【问题标题】:Post increment inside expression of if statement在 if 语句的表达式内发布增量
【发布时间】:2017-08-10 02:02:58
【问题描述】:

在下面的代码中,我期待回答“是”。但答案是否定的。这意味着 i 在 && 操作后递增。我期待一旦 if() 中的整个表达式被评估, i 就会增加。那么帖子增量的相关规则是什么?

int main()
{
    int i = 1;
    if (i++ && (i == 1))
        printf("Yes\n");
    else
        printf("No\n");
}

【问题讨论】:

  • 对于&&,首先对左侧进行全面评估,其中包括递增i。你应该问的不是++,而是&&
  • 是所有逻辑运算符都这样还是只有少数?
  • &&|| 就是这种情况,因为它们的short-circuiting behavior。这两个运算符将始终首先完全评估左侧参数。根据该评估的结果,可能(或可能不)继续并评估右手参数。
  • 这也称为sequence point。如果在本例中的子表达式之间存在序列点,则第一个子表达式的值计算和副作用,即i++,在第二个子表达式的每个值计算和副作用之前都被排序。
  • 以下是您需要了解的有关 ++ 工作原理的所有信息:不要。永远不要使用它,它永远不会咬你。在i += 1 上保存几次击键是不值得的。

标签: c mingw32


【解决方案1】:

逻辑与运算符&& 在左操作数和右操作数的求值之间有一个序列点。这意味着首先评估左操作数以及任何副作用(在本例中为增量)。

在这个表达式中,i 以 1 开头。所以表达式 i++ 的值为 1,i 的值递增。

作为&& 运算符的左侧,此值的计算结果为真,因此随后计算右侧。如果值为 0 即 false,则不会评估右侧。

此时i 的值为2,因此i == 1 的计算结果为假,从而使&& 运算符的结果为假。这导致else 子句被执行。

【讨论】:

    【解决方案2】:

    它从左到右,从上到下编译,所以你有一个“否”是合乎逻辑的,你的 if 语句包含 i++ 这将导致 i 等于 2 然后返回 @987654323 @,然后它包含 i==1,它将返回 false,因为 i 不再等于 1,因此您的 if 语句返回 false,这将使其执行 else 上的内容,表示“否”。

    关于逻辑运算符的简单解释:

    &&:从左到右求值,所有求值条件都必须返回'true'才能为真。

    ||:也是从左到右求值,只是一旦找到一个真条件就以真结束求值。

    【讨论】:

      猜你喜欢
      • 2016-09-15
      • 1970-01-01
      • 1970-01-01
      • 2016-03-17
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      • 2016-12-18
      • 1970-01-01
      相关资源
      最近更新 更多