2013-05-21 275 views
1

這裏布爾變量是我的代碼:for循環VS條件

int main() 
{ 
int input; 
bool isZero = false; 

while (!isZero) 
{ 
    ... 

    if (0 == input) 
    { 
     isZero = true; 
    } 

    else 
    { 
     isZero = false; 
    } 

} 

return 0; 
} 

的程序在做什麼它應該,但我覺得像isZero表達並非萬無一失!

bool isZero = false; 
while(!isZero); 
{ 
    .... 
} 

同樣的事情

bool isZero = false; 
while(isZero == false) 
{ 
    ... 
} 

爲什麼或者爲什麼不呢? 此外,在哪些情況下真實代表1,並且在哪些情況下代表任何非零數字?

+3

'while(input)'怎麼樣?根本不需要'isZero'。 – chris

+0

'true'是任何是或轉換爲非零的東西。 – juanchopanza

+1

他們是相同的,我更喜歡'while(!isZero)' –

回答

4

雖然要求條件是布爾型,並且!isZero已經是布爾型。平等運算符生成一個布爾值,所以isZero == false是一個布爾值。所以你唯一改變的是添加另一個運算符,並且(可能)稍微減慢循環(AFAIR比較比位運算符慢)。

對布爾值的操作與對整數值的操作類似。您的疑慮可以轉化爲整數:「嗨,x == 1不是萬無一失,我必須檢查,是否x - 1 == 0」。

底線是,那!isZero是絕對萬無一失的。

至於INT到bool轉換,標準說,

算術,無作用域枚舉,指針,或指向構件類型的prvalue可以轉換爲bool類型的prvalue。零值,空指針值或空成員指針值被轉換爲false;任何其他值都將轉換爲true。對於直接初始化(8.5),std :: nullptr_t類型的prvalue可以轉換爲類型爲bool的prvalue;結果值是錯誤的。

0

C++對條件的要求非常寬鬆。它接受布爾值,它會隱式地將任何整數轉換爲布爾值(其中0爲false且非零爲真),並且它也會隱式地將任何指針轉換爲布爾值(因爲指針是無符號整數,在這種情況下,NULL將是錯誤的,並且任何其他指針都是正確的)。因此,以下全部評估爲真,以便執行。

int i = 4; 
char c = '0'; 
bool b = true; 
void * p = 0xdeadbeef; 
while (i) // ... 
while (c) // ... 
while (b) // ... 
while (p) // ... 

雖然以下不會評估爲true,所以while將不會執行。

int i = 0; 
char c = '\0'; 
bool b = false; 
void * p = NULL; 
while (i) // ... 
while (c) // ... 
while (b) // ... 
while (p) // ... 

根據C++,所有這些都是允許的。

當您在表達式中查看布爾值時,在其上放置==運算符是多餘的。無論上面的b是真是假,說while (b)是非常有意義的,你不需要while (b == true)。至於所有其他人,每個程序員都有自己的選擇。我個人的偏好是明確比較所有非布爾值。聲明int i = 5; while (i)在C++中可能是合法的,但它只是不清楚。我寧願看到int i = 5; while (i != 0)。這是沒有必要的,但不會花費您任何額外的處理器操作,並且對其意圖是明確的。

+0

對於這段代碼,如果else條件被執行,那麼當在while(!notZero)處檢查循環時,不會將notZero的值變回true,從而使得它成爲一個無限循環? – Bbvarghe

+0

在OP中給出的代碼中,是的,如果執行else條件,isZero將爲false,因此while(!isZero)將評估爲true,while循環將繼續。據推測,在「...」部分中,「輸入」被改變了。當輸入= 0時,isZero設置爲true,這將打破循環。 –