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 != 3
、if
语句知道表达式的结果将是 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 时不执行。
为什么这两个语句不等价?
如果 i==3 则执行 fork()。
如果 i!=3 则不会执行 fork()。
这是怎么回事?是某种编译器优化故障吗?
if((i==3) && (fork()==0))
if((fork()==0) && (i==3))
这叫做short-circuit evaluation。如果第一项为假,你就知道整个 &&
都是假的,所以很多语言故意跳过第二个计算。
这是逻辑&&
运算符执行的短路评估的直接结果:当i != 3
、if
语句知道表达式的结果将是 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 时不执行。