【问题标题】: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

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


【解决方案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
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-05
  • 2013-04-29
  • 2015-09-21
  • 1970-01-01
  • 2013-10-16
  • 2019-01-19
  • 2010-09-15
相关资源
最近更新 更多