2010-11-07 141 views
2

編譯器優化是否會導致類似這樣的代碼出現問題?具體而言,可以回答自動增量以正確的順序進行蒸發嗎?編譯器優化與增量

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

回答

4

Yes; this is specified

spec says

操作數在一個表達式被 評價從左到右。對於 例如,在F(i) + G(i++) * H(i), 方法F使用舊值的i ,則方法G被調用的i的 舊值調用,並且,最後,方法H 被調用的i新值。 這與運算符優先級 分開,並與之無關。

+0

這僅適用於單一改性我真的,看到我的回答如下... – 2010-11-08 01:38:06

+0

@Andy:錯誤。這總是如此。 – SLaks 2010-11-08 02:13:27

0

不,我認爲你是在序列點之間多次修改對象(i)。 IIRC既不按位也不是數組索引是序列點。您只能修改對象一次,否則是未指定或未定義的行爲。

注意。這不一定是優化器的問題,它只是不合法。

編輯:這裏有一個序列點一個鏈接 - http://msdn.microsoft.com/en-us/library/d45c7a5d(VS.80).aspx

+0

錯了。 **這是C#,而不是C++ **。 – SLaks 2010-11-08 02:10:09

+0

DOH!我的錯誤,我誤解了標籤。儘管如此,它還是會咬任何從c#移動到C++的人,所以我不會這麼做。 :-) – 2010-11-08 02:29:02