2015-03-30 32 views
-3

为什么这两个语句不相等?IF语句中没有分号

如果我== 3然后fork()被执行。

如果我!= 3那么fork()不会被执行。

这是怎么回事?这是否是某种编译器优化故障?

if((i==3) && (fork()==0)) 
if((fork()==0) && (i==3)) 
+0

我的猜测是,一旦第一个值是假的,它不需要检查下一个。我不是C程序员。 – Bob 2015-03-30 17:49:14

回答

0

这是合乎逻辑的&&运营商进行短路评价的直接结果是:如果i != 3if声明知道,表达式的结果将是false,并停止在那里。

这就是为什么它不能执行fork。如果你不想要这种行为,你可以使用按位AND运算符&

但是,您的代码的逻辑仍然值得怀疑,因为在i != 3时,您不可能知道您登陆的“叉子”的哪一侧。

如果你想要做一个fork不管什么i值,但适当地获得了“叉”的一面,做叉前期,并检查if里面的结果:

pid_t side = fork(); 
if (i == 3) { 
    if (side == 0) { 
     ... 
    } else { 
     ... 
    } 
} else { 
    if (side == 0) { 
     ... 
    } else { 
     ... 
    } 
} 
1

这叫做short-circuit evaluation。如果第一项是错误的,你知道整个&&将是错误的,所以很多语言故意跳过第二次评估。

0

C的& &运算符的右侧在左侧不正确时不会执行。