C 为什么我的一些代码被跳过了?

C 为什么我的一些代码被跳过了?,c,C,当我在调试器中单步执行程序时,程序显示出一些奇怪的行为。在下面的摘录中,它检查pktNum!=~invPktNum然后直接进行第二次返回1语句 调试器显示pktNum是一个无符号字符,为0x01;invPktNum是一个无符号字符,为0xFE /* Verify message integrity. */ if (pktNum != ~invPktNum) { return 1; } ccrc = crc16_ccitt(msg, XModem_Block_Size); if ( (((

当我在调试器中单步执行程序时,程序显示出一些奇怪的行为。在下面的摘录中,它检查
pktNum!=~invPktNum
然后直接进行第二次
返回1语句

调试器显示
pktNum
是一个无符号字符,为0x01;
invPktNum
是一个无符号字符,为0xFE

/* Verify message integrity. */
if (pktNum != ~invPktNum) {
    return 1;
}
ccrc = crc16_ccitt(msg, XModem_Block_Size);
if ( (((ccrc>>8) & 0xFF) != crcBuf[0]) 
    || ((ccrc & 0xFF) != crcBuf[1]) ) {
    return 1;
}

你是在比较整数和布尔。这种风格一开始就很糟糕,一些编译器会抱怨


也许你把
搞错了
~
<代码>!如果invPktNum为非false,则invPktNum
将返回false;如果invPktNum为false,则返回true。我很确定你的意思是
~invPktNum

!(0xFE)
0
。也许你想要的是
~(0xFE)

一元
不符合逻辑。如果操作数为
0
,则结果为
1
,否则结果为
0
。这意味着
!invPktNum
0
,因此
if
表达式为true

您可能正在查找一元
~
,它不是按位的



顺便说一下,它可能出现在调试器中,好像第二个
返回1而不是第一个,因为编译器可能已对代码重新排序,并将这两个
组合起来返回1语句放在一起(特别是在启用优化的情况下)。

编译器已将两个
return 1
案例折叠成完全相同的代码。两个
if
测试分支到相同的汇编指令。对于调试器,每条指令只能标记一个行号,因此您可以看到这种奇怪的行为。如果使用
-g
编译,而不使用
-O
(或者更明确地使用
-O0
)编译,则会产生不同的情况,事情会更清楚。

检查编译器优化在调试模式下肯定被禁用。(只是为了与众不同)

这是
的结果
是一个
int
。哦,我的天啊!它完全按照你告诉它的做了-它测试了0x1!=0,然后返回1。停止印刷!对不起,我是说“~”。我把它改成了因为我认为0x01和~0xFE是相等的,但我的代码似乎仍然不这么认为。但是没有-g就没有行号,对吗?我想说的是,更重要的是禁用编译器标志中的任何-O。不过,这仍然是一个很好的观点+