即使其中一个使用后递增,另一个使用前递增,以下for循环也会产生相同的结果。
这是代码:
for(i=0; i<5; i++) { printf("%d", i); } for(i=0; i<5; ++i) { printf("%d", i); }
对于两个“ for”循环,我得到相同的输出。我想念什么吗?
评估i++或之后,两种情况下++i的新值i将相同。增量前和增量后的差异是对表达式本身求值的结果。
i++
++i
++i递增i并评估为的新值i。
i
i++计算为的旧值i,并递增i。
在for循环中这无关紧要的原因是控制流程大致如下所示:
因为(1)和(4)是解耦的,所以可以使用前递增或后递增。
好吧,这很简单。以上for循环在语义上等效于
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增量之前的值。
j