11

可能重复:
谁能解释这些未定义的行为(i = i++ + ++i,i = i++ 等)
在 printf 中增加值

我有两个双精度数组xy整数i。我的问题是声明是否:

double res = x[i] * y[i++];

总是等于语句:

double res = x[i] * y[i];
i++;

是否有可能某些编译器会x[i] * y[i++]变成y[i++] * x[i],这显然会产生不同的结果?

4

4 回答 4

13

否 -x[i] + y[i++]具有未定义的行为。您正在修改 1 的值i并使用该值i而没有中间序列点,这会产生未定义的行为1


  1. 在 C++11 中,该标准消除了“序列点”术语,但效果保持不变——两者相对于彼此是无序的。
于 2012-12-05T18:17:45.983 回答
8

不,当增量发生时它是未定义的。

于 2012-12-05T18:12:47.537 回答
6

代码修改i并使用它的值而没有中间的序列点,因此行为是未定义的。语言定义在这里没有强加任何要求。

于 2012-12-05T18:16:06.833 回答
1

不,

i++ + i++ 的值 在和中未定义CC++

如果您在同时写入变量的表达式中读取变量两次,则结果未定义。不要那样做。另一个例子是:

v[i] = i++;

未定义意味着它的编译器依赖。
由于评估顺序,一些编译器可能也会警告您未定义。非常好的C++参考资料

1 http://www.stroustrup.com/bs_faq2.html#evaluation-order

于 2012-12-05T18:14:49.470 回答