C++ 比较运算符不返回 true 或 false

标签 c++ operators logical-operators compiler-bug

我有以下程序

int a = 216;
bool* v = (bool*)((void*)&a);
std::cout << (*v == true) << endl;

我希望这个程序打印出 true 或 false,但它却打印出 216。我用 g++ (Ubuntu 4.8.2-19ubuntu1) 4.8.2 编译了它。它是预期的行为还是一些错误?为什么相等运算符返回的类型与 bool 不同?

--------编辑--------

我的意图不是强制转换为 void 而是让 v 在其内存位置存储 216。替代程序可能如下所示:

bool v;
int a = 216;
memcpy(&v, &a, sizeof(bool));
std::cout << (v == true) << endl;

或者我可以使用指向某个随机值的未初始​​化的 bool 指针,例如216.

最佳答案

在将指针转换为 void* 之后,您唯一可以做的事情就是将其转换回原始指针类型(在您的例子中为 int*)。不过,您将其转换为 bool*,这会将您带入未定义行为 的领域。或者,换句话说,您不能期望任何事情以某种方式发生。

您可能认为摆脱对 void* 的转换将解决此问题。但是,在将指针转换为不同的指针类型后取消引用指针也会导致未定义的行为。

虽然这样可以很容易地实现预期的输出:

bool v = (bool) a;
std::cout << (v == true) << std::endl;

关于C++ 比较运算符不返回 true 或 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26465234/

相关文章:

c++ - 需要在C++中将txt文件转换成二进制文件

if 条件下的 Python pandas : crash unknown

c++ - Kinect body 跟踪 GetAndRefreshBodyData 返回错误

c++ - OpenMP C++ GCC 基本例程

javascript - JavaScript 如何处理++ 运算符?

php - 为什么 1++ + 1 在 php 中计算结果为 2?

ios - 在 reduce 中使用逻辑运算符作为组合闭包

c++ - 条件评估是否优化?这段代码不好吗?

c++ - basic_string::_M_construct null 在构造字符串的子 vector 后无效

math - 是否存在允许您定义新运算符的强类型编程语言?