相关疑难解决方法(0)

未定义的行为和序列点

什么是"序列点"?

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

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

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

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

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

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

为什么这些构造使用前后增量未定义的行为?

#include <stdio.h>

int main(void)
{
   int i = 0;
   i = i++ + ++i;
   printf("%d\n", i); // 3

   i = 1;
   i = (i++);
   printf("%d\n", i); // 2 Should be 1, no ?

   volatile int u = 0;
   u = u++ + ++u;
   printf("%d\n", u); // 1

   u = 1;
   u = (u++);
   printf("%d\n", u); // 2 Should also be one, no ?

   register int v = 0;
   v = v++ + ++v;
   printf("%d\n", v); // 3 (Should be the …
Run Code Online (Sandbox Code Playgroud)

c increment operator-precedence undefined-behavior sequence-points

793
推荐指数
13
解决办法
7万
查看次数

在C++ 11中,`i + = ++ i + 1`是否表现出未定义的行为?

在我阅读的过程中出现了这个问题(答案) 那么为什么i = ++ i + 1在C++ 11中定义明确?

我认为,微妙的解释是(1)表达式++i返回一个左值但是+将prvalues作为操作数,因此必须执行从左值到右值的转换; 这涉及获得该左值的当前值(而不是旧值的一个以上i),因此必须在增量的副作用(即更新)之后进行排序i(2)赋值的LHS也是左值,所以它的价值评估不涉及取得当前价值i; 虽然这个值计算在RHS的值计算中是不可测的,但这没有问题.(3)赋值本身的值计算涉及更新i(再次),但是在其RHS的值计算之后排序,因此在变换之后更新到i; 没问题.

很好,所以那里没有UB.现在我的问题是如果将分配运算符更改=+=(或类似的运算符).

表达式的评估是否会i += ++i + 1导致未定义的行为?

在我看来,标准似乎在这里自相矛盾.由于LHS +=仍然是左值(并且其RHS仍然是prvalue),所以与上述相同的推理适用于(1)和(2); 在操作数的评估中没有未定义的行为+=.至于(3),复合赋值的运算+=(更确切地说是该运算的副作用;它的值计算,如果需要,在任何情况下在其副作用之后排序)现在必须同时获取当前值i,然后(显然在它之后排序,即使标准没有明确说明,或者对这些运算符的评估总是会调用未定义的行为)添加RHS并将结果存回i.如果它们的副作用没有排序,这两个操作都会给出未定义的行为++,但正如上面所论述的那样(在给出运算符的RHS ++的值计算之前对其进行排序的副作用,该计算值在计算之前排序.该复合转让的操作),情况并非如此.++=

但另一方面,标准也表示E += F相当于E = E + F,除了(左值)E仅被评估一次.现在在我们的例子中,作为左值的i(E …

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

47
推荐指数
3
解决办法
3295
查看次数