当你逻辑不是浮点数时会发生啥?
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
;任何其他值都将转换为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++ 相同,但类型除外。
【讨论】:
谢谢!我认为这意味着在 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";
【讨论】:
“自己看”的问题是你可以观察到未定义或实现定义的行为,它只告诉你在你的特定平台/编译器上发生了什么,这在知道会发生什么时没有用就定义明确的行为而言。 你不能从“实现定义的”行为中“期待”任何东西。那么,“定义明确”对您意味着什么? 没错,这就是为什么如果行为是实现定义的,“自己看”是一个无用的答案。感谢您同意我的观点。 :-Pif
/else
块的两个分支都做同样的事情,也可能没有if
/else
。以上是关于当你逻辑不是浮点数时会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章
C++编程 CString用atof转换成float时,值从0.39999变成了0.39998999.请问是啥问题?该怎么解决?