iju*_*ath -1 c conditional while-loop
试图破译这段C代码:
int WaitForPacket(uint16 milliseconds, Dexcom_packet* pkt, uint8 channel) {
uint32 start = getMs();
uint8 * packet = 0;
uint32 i = 0;
uint32 seven_minutes = 420000;
int nRet = 0;
swap_channel(nChannels[channel], fOffset[channel]);
while (!milliseconds || (getMs() - start) < milliseconds) {
i++;
if(!(i % 60000)) {
strobe_radio(channel);
}
doServices();
if((getMs() - start) > seven_minutes) {
killWithWatchdog();
delayMs(2000);
}
blink_yellow_led();
if (packet = radioQueueRxCurrentPacket()) {
uint8 len = packet[0];
fOffset[channel] += FREQEST;
memcpy(pkt, packet, min8(len+2, sizeof(Dexcom_packet)));
if(radioCrcPassed()) {
if(pkt->src_addr == dex_tx_id || dex_tx_id == 0 || only_listen_for_my_transmitter == 0) {
pkt->txId -= channel;
radioQueueRxDoneWithPacket();
LED_YELLOW(0);
return 1;
} else {
radioQueueRxDoneWithPacket();
}
} else {
radioQueueRxDoneWithPacket();
LED_YELLOW(0);
return 0;
}
}
}
LED_YELLOW(0);
return nRet;
}
Run Code Online (Sandbox Code Playgroud)
代码是非常易读的,我得到了大部分内容(除了那个uint8 * packet = 0,不是一个空指针?),但我不确定!milliseconds在while循环的条件下发生了什么.这只是一点点吗?那是什么意思?什么时候是不正确的,什么时候是假的,如果有多于一位?
!milliseconds
Run Code Online (Sandbox Code Playgroud)
相当于:
(milliseconds == 0)
Run Code Online (Sandbox Code Playgroud)
根据!运营商的定义:
(C11,6.5.3.3p5)"[...]表达式!E相当于(0 == E)."