这是我的代码:
#include <cstring>
#include <iostream>
int main() {
bool a;
memset(&a, 0x03, sizeof(bool));
if (a) {
std::cout << "a is true!" << std::endl;
}
if (!a) {
std::cout << "!a is true!" << std::endl;
}
}
它输出:
a is true!
!a is true!
bool
上的!
运算符似乎只反转最后一位,但每个不等于0
的值都被视为true
。这导致了所显示的行为,这在逻辑上是错误的。这是实现中的错误,还是规范允许这样做?请注意,可以省略memset
,因为a
包含内存垃圾,所以行为可能是相同的。
我使用的是gcc 4.4.5,其他编译器可能会有不同的做法。
发布于 2014-04-24 20:11:00
这不是“逻辑上的错误”,而是一种未定义的行为。bool
应该只包含两个值中的一个:true
或false
。为其赋值将导致转换为这些值之一。在内存之上写入一个任意字节值(或者,正如您所提到的,让它保持未初始化)将不会破坏类型安全,因此您很可能最终得到一个既不是true
也不是false
的值。
发布于 2014-04-26 17:31:31
在内部,它可能使用逐位not (~
运算符)来反转它,这将在布尔值为0或全1时起作用:
a = 00000000 (false)
!a = 11111111 (true)
但是,如果将其设置为三:
a = 00000011 (true)
!a = 11111100 (also true)
https://stackoverflow.com/questions/23268357
复制相似问题