在IF声明中没有分叉

时间:2015-03-30 17:46:07

标签: c fork

为什么这两个陈述不相同?

如果i == 3则执行fork()。

如果i!= 3则fork()不会被执行。

这里发生了什么?它是某种编译器优化故障吗?

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

3 个答案:

答案 0 :(得分:1)

这称为short-circuit evaluation。如果第一个术语为假,则您知道整个&&将为假,因此许多语言都会故意跳过第二个评估。

答案 1 :(得分:0)

这是逻辑&&运算符执行短路评估的直接结果:当i != 3时,if语句知道表达式的结果将是false,并在那里停止。

这就是为什么它无法执行fork。如果您不想要此行为,则可以使用按位AND运算符&

然而,你的代码的逻辑仍然是有问题的,因为它无法分析" fork"你在i != 3时降落。

如果你想fork无论i的价值是什么,而是正确地得到" fork"的一面,请先做前叉,然后检查结果在if

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

答案 2 :(得分:0)

C&& amp;&当左侧是假的时,不执行操作符。