为什么C++允许将算术或枚举值隐式转换为布尔值?

Nav*_*K N 2 c++ boolean

C++标准在第4.12节中说

算术,枚举,指针或指向成员类型的指针的右值可以转换为bool类型的右值.将零值,空指针值或空成员指针值转换为false,将任何其他值转换为true.

这意味着以下代码有效,

if(5)
  std::cout << "WOW!";
Run Code Online (Sandbox Code Playgroud)

它在语法上是有效的,但在语义上它没有任何意义.我的问题是为什么C++允许这样奇怪的事情?AFAIK,它没有任何优势而不是混淆.

Joh*_*don 21

认为这是历史性的,也是C用于评估bool概念的副产品......

C没有使用布尔类型,并且在C的"向下到金属"范例中,设置为NULL的指针和数字类型等也是隐式的false.

如果你认为它是'没有/零== false'和'其他任何东西== true'它确实有意义.

  • 并且C使用0 == false,而不是0 == true的原因是处理器实际上没有任何数据类型 - 只是不同大小的寄存器(如果你很幸运).硬件支持的"布尔"运算在寄存器中归结为0或非零.C只是让程序员可以看到.请记住,C可以被认为是一种高级汇编语言,它非常有意义. (7认同)

Art*_*yom 7

实际上,在许多语言中,包括C/Python/Perl/BASIC非零整数/指针值总是被认为是真的,0被认为是假的.

这是许多编程语言中的已知约定,因此没有理由,为什么这不适用于C++?

问题是为什么在Java中不是这样?

  • 可能迫使程序员在逻辑条件下显式化并使代码更具可读性. (3认同)