卸貨
Lv 5
卸貨 發問時間: 電腦與網際網路程式設計 · 8 年前

請問邏輯判斷式的判斷規則

假設一個邏輯判斷為:

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 7
    8 年前
    最佳解答

    對於 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... 但是這不在討論範圍內......)。

  • 匿名使用者
    6 年前

    到下面的網址看看吧

    ▶▶http://qoozoo09260.pixnet.net/blog

  • novus
    Lv 6
    8 年前

    分兩類討論

    對內建的 &&,這是標準明定可依賴的行為。

    對於使用者自訂的 operator&& ,行為則完全等同函數,亦即左右兩個運算元都保證會被算出來,但順序由編譯器決定。

  • John
    Lv 6
    8 年前

    記得 && 以及 ||,是有順序的...

    不過,不是每一個人都能記得所有的標準,

    建議使用function,把判斷式包起來,

    直接return結果。

    function中的判斷式,

    可以用比較清楚的寫法,

    即便寫起來長一些,也是比較容易理解。

    如有錯誤,請其他大大指教...

    參考資料: 自己
還有問題?馬上發問,尋求解答。