2010-11-29 40 views
1

在考試的問題是:誰能解釋和跟蹤這一點,因爲我的老師不能

編寫以下程序的輸出:從控制檯使用Xcode中有包括該

int i = 2 ; 
int main() { 

    int j = 10, p ; 
    while (i-- && p == fork()) 
     if (p < 0) exit(1); 
    j += 2; 
    if (p == 0) { 
     i *= 3; 
     j *= 3; 
    } 
    else { 
     i *= 2; 
     j *= 2; 
    } 

    printf("i = %d, j = %d \n",i,j); 

    return 0; 
} 

輸出行之前int i = 2;

#include <stdio.h> 
    #include <stdlib.h> 
    #include <unistd.h> 

輸出:

i = 3, j = 36 
i = 0, j = 36 
i = -3, j = 36 

注:我注意到,如果我們使用Ubuntu,輸出是不同的。

我認爲這是Ubuntu的輸出:

i = 2 , j = 24 
i = 2 , j = 24 

任何簡要解釋或跟蹤將是巨大的感謝

+0

我希望老師能夠抓住這樣的問題。我猜p = fork()是什麼意思,但這是複合語句的危險。 – 2010-11-29 15:32:06

+0

是的,它是p = fork()但是編譯器給出了一個錯誤(在你應該寫的時候比較東西沒有賦值) – 2010-11-29 15:35:08

回答

5

假設這是一個錯字,而while (i-- && p == fork())確實是while (i-- && (p = fork())),那麼輸出取決於OS調度程序。

主要工藝叉關閉過程與

  • I = 1個p = 0時< - 過程A,parent.p = A
  • I = 0 p = 0時< - 過程B,父.P = B
  • I = -1 p =乙< - 父進程,parent.p = B

方法A和B不繼續循環,因爲p=fork()評估他們爲假。

每個進程都向j添加2(這可能是j = 12)。總結:

A: i=+1 p=0 j=12 
B: i= 0 p=0 j=12 
P: i=-1 p=*B* j=12 

其中p = 0,具有i和j乘以3的情況下,那些其中p = 0(父進程)已經它們乘以2。這將產生以下完全合理的輸出!對我來說:

i = -2, j = 24 
i = 3, j = 36 
i = 0, j = 36 

(順序將是有些隨機)

正如銳齒指出,書面簡單地產生隨機的結果,根據一塊未初始化內存的代碼。

10

p未初始化和從未改變

int j = 10, p; //uninitialized 
while (i-- && p == fork()) //comparison - no changes 
if (p < 0) exit(1); //comparison - no changes 
if (p == 0) { //comparison - no changes 

所以p恰好存儲任何值有在加任何編譯器分配未初始化變量的內存。