考虑一下:
main()
{
int i = 1;
fork(); fork(); fork();
printf("%d ",i);
}
上述代码的输出是:
1 1 1 1 1 1 1 1
也就是说,最后有8(2 ^ 3)个进程到达printf()
行。现在考虑以下代码:
main()
{
int i = 1;
fork() && fork() || fork();
printf("%d ",i);
}
最初,我认为输出没有变化,因为使用&&
,||
的比较结果未被if
或{等控制语句评估{1}}。也就是说,他们被丢弃了。但是,此代码的输出是:
while
意思是,最后有5个进程到达1 1 1 1 1
行。
我的问题:此行做什么
printf()
当然,有些事情发生了变化。我从未考虑使用 fork() && fork()||fork();
,&&
之类的比较运算符,而不使用||
,if
之类的控制语句来评估比较结果,并相应地采取一些措施。我想,没有这些控制结构,比较运算符是没有意义的;他们只是简单地返回while
或1
而没有做任何事情。
显然,我错了,完全没有意识到运营商的这种用法。
答案 0 :(得分:3)
fork()
返回PID,如果在子进程中返回,则返回0
。逻辑运算符在C中短路,因此如果a && b
为b
,则a
不评估0
,a || b
不评估b
如果a
不是0
。
所以你分叉一次。两个过程。 &&
的右侧仅在孩子中进行评估。三个过程。 ||
的右侧再次在同一个孩子中进行评估。四个过程。可是等等! &&
绑定比||
更紧密,因此父进程也会再次分叉,总共有五个进程。
答案 1 :(得分:1)
即使它不是条件检查的一部分,也可以使用以下语句:
exp1 && exp2 || exp3;
仍然会根据布尔表达式评估规则进行评估。在这种情况下,如果exp1
为false(0),则会跳过exp2
,因为exp1 && exp2
已被确定为false。如果exp1 && exp2
为真(非0),那么将跳过exp3
,因为整个表达式被确定为已经为真。