Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 不带控制语句的逻辑比较运算符_C - Fatal编程技术网

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()
调用上使用逻辑
&
|
运算符)和答案(如何评估此语句)我已经修改了重复问题的标题,以便更好地反映问题的内容(并在标题中特别提到&&和| |)。