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

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

以下for循环产生相同的结果,即使一个使用后增量和另一个预增量。

这是代码:

for(i=0; i<5; i++) {
    printf("%d", i);}for(i=0; i<5; ++i) {
    printf("%d", i);}

我为两个'for'循环得到了相同的输出。我错过了什么吗?


天涯尽头无女友
浏览 547回答 3
3回答

富国沪深

在评估i++或之后,两种情况下++i的新值都是i相同的。增量前和增量之间的差异在于评估表达式本身的结果。++i递增i并计算为的新值i。i++计算旧的值i,并递增i。这在for循环中无关紧要的原因是控制流大致如下:测试条件如果是假,则终止如果是真的,执行正文执行增量步骤因为(1)和(4)是去耦的,所以可以使用前增量或后增量。

三国纷争

嗯,这很简单。上述for循环在语义上等同于int&nbsp;i&nbsp;=&nbsp;0;while(i&nbsp;<&nbsp;5)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;printf("%d",&nbsp;i); &nbsp;&nbsp;&nbsp;&nbsp;i++;}和int&nbsp;i&nbsp;=&nbsp;0;while(i&nbsp;<&nbsp;5)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;printf("%d",&nbsp;i); &nbsp;&nbsp;&nbsp;&nbsp;++i;}请注意这些行i++;和++i;从本块代码的角度来看具有相同的语义。它们对值i(将其递增1)具有相同的效果,因此对这些循环的行为具有相同的影响。请注意,如果将循环重写为,则会有所不同int&nbsp;i&nbsp;=&nbsp;0;int&nbsp;j&nbsp;=&nbsp;i;while(j&nbsp;<&nbsp;5)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;printf("%d",&nbsp;i); &nbsp;&nbsp;&nbsp;&nbsp;j&nbsp;=&nbsp;++i;}int&nbsp;i&nbsp;=&nbsp;0;int&nbsp;j&nbsp;=&nbsp;i;while(j&nbsp;<&nbsp;5)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;printf("%d",&nbsp;i); &nbsp;&nbsp;&nbsp;&nbsp;j&nbsp;=&nbsp;i++;}这是因为在第一个代码块中j看到i增量之后的值(i首先递增,或者预先递增,因此名称),并且在第二个代码块中j看到i增量之前的值。

拉风的咖菲猫

您的代码的结果将是相同的。原因是两个增量操作可以看作是两个不同的函数调用。这两个函数都会导致变量递增,只有它们的返回值不同。在这种情况下,返回值只是丢弃,这意味着输出中没有可区别的差异。然而,在引擎盖下有一个区别:后增量i++需要创建一个临时变量来存储原始值i,然后执行增量并返回临时变量。预增量++i不会创建临时变量。当然,任何体面的优化设置都应该能够在对象简单的情况下优化它int但请记住,++ - 运算符在迭代器等更复杂的类中被重载。由于两个重载方法可能具有不同的操作(例如,可能希望输出“嘿,我是预先递增的!”到stdout),当不使用返回值时,编译器无法判断方法是否等效(基本上因为这样的编译器可以解决无法解决的暂停问题),如果你写的话,它需要使用更昂贵的后增量版本myiterator++。你应该预先增加的三个原因:您不必考虑变量/对象是否可能具有重载的增量后方法(例如在模板函数中)并以不同方式对待它(或者忘记以不同方式对待它)。一致的代码看起来更好。当有人问你“你为什么预先增加?”&nbsp;您将有机会向他们讲述编译器优化的暂停问题和理论限制。:)
打开App,查看更多内容
随时随地看视频慕课网APP