c++ - 在 bool 中写入非 0 或 1 的值是 UB 吗?如果是,他们如何比较?

标签 c++ memory boolean equality

<分区>

考虑下面的程序。

所有与最近的 gcc 的比较都是正确的,但只有值 1 与适用于 x86 的 Visual Studio 命令行编译器 v. 19.16.27031.1 比较相等。

我认为通过字符指针写入 POD 通常是可以的;但是标准中是否有关于将有趣的值写入 bool 变量的措辞?如果允许,是否有关于比较行为的措辞?

#include <iostream>
using namespace std;

void f()
{
   if(sizeof(bool) != 1)
   {
      cout << "sizeof(bool) != 1\n";
      return;
   }

  bool b;

  *(char *)&b = 1;
  if(b == true) { cout << (int) *(char *)&b  << " is true\n"; }

  *(char *)&b = 2;
  if(b == true) { cout << (int) *(char *)&b  << " is true\n"; }

  *(char *)&b = 3;
  if(b == true) { cout << (int) *(char *)&b  << " is true\n"; }
}

int main()
{
    f();
}

附言gcc 8.3 使用 test 指令有效地检查非零值,而 gcc 9.1 明确地与 1 进行比较,只使比较结果为真。也许这个godbolt link有效。

最佳答案

没有。这不行。

在 bool 中写入任意数据非常困难(参见 What is the strict aliasing rule? )并且类似于 Does the C++ standard allow for an uninitialized bool to crash a program?

*(char *)&b = 2;

这种类型的双关黑客调用 UB。根据您对 bool 的编译器实现及其允许进行的优化,您可以拥有 demons flying off your nose .

关于c++ - 在 bool 中写入非 0 或 1 的值是 UB 吗?如果是,他们如何比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56776375/

相关文章:

C++ 构造函数和隐式字符串转换

c++ - 在屏幕上绘制单个像素

javascript - NodeJS 如何处理内存?

java - Java 中的结果集

python - 什么会阻止过滤器返回 0?

c++ - 链接计算着色器

c++ - 在Cmake中构建Assimp时出错

c - 如果线程在释放内存之前被杀死,如何释放线程分配的内存?

iphone - ios - 内存警告和崩溃

java - 在另一种方法中更改 boolean 值?