考试中的问题是:
写下以下程序的输出:
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
任何简短的解释或追踪都会很棒谢谢
答案 0 :(得分: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
恰好存储了内存中的任何值以及编译器为未初始化的变量分配的内容。
答案 1 :(得分:5)
假设这是一个拼写错误,while (i-- && p == fork())
真的是while (i-- && (p = fork()))
,那么输出取决于操作系统调度程序。
主要流程使用
分离流程进程A和B不会继续循环,因为p=fork()
对它们的计算结果为false。
每个进程将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
(订单会有点随机)
正如尖锐的指出,你编写的代码只是产生随机结果,取决于一块未初始化的内存。