C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了C:将按位AND的结果分配给bool大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_618_0@
@H_618_0@
我在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

WTF?当它应该是按位AND与0x1的结果时,firstOk怎么能是244?我知道布尔值实际上存储为整数,但是我的按位AND怎么可能被忽略?因为它是244,所以当它应该是假的时候它被评估为真,这是问题的原因.

是不是将按位AND的结果赋给布尔值安全?这是一个gcc bug吗?或者我应该做以下的事情?

bool firstOk = (status & 0x1) ? true : false;

提前致谢.

@R_301_1964@

当你到达sleep()调用时,局部变量fi​​rstOk和secondOk不是“活动的”,所以即使它们已经被分配了堆栈槽,它们的值也不再存储在任何地方是完全可能的(而且很可能).

如果需要调试这些变量中的任何一个,则需要

>将它们重新声明为静态,这将从堆栈中分配持久存储
>将firstOk和secondOk的声明移动到外部作用域. (注意,这可能还不够,除非你将它们移到文件范围.)
>将firstOk和secondOk的值复制到外部作用域中的持久变量或变量,并检查它们.

在任何情况下,一旦完成调试过程,我将恢复上述任何调试措施.

本图文内容来源于网友网络收集整理提供,作为学习参使用,版权属于原作者。

大佬总结

以上是大佬教程为你收集整理的C:将按位AND的结果分配给bool全部内容,希望文章能够帮你解决C:将按位AND的结果分配给bool所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
猜你在找的C&C++相关文章