Может ли кто-нибудь объяснить и проследить это, потому что мой учитель не может - PullRequest
1 голос
/ 29 ноября 2010

вопрос на экзамене был:

написать вывод следующей программы:

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;
}

Вывод из консоли с использованием xcode с включением этой строки перед 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

было бы замечательно любое краткое объяснение или след. Спасибо

Ответы [ 2 ]

10 голосов
/ 29 ноября 2010

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 хранит все значения в памяти и все, что компилятор присваивает неинициализированным переменным.

5 голосов
/ 29 ноября 2010

Если предположить, что это опечатка, а while (i-- && p == fork()) действительно while (i-- && (p = fork())), то вывод зависит от планировщика ОС.

Основной процесс разветвляет процессы с

  • i = 1 p = 0 <- процесс A, parent.p = A </li>
  • i = 0 p = 0 <- процесс B, parent.p = B </li>
  • i = -1p = B <- родительский процесс, parent.p = B </li>

Процессы A и B не продолжают цикл, поскольку p=fork() для них оценивается как ложное.

Каждый процесс добавляет 2 к j (что также может быть 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

(порядок будет несколько случайным)

Как указал острый зуб, ваш код, как написано, просто дает случайные результаты, в зависимости от частинеинициализированная память.

...