为了账号安全,请及时绑定邮箱和手机立即绑定

'for'循环内的后增量和预增量产生相同的输出

'for'循环内的后增量和预增量产生相同的输出

C++ C
天涯尽头无女友 2019-07-23 18:05:43
'for'循环内的后增量和预增量产生相同的输出以下for循环产生相同的结果,即使一个使用后增量和另一个预增量。这是代码:for(i=0; i<5; i++) {     printf("%d", i);}for(i=0; i<5; ++i) {     printf("%d", i);}我为两个'for'循环得到了相同的输出。我错过了什么吗?
查看完整描述

3 回答

?
富国沪深

TA贡献1790条经验 获得超9个赞

在评估i++或之后,两种情况下++i的新值都是i相同的。增量前和增量之间的差异在于评估表达式本身的结果。

++i递增i并计算为的新值i

i++计算旧的值i,并递增i

这在for循环中无关紧要的原因是控制流大致如下:

  1. 测试条件

  2. 如果是假,则终止

  3. 如果是真的,执行正文

  4. 执行增量步骤

因为(1)和(4)是去耦的,所以可以使用前增量或后增量。


查看完整回答
反对 回复 2019-07-23
?
三国纷争

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增量之前的值。


查看完整回答
反对 回复 2019-07-23
?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

您的代码的结果将是相同的。原因是两个增量操作可以看作是两个不同的函数调用。这两个函数都会导致变量递增,只有它们的返回值不同。在这种情况下,返回值只是丢弃,这意味着输出中没有可区别的差异。

然而,在引擎盖下有一个区别:后增量i++需要创建一个临时变量来存储原始值i,然后执行增量并返回临时变量。预增量++i不会创建临时变量。当然,任何体面的优化设置都应该能够在对象简单的情况下优化它int但请记住,++ - 运算符在迭代器等更复杂的类中被重载。由于两个重载方法可能具有不同的操作(例如,可能希望输出“嘿,我是预先递增的!”到stdout),当不使用返回值时,编译器无法判断方法是否等效(基本上因为这样的编译器可以解决无法解决的暂停问题),如果你写的话,它需要使用更昂贵的后增量版本myiterator++

你应该预先增加的三个原因:

  1. 您不必考虑变量/对象是否可能具有重载的增量后方法(例如在模板函数中)并以不同方式对待它(或者忘记以不同方式对待它)。

  2. 一致的代码看起来更好。

  3. 当有人问你“你为什么预先增加?” 您将有机会向他们讲述编译器优化的暂停问题和理论限制。:)


查看完整回答
反对 回复 2019-07-23
  • 3 回答
  • 0 关注
  • 541 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信