当我在调试器中单步执行时,我的程序表现出一些奇怪的行为。在下面的摘录中,它会检查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;
}
答案 0 :(得分:7)
编译器已将两个return 1
个案例折叠成完全相同的代码。两个if
测试都分支到同一个汇编指令。每个指令只能用调试器的单个行号标记,因此您会看到这种奇怪的行为。如果您使用-g
和进行编译而不使用 -O
(或者甚至更明确地使用-O0
),则会产生不同的案例,事情会更清晰。
答案 1 :(得分:3)
一元!
是合乎逻辑的。如果操作数为0
,则结果为1
,否则结果为0
。这意味着!invPktNum
为0
,因此if
表达式为真。
你可能正在寻找一元~
,这是按位 - 不是。
顺便说一句,它可能出现在调试器中,好像第二个return 1;
正在执行而不是第一个,因为编译器可能已重新排序代码并将这两个return 1;
语句组合在一起(特别是如果启用了优化)。
答案 2 :(得分:2)
!(0xFE)
是0
。也许你想要的是~(0xFE)
?
答案 3 :(得分:0)
检查编译器优化对于调试模式肯定是禁用的。 (只是与其他人不同)
答案 4 :(得分:-1)
你将int与bool进行比较。这开始是不好的风格,一些编译器会抱怨。
也许你混淆了!
和~
?如果invPktNum为非false,则!invPktNum
将返回false,如果为false,则返回true。我很确定你的意思是~invPktNum
。