2010-11-29 52 views
1

la question à l'examen était:et tracer cela parce que mon professeur ne peut pas

écrire la sortie du programme suivant:

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

sortie de la console en utilisant Xcode avec inclure cette lignes avant int i = 2;:

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

sortie:

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

Remarque: Je remarque que la sortie est différente si nous utilisons Ubuntu.

Je pense que c'est la sortie de Ubuntu:

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

toute brève expliquer ou trace serait grand Merci

+0

Je m'attendrais à ce qu'un enseignant attrape un problème comme celui-ci. Je suppose que p = fork() était ce que l'on voulait dire, mais c'est le danger des déclarations composées. –

+0

oui c'est p = fork() mais le compilateur donne une erreur (dans le temps on devrait écrire comparer les choses pas assigner une valeur) –

+0

Ça devrait être 'while (i-- && (p = fork())! = 0) '- de cette façon, vous transmettez l'intention clairement et le compilateur ne se plaint pas et le code ne dépend pas d'une variable non initialisée. – sharptooth

Répondre

5

En supposant que c'était une faute de frappe, et while (i-- && p == fork()) était vraiment while (i-- && (p = fork())), alors la sortie dépend du planificateur OS.

Les principales fourches de processus hors processus avec

  • i = 1 p = 0 < - procédé A, A = parent.p
  • i = 0 p = 0 < - procédé B, parent .p = B
  • i = -1 p = B < - processus parent, parent.p = B

processus A et B ne continue pas la boucle, car la p=fork() évaluée comme fausse pour eux.

Chaque processus ajoute 2 à j (ce qui pourrait aussi bien être j = 12). En résumé:

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

Les cas où p = 0, ont i et j multiplié par 3, ceux avec p = 0 (le processus parent) les ont multiplié par 2. Cela donne la sortie suivante tout à fait raisonnable! pour moi:

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

(L'ordre va être un peu au hasard)

comme Dentranchante a souligné, votre code comme écrit est simplement produire des résultats aléatoires, en fonction d'un morceau de mémoire non initialisée.

10

p et est-uninitialized jamais changé.

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 

si p arrive à stocker toute valeur est là dans la mémoire ainsi que quel que soit le compilateur attribue des variables non initialisées à.

+1

Une faute de frappe, je suppose? – Kos

+0

qu'en est-il de la sortie ?? –

+0

Qu'en est-il? Votre code contient un bug sérieux et produira probablement des résultats différents chaque fois que vous l'exécuterez. –