這裏是我的代碼從一個字節數組反序列化uint64_t中值:編譯器警告有關未定義操作
uint8_t* s = blah;
uint64_t output =
(((uint64_t)*s++) << 56) +
(((uint64_t)*s++) << 48) +
(((uint64_t)*s++) << 40) +
(((uint64_t)*s++) << 32) +
(((uint64_t)*s++) << 24) +
(((uint64_t)*s++) << 16) +
(((uint64_t)*s++) << 8) +
(((uint64_t)*s) );
我編譯此代碼使用g ++在Ubuntu版本5.4。
雖然代碼工作完全按照預期,我得到的最後一行編譯時警告:
warning: operation on 's' may be undefined [-Wsequence-point]
想知道什麼可能是錯誤的,我怎麼能解決這個問題。問候。
可能的重複https://stackoverflow.com/questions/4176328/undefined-behavior-and-sequence-points –
各種's ++'子表達式的評估順序是未指定的。在這種情況下,同一個對象被多次修改,這個標準不僅僅是說它們可以以任何順序被評估(這足夠糟糕),並且說行爲是完全不確定的。 –
任何你不使用簡單循環的理由?讓編譯器進行展開。 – Olaf