编译器优化和增量

问题描述 投票:0回答:2

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

uint result = (array[i++] << 16) | (array[i++] << 8) | array[i++];
c# increment compiler-optimization
2个回答
4
投票

是的;这是指定的

规格说

表达式中的操作数是 从左到右评价。为了 例如,在

F(i) + G(i++) * H(i)
中, 使用旧值调用方法
F
i
,然后调用方法
G
i
的旧值,最后是方法
H
使用新值
i
进行调用。 这是独立于且无关的 运算符优先级。


0
投票

不,我认为您在序列点之间多次修改对象 (i)。 IIRC 按位或或数组索引都不是序列点。您只能修改该对象一次,否则是未指定或未定义的行为。

注意。这不一定是优化器的问题,只是不合法。

编辑:这是关于序列点的链接 - http://msdn.microsoft.com/en-us/library/d45c7a5d(VS.80).aspx

© www.soinside.com 2019 - 2024. All rights reserved.