i++ 和 ++i 的区别?

Posted

技术标签:

【中文标题】i++ 和 ++i 的区别?【英文标题】:Difference between i++ and ++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 并没有真正匹配它自己的标题(或重复选择)。 【参考方案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 不,括号与评估顺序无关

以上是关于i++ 和 ++i 的区别?的主要内容,如果未能解决你的问题,请参考以下文章

PHP中的++$i和$i++有啥区别?

Iterator和Iteratable的区别,介绍

i--和--i的区别

C语言中i++和(i)++的区别

i++和++i区别

df.iloc[[i]] 和 df.iloc[i] 有啥区别 [重复]