如果你不是浮动的话,会发生什么?

时间:2012-03-23 03:26:09

标签: c++ c floating-point logic logical-operators

我认为这只会返回一个int。还有什么事情我应该知道吗? C / C ++差异?

float a = 2.5;
!a; // What does this return? Int? Float?

3 个答案:

答案 0 :(得分:36)

关于C ++,引用C ++11§5.3.1/ 9:

  

逻辑否定运算符!的操作数在上下文中转换为bool;如果转换后的操作数为true,则其值为false,否则为false。结果的类型为bool

那么真正相关的是static_cast<bool>(some_float)的行为 - 引用§4.12/ 1:

  

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

将这些组合在一起,2.5f是一个非零值,因此将评估为true,否定时将评估为false。即,!a == false


关于C,引用C99§6.5.3.3/ 5:

  

逻辑否定运算符!的结果是0,如果其操作数的值不等于01,如果其操作数的值比较等于0。结果的类型为int。表达式!E相当于(0==E)

即。除了类型之外,最终结果与C ++相同。

答案 1 :(得分:8)

来自here

如果一个浮点数恰好为0.0f,则转换为false 如果它不是真的0.0f,那也是如此 Inifinity也将转换为true。

答案 2 :(得分:0)

亲眼看看:

#include <iostream>

int main()
{
   float a = 2.5;

   if ( !a )
       std::cout << !a << "\n";

   else
       std::cout << !a << "\n";
}