为什么输出 2 3 0?

时间:2020-12-27 16:49:00

标签: c output

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

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

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

4 个答案:

答案 0 :(得分:2)

  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 的测试中使用这些值之前 incr

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

答案 1 :(得分:2)

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

  1. 返回 i 的值并将其递增(第一个 ++),因此我们现在剩下 a[0]i 初始化为 0),
  2. 现在来到 a[0],它再次进行后递增(第二个 ++),因此最终返回 a[0],然后递增它。

因此对于第一次迭代,for 的条件中返回的值是 a[0],即 1,因此循环将继续执行其主体。

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

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

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

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

再次回到有条件的循环,它将返回 a[i] = a[3] = 0,此时 a[i] 为 0,因此条件失败并因此停止循环。因此,之后您无需打印任何内容。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

这个

if (doc.exists) {
   this.$set(this.products, doc.id, {
      data: doc
   });
}

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

你的循环:

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

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

for(i = 0; a[i++]++;)
相关问题