IF 语句中没有分叉

No forking in IF statement

为什么这两个语句不等价?

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

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

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

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

这叫做short-circuit evaluation。如果第一项为假,你就知道整个 && 都是假的,所以很多语言故意跳过第二个计算。

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

这就是它无法执行的原因 fork。如果您不希望出现这种情况,可以使用按位与运算符 &.

但是,您的代码逻辑仍然值得怀疑,因为无法判断您在 i != 3 时降落在 "fork" 的哪一侧。

如果你想做一个 fork 不管 i 的值是多少,但正确地得到 "fork" 的一侧,提前做叉子,然后检查结果在 if:

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

C 的 && 运算符的右侧在左侧为 false 时不执行。