2014-02-17 32 views
3

考慮一下:邏輯比較操作符,而不控制語句

main() 
    { 
     int i = 1; 
     fork(); fork(); fork(); 
     printf("%d ",i); 
    } 

上述代碼的輸出是:

1 1 1 1 1 1 1 1 

即,在端部有8個(2^3)處理達到printf()一行。現在考慮下面的代碼:

main() 
    { 
     int i = 1; 
     fork() && fork() || fork(); 
     printf("%d ",i); 
    } 

起初,我以爲是因爲使用&&比較的結果會出現在輸出沒有變化,||都沒有被控制語句評價像ifwhile。也就是說,他們正在被拋棄。然而,這種代碼的輸出是:

1 1 1 1 1 

含義,在末端有5個流程,到達printf()線。

我的問題:這是什麼線做

fork() && fork()||fork(); 

當然,事情發生了變化。我從來沒有考慮過使用像&&||這樣的比較運算符,而沒有像if,while這樣的控制語句來評估比較結果並相應地採取一些措施。我認爲,沒有這些控制結構,比較運算符就沒有意義;他們只是簡單地返回10而沒有做任何事情。

顯然,我錯了,而且完全沒有意識到操作員的這種用法。

+3

也許編寫合理的代碼將是一個好開始 –

+0

@EdHeal這是一個謎題。 –

+0

我不明白這是如何重複的。問題不在於fork()。事實證明,這是關於所謂的「操作員短路」。一個從未聽過這個詞的人不能看這個(這是這種情況,這次) –

回答

3

fork()返回子進程的PID,如果它返回父進程,或0返回子進程的PID。邏輯運算符在C中短路,所以a && b未評估b如果a0,並且a || b未評估b如果a不是0

所以你分叉一次。兩個過程。 &&的右側僅在兒童中進行評估。三個過程。 ||的右側會再次在同一個孩子中進行評估。四個過程。可是等等! &&綁定比||更緊密,因此父進程也會再次分叉,總共有五個進程。

1

即使它不是一個條件檢查的一部分,下面的語句:

exp1 && exp2 || exp3; 

每布爾表達式計算規則仍然將評估。在這種情況下,如果exp1爲假(0),則exp2將被跳過,因爲exp1 && exp2已被確定爲假。如果exp1 && exp2爲真(非0),則exp3將被跳過,因爲整個表達式已被確定爲真。