2012-01-19 239 views
1

下面的兩個代碼snipets做的是完全一樣的東西嗎?while循環條件在c

do 
{ 
    Delay_us(1); 
    status = fetchStatus(); 
}while(!status); 

二snipet - >

do 
{ 
    Delay_us(1); 
}while(status = fetchStatus(), !status); 

這是優選的?

+1

這第二個是可怕的。第一個替代方案實際上是'while(!(status = fetchStatus())'。 –

+1

第二個是合法的嗎?循環的條件不需要是一個有效的表達式?甚至可以評估什麼? – prelic

+0

@prelic:這是(據我所知)一個晦澀的功能,使用時會造成混淆:http://en.wikipedia.org/wiki/Comma_o​​perator –

回答

4

是的,他們這樣做,但我寧願以下幾點:

do { 
    Delay_us(1); 
} while (!(status = fetchStatus())); 

因爲它簡化了它一起到一個語句,而不是兩個。

+1

咦?這不會減少通話的次數。 –

+0

@StephenCanon對不起,它減少了發言的數量,謝謝指出。 –

7

你可以這樣做:

do 
{ 
    Delay_us(1); 
} while(!fetchStatus()); 

這樣,你不需要創建一個局部變量,如果你使用它。

+1

你怎麼知道他不使用它? – asaelr

+1

我使用它;)THanks – Christian

+0

@asaelr我不知道OP不使用它,我只是從OP中收集。 – Neal

1

它們具有相同的邏輯輸出。在每種情況下,都會分配狀態並進行評估,但第一種狀態更具可讀性。一般不要使用逗號運算符。

0

我絕不是專家,但我相信我們正在進入編譯器優化領域。這實際上取決於您使用哪種編譯器來從該代碼生成二進制文件。一個編譯器可能會像您的第一個代碼段那樣使用代碼,並將其優化爲二進制代碼,從而有效地完成第二個代碼段的功能。

1

它們是等效的。由於它們相當,所以都不是首選。但是,有些人可能會更喜歡美觀,因爲它比較熟悉。

你真的打算在第一次檢查狀態之前延遲嗎?

0

如何:

for(; !fetchStatus(); Delay_us(1));