【发布时间】:2015-03-30 17:46:07
【问题描述】:
为什么这两个语句不等价?
如果 i==3 则执行 fork()。
如果 i!=3 则不会执行 fork()。
这里发生了什么?是不是某种编译器优化故障?
if((i==3) && (fork()==0))
if((fork()==0) && (i==3))
【问题讨论】:
-
我的猜测是,一旦第一个值为 false,就不需要检查下一个。我不是 C 程序员。
为什么这两个语句不等价?
如果 i==3 则执行 fork()。
如果 i!=3 则不会执行 fork()。
这里发生了什么?是不是某种编译器优化故障?
if((i==3) && (fork()==0))
if((fork()==0) && (i==3))
【问题讨论】:
这称为short-circuit evaluation。如果第一个词是假的,你知道整个&& 会是假的,所以很多语言故意跳过第二个评估。
【讨论】:
这是由逻辑&& 运算符执行的短路评估 的直接结果:当i != 3,if 语句知道表达式的结果将是@987654324 @,然后停在那里。
这就是它无法执行fork 的原因。如果您不希望这种行为,您可以使用按位与运算符&。
但是,您的代码逻辑仍然存在问题,因为无法判断i != 3 时您落在“分叉”的哪一侧。
如果你想做一个fork不管i的值是多少,但要正确地拿到“叉子”的一边,先做叉子,然后检查if里面的结果:
pid_t side = fork();
if (i == 3) {
if (side == 0) {
...
} else {
...
}
} else {
if (side == 0) {
...
} else {
...
}
}
【讨论】:
当左侧为假时,C 的 && 运算符右侧不执行。
【讨论】: