<分区>
考虑下面的程序。
所有与最近的 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有效。