2010-11-29 67 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恰好存储任何值有在加任何编译器分配未初始化变量的内存。