2009-09-25 85 views
27

if (c)在C++中與if (c == 0)相同嗎?在C++中如何評估語句?

+2

請記住,0並不總是意味着同樣的事情。它可以是空指針常量或整數零。 – 2009-09-25 19:37:06

+3

難道你不是指「如果(c)與C++中的if(c!= 0)一樣嗎?」 ? – 2009-09-25 21:10:50

+0

是特定類型的變量c嗎? – 2009-09-25 21:15:48

回答

44

不,if (c)if (c != 0)相同。 而if (!c)if (c == 0)相同。

+9

假設沒有奇怪的重載地方,這往往是C++中答案的一部分。 – 2009-09-25 19:38:54

+6

當然,如果運營商==或!=超載,任何事情都可能發生,它甚至可能會開始爲你播放國歌...... ;-) – Jesper 2009-09-26 06:27:09

+9

其中一個這樣的日子,我要做一個讓操作符重載的類發揮音效。每次有人想對它們進行排序都會很棒。 – rlbond 2009-11-05 05:59:41

3

它更像if (c != 0)

當然,!=操作可以被重載,所以它不是完全準確的說,這些是完全平等的。

0

是的,如果將== 0更改爲!= 0,它們是相同的。

+0

呃,不,他們不是。 – Aistina 2009-09-25 19:21:11

+0

if語句被*定義爲接受任何非零值爲真。所以是的,它是一樣的。 – 2009-09-25 19:57:17

21

我會打破這一個包...「if (c)」是最接近「if (((bool)c) == true)」。對於整數類型,這意味着「if (c != 0)」。正如其他人指出的那樣,超載operator !=可能會造成一些奇怪的現象,但是如果我錯了,也可以重載「operator bool()」。

+1

這個問題最初是用C標記的,因此上面的答案,因爲C中沒有bool。 – 2009-09-25 19:44:10

+3

if(static_cast (c))...我會穿上我的大衣。 – 2009-09-25 21:40:58

+0

C99有Bool ... – rlbond 2009-09-25 22:54:40

0

這僅適用於數值。如果c是類,必須有重載操作,其不轉換布爾值,如在這裏:

#include <stdio.h> 

class c_type 
{ 
public: 
    operator bool() 
    { 
     return true; 
    } 
}; 

int main() 
{ 
    c_type c; 
    if (c) printf("true"); 
    if (!c) printf ("false"); 
} 
6

如果c是一個指針或數值,

if(c) 

相當於

if(c != 0) 

如果c是一個布爾(bool類型[只有C++]), (編輯:或用戶定義的類型與操作布爾()的過載)

if(c) 

相當於

if(c == true) 

如果c是也不指針或數字值既不是布爾值,

if(c) 

不會編譯。

+2

它是一個用戶自定義的類型,可以像D. Shawley和galets一樣實現'operator bool()',這樣它就可以很好地編譯。 – Troubadour 2009-09-25 20:39:39

+0

確切的說,我把它加到解釋 – 2009-09-25 22:49:13

-5

如果c是一個指針,則測試

if (c) 

是不太一樣

if (c != 0) 

後者是c一個簡單的檢查針對0(空)指針而前者實際上是檢查c是否指向有效對象的指令。通常編譯器會生成相同的代碼。

+0

不,它不是......它們在指針的情況下意味着完全相同:if(c!= NULL) – Massa 2009-09-25 22:38:06

+0

編譯和/或運行時沒有辦法知道對象在C或C++中是否有效。 你可以這樣寫: 「X * c =(X *)1;」 然後c幾乎可以肯定指向一個無效的對象。並且 「if(c)」將成立。 – 2009-09-26 04:47:21

+0

@Andrew:我懷疑你可以證明你的陳述證明沒有辦法檢查對象是否有效。當然,編譯器需要很多努力來生成運行時代碼來檢查,這就是爲什麼編譯器不會打擾並生成相同的代碼,即針對空指針進行測試。這就是爲什麼你的例子不能在(可能)所有當前編譯器上產生錯誤結果的原因。 – Troubadour 2009-09-26 08:06:23