相关疑难解决方法(0)

未定义的行为和序列点

什么是"序列点"?

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

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

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

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

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

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

后增量和预增量概念?

我不明白后缀和前缀增量或减量的概念.谁能给出更好的解释?

c++ conceptual pre-increment post-increment

66
推荐指数
6
解决办法
11万
查看次数

序列点和部分顺序

几天前,这里有一个关于表达方式的讨论

i = ++ i + 1

是否调用UB(未定义的行为).

最后得出的结论是它调用UB,因为'i'的值在两个序列点之间不止一次变化.

我参与了与Johannes Schaub在同一个线程中的讨论.据他介绍

i =(i,i ++,i)+1 ------(1)/*也调用UB*/

我说(1),因为先前的子表达式的副作用是由逗号运算符清零不调用UB""之间i和i ++和我++和我之间.

然后他给出了以下解释:

"是的,在i ++完成之前的所有副作用之后的序列点,但没有任何东西可以阻止赋值副作用与i ++的副作用重叠.潜在的问题是赋值的副作用未指定发生在或之后在评估赋值的两个操作数之前,所以序列点在保护它时无法做任何事情:序列点诱导偏序:只是因为在i ++之后和之前有一个序列点并不意味着所有的副作用都被排序关于我.

另外,请注意,只有序列点没有任何意义:评估的顺序不是由代码的形式决定的.它由语义规则决定.在这种情况下,没有语义规则说明何时在评估那些操作数的操作数或子表达式时发生赋值副作用".

用"大胆"写的声明使我感到困惑.我所知道的:

"在执行序列中称为序列点的某些特定点,先前评估的所有副作用都应完整,并且不会产生后续评估的副作用."

因为,逗号运算符也指定了执行顺序,当我们到达最后一个i时,i ++的副作用已被取消.如果未指定评估顺序,那么(Johannes)会是正确的(但是在逗号运算符的情况下,它已被明确指定) ).

所以我只想知道(1)是否调用UB?有人能给出另一个有效的解释吗

谢谢!

c c++ expression language-lawyer

22
推荐指数
3
解决办法
1673
查看次数