簡體   English   中英

&&和|| 操作員未按預期工作

[英]&& and || operators not working as expected

#include <iostream>
#include <string>

using namespace std;

int main(){
    char c1;
    char c2 = 'B';

    while(c1 != 'B' && c2 == 'B'){

        cout << "Ok!" << endl;

        c1 = 'B';
        //c2 = 'A';

        cout << "c1 = " << c1 << endl << "c2 = " << c2 << endl;
    }
}

/*
    >>OUTPUT<<

    Ok!
    c1 = B
    c2 = B
*/

查看上面的簡單程序,您會認為這將是一個無限循環,但由於某種原因,它會運行一次並結束。 將運算符從&&更改為|| 陷入無限循環。

就像&&和|| 運算符被交換。 我只是看不到嗎?

c1尚未初始化,因此可能不是'B' ,即c1 != 'B'可能計算為true。

因此,從統計上講,循環可能只運行一次,當然也不會超過該循環,因為您在循環主體中將c1顯式設置為'B'

(請注意,通常,讀取未初始化變量的行為是undefined ,但是char類型是一個明顯的例外。)

&&是AND, || 是或

運營商的名單可以發現這里和更詳細的解釋,包括優先順序,每個人都可以找到這里

程序第一次到達循環c1時是未初始化的,並且讀取其值是undefined ,可能不是'B',但是可以是任何東西。 因此,在大多數情況下, c1 != 'B'評估為真。 因此, c1 != 'B' && c2 == 'B'的整個語句為true && true ,並且循環運行一次。

注意:讀取未初始化的值是“未定義的行為”。 從技術上講,這會使您的整個應用程序變得不確定,因此無效。 但是“未定義的行為”可以做任何事情,在這種情況下,返回的值不為“ B”,或者將來可能返回的值為“ B”,或者只是崩潰。

在循環中,您設置c1 = 'B' ,因此while循環c1 != 'B'的第一個條件變為false,然后整個條件為false && true 由於false AND true = false,因此循環中止。

如果用or或( || )換出and,則循環將始終運行,因為c2 == 'B'將始終為true,因為您無需在循環中進行更改。

您應該學習如何使用調試器並逐步執行代碼,並在每個步驟之后檢查變量。 對於像這樣的非常簡單的問題,“ printf-debugging”也適用。 只需將您感興趣的變量和表達式的內容轉儲到stdout。 但是無論如何,您都應該學習如何使用調試器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM