0
如果我寫:我的編譯器會重新排列這個表達式嗎?
if(somePtr != NULL && somePtr->someFun() == SUCCESS)
{
/**/
}
將它放心,somePtr != NULL
將somePtr->someFun() == SUCCESS
前應檢查?
有沒有可能我的編譯器會重新排序這兩個?
如果我寫:我的編譯器會重新排列這個表達式嗎?
if(somePtr != NULL && somePtr->someFun() == SUCCESS)
{
/**/
}
將它放心,somePtr != NULL
將somePtr->someFun() == SUCCESS
前應檢查?
有沒有可能我的編譯器會重新排序這兩個?
有沒有可能我的編譯器會重新排序這兩個?
都能跟得上。確保&&
僅在第一個表達式爲true
(順便說一句,它也在整個表達式中引入了一個序列點)的情況下評估第二個表達式。
& &運算符組從左到右。操作數都被上下文轉換爲bool類型(第4章)。如果兩個操作數都爲真,結果爲true,否則爲false。 與
&
,&&
不同,保證從左到右的評估:如果第一個操作數爲假,則不評估第二個操作數。結果是一個布爾值。如果評估第二個表達式,則在與第二個表達式關聯的每個值計算和副作用之前對與第一個表達式關聯的每個值計算和副作用進行排序。
(C++ 11,[expr.log.and];強調)
感謝您爲我提供這些信息。我會研究標準文件。 – summereno 2013-04-08 01:39:02
只需謹慎一點:這對於內置運算符&&是真實的。一個重載的操作符&&(在這裏**不是**)不保證評估順序或短路。 – 2013-04-08 14:33:16