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

Jus*_*tin 2 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;
}
Run Code Online (Sandbox Code Playgroud)

Ben*_*son 7

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