为什么此代码中的条件为true
?
int main ( )
{
if ("")
cout << "hello"; // executes!
return 0;
}
答案 0 :(得分:31)
如果条件评估为0 * 以外的任何条件,则该条件被视为“真”。 ""
是一个包含单个\0
字符的const char数组。要将此值作为条件进行评估,编译器会将数组“衰减”为const char*
。由于const char[1]
不在地址0,因此指针非零并满足条件。
* 更确切地说,如果在隐式转换为true
后评估为bool
。对于简单类型,这与非零相同,但对于类类型,您必须考虑是否定义了operator bool()
及其作用。
§4.12:
4.12布尔转换[conv.bool]
算术,无范围枚举,指针或指向成员类型的指针的prvalue可以是 转换为bool类型的prvalue。零值,空指针值, 或null成员指针值转换为false;任何其他价值 转换为真。可以转换类型为std :: nullptr_t的prvalue 对于bool类型的prvalue;结果值为false。
答案 1 :(得分:3)
因为""
衰减到char const*
,并且所有非空指针在转换为布尔值时转换为true
。
答案 2 :(得分:0)
你可能来自像PHP这样的languange,其中检查处理不同:
php -r 'echo "X";if ("") echo "Y";'
这将打印X,但不打印Y,因为空字符串没有值。
正如其他人所指出的那样,在C ++中它是一个非空指针,所以评估为真。