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

时间:2010-11-22 23:00:56

标签: c

当我在调试器中单步执行时,我的程序表现出一些奇怪的行为。在下面的摘录中,它会检查pktNum != ~invPktNum,然后直接进入第二个return 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;
}

5 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:3)

一元!是合乎逻辑的。如果操作数为0,则结果为1,否则结果为0。这意味着!invPktNum0,因此if表达式为真。

你可能正在寻找一元~,这是按位 - 不是。


顺便说一句,它可能出现在调试器中,好像第二个return 1;正在执行而不是第一个,因为编译器可能已重新排序代码并将这两个return 1;语句组合在一起(特别是如果启用了优化)。

答案 2 :(得分:2)

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

答案 3 :(得分:0)

检查编译器优化对于调试模式肯定是禁用的。 (只是与其他人不同)

答案 4 :(得分:-1)

你将int与bool进行比较。这开始是不好的风格,一些编译器会抱怨。

也许你混淆了!~?如果invPktNum为非false,则!invPktNum将返回false,如果为false,则返回true。我很确定你的意思是~invPktNum