c – 为什么i = i调用未定义的行为?
发布时间:2020-12-16 09:55:09 所属栏目:百科 来源:网络整理
导读:参见英文答案 Why are these constructs using pre and post-increment undefined behavior?????????????????????????????????????14个 我理解C使用序列点的概念来识别模糊计算,并且=运算符不是序列点.但是,我无法看到执行语句时有任何歧义 我=我 根据我的理
参见英文答案 >
Why are these constructs using pre and post-increment undefined behavior?????????????????????????????????????14个
我理解C使用序列点的概念来识别模糊计算,并且=运算符不是序列点.但是,我无法看到执行语句时有任何歧义 我=我 根据我的理解,这简单地等于评估& i处的任何内容,递增它并将其存储在相同位置.然而,GCC将其标记为: [警告]’i’上的操作可能未定义[-Wsequence-point] 我错过了关于如何=函数的东西? 编辑:在标记为重复之前,请注意我浏览了有关序列点和未定义行为的其他帖子.它们都没有具体地解决表达式i = i(注意预增量).提到的表达通常是i = i,a = b b等.我对它们中的任何一个都毫无疑问. 解决方法
你遗漏了一些未定义的行为.未定义的行为只是意味着编译器可以做任何想做的事情.它可以抛出错误,它可以(如GCC所示)显示警告,它可以导致恶魔飞出你的鼻子.主要的是,它不会表现良好,并且在编译器之间不会表现一致,所以不要这样做!
在这种情况下,编译器不必使得在返回语句的rhs之前必须完成运算符的lhs的副作用.这对你来说很有趣,但你不像计算机那样思考.如果需要,它可以计算返回值并将其返回到寄存器中,将其分配给i,然后对实际值执行增量.所以看起来更像 register=i+1; i=register; i=i+1; 该标准不保证不会发生这种情况,所以就是不要这样做! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |