2009-09-25 87 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