Skip to content

無窮迴圈的未定義行為 ​

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 / 條件變數

參考 ​

頁面歷史

Just observe 👀