编译器优化会导致像这样的代码出现问题吗?具体来说,是否可以回复自动增量以按正确的顺序进行评估?
uint result = (array[i++] << 16) | (array[i++] << 8) | array[i++];
答案 0 :(得分:4)
表达式中的操作数是 从左到右进行评估。对于 例如,在
F(i) + G(i++) * H(i)
中, 使用旧值调用方法F
i
的{{1}},然后调用方法G
旧值i
,最后是方法H
使用新值i
调用。 这是独立的,与之无关 运算符优先级。
答案 1 :(得分:0)
不,我认为你在序列点之间多次修改对象(i)。 IIRC既不是按位,也不是数组索引是序列点。您只能修改一次对象,否则是未指定或未定义的行为。
请注意。这不一定是与优化器有关的问题,它只是不合法。
编辑:这是序列点的链接 - http://msdn.microsoft.com/en-us/library/d45c7a5d(VS.80).aspx