[英]&& 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.