【问题标题】:Summing bool values in C/C++在 C/C++ 中对布尔值求和
【发布时间】:2011-12-01 11:30:32
【问题描述】:

考虑下面的 C++ 代码:

bool a = 5;
bool b = 6;
int c = (int)a + (int)b;

当我编译并运行此代码时,c 的值为 2。标准是否保证在任何编译器/平台中,使用 false (0) 或 true(不一定为 1)初始化的 bool 值在操作和代码中将为 1以上将始终导致 c 为 2?

在 C99 中,包括 stdbool.h,它仍然有效吗?

【问题讨论】:

  • 我猜你的答案在这里:stackoverflow.com/questions/2725044/…
  • IMO,如果您将除 true/false 以外的其他内容分配给 bool 变量,则应该对它进行代码审查。
  • 感谢@AlessandroPezzato 找到重复项
  • @Alessandro Pezzato 在那个问题中,他询问的是键值 true,而不是分配了非 0 或 1 值的变量。
  • @Max 通常会看到代码直接将指针分配给布尔值,以检查它是否不为 NULL。我知道首先与 NULL 进行比较是一种很好的做法,但有时人们在编码时会变得懒惰,只是对它进行评估。

标签: c++ c99


【解决方案1】:

C++ 标准的第 4.7 节(整数版本)说:

如果源类型为bool,则false值转换为 零,值 true 转换为一。

第 4.9 节对浮点转换做出同样的保证。

【讨论】:

  • 谢谢,这个答案适用于 C++,但这对 C99(带有 stdbool)也有效吗?
【解决方案2】:

对于编译器,规则通常是 false 为 0,其他任何值都为 true。但是,将 bool 视为整数类型通常被认为是错误的形式。然而,该标准包含一个转换为 int 的规则,只要编译器遵守标准,您的假设是正确的 false = 0 和 true = 1!

无论如何,为什么要使用 bool 类型进行算术运算?

希望有帮助

【讨论】:

  • bool 类型的算术运算有助于编写更少的代码,因此您可以编写 x += a;,而不是 x += (a ? 1 : 0);。
  • 为什么不使用 x |= a;甚至 x = x ||一种;对底层类型都很好并且尊重
  • 如果 x 是一个 int,计算有多少(一组布尔值)是真的?我知道有一些方法可以解决,但由于这看起来更简单,所以我问这个问题是否会一直有效。
  • @fbafelipe:写更少的代码是从不我的目标。我想编写易于维护、易于理解且性能良好的代码。有时短代码可以满足这些目标。对布尔值进行算术运算永远不会。
  • 数组可能对布尔值有专门化,可以优化内存,在这种情况下,它可能是首选而不是另一种类型的数组(很可能在计算时间的范围内,但你不应该假设人们需要)。
【解决方案3】:

按照标准:

  • true 转换为 1
  • false 转换为 0

并且他不需要转换为int,因为转换为int 是隐式的。

【讨论】:

    【解决方案4】:

    David Schwartz 已经回答了 C++。对于 C99 标准,我们有 6.3.1.4:

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

    由于标准的 6.3.1.1 还明确指出 _Bool 受整数提升的影响,很明显 _Bool 将始终为 0 或 1。

    【讨论】:

      猜你喜欢
      • 2012-06-05
      • 2017-08-14
      • 1970-01-01
      • 2013-11-04
      • 1970-01-01
      • 1970-01-01
      • 2010-12-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多