2017-02-17 50 views
0

我們來考慮下面的C代碼片段。奇怪狀態檢查

while(!var_can_be_0_or_1 && foo_returns_0_or_1(arg1, arg2)) { 
    body; 
} 

這是一個簡單的條件聲明,做我不明白的東西。但是讓我們說我有兩個宏

#define TRUE 1 
#define FALSE 0 

有人可以告訴我(或者向我解釋)我們在此while循環的條件下檢查什麼?我的意思是在什麼情況下循環體將執行以及它將跳過哪些條件?

我發現它在一本關於數據結構,其中綴表達式串轉換爲一個後綴的程序。確切的代碼是這樣的--->

int prcd(char char); 
int und, outpos; 
char symb, topsymb; 

while(!und && prcd(topsymb, symb)) { <----- Stuck on this one real bad 
      postr[outpos++] = topsymb; 
      popandtest(&opstk, &topsymb, &und); 
} 

說明可能是不必要的,但只是把事情放到上下文中。 ;)

編輯:

我真的很抱歉,如果這個問題有點不清楚的人誰試圖幫助,所以我會解釋多一點什麼我真的問這裏

讓我們忘了我在本文的精心部分寫的代碼,並返回到第一個,讓我們只說我們有一個while循環,簡單明瞭,同時循環

while(!condition1 && condition2) { 
execute some codes; 
} 

這裏,condition1 = und,und是一個int,其值可以是0或1(和NOTHEELSE)。 0和1分別被宏觀化爲FALSETRUE。和condition2 = prcd(topsymb, symb);這是一個函數,其原型被提及爲int prcd(char char);。它再一次返回0或1和NOTHEELSE。

現在我想知道的是如何while循環括號內的條件得到評估。

希望這可以解決問題。 :)

+0

'我想知道的是如何評估while循環括號內的條件。希望這可以解決問題。「 - 不,它不會清除事情。答案仍然和以前一樣。當且僅當滿足條件時,while循環內的所有內容才被「評估」。 –

+1

@SaniSinghHuttunen我親愛的先生,當然你的答案保持不變。我只是爲那些理解這個問題的人做了一些修改。但你首先知道我究竟在問什麼。再次感謝:) – allocated

+0

如果condition1和condition2是:1,0或1,1 - 只評估condition1,並且循環不執行; 0,0 - 兩種條件都被評估,但循環不執行; 0,1 - 兩個條件都被評估,循環執行。 – Dmitri

回答

4

我的意思是在什麼情況下/ s的循環體將執行以及其中 條件/ s時,將跳過

body將執行,如果var_can_be_0_or_1false(即0)和返回函數foo_returns_0_or_1的值是true(即不是0)。

如果不符合任何標準,則會跳過body

+2

...雖然注意到'foo_returns_0_or_1()'也不會被調用,如果var_can_be_0_or_1不是零。 – Dmitri

+1

@Dmitri:正確但與問題無關。 –

+0

謝謝@Sani SIngh Huttunen,正是我尋找的答案:) – allocated

1

&&運營商部隊從左到右評估。 !var_can_be_0_or_1將得到充分評估(和任何副作用適用);如果表達式的結果不爲零(true),那麼將評估foo_returns_0_or_1(arg1, arg2)。如果該表達式的結果也爲非零(true),那麼循環的主體將被執行,否則循環將退出。

2

我不能確定,如果這是你在找什麼,但這裏是什麼,我相信你想要的:

while(!var_can_be_0_or_1 && // if this is '0', continue; else exit 
     foo_returns_0_or_1(a, b) // if this is NOT '0', continue; else exit 

這是否幫助?

使用您的宏,這是類似於編寫

while (var_can_be_0_or_1 == FALSE && foo_returns_0_or_1 == TRUE) 

我說類似的,因爲,如果函數foo_returns_0_or_1不返回1,而是返回一些其他的號碼,那麼你的真宏將不匹配,如上所述,條件測試將失敗。

C不要求你寫等式(== TRUE),而是可以對函數的輸出或變量的狀態進行求值,如果它是一個int,並且是這個語句的更好選擇。

正如@John Bode所說,如果第一個條件失敗,那麼第二個條件將永遠不會被測試。由於這是一個函數,所以函數永遠不會被調用。

+0

這是否包括!?。我拒絕。 –

+0

我不明白你的意見。你能詳細說明嗎? – tjcertified

+0

當我在C中看到像'x == TRUE'這樣的東西時,我會畏縮不前,因爲當'x == TRUE'沒有時,'x'仍然可以評估爲true(通常,當'x'只能是0時或1)。 – Dmitri

0

我認爲這是一些缺少前置條件的僞代碼,因爲它不會按原樣編譯。

  1. 如果「UND」是全球性的,那麼它必須被初始化爲零,while循環將永遠是TRUE,如果裏面的功能這必須是垃圾,因爲它被分配在堆棧上,因此行爲是不可預測的初始化。
  2. 同樣,缺少prcd()的定義,很難建議它返回什麼。

我認爲你需要糾正與適當的投入問題。

+0

對不起,首先猜我的問題還不清楚,我會編輯它。 – allocated