2017-07-25 12 views
-4

快速的問題。如何將下面的代碼將執行檢查的順序:如果語句順序檢查fr對象依賴於編譯器嗎?

if ((NULL != ObjectPtr) && (ObjectPtr->isValid())) 
{ 
} 

用在if語句來依賴於編譯器的順序?如果ObjectPtrNULL,那麼代碼會崩潰嗎?

+1

括號太多。

+0

[Yoda條件](https://en.wikipedia.org/wiki/Yoda_conditions)在20年前與C++相關,但事實不是這樣。 –

+1

這是一個明顯的重複,來自120k和200k用戶。 – meagar

回答

3

命令依賴於if語句依賴於編譯器嗎?

莫非代碼崩潰,如果ObjectPtrNULL

號的語言保證。

2

在C++中,&&運營商保證是短路。這意味着首先檢查左側的操作數,如果它是假的,則不評估右側的操作數。

所以你的代碼是安全的,不會通過NULL指針執行成員訪問。

類似地,||也是短路的,如果左操作數爲真,則不會評估其右側操作數。

布爾操作數,按位運算符&|給出相同的結果作爲邏輯運算符&&||,但位運算符不短路和他們的右手操作數始終評估(可能是前左手一個)。由於Quentin在評論中提到,用戶提供的這些運算符的重載不會短路,因爲它們實際上是函數調用,並且具有函數調用的評估順序(在調用之前評估所有參數)。

+0

注意:這隻適用於內置的運算符(可能會或可能不明顯)。 – Quentin