当a是数字时,while(!a)是什么意思?

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循环的条件下发生了什么.这只是一点点吗?那是什么意思?什么时候是不正确的,什么时候是假的,如果有多于一位?

oua*_*uah 7

 !milliseconds
Run Code Online (Sandbox Code Playgroud)

相当于:

  (milliseconds == 0)
Run Code Online (Sandbox Code Playgroud)

根据!运营商的定义:

(C11,6.5.3.3p5)"[...]表达式!E相当于(0 == E)."