当你逻辑不是浮点数时会发生啥?

Posted

技术标签:

【中文标题】当你逻辑不是浮点数时会发生啥?【英文标题】:What happens when you logical not a float?当你逻辑不是浮点数时会发生什么? 【发布时间】:2012-04-07 16:38:57 【问题描述】:

我假设这只是返回一个 int。还有什么我应该注意的吗? C/C++ 的区别?

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

【问题讨论】:

可能的答案here 【参考方案1】:

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

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

所以 真正 相关的是 static_cast<bool>(some_float) 的行为 – 引用 §4.12/1:

算术、无作用域枚举、指针或指向成员类型的指针的纯右值可以转换为bool 类型的纯右值。零值、空指针值或空成员指针值转换为false;任何其他值都将转换为truestd::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++ 相同,但类型除外。

【讨论】:

谢谢!我认为这意味着在 C 中我会得到一个 int? @NathanFig:对,C 语言中! 的结果始终是int @ildjarn 我看到你在 F# 编辑中使用 <!-- language: lang-ml --> 来强制语法高亮,但也有 <!-- language: lang-f#--> 那么为什么不使用它呢? @CetinSert :当我第一次开始使用 SO 时,只有前者有效,我只是出于习惯继续使用它。 :-] @CetinSert:谢谢。 :-] 联系某人的另一个选项是转到Chat.SO 并创建一个新房间,然后转到该人的聊天资料并向他们发送该房间的邀请(它会向他们显示收件箱通知)。 【参考方案2】:

来自here

如果浮点数恰好为 0.0f,则浮点数将被转换为 false, 如果它不完全是 0.0f,这也是正确的! Infinity 也将转换为 true。

【讨论】:

我不确定无穷大的否定,所以我在这里查看了输出ideone.com/WWoJB#view_edit_box 如果正好 +0.0f,-0.0f 有一个位设置,倒置仍然有一个位设置 @dwelch 我不知道,我猜你每天都会学到一些新东西 我的理解是你可以让指数和尾数仍然显示为零的符号位。【参考方案3】:

自己看看:

#include <iostream>

int main()

   float a = 2.5;

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

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

【讨论】:

“自己看”的问题是你可以观察到未定义或实现定义的行为,它只告诉你在你的特定平台/编译器上发生了什么,这在知道会发生什么时没有用就定义明确的行为而言。 你不能从“实现定义的”行为中“期待”任何东西。那么,“定义明确”对您意味着什么? 没错,这就是为什么如果行为是实现定义的,“自己看”是一个无用的答案。感谢您同意我的观点。 :-P if/else 块的两个分支都做同样的事情,也可能没有if/else

以上是关于当你逻辑不是浮点数时会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章

python浮点数是啥意思

c语言NULL是啥意思?

浮点数定义到底是啥意思啊?求教!

C++编程 CString用atof转换成float时,值从0.39999变成了0.39998999.请问是啥问题?该怎么解决?

请问java提供啥方法实现将一个浮点数,四舍五入只保留小数点后两位

应该按啥顺序添加浮点数以获得最精确的结果?