【发布时间】:2012-10-29 07:31:01
【问题描述】:
int test[2] = { 45, test[0] };
int x = (x = 111);
cout << test[0] << " " << test[1] << " " << x << "\n"; // 45 45 111
前两行的赋值合法吗? Visual Studio 2010 编译并运行它时没有任何错误或警告,但这似乎是一个可能未定义的奇怪情况,所以我想确认它是可以接受的。如果我做了像int x = x; 这样公然自反(并且可能是未定义)的事情,Visual Studio 会警告我,所以我想知道它似乎允许的这些情况是如何处理的。
【问题讨论】:
-
int x = (x + 1)也编译并将x设置为1毫无价值(无论如何,在Linux 上使用GCC)。 -
@apsillers:你依赖于未定义的行为。
x在评估(x + 1)时未初始化。 -
这也可以在 linux 上编译。结果:45 45 111 确实这是一个奇怪的情况,但似乎是正确的!我猜编译器可以解决问题。当这些行转换为程序集时,它们是按顺序排列的,因此当使用的值已经存在。
-
那 (
int x = (x + 1);) 是明确未定义的行为;您正在增加一个不确定的值,该值不能保证为零。 -
@apsillers:你很幸运。在我的 GCC 上,默认值为 potato。
标签: c++ variables initialization standards variable-assignment