在C/C++中,x [i]*y [i ++]总是等于x [i]*y [i]

Ser*_*erg 11 c++ performance compiler-optimization

可能重复:
任何人都可以在printf中解释这些未定义的行为(i = i ++ + ++ i,i = i ++等...)
增量值

我有两个双阵列xy和整数i.我的问题是声明是否:

double res = x[i] * y[i++];
Run Code Online (Sandbox Code Playgroud)

总是等于声明:

double res = x[i] * y[i];
i++;
Run Code Online (Sandbox Code Playgroud)

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

Jer*_*fin 13

不 - x[i] + y[i++]有未定义的行为.您正在修改值i并且也使用该值i而没有插入序列点,这会给出未定义的行为1.


  1. 在C++ 11中,该标准已经消除了"序列点"术语,但效果保持不变 - 两者相互无序.

  • 这与乘法运算符的可交换性无关.如果操作是`x [i] - y [i ++]`(不能反转),那么在这种情况下`i`的行为仍然是未定义的. (3认同)

Lin*_*cer 8

不,增量发生时未定义.

  • 不仅仅是增量发生的时候.行为完全**未定义:它修改`i`并读取其值而没有插入序列点. (8认同)
  • @FredOverflow - 询问您的编译器供应商. (2认同)

Pet*_*ker 6

代码修改i并使用其值而没有插入序列点,因此行为未定义.语言定义不会在此处强加任何要求.