C 不带控制语句的逻辑比较运算符
考虑这一点:C 不带控制语句的逻辑比较运算符,c,C,考虑这一点: 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();
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
或while
这样的控制语句进行评估。也就是说,它们被丢弃了。但是,此代码的输出为:
1 1 1 1 1
也就是说,最后有5个进程到达printf()
行
我的问题:这条线是做什么的
fork() && fork()||fork();
当然,有些事情已经改变了。我从未想过在没有控制语句的情况下使用比较运算符,如&
,|
,如if
,while
,来评估比较结果,并相应地采取一些措施。我认为,没有这些控制结构,比较运算符是没有意义的;他们只需返回1
或0
,而不做任何处理
显然,我错了,我完全不知道运算符的这种用法。即使它不是条件检查的一部分,下面的语句:
exp1 && exp2 || exp3;
仍将按布尔表达式求值规则求值。在这种情况下,如果exp1
为false(0),则将跳过exp2
,因为exp1&&exp2
已确定为false。如果exp1&&exp2
为真(不是0),则将跳过exp3
,因为整个表达式随后被确定为已为真。fork()
返回子进程的PID(如果它在父进程中返回),或者0
返回子进程的PID。逻辑运算符在C中短路,因此如果a
为0
,则a&&b
不计算b
,如果a
不是0
,则a | b
不计算b
所以你用叉子叉一次。两个过程。
&&
的右侧仅在子对象中计算。三个过程。|
的右侧将在同一子级中再次求值。四个过程。但是等等<代码>&&绑定比|
更紧密,因此父进程也会再次分叉,总共有五个进程。也许编写合理的代码是一个好方法start@EdHeal这是一个谜题,我不明白这怎么会是重复的。问题不在于fork()。事实证明,这就是所谓的“操作人员短路”。一个从未听说过这个词的人无法查找这个词(这次是这样)@sanjeevmk-标题可能不同,但它是重复的,因为问题的核心(在fork()
调用上使用逻辑&
和|
运算符)和答案(如何评估此语句)我已经修改了重复问题的标题,以便更好地反映问题的内容(并在标题中特别提到&&和| |)。