为什么输出2 3 0?

why is output 2 3 0?

我正在做一些考试题,我遇到了这个,但我就是不明白。

   int main()
    {
       int a[3+2] = {1, 2, 3}, i;
       for(i = 0; a[i++]++;)
          printf("%d", a[i]);
    return 0;
    }

为什么这段代码的输出是2 3 0?我尝试了几种思考方式,但无法理解。

  int a[3+2] = {1, 2, 3}, i;
  for(i = 0; a[i++]++;)
      printf("%d", a[i]);

相当于让阅读更简单

  int a[3+2] = {1, 2, 3, 0, 0}, i;
  for(i = 0; a[i];) {
      a[i] += 1;
      i += 1;
      printf("%d", a[i]);
  }
  a[i] += 1;

所有++都是postr incr,所以在for

的测试中使用before incr的值

请注意,pre incr (++a[++i]) 的结果是未定义的,因为两个 incr 的顺序未指定

碰巧是这样,因为在for中你有一个[i++]。当 i = 3 数组中的计数为 4 并且您收到 int 的默认值,即 0,您的数组为 [1, 2 , 3, 0, 0]。抱歉我的英语不好。

在第一次迭代中,a[i++]++ 将做两件事:

  1. Return i 的值并增加它(第一个 ++),这样我们就可以得到 a[0]i 初始化为 0)现在,
  2. 现在来到 a[0],它再次增加 post(第二个 ++),所以这最终 returns a[0] 然后增加它。

所以对于第一次迭代,在for条件中编辑的值return是a[0],即1,因此循环将继续到它的主体。

来到 for 循环的主体,我们现在对上面的语句有两个更改,ia[i] 都递增,所以我们有 i = 1a[0] = 2a[0] 加了 1,记住外面的 ++)。

以同样的方式继续,我们将继续 i = 2, a[1] = 3a[1] 是 2 但 post 增加了,所以变成了 3)。

在此之后,再次回到循环的条件,我们有 i (=2) 和 a[i] (=3) 都再次 post-递增,所以值returned 将是 a[i]a[2](因为 i 现在是 2,现在它在被 returned 之后递增),所以 i 在 for 循环体内的下一条语句中将是 3,这将使数组元素成为 a[3] 即 0(这就是为什么你在最后一次迭代中得到 0)。

由于i = 3和数组声明,我们将a[3]的默认值设置为0,它在下一次迭代中给出i = 3a[i] = a[3] = 0

再次回到循环条件,它将 return a[i] 此时是 a[3] 即 0,因此条件失败并因此停止循环。因此,您之后不会打印任何内容。

这个

int a[3+2] = {1, 2, 3}

相同
int a[5] = {1, 2, 3, 0, 0}

你的循环:

for(i = 0; a[i++]++;)

一旦 a[i] == 0 就停止打印,在您的情况下是第 4 个位置。你的循环相当于

 int a[3+2] = {1, 2, 3, 0, 0}, i;
 for(i = 0; a[i] != 0;)
 {  
    a[i]++;
    i++;
    printf("%d", a[i]); 
 }
 a[i]++;
 i++;