【发布时间】:2012-04-07 16:38:57
【问题描述】:
我假设这只是返回一个 int。还有什么我应该注意的吗? C/C++ 的区别?
float a = 2.5;
!a; // What does this return? Int? Float?
【问题讨论】:
-
可能的答案here
标签: c++ c floating-point logic logical-operators
我假设这只是返回一个 int。还有什么我应该注意的吗? C/C++ 的区别?
float a = 2.5;
!a; // What does this return? Int? Float?
【问题讨论】:
标签: c++ c floating-point logic logical-operators
关于 C++,引用 C++11 §5.3.1/9:
逻辑否定运算符
!的操作数根据上下文转换为bool;如果转换后的操作数为false,则其值为true,否则为false。结果的类型是bool。
所以 真正 相关的是 static_cast<bool>(some_float) 的行为 – 引用 §4.12/1:
算术、无作用域枚举、指针或指向成员类型的指针的纯右值可以转换为
bool类型的纯右值。零值、空指针值或空成员指针值转换为false;任何其他值都将转换为true。std::nullptr_t类型的纯右值可以转换为bool类型的纯右值;结果值为false。
将它们放在一起,2.5f 是一个非零值,因此将计算为 true,当它被否定时将计算为 false。即!a == false。
关于 C,引用 C99 §6.5.3.3/5:
如果其操作数的值比较不等于
0,逻辑否定运算符!的结果是0,如果其操作数的值比较等于0,则为1。结果类型为int。表达式!E等价于(0==E)。
即最终结果与 C++ 相同,但类型除外。
【讨论】:
! 的结果始终是int。
<!-- language: lang-ml --> 来强制语法高亮,但也有 <!-- language: lang-f#--> 那么为什么不使用它呢?
来自here
如果浮点数恰好为 0.0f,则浮点数将被转换为 false,
如果它不完全是 0.0f,这也是正确的!
Infinity 也将转换为 true。
【讨论】:
自己看看:
#include <iostream>
int main()
{
float a = 2.5;
if ( !a )
std::cout << !a << "\n";
else
std::cout << !a << "\n";
}
【讨论】:
if/else 块的两个分支都做同样的事情,也可能没有if/else。