可能重复:
Could anyone explain these undefined behaviors (i = i++ + ++i , i = i++, etc…)
根据c++标准,
i = 3;
i = i++;
将导致未定义的行为。
我们使用术语“未定义的行为”,如果它可以导致不止一个结果。但在这里,无论计算顺序如何,i
的最终值都将是4,所以这不应该被称为“未指定的行为”吗?
发布于 2011-02-11 20:17:48
这句话,"…i
的最终值将是4,不管…的顺序如何“是不正确的。编译器可能会发出与以下内容等效的代码:
i = 3;
int tmp = i;
++i;
i = tmp;
或者这样:
i = 3;
++i;
i = i - 1;
或者这样:
i = 3;
i = i;
++i;
至于术语的定义,如果答案保证是4,那就不是未指定或未定义的行为,它将是已定义的行为。
根据标准(Wikipedia),它是未定义的行为,所以它甚至可以自由地这样做:
i = 3;
system("sudo rm -rf /"); // DO NOT TRY THIS AT HOME … OR AT WORK … OR ANYWHERE.
发布于 2011-02-11 20:28:02
不,我们不使用术语“未定义的行为”,当它可以简单地导致一个以上的算术结果。当行为被限制为不同的算术结果(或者,更一般地,一些可预测的结果集)时,它通常被称为未指定的行为。
未定义的行为意味着完全不可预测和无限的后果,如格式化计算机上的硬盘驱动器或简单地使您的程序崩溃。i = i++
是一种未定义的行为。
在这种情况下,i
应该是4的想法是从哪里得到的还不清楚。在C++语言中,绝对没有任何东西可以让您得出这样的结论。
发布于 2011-02-11 20:24:57
在C和C++中,两个sequence points之间的任何操作的顺序完全由编译器决定,不能依赖于。该标准定义了一个组成序列点的列表,从内存中看,这是
在调用函数之前,语句后面的分号和所有函数参数的逗号与||
查看维基百科上的页面,这些列表更完整,描述也更详细。序列点是一个非常重要的概念,如果您还不知道它的含义,那么立即学习它将使您受益良多。
https://stackoverflow.com/questions/4968854
复制相似问题