【问题标题】:Confusing output after use of increment operator使用增量运算符后输出混乱
【发布时间】:2014-06-04 09:42:42
【问题描述】:
#include <stdio.h>

main()
{   
    int a[5] = {5,1,15,20,25};
    int i,j,m;
    i = ++a[1];
    j = a[1]++;
    m = a[i++];
    printf("%d %d %d\n",i,j,m);
}

好的,现在程序编译并运行良好。但是我得到的输出是 3 2 15 即 i = 3 ,j = 2,m = 15。我不明白 i 的值是如何变成 3 的,因为 a[1] 即 '1' 当递增时必须变为 2 . 这是一个'追踪输出'类型的问题。我正在使用 gcc。

【问题讨论】:

    标签: c post-increment pre-increment


    【解决方案1】:

    当下面一行被执行时,

    m = a[i++];
    

    i 再次递增,使其值为3

    【讨论】:

    • 哦,是的。谢谢你,为什么 m 返回 a[2] 而那是 15,因为 i++ 是后增量。 m 在 i 增加之前被赋值。但是 j 必须等于 '1' 因为值将首先被分配,然后它会增加不是吗?
    • j = a[1]++; 可以解释为j=a[1];a[1] = a[i]+1;。分配给j 的表达式a[1]++ 的值是a[1]a[1] 递增之前的值。
    【解决方案2】:

    我已经在语句执行之前和之后编写了变量的值,并且 所有的副作用都发生了。

    int a[5] = {5, 1, 15, 20, 25};
    int i, j, m;
    
    // before : i is indeterminate, a[1] = 1
    i = ++a[1];  
    // after: i = 2, a[1] = 2
    
    // before: j indeterminate, a[1] = 2
    j = a[1]++;  
    // after: j = 2, a[1] = 3
    
    // before: m indeterminate, i = 2
    m = a[i++];  
    // after: m = a[2] = 15, i = 3
    

    因此,最终值为

    i = 3
    j = 2
    m = 15
    

    【讨论】:

      【解决方案3】:

      在第 7 行,你有

      i = ++a[1];
      

      这会增加 a[1](到 2),然后将其分配给 i

      然后在第 9 行,你有

      m = a[i++];
      

      这会增加 i(到 3),然后将 a[3] (15) 分配给 m。

      【讨论】:

        【解决方案4】:

        i = 3 因为

        i = ++a[1] => i = ++1 and so i,a[1] are both 2
        m = a[i++] => i = 3 because of i++
        

        【讨论】:

          猜你喜欢
          • 2019-04-07
          • 1970-01-01
          • 1970-01-01
          • 2020-11-04
          • 1970-01-01
          • 2013-06-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多