【发布时间】:2014-04-24 12:03:14
【问题描述】:
这是我的代码:
#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,其他编译器可能会采用不同的方式。
【问题讨论】:
-
哇,但你为什么还要...
-
看来这个问题至少在 GCC 4.6 Demo 中得到了修复。
-
LLVM 5.1 (clang-503.0.38) 也没有出现这个问题。
-
允许编译器假定
bool值是true或false,因为bool只能具有这些值。 (非零整数值转换为 - 不视为 -true无关紧要,因为此代码中没有进行任何转换。) -
@flyx:未定义的行为.. 无人登陆。一切顺利