【问题标题】:why is output 2 3 0?为什么输出 2 3 0?
【发布时间】:2020-12-27 16:49:00
【问题描述】:

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

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

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

【问题讨论】:

  • 这是写得很糟糕的代码。问问它是如何工作的很好,只要确保你从来没有写过这样的代码。程序员的职责之一是不要编写不必要的聪明或可能让下一个阅读它的程序员感到困惑的代码。

标签: c output


【解决方案1】:

在第一次迭代中,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) 再次后递增,因此返回的值将是 a[i] 即 @987654342 @(因为i现在是2,现在返回后递增),所以i在for循环体内的下一个语句中将为3,这将使数组元素为a[3],即0 (这就是你在最后一次迭代中得到0 的原因)。

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

再次回到有条件的循环,它将返回a[i],此时a[3] 为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 的顺序是未指定的

    【讨论】:

    • 在此代码中使用 ++ 非常好,只要您不以 OP 的方式组合它们。
    • @RobertHarvey 我不确定是否理解您,您是否说行为未定义是因为两个 ++ 的顺序未定义?对我来说不,因为有 post incr 而不是 pre incr => 他们的顺序不相关
    • 我的意思是,你也可以写a[i] = a[i] + 1a[i]++ 对每个人来说都是完全可以接受和理解的。
    • 这不一样,在 OP 代码中数组将有 (23410) 和你的 23400
    • @dreamcrash:更有理由一开始就不写这样的代码。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      这个

      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++;
      

      【讨论】:

        猜你喜欢
        • 2017-09-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-03
        • 1970-01-01
        • 2016-05-02
        • 2021-02-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多