【问题标题】:Cast to bool: `!!` vs `(bool)`转换为布尔值:`!!` vs `(bool)`
【发布时间】:2019-03-02 12:50:14
【问题描述】:

使用!!x(bool)x 有什么区别吗?

假设__STDC_VERSION__ >= 199901L#include <stdbool.h>

他们是否都保证结果是01,并且无论x 的大小和值如何,都不会发生溢出?

【问题讨论】:

  • (bool)x 是 bool 的真实状态(如果 x 不为零),但这与 1 不完全相同
  • bool 有两种状态,您可以随意称呼它们,但我希望清楚我所说的“真实状态”指的是哪一种。该标准没有给出各州的官方名称
  • 表达式while(x) /*...*/;while(!!x) /*...*/;while((_Bool)x) /*...*/;是等价的。我更喜欢第一个。 ifforcondition 部分相同。
  • 更多的是当您出于某种原因实际需要号码1时。
  • (bool)2 == 1 为真,因为整数提升将(bool)2 带到(int)1

标签: c casting boolean


【解决方案1】:

!!x(在 C 中,而不是 C++ 中)具有类型 int(bool)x(包括<stdbool.h>)的类型为_Bool。 虽然_Bools 很快就会被提升为ints,但可以从_Generic 内部区分两者。

!!x(或等效的0!=x)将始终为01(bool)x 将始终为(bool)0(bool)1,如果它编译(=不违反任何约束)和x 已定义,它总是会被很好地定义。

!!x+INT_MAX(bool)x+INT_MAXbool 提升为 int)等表达式中的溢出仍然是一个问题。


参考资料:

6.3.1.2: (_Bool)x (_Bool)(0!=x)

1 当任何标量值转换为 _Bool 时,如果 值比较等于 0;否则,结果为 1.59)

( 6.2.5p18, 6.2.5p21 -- 标量是数字类型或指针

整数和浮点类型统称为算术类型。 ...

算术类型和指针类型统称为标量 类型。 ... )

6.5.3.3p5: !!x 0!=x

逻辑否定运算符的结果!如果它的值是 0 操作数比较不等于 0,如果其操作数的值比较,则为 1 等于 0。结果的类型为 int。表达式 !E 是等价的 到 (0==E)。

【讨论】:

  • 请同时回答问题的第二部分,这对于大多数用例来说也是最重要的。
  • @CacahueteFrito OK
猜你喜欢
  • 2021-06-27
  • 2018-01-24
  • 1970-01-01
  • 2011-12-26
  • 1970-01-01
  • 1970-01-01
  • 2014-09-07
  • 2016-04-27
  • 2012-02-25
相关资源
最近更新 更多