2道C语言题目
1个回答
关注
展开全部
第二题:问下面的代码执行后总共产生了多少进程(不包括主进程)?(2009 EMC笔试)
#include
int main(){
fork();
fork() && fork() || fork();
fork();
}
#include
int main(){
fork();
fork() && fork() || fork();
fork();
}
这个题目跟上一个对比起来就稍微有点难度了,因为你就算画树也有可能算错!
www.spongeliu.com
我个人感觉这个题目考察两方面的知识:1、开头所讲的fork()返回值;2、&&和||的运算。
www.spongeliu.com
让我们现讨论下&&和||的运算再来继续讨论这个题目。&&是“逻辑与”操作,如果两个操作数有一个为0,则整个式子为0。标准C中规定,如果&&运算符的左操作数为0,则不计算右操作数;如果左操作数为1,才计算右操作数。
与之类似,||操作符是“逻辑或”操作,标准C规定如果||运算符左操作数为1,则不计算右操作数;如果左操作数为0,则计算右操作数。
www.spongeliu.com
继续来看我们的题目,我们把题目中的5个fork()分别标记为A,B,C,D,E。则我们可以看到,主进程一共产生4个进程,分别产生在A,B,C,E位置上(B,C两个fork()返回值都不是0,因此B&&C不为0,因此不计算D)。让我们仍然采用上题的算法,使用一个队列:
首先,将主进程产生子进程的位置放到队列中:
queue = " A B C E ";
sum = 0;
queue = " A B C E ";
sum = 0;
我们从队列中取首元素A,我们分析A处产生的进程,发现它会在B, C, E三处产生子进程,我们把这三个元素插入到队列中,并将sum+1。
queue = " B C E B C E "
sum ++;
queue = " B C E B C E "
sum ++;
然后,我们从队列中取出首元素B,B处产生的子进程稍稍不一样,因为子进程中B所代表的fork()返回值为0,因此C得不到执行,而D会得到执行。因此,B处产生的子进程会执行D, E,将这两个元素送入队列,sum++:
queue = " C E B C E D E "
s
咨询记录 · 回答于2021-10-26
2道C语言题目
您好,您的问题我已经看到了,正在整理答案,请稍等一会,我们是一个一个回答,请耐心等待,打字需要一点时间,很高兴能为您服务
第一题,计算下面代码理论上总共打印了多少行:(网易2011笔试题)#include#include#includeint main(){int i;for(i = 0; i<5; i++){fork();printf("%d\n",getpid());fflush(stdout);}}#include#include#includeint main(){int i;for(i = 0; i<5; i++){fork();printf("%d\n",getpid());fflush(stdout);}}
问题解答:这道问题并不难,最快的想法就是2+4+8+16+32,因为第一层的printf会有两个进程打印,第二层会增加到4个,以此往下,就得出62行。www.spongeliu.com但我这里打算采用另外一种方法,一种更加直观的方法,就是直接数出来,这样会避免大脑短路,而且对下一题目有帮助。www.spongeliu.com要直接数出来也很简单,只是有些繁琐,因为每循环一次,都会打印一行并且产生一个子进程,子进程又会继续循环打印并产生新的进程。我们可以在草稿纸上画一棵树,画出每个进程的子进程以及循环次数,如果你眼力够好,脑子不容易乱,这种方法很快会让你得到正确答案。但我恰好脑子不是能够保证清醒的人,画了三遍树得到的都是错误答案。www.spongeliu.com随后,我在纸上用了一种更简单的数据结构——队列进行计算,并且顺利得出了答案。我是这样计算的:首先,主进程会循环5次,则我们将5压入到队列中:queue =" 5 ";sum = 0; //sum是总打印次数queue =" 5 ";sum = 0; //sum是总打印次数主进程会循环5次,打印5行并且产生5个子进程,这5个子进程分别会打印5,4,3,2,1行,则我们将这5个数放入队列,并将第一个5出队列加入到sum中:queue = " 5 4 3 2 1 ";sum = sum + 5;queue = " 5 4 3 2 1 ";sum = sum + 5;这样,我们再取队列首元素,即5,他会打印5行,并且生成4个子进程,子进程的分别会打印4,3,2,1行,我们把这4个数放入到队列中,并将第一个5出队列加入到sum中:queue = " 4 3 2 1 4 3 2 1";sum = sum + 5;queue = " 4 3 2 1 4 3 2 1";sum = sum + 5;我们继续重复上面的工作,取首元素4,他会打印4行,并且会声称3个子进程,子进程分别打印3,2,1行,重复上面的入队列和出队列操作:queue = " 3 2 1 4 3 2 1 3 2 1 ";sum = sum + 4;queue = " 3 2 1 4 3 2 1 3 2 1 ";sum = sum + 4;这样,以此
第二题:问下面的代码执行后总共产生了多少进程(不包括主进程)?(2009 EMC笔试)#includeint main(){fork();fork() && fork() || fork();fork();}#includeint main(){fork();fork() && fork() || fork();fork();}这个题目跟上一个对比起来就稍微有点难度了,因为你就算画树也有可能算错!www.spongeliu.com我个人感觉这个题目考察两方面的知识:1、开头所讲的fork()返回值;2、&&和||的运算。www.spongeliu.com让我们现讨论下&&和||的运算再来继续讨论这个题目。&&是“逻辑与”操作,如果两个操作数有一个为0,则整个式子为0。标准C中规定,如果&&运算符的左操作数为0,则不计算右操作数;如果左操作数为1,才计算右操作数。与之类似,||操作符是“逻辑或”操作,标准C规定如果||运算符左操作数为1,则不计算右操作数;如果左操作数为0,则计算右操作数。www.spongeliu.com继续来看我们的题目,我们把题目中的5个fork()分别标记为A,B,C,D,E。则我们可以看到,主进程一共产生4个进程,分别产生在A,B,C,E位置上(B,C两个fork()返回值都不是0,因此B&&C不为0,因此不计算D)。让我们仍然采用上题的算法,使用一个队列:首先,将主进程产生子进程的位置放到队列中:queue = " A B C E ";sum = 0;queue = " A B C E ";sum = 0;我们从队列中取首元素A,我们分析A处产生的进程,发现它会在B, C, E三处产生子进程,我们把这三个元素插入到队列中,并将sum+1。queue = " B C E B C E "sum ++;queue = " B C E B C E "sum ++;然后,我们从队列中取出首元素B,B处产生的子进程稍稍不一样,因为子进程中B所代表的fork()返回值为0,因此C得不到执行,而D会得到执行。因此,B处产生的子进程会执行D, E,将这两个元素送入队列,sum++:queue = " C E B C E D E "s
希望我们的回答能帮助到您,祝您生活愉快!好人一生平安!谢谢麻烦记得点个赞!
这个怎么做
答案是多少
回答啊
回答啊
我也需要想啊,我不是机器人的,宝宝
程序题的一题,总共这个题,麻烦谢谢回答一下答案
已赞过
评论
收起
你对这个回答的评价是?