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。不过,这仍然是一个很好的观点+