【问题标题】:Difference between i++ and ++i?i++ 和 ++i 的区别?
【发布时间】:2015-07-11 23:36:03
【问题描述】:

这是我的代码:

int main()
{
    int i=2,j=2,c=2,d;

    d= ++i || ++j && c;
    printf("I is %d\n",i);
    printf("J is %d\n",j);
    printf("C is %d\n",c);
    printf("D is %d\n",d);
    return 0;
}

以下代码的输出是:

i is 3                                                                                                                                                                          
j is 2                                                                                                                                                                          
c is 2                                                                                                                                                                          
d is 1

现在我的问题是,如果 ++i3 那么为什么 ++j 是 2?

++ii++ 有什么区别?另外我想知道d怎么是1

【问题讨论】:

  • 为什么在++j之后J的值还是2?
  • 请注意,++j 永远不会被执行。肯定有一些关于短路和逻辑运算符的问题
  • 嗯,每个人都投票支持的副本肯定回答了这个问题的标题。太糟糕了 question 并没有真正匹配它自己的标题(或重复选择)。

标签: c short-circuiting


【解决方案1】:

评估的原因是布尔运算符&&|| 短路

  • 对于&&,如果左侧表达式为假,则组合结果为假(从不计算右侧表达式)。
  • 对于||,如果左侧表达式为真,则组合结果为真(右侧表达式从不求值)。

当右侧表达式具有副作用时,这一点尤为重要,例如更改值(或调用具有副作用的某些函数),例如在您的情况下:

d= ++i || ++j && c;

请注意,组合的条件表达式会将i 增加1,因为|| 左侧的条件表达式为真,右侧的条件表达式即++j && c 永远不会被计算。

因此,总表达式最终会导致:

d = 1 || ++j && c;

这解释了为什么 d=1?

现在,如果您更改i=-1 的值,那么|| 右侧的表达式将被执行,j 将按照您的预期递增

现在查看 i++ 与 ++i 的性能影响 here :)

【讨论】:

    【解决方案2】:

    你问:

    现在我的问题是如果 ++i 是 3 那么为什么 ++j 是 2?

    ++j 永远不会执行,因为 ++i 的计算结果为 true。

    由于运算符优先级,表达式++i || ++j && c 等价于++i || (++j && c)

    运行时从左到右计算表达式++i || ++j && c
    第一项 ++i 的计算结果为 3,其副作用是 i 的值为 3。由于它非零,因此运行时间不需要在此之后评估任何内容。由于从未计算过++j,因此j 的值不会更改。

    ++ii++ 有什么区别?

    表达式++i 的值为i+1,其副作用是i 的值增加了1

    表达式i++ 的值为i,其副作用是i 的值增加了1

    int i = 2;
    int x = ++i;  // x == 3, i == 3 at the end of execution of the statement
    int y = i++;  // y == 3, i == 4 at the end of execution of the statement
    

    我想知道D怎么是1

    d 的值设置为 1,因为表达式的布尔值为 true

    【讨论】:

      【解决方案3】:

      ++i 是预增量。
      i++ 是后增量。
      假设这里i = 2

      在后增量中

      printf("%d",i++); // it will print output 2 then increment value of i to 3
      

      在预增量中

      printf("%d",++i); //first it will increment value of i to 3, then print output 3
      

      d= ++i || ++j && c;    
      

      条件将以这种方式执行++i || (++j && c);
      当 i=2 时,++i 之后将变为 3
      OR 中,如果第一个条件为真,它将跳过第二个条件。表示++j && c 不会被执行。
      ++i || ++j && c 的结果是 1
      所以 d = 1。


      printf("I is %d\n",i);  // i = 3;
      printf("J is %d\n",j);  // j = 2;
      printf("C is %d\n",c);  // c = 2;
      printf("D is %d\n",d);  // d = 1;  
      

      Short Circuit evaluation

      【讨论】:

      • && 的优先级高于 ||。所以它会先解决++i,然后如果是假的,解决++j && c,最后把||这两个东西一起解决。
      • @MattMcNabb ,如果表达式是++i || (++j && c),那么(++j && c)不应该先执行,因为它们在括号中?
      • @CoolGuy 不,括号与评估顺序无关
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-16
      • 1970-01-01
      • 2020-02-26
      • 2017-10-23
      • 2011-03-21
      • 2021-08-25
      相关资源
      最近更新 更多