为什么空字符串文字被视为true?

D M*_*hta 25 c++ string if-statement

为什么这段代码中的条件true

int main ( )
{

   if ("")
      cout << "hello"; // executes!

   return 0;
}
Run Code Online (Sandbox Code Playgroud)

dlf*_*dlf 31

如果条件评估为0 *以外的任何条件,则该条件被视为"真" .""是一个包含单个\0字符的const char数组.要将此值作为条件进行评估,编译器将"衰减"数组const char*.由于const char[1]它不位于地址0,因此指针非零并且满足条件.


*更确切地说,如果它true在被隐式转换为之后进行评估bool.对于简单类型,这与非零相同,但对于类类型,您必须考虑是否operator bool()已定义及其作用.

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

4.12布尔转换[conv.bool]

算术,无范围枚举,指针或指向成员类型的指针的prvalue可以转换为bool类型的prvalue.零值,空指针值或空成员指针值转换为false; 任何其他值都转换为true.类型为std :: nullptr_t的prvalue可以转换为bool类型的prvalue; 结果值为false.

  • 这是一个`const char [1]`. (11认同)
  • 是的,它衰败了,但它不是一个开头的指针.由于整个字符串文字是指针,事情是如此常见的误解,我觉得澄清是很重要的. (4认同)
  • @chris它是,但要被评估为一个条件,它必须转换为`const char*`,对吗? (2认同)

TNA*_*TNA 5

因为""衰减为 achar const*并且所有非空指针true在转换为布尔值时都会计算为 if 或 。