编译器优化&增量

时间:2010-11-07 23:35:24

标签: c# optimization compiler-construction increment

编译器优化会导致像这样的代码出现问题吗?具体来说,是否可以回复自动增量以按正确的顺序进行评估?

uint result = (array[i++] << 16) | (array[i++] << 8) | array[i++];

2 个答案:

答案 0 :(得分:4)

Yes; this is specified

spec says

  

表达式中的操作数是   从左到右进行评估。对于   例如,在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