【问题标题】:No forking in IF statement [duplicate]IF 语句中没有分叉[重复]
【发布时间】:2015-03-30 17:46:07
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 我的猜测是,一旦第一个值为 false,就不需要检查下一个。我不是 C 程序员。

标签: c fork


【解决方案1】:

这称为short-circuit evaluation。如果第一个词是假的,你知道整个&& 会是假的,所以很多语言故意跳过第二个评估。

【讨论】:

    【解决方案2】:

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

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

    但是,您的代码逻辑仍然存在问题,因为无法判断i != 3 时您落在“分叉”的哪一侧。

    如果你想做一个fork不管i的值是多少,但要正确地拿到“叉子”的一边,先做叉子,然后检查if里面的结果:

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

    【讨论】:

      【解决方案3】:

      当左侧为假时,C 的 && 运算符右侧不执行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-12-20
        • 1970-01-01
        • 1970-01-01
        • 2015-02-16
        • 2020-11-27
        • 2017-08-16
        • 2021-01-25
        • 2016-05-24
        相关资源
        最近更新 更多