C++中的if语句是如何评估的?

41

if ( c )if ( c == 0 )在C++中是等价的吗?


2
请记住,0并不总是表示相同的含义。它可以是空指针常量或整数零。 - David Thornley
6
你的意思是“在C++中,if(c)和if(c != 0)是一样的吗?”吗? - Peter Mortensen
1
变量c是特定类型的吗? - Peter Mortensen
Just int。但是如果 c 是一个指针会发生什么呢?'if (c)' 检查 c 是否指向某个东西? - derrdji
3
@derrdji,它正在和int类型的值0进行比较。根据变量c的类型,会出现不同的情况。如果c是一个类的对象,则会调用其重载的operator==函数。如果c是一个double类型,则整数将被转换为double类型。如果c是一个指针,则整数将被转换为null指针,并且与null指针的比较将检查c是否指向其类型的有效对象(或函数)。需要注意的是,在所有情况下,0始终是相同的,并且始终具有相同的含义。它只能转换为许多不同的东西。 - Johannes Schaub - litb
可能是在C/C++中负数返回false吗?的重复问题。 - Archmede
7个回答

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

10
假设没有发生任何奇怪的重载(overloading)情况,这通常是C++答案的一部分。 - David Thornley
6
当然,如果操作符“==”或“!=”被重载了,那么任何事情都有可能发生,甚至会为您播放国歌...;-) - Jesper
9
未来某一天,我会开设一个课程,通过重载运算符播放声音效果。每当有人想要对它们进行排序时,这将是非常棒的体验。 - rlbond

25

在这个问题上,我会与众不同... "if (c)" 最接近的是 "if (((bool)c) == true)"。对于整数类型,这意味着 "if (c != 0)"。正如其他人指出的那样,重载 operator != 可能会导致一些奇怪的问题,但是除非我错了,重载 "operator bool()" 也可能会导致类似问题。


1
问题最初只被标记为C语言,因此上述答案是基于C语言的,因为C语言中没有bool类型。 - Brian R. Bondy
4
如果(static_cast<bool>(c))...我要去拿我的外套。 - alex tingle
或者使用 if(bool cond = c) ...; 来显示隐式转换。 - Johannes Schaub - litb

7
如果 c 是一个指针或者数字值,
if( c )

等同于

if( c != 0 )

如果c是一个布尔值(类型为bool [仅限C ++]),(编辑:或者是重载了operator bool()的用户定义类型)
if( c )

等同于

if( c == true )

如果c既不是指针也不是数值,也不是布尔值,
if( c )

无法编译。


3
可以将其翻译为:“这是一个用户定义的类型,可以像D.Shawley和galets都指出的那样实现operator bool(),这样它就可以成功编译了。” - Troubadour
精确的,我将其添加到解释中 - Patrice Bernassola

3

这更像是 if ( c != 0 )

当然,!= 操作符可以被重载,因此说这两者完全相等并不十分准确。


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");
}

0

如果你把== 0改成!= 0,那么它们就是相同的。


if语句被定义为接受任何非零值作为真。所以是的,它是相同的。 - Zan Lynx

-5
如果 c 是一个指针,那么测试
if ( c )

不完全相同

if ( c != 0 )

后者是针对指针 c 与 0 (null)的简单检查,而前者实际上是一条指令,用于检查 c 是否指向有效对象。 通常编译器生成相同的代码。

不是的,如果指针的情况下,两者完全相同:if( c != NULL ) - Massa
在C或C++中,编译器和/或运行时无法知道对象是否有效。 你可以这样写: "X* c = (X*)1;" 然后c几乎肯定指向一个无效的对象。并且 "if(c)"将为真。 - Andrew Stein
@Andrew:我怀疑你无法证明你的说法,即没有办法检查对象是否有效。当然,编译器需要花费大量的精力来生成运行时代码进行检查,这就是为什么编译器不费心并生成相同的代码,即针对空指针进行测试。这就是为什么你的例子在(可能)所有当前的编译器上都无法产生错误结果的原因。 - Troubadour
1
@Massa: 很抱歉,我的参考资料是Bjarne Stroustrup(C++的创造者)所著的《The C++ Programming Language, Special Edition》中的第6.3.2节(选择语句)。你的参考资料是什么? - Troubadour
将对象指针与空指针进行比较可以检查它是否指向有效对象,而“有效对象”意味着“具有非空指针地址的对象”。 - Johannes Schaub - litb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接