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
现在我的问题是,如果 ++i
是 3
那么为什么 ++j
是 2?
++i
和 i++
有什么区别?另外我想知道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
的值不会更改。
++i
和i++
有什么区别?
表达式++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 的区别?的主要内容,如果未能解决你的问题,请参考以下文章