【问题标题】:Why do isnan, isinf, and isfinite return an int and not a bool?为什么 isnan、isinf 和 isfinite 返回一个 int 而不是 bool?
【发布时间】:2012-07-13 16:50:35
【问题描述】:

isnan 返回一个整数...nonzero value if arg is NaN, ​0​ otherwise。为什么它不返回一个布尔值?这不是一些遗留的东西,它是 C++11 的新东西。

【问题讨论】:

  • 可能是因为这来自 C 没有 boolean 类型的日子...

标签: c++ floating-point c++11 nan infinite


【解决方案1】:

为了澄清,isnan、isinf 在 C99 中作为宏添加为 int 表达式。因此,为了 C 兼容性,将它们添加为返回 int 的函数是有意义的。

http://www.cplusplus.com/reference/cmath/isnan/

C99 C++11

在 C 中,这被实现为一个返回 int 值的宏。这 x 的类型应为 float、double 或 long double

【讨论】:

    【解决方案2】:

    遗留的东西,这些都可以在<cmath> 中找到,这是放在std 命名空间中的C 标准库<math.h>。 C 没有原生的 bool 类型。1

    虽然这些确实是 C++11 的添加,但它们本质上是在提取 C99 中添加到 <math.h> 的内容。


    1。对于那些即将抱怨的人,C99 的bool 实际上是一个宏。有一个 _Bool,但我猜 C99 作者选择不将它用于 isnanet al.,以便与 <math.h> 中的其他内容保持一致。

    【讨论】:

    • C99 的类型 _Bool 不是宏,因为 _Bool 是 C99 关键字。
    • 那么关于 bool 的评论就没有任何意义了。 isnan 可以返回 _Bool(或 #defined 到 _Bool 的 bool)。我认为不是因为 C99 isnan 是基于更早的非标准定义,其中确实没有 bool 类型。
    • @bames53:关于 bool 的评论只是一个免责声明,以防止人们质疑我关于 C99 没有 bool 类型的说法。我同意,C99 的 isnan 可能可以被定义为返回 _Bool,但这将是关于 C 的问题的讨论......
    • @bames53:啊,我现在明白你的意思了。脚注已调整!
    • 我一直认为 isnan 来自 BSD 4.3 倍......无论如何,如果在 C 中定义为“比较不等于 0”吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-23
    • 1970-01-01
    • 2013-06-09
    • 1970-01-01
    • 2016-05-28
    • 1970-01-01
    相关资源
    最近更新 更多