【问题标题】:bool to int conversionbool 到 int 的转换
【发布时间】:2011-07-19 04:37:15
【问题描述】:

这种转换的可移植性如何。我可以确定两个断言都通过了吗?

int x = 4<5;
assert(x==1);

x = 4>5;
assert(x==0);

不要问为什么。我知道这很丑。谢谢。

【问题讨论】:

  • 你为什么不改变第一个表达式?你可以写assert(x!=0)。即使 bool(true) 转换为可移植到 int(1),“not false”断言也具有更易读的表达式。
  • 为什么不:assert( 4 &lt; 5);assert(!( 4 &gt; 5));
  • @harper:使用比较表达式的要求值是完全合理的。
  • @R._ 当问题是 bool 到 int 的转换是否给出了合理的结果时,我不会依赖这个。当作者怀疑此要求是否满足时,读者可能会遇到同样的问题。特别是因为 x 的值不是要检查的条件,而只是一个中间结果。
  • 如果我真的需要将布尔值转换为 0 或 1,我可能会写 (4 &lt; 5) ? 1 : 0。一个好的编译器可能会产生相同的机器代码,并且对于人类读者来说更清晰。

标签: c++ c c99


【解决方案1】:
int x = 4<5;

完全便携。符合标准。 boolint 的转换是隐式的!

C++ 11 或 14 标准的第 4.7/4 节,C++ 17 标准的第 7.8/4 节,20 标准的第 7.3.9/2 节说(积分转换

如果源类型为 bool,则值 false 被转换为零并且 true 的值被转换为 1


至于 C,据我所知,C 中没有 bool。(1999 年之前)所以 boolint 的转换仅在 C++ 中相关。在 C 中,4&lt;5 的计算结果为 int 值,在这种情况下,值为 14&gt;5 的计算结果为 0

编辑:Jens 在评论中说,C99 有 _Bool 类型。 bool 是在 stdbool.h 头文件中定义的宏。 truefalse 也是在 stdbool.h 中定义的宏。

C99 中的第 7.16 节说,

bool 扩展为 _Bool。

[..] true 扩展为整数常量 1, false 它扩展为整数常量 0,[..]

【讨论】:

  • 无论 C 语言的版本和 bool/_Bool 类型的可用性如何,C 中的关系运算符都会生成 int,而不是 bool。 IE。即使在 C99 中,关系运算符仍然产生 int
【解决方案2】:

您同时标记了您的问题 [C] 和 [C++]。不同语言的结果是一致的,但每种语言的答案结构不同。

在 C 语言中,您的示例与 bool 无关(这也适用于 C99)。在 C 语言中,关系运算符不会产生 bool 结果。 4 &gt; 54 &lt; 5 都是产生int 类型结果的表达式,其值为01。因此,在您的 C 示例中没有发生任何类型的“bool 到 int 转换”。

在 C++ 中,关系运算符确实会产生 bool 结果。 bool 值可转换为 int 类型,true 转换为 1false 转换为 0。这是由语言保证的。

附: C语言还有一个专用的布尔类型_Bool(宏别名为bool),其整数转换规则与C++中基本相同。但这与您在 C 中的具体示例无关。同样,无论语言规范的版本如何,C 中的关系运算符总是产生int(而不是bool)结果。

【讨论】:

  • 没错,K&R C 中没有 bool。我将我的问题重新标记为 C99。
  • @pic11:没有必要重新标记任何东西。它与 K&R 或任何其他 C 无关。即使 C99 中有 bool,关系运算符仍然在 C99 中产生 int,而不是 bool。因此,如果您特别感兴趣的是关系运算符(如您的示例中所示),那么问题仍然与 bool 无关。
  • 现在我明白了。关系运算符的结果可隐式转换为 int。这在 C、C99 和 C++ 中是正确的。再次重新定位。
  • @pic11:不,你不明白。在包括 C99 在内的 C 中,比较运算符的结果是 int,而不是 bool没有发生转化。
  • 是否有任何符合标准的方法可以使语言具有类似于bool 但不允许使用其地址的类型?许多嵌入式系统都使用这些类型(通常使用标识符bit 声明)。例如在中档 PIC,if (bitVar1) bitVar2=1; 将是两条指令; if (byteVar1) byteVar2=1; 的最佳编码至少是四个(在许多编译器上,可能是五个)。因此,此类类型可以显着提升性能。
【解决方案3】:

C 标准的第 6.5.8.6 节说:

每个运算符 (大于), = (大于或等于) 如果指定,则应产生 1 关系为真,如果是,则为 0 false。)结果的类型为 int。

【讨论】:

  • 感谢您的参考。由于历史原因,似乎 true==1。
【解决方案4】:

似乎没有问题,因为 int 到 bool 的转换是隐式完成的。这适用于 Microsoft Visual C++、GCC 和 Intel C++ 编译器。在 C 或 C++ 中都没有问题。

【讨论】:

  • “它在某些情况下有效”不是检查正确性的好方法,尤其是对于这些工具的未指定版本。我更喜欢其他答案中的方法;他们不能保证特定的实现是正确的,但他们可以保证正确的实现会做什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-24
  • 1970-01-01
  • 2015-12-01
  • 1970-01-01
  • 2014-09-19
相关资源
最近更新 更多