編譯器優化是否會導致類似這樣的代碼出現問題?具體而言,可以回答自動增量以正確的順序進行蒸發嗎?編譯器優化與增量
uint result = (array[i++] << 16) | (array[i++] << 8) | array[i++];
編譯器優化是否會導致類似這樣的代碼出現問題?具體而言,可以回答自動增量以正確的順序進行蒸發嗎?編譯器優化與增量
uint result = (array[i++] << 16) | (array[i++] << 8) | array[i++];
操作數在一個表達式被 評價從左到右。對於 例如,在
F(i) + G(i++) * H(i)
, 方法F
使用舊值的i
,則方法G
被調用的i
的 舊值調用,並且,最後,方法H
被調用的i
新值。 這與運算符優先級 分開,並與之無關。
不,我認爲你是在序列點之間多次修改對象(i)。 IIRC既不按位也不是數組索引是序列點。您只能修改對象一次,否則是未指定或未定義的行爲。
注意。這不一定是優化器的問題,它只是不合法。
編輯:這裏有一個序列點一個鏈接 - http://msdn.microsoft.com/en-us/library/d45c7a5d(VS.80).aspx
錯了。 **這是C#,而不是C++ **。 – SLaks 2010-11-08 02:10:09
DOH!我的錯誤,我誤解了標籤。儘管如此,它還是會咬任何從c#移動到C++的人,所以我不會這麼做。 :-) – 2010-11-08 02:29:02
這僅適用於單一改性我真的,看到我的回答如下... – 2010-11-08 01:38:06
@Andy:錯誤。這總是如此。 – SLaks 2010-11-08 02:13:27