当所有“部分”均为“ i ++”时,“ for”如何工作?

时间:2019-09-29 22:09:06

标签: c

我已经使用Code :: Blocks查找结果了,最后它给了我2,其中i + j = 1 + 1

#include <stdio.h>

int main(void) {
    int i = -1, j = 1;

    for(i++; i++; i++)
        j++;

    printf("%d",i + j);
    return 0;
}

i如何成为1,为什么j没有增加?

3 个答案:

答案 0 :(得分:6)

您从i == -1, j == 1开始。

然后您运行第一个i++,它将生成i == 0。结果({{1}的原始值)未使用。

然后您在i中进行首次测试。由于i++已经是i,因此测试是0,因此false循环将退出。现在,后增量运行,使其变为for,然后退出循环。

请注意,如何从未达到i == 1

要更清楚地看到它,可以按照以下等效方式考虑j++;循环:

for

答案 1 :(得分:3)

这是执行顺序:

  1. i-1,而j1

  2. i递增(此后i == 0

  3. 该循环检查是否为i != 0。由于此时i0,所以将跳过循环的内容。

  4. i再次递增(此后i == 1

  5. 代码显示i + j,这是2,因为j不变,而i1

这是一个带有while循环的程序,它与您所质疑的程序具有相同的作用:

int main(void) {
    int i = -1, j = 1;
    i++;
    while(i++)
    {
        j++;
        i++;
    }
    printf("%d",i + j);
    return 0;
}

直接回答您的问题:

  • i之后是1,因为它是从-1的原始值起增加了两次。

  • j不会增加,因为跳过了循环的内容。

答案 2 :(得分:1)

让我先解释一下如何执行循环:

  1. 首先执行初始化步骤,并且仅执行一次。此步骤允许您声明和初始化任何循环控制变量。只要出现分号,就无需在此处声明。

  2. 接下来,评估条件。如果为true,则执行循环主体。如果为假,则不执行循环主体,并且控制流仅在for循环之后跳转到下一条语句。

增量运算符: i的值在执行后会递增i++

您的代码说明:

 for(i++; i++; i++)  
  1. 在初始化步骤i++已执行,但是i仍将是0,直到达到条件for的循环为止。

  2. i变为零,表示条件为假,但同时又执行了一个i++

  3. 由于条件为假,for循环语句将永远不会执行,i的值将为1,而j的值仍为1