無窮迴圈的未定義行為
C++ 中 沒有 side effect 的無窮迴圈是 UB,編譯器可以假設迴圈會結束。
cpp
int main() {
while (1);
}
void unreachable() { std::cout << "why?\n"; }clang 15 -O1 會把 main 整個刪掉,直接落到下一個函數,印出 why?。
同理,下面的 Collatz 迴圈會被編成單一 ret,不是編譯器證明了猜想:
cpp
void collatz(unsigned n) {
while (n > 1) n = n % 2 ? 3 * n + 1 : n / 2;
}- C++26(P2809)起,條件為常數的 trivial 無窮迴圈(如
while (1);)不再是 UB - gcc、MSVC、clang 11、
-O0都不會這樣 - 需要無窮等待時,迴圈內放 side effect(I/O、
volatile、atomic),或改用 sleep / 條件變數