我在 C++ 中有以下循环,用 g++ 4.1.2 编译:
while(1) {
int status = getStatus();
bool firstOk = status & 0x1;
bool secondOk = status & 0x2;
if(firstOk != m_firstOk) {
logStatus(1, firstOk);
m_firstOk = firstOk;
}
if(secondOk != m_secondOk) {
logStatus(2, secondOk);
m_secondOk = secondOk;
}
sleep(1);
}
注意 logStatus() 是按值接收其参数的,所以参数不会被修改。m_firstOk 和 m_secondOk 当然是 bool 成员属性。
到目前为止,这一切都很好。我收到了一份报告,它没有检测到 firstOk 何时更改。我使用 gdb 附加到正在运行的进程。它在 sleep() 行中,当我看到以下内容时我感到很惊讶:
(gdb) p m_firstOk
$1 = true
(gdb) p m_secondOk
$2 = true
(gdb) p firstOk
$3 = 244
怎么回事?当 firstOk 应该是按位与 0x1 的结果时,它怎么可能是 244?我知道一个布尔值实际上存储为一个整数,但我的按位 AND 怎么能被忽略呢?由于它是 244,当它应该为假时,它被评估为真,这就是问题的原因。
不是将按位与的结果分配给布尔安全吗?这是一个 gcc 错误吗?或者我应该做如下的事情?
bool firstOk = (status & 0x1) ? true : false;
提前致谢。