Percy

“ for”循环中的后递增和预递增产生相同的输出

java

即使其中一个使用后递增,另一个使用前递增,以下for循环也会产生相同的结果。

这是代码:

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

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

对于两个“ for”循环,我得到相同的输出。我想念什么吗?


阅读 425

收藏
2020-12-02

共2个答案

小编典典

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

++i递增i并评估为的新值i

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

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

  1. 测试条件
  2. 如果为假,则终止
  3. 如果是真的,执行身体
  4. 执行增量步骤

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

2020-12-02
小编典典

好吧,这很简单。以上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增量之前的值。

2020-12-02