相关疑难解决方法(0)

未定义的行为和序列点

什么是"序列点"?

未定义的行为和序列点之间的关系是什么?

我经常使用有趣和复杂的表达方式a[++i] = i;,让自己感觉更好.我为什么要停止使用它们?

如果您已阅读此内容,请务必访问后续问题重新加载未定义的行为和序列点.

(注意:这是Stack Overflow的C++常见问题解答的一个条目.如果你想批评在这种形式下提供常见问题解答的想法,那么发布所有这些的元数据的发布将是这样做的地方.这个问题在C++聊天室中受到监控,其中FAQ的想法一开始就出现了,所以你的答案很可能被那些提出想法的人阅读.)

c++ c++-faq undefined-behavior sequence-points

970
推荐指数
4
解决办法
10万
查看次数

那么为什么i = ++ i + 1在C++ 11中定义明确?

我已经看到了其他类似的问题,并阅读了有关它的缺陷.但我仍然没有得到它.为什么i = ++i + 1在C++ 11中定义得很好i = i++ + 1?该标准如何明确定义?

通过我的工作,我之前有以下顺序(其中箭头表示关系之前的顺序,除非另有说明,否则一切都是值计算):

i = ++i + 1
     ^
     |
assignment (side effect on i)
 ^      ^
 |      |
?i   ++i + 1
     ||    ^
    i+=1   |
     ^     1
     |
?assignment (side effect on i)
  ^      ^
  |      |
  i      1
Run Code Online (Sandbox Code Playgroud)

i用黑星标记了一个副作用,i用白星计算了一个值.这些似乎相互之间没有相应的顺序(根据我的逻辑).标准说:

如果对标量对象的副作用相对于同一标量对象的另一个副作用或使用相同标量对象的值进行的值计算未被排序,则行为未定义.

缺陷报告中的解释并没有帮助我理解.左值到右值的转换与任何事情有什么关系?我弄错了什么?

c++ undefined-behavior language-lawyer c++11

29
推荐指数
2
解决办法
2033
查看次数