3 回答
![?](http://img1.sycdn.imooc.com/545863c10001865402200220-100-100.jpg)
TA贡献1790条经验 获得超9个赞
在评估i++
或之后,两种情况下++i
的新值都是i
相同的。增量前和增量之间的差异在于评估表达式本身的结果。
++i
递增i
并计算为的新值i
。
i++
计算旧的值i
,并递增i
。
这在for循环中无关紧要的原因是控制流大致如下:
测试条件
如果是假,则终止
如果是真的,执行正文
执行增量步骤
因为(1)和(4)是去耦的,所以可以使用前增量或后增量。
![?](http://img1.sycdn.imooc.com/545869510001a20b02200220-100-100.jpg)
TA贡献1804条经验 获得超7个赞
嗯,这很简单。上述for
循环在语义上等同于
int i = 0;while(i < 5) { printf("%d", i); i++;}
和
int i = 0;while(i < 5) { printf("%d", i); ++i;}
请注意这些行i++;
和++i;
从本块代码的角度来看具有相同的语义。它们对值i
(将其递增1)具有相同的效果,因此对这些循环的行为具有相同的影响。
请注意,如果将循环重写为,则会有所不同
int i = 0;int j = i;while(j < 5) { printf("%d", i); j = ++i;}int i = 0;int j = i;while(j < 5) { printf("%d", i); j = i++;}
这是因为在第一个代码块中j
看到i
增量之后的值(i
首先递增,或者预先递增,因此名称),并且在第二个代码块中j
看到i
增量之前的值。
![?](http://img1.sycdn.imooc.com/545863b500014e4602200220-100-100.jpg)
TA贡献1995条经验 获得超2个赞
您的代码的结果将是相同的。原因是两个增量操作可以看作是两个不同的函数调用。这两个函数都会导致变量递增,只有它们的返回值不同。在这种情况下,返回值只是丢弃,这意味着输出中没有可区别的差异。
然而,在引擎盖下有一个区别:后增量i++
需要创建一个临时变量来存储原始值i
,然后执行增量并返回临时变量。预增量++i
不会创建临时变量。当然,任何体面的优化设置都应该能够在对象简单的情况下优化它int
但请记住,++ - 运算符在迭代器等更复杂的类中被重载。由于两个重载方法可能具有不同的操作(例如,可能希望输出“嘿,我是预先递增的!”到stdout),当不使用返回值时,编译器无法判断方法是否等效(基本上因为这样的编译器可以解决无法解决的暂停问题),如果你写的话,它需要使用更昂贵的后增量版本myiterator++
。
你应该预先增加的三个原因:
您不必考虑变量/对象是否可能具有重载的增量后方法(例如在模板函数中)并以不同方式对待它(或者忘记以不同方式对待它)。
一致的代码看起来更好。
- 3 回答
- 0 关注
- 541 浏览
添加回答
举报