「cout
最近引發了一個令人費解的面試問題辯論:以下的正確輸出是什麼
int a = 0; cout << a++ << a;
一些候選人自信地選擇了“01”,而另一些候選人則認為該行為未定義——這個答案最初讓一些人感到驚訝。
問題的關鍵在於評估語句的順序和副作用。為了理解這一點,讓我們將其擴展為等效的函數呼叫:
std::operator<<(std::operator<<(std::cout, a++), a);
C 保證前面評估的副作用將在序列點執行。然而,參數求值之間沒有順序點,導致參數求值的順序不確定-a 可以在 a 之前求值,反之亦然。
求值順序的這種模糊性導致語句的行為未定義。然而,在 a 和 a 的情況下,前者的結果用作後者的參數,使輸出取決於評估的順序。
C 17 更新:清晰度歧義
在 C 17 中,規則已經演變。引入了有關移位運算符的特定聲明,規定左側操作數的求值和副作用必須發生在右側操作數的求值和副作用之前。
In a shift operator expression E1<<E2 and E1>>E2, every value computation and side-effect of E1 is sequenced before every value computation and side effect of E2.
根據此要求,表達式“a 這種語意上的細化確保了表達式求值的清晰度和一致性涉及移位運算符,與慣用的 C 實踐保持一致。
以上是'cout”的輸出是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!