一段简单的C++代码,为什么会断言失败? 20

vector<int>a(10);vector<int>b(10);inti=0;for(;i<10;)b[i]=a[i++];一时没想明白,这段代码为什么会内存溢出,用... vector<int> a(10);
vector<int> b(10);
int i = 0;
for (; i < 10;)
b[i] = a[i++];
一时没想明白,这段代码为什么会内存溢出,用的是VS2013IDE,求指教。
(PS:把i++拿出来就正常了)
将b[i]=a[i++];换做b[i++]=a[i];一样有这个问题,所以不知道编译器是怎么编译执行的,感到奇怪,想知道这段代码是怎么执行的,如果是a[i]先执行我想b[i++]=a[i]是对的,如果b[i]先执行,我想b[i]=a[i++];是对的,但事实上两种写法都错了,求教怎么回事?
展开
 我来答
百度网友fc266e016
2015-03-19 · 超过12用户采纳过TA的回答
知道答主
回答量:55
采纳率:0%
帮助的人:35.5万
展开全部
你这个程序是想让b里面的每个值按照位置与a里面的每个值相同,还是想让b[0]=a[1],你这样写会出现b[9]=a[10],这样a[10]就指向了不存在区域,所以会发生泄漏。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
问额外我而去
2015-03-19 · TA获得超过838个赞
知道小有建树答主
回答量:802
采纳率:0%
帮助的人:469万
展开全部
  1. b[i++]=a[i]先求值b[i++]

  2. b[i]=a[i++];  先求值a[i++];

     原因我无力回答,但这是事实


对于b[i++]=a[i],你错误的人为i++在执行完这行之后!

可以你忽略了等号两边都是函数调用这个事实,而函数触发序列点, 序列点对i++求职


不用向下解释了吧,呵呵

c语言, 这酸爽!!!

本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
缘明思
2015-05-04 · TA获得超过543个赞
知道小有建树答主
回答量:795
采纳率:88%
帮助的人:352万
展开全部
实测,vs2008没事。果然是编译器的问题。可能是新标准对编译器的新要求,对++做了保护。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2015-03-19
展开全部
i++之后赋值给b[i] 你说栈溢不溢出
追问
我试过b[i++]=a[i];一样有这个问题,所以感到奇怪
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2019-05-31
展开全部
c99标准规定,一个表达式产生结果的同时,存在修改其他变量副作用,那么,副作用的更新时机存在一定的不确定性,属于undefine行为,给编译器优化留下空间。
以上面的例子来看,b[i] = a[i++]这个表达式存在多个副作用。
i++运算会修改i本身的值
b[i]=xxx,会修改b[i]的值
这里的i自增1这个动作和b[i]赋值的动作的执行先后是不确定的,之所以溢出(数组访问越界),是编译器优化时,先把i的值更新了,再做b[i]的赋值而导致。
这里还涉及到程序点的问题,不再多说了,反正记住一点,一个表达式里面不要出现使用一个变量的同时又更新这个变量,特别是i++这种。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式