Yahoo 知識+ 將於 2021 年 5 月 4 日 (美國東岸時間) 停止服務,而 Yahoo 知識+ 網站現已轉為僅限瀏覽模式。其他 Yahoo 資產或服務,或你的 Yahoo 帳戶將不會有任何變更。你可以在此服務中心網頁進一步了解 Yahoo 知識+ 停止服務的事宜,以及了解如何下載你的資料。
請問邏輯判斷式的判斷規則
假設一個邏輯判斷為:
if( ConditionA && ConditionB ){...}
在我使用的編譯器中若判斷 ConditionA 為假,則會直接跳出 if 判斷而不檢查 ConditionB 的值。我想問的問題就是這個行為到底是 C 或 C++ 的標準還是個別編譯器自行最佳化而產生?
會這樣問的原因是我有一個結構指標 p,而我想做這件事:
if( p != NULL && p->m1 == 1 ) DoSomething();
else DoTheOtherThimg();
但若前述邏輯判斷的行為非為可靠的話,我勢必要將這個敘述改成:
if( p != NULL ){
if( p->m1 == 1 ) DoSomething();
}
...?? DoTheOtherThing();
而且在原先 DoTheOtherThing 那邊會面臨更複雜的邏輯判斷。
因此在此想詢問諸位先進是否有這方面的知識?
謝謝
4 個解答
- 其威Lv 79 年前最愛解答
對於 C 來說,&& 與 || 的求值順序是可以依賴的,一定是由左至右。
舉例來說:
if (Cond1 && Cond2 && ... && CondN)
會照 Cond1 => Cond2 => ... => CondN 這樣的順序求值,只要遇到其中一個是 false 就跳出,不會繼續往下求值。
如果是 || 的話則是遇到 true 跳出。
對 C++ 來說,如果是內建的 operator && 與 operator ||,求值順序也是可以依賴的,都是由左至右(與 C 相同)。
但是如果是自訂的 operator && 與 operator ||,會被當成函式參數,求值的順序就不固定了。
所以你應該盡量避免覆寫 operator && 與 operator ||,因為 C++ 中沒有任何方法可以達到與內建 && || 相同的行為。
=== 分隔線 ===
以你舉的例子來說:
if ( p != NULL && p->m1 == 1 )
doSomething();
else
doSomethingElse();
你可以放心的這樣寫,永遠不會發生在取 p->m1 的時候 p 為 NULL 的情況(除非你手賤去 overload 了 operator &&,或是多執行緒同時修改 p... 但是這不在討論範圍內......)。
- JohnLv 69 年前
記得 && 以及 ||,是有順序的...
不過,不是每一個人都能記得所有的標準,
建議使用function,把判斷式包起來,
直接return結果。
function中的判斷式,
可以用比較清楚的寫法,
即便寫起來長一些,也是比較容易理解。
如有錯誤,請其他大大指教...
資料來源: 自己