【问题标题】:Why isn't j incremented in (++i || ++j)为什么 j 在 (++i || ++j) 中不递增
【发布时间】:2018-09-06 09:12:14
【问题描述】:

我不明白这段代码的输出:

 long i=5, j=10;
 if (++i || ++j)  printf("%ld  %ld\n", i, j);
 else  printf("Prog1\n");

输出是 6 和 10。我希望是 6 和 11。为什么 j 没有增加?

【问题讨论】:

  • 您的 if 语句正在评估 OR 语句,因此首先在管道左侧读取 ++i ||和增量。它忽略了 ++j,因此它最终是 6 和 10...
  • 我不知道你为什么要这样做,但你可能不应该......你想在这里达到什么效果?

标签: c logic pre-increment


【解决方案1】:

逻辑或运算符||short circut operator。这意味着如果仅通过查看左侧操作数即可确定结果,则不会计算右侧操作数。

C standard 的第 6.5.14 节有关逻辑 OR 运算符的声明如下:

4 与按位 | 运算符不同,|| 运算符保证 从左到右的评估;如果计算第二个操作数,则有 第一个和第二个评估之间的序列点 操作数。 如果第一个操作数比较不等于 0,则第二个 不计算操作数。

在这种情况下,++i 被求值,结果为 6(具​​有递增i 的副作用。如果任一操作数非零,则逻辑 OR 运算符求值为 1(即真)。由于左侧非零,不计算右侧,随后j 不递增。

【讨论】:

    【解决方案2】:

    您的 if 条件使用短路逻辑 OR 运算符 ||。由于运算符左侧 (++i) 的计算结果为 true,因此右侧 (++j) 不会被执行。

    【讨论】:

      【解决方案3】:

      if 语句中只执行了++i,因为++i 不为零并且已经被视为true。因为|| OR 操作,所以不需要执行++j

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-04-22
        • 1970-01-01
        • 2021-09-20
        • 1970-01-01
        • 2014-06-14
        • 2020-03-28
        • 2021-02-28
        相关资源
        最近更新 更多