没有控制语句的逻辑比较运算符

时间:2014-02-17 15:32:18

标签: 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();
      printf("%d ",i);
    }

最初,我认为输出没有变化,因为使用&&||的比较结果未被if或{等控制语句评估{1}}。也就是说,他们被丢弃了。但是,此代码的输出是:

while

意思是,最后有5个进程到达1 1 1 1 1 行。

我的问题:此行做什么

printf()

当然,有些事情发生了变化。我从未考虑使用 fork() && fork()||fork(); &&之类的比较运算符,而不使用||if之类的控制语句来评估比较结果,并相应地采取一些措施。我想,没有这些控制结构,比较运算符是没有意义的;他们只是简单地返回while1而没有做任何事情。

显然,我错了,完全没有意识到运营商的这种用法。

2 个答案:

答案 0 :(得分:3)

如果子进程在父进程中返回,则

fork()返回PID,如果在子进程中返回,则返回0。逻辑运算符在C中短路,因此如果a && bb,则a不评估0a || b不评估b如果a不是0

所以你分叉一次。两个过程。 &&的右侧仅在孩子中进行评估。三个过程。 ||的右侧再次在同一个孩子中进行评估。四个过程。可是等等! &&绑定比||更紧密,因此父进程也会再次分叉,总共有五个进程。

答案 1 :(得分:1)

即使它不是条件检查的一部分,也可以使用以下语句:

exp1 && exp2 || exp3;

仍然会根据布尔表达式评估规则进行评估。在这种情况下,如果exp1为false(0),则会跳过exp2,因为exp1 && exp2已被确定为false。如果exp1 && exp2为真(非0),那么将跳过exp3,因为整个表达式被确定为已经为真。