快速的問題。如何將下面的代碼將執行檢查的順序:如果語句順序檢查fr對象依賴於編譯器嗎?
if ((NULL != ObjectPtr) && (ObjectPtr->isValid()))
{
}
用在if
語句來依賴於編譯器的順序?如果ObjectPtr
是NULL
,那麼代碼會崩潰嗎?
快速的問題。如何將下面的代碼將執行檢查的順序:如果語句順序檢查fr對象依賴於編譯器嗎?
if ((NULL != ObjectPtr) && (ObjectPtr->isValid()))
{
}
用在if
語句來依賴於編譯器的順序?如果ObjectPtr
是NULL
,那麼代碼會崩潰嗎?
命令依賴於
if
語句依賴於編譯器嗎?
號
莫非代碼崩潰,如果
ObjectPtr
是NULL
?
號的語言保證。
在C++中,&&
運營商保證是短路。這意味着首先檢查左側的操作數,如果它是假的,則不評估右側的操作數。
所以你的代碼是安全的,不會通過NULL指針執行成員訪問。
類似地,||
也是短路的,如果左操作數爲真,則不會評估其右側操作數。
布爾操作數,按位運算符&
和|
給出相同的結果作爲邏輯運算符&&
和||
,但位運算符不短路和他們的右手操作數始終評估(可能是前左手一個)。由於Quentin在評論中提到,用戶提供的這些運算符的重載不會短路,因爲它們實際上是函數調用,並且具有函數調用的評估順序(在調用之前評估所有參數)。
注意:這隻適用於內置的運算符(可能會或可能不明顯)。 – Quentin
括號太多。 –
[Yoda條件](https://en.wikipedia.org/wiki/Yoda_conditions)在20年前與C++相關,但事實不是這樣。 –
這是一個明顯的重複,來自120k和200k用戶。 – meagar