为什么空字符串字面值被视为真?

Why is an empty string literal treated as true?

本文关键字:字符串 字面值 为什么      更新时间:2023-10-16

为什么这个代码中的条件是true ?

int main ( )
{
   if ("")
      cout << "hello"; // executes!
   return 0;
}

一个条件被认为是" true ";如果它的值不是0*""是包含单个字符的const字符数组。为了将其作为条件求值,编译器会"衰减"。将阵列切换到const char*。由于const char[1]不位于地址0,因此该指针非零,条件满足。


*更准确地说,如果它在隐式转换为bool后求值为true。对于简单类型,这相当于非零,但对于类类型,您必须考虑是否定义了operator bool()以及它的作用。

§4.12来自c++ 11草案规范:

4.12布尔转换[conv.bool]

可以是算术、无作用域枚举、指针或指向成员类型的指针的右值转换为bool类型的右值。零值,空指针值,或null成员指针值转换为false;任何其他值为转换为真。可以转换std::nullptr_t类型的右值返回bool类型的右值;结果值为false。

因为""会衰减为char const*,而所有非空指针在转换为布尔值时都是true

您可能来自PHP这样的语言,其中检查的处理方式不同:

 php -r 'echo "X";if ("") echo "Y";'

这将打印X,但不打印Y,因为空字符串没有值。

正如其他人指出的,在c++中,它是一个非空指针,因此计算为true。