像int n6 = n1 + ++n1;
這樣的陳述是未定義的行爲,因爲它們違反了排序規則。但是,如果它們違反了序列規則,爲什麼編譯器不會給出一個嚴重錯誤?其他的例子:爲什麼編譯器不執行排序規則?
i = ++i + i++; // undefined behavior
i = i++ + 1; // undefined behavior (but i = ++i + 1; is well-defined)
f(++i, ++i); // undefined behavior
f(i = -1, i = -1); // undefined behavior
似乎在所有這些情況下,標準明確地說,這是不確定的行爲,所以它可以很容易地說:「節目是形成不良的」,這通常會導致很難診斷。
應該編譯能夠[this](http://coliru.stacked-crooked.com/a/f11297b5b6e064c8)出來嗎?這是同樣的事情,但很難診斷。 – NathanOliver
硬錯誤是未定義行爲的有效結果,因此使其成爲UB允許編譯器拒絕它,如果它們能夠檢測到它(例如,用'-Werror = sequence-point'或類似的方法) –
@JonathanWakely一個硬錯誤只是在運行時執行的代碼中未定義行爲的有效結果。 '-Werror = sequence-point'可能非常有用,但是當使用它時,GCC不再符合C++標準。 'int main(){} void f(int i){++ i ++ ++ i; C是一種嚴格遵守的程序。 (我不確定C++是什麼意思。) – hvd