【问题标题】:Pre increment vs Post increment in array数组中的前增量与后增量
【发布时间】:2013-05-27 23:13:30
【问题描述】:

我正在学习编程,我是从 C 语言开始的。我在读 Let us C 书。我正在经历那本书中的这个程序。

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

我的理解是,它将打印i as 2j as 1m as 15

但不知何故,它打印为i as 3j as 2m as 15?为什么会这样?

以下是我的理解-

b = x++;
In this example suppose the value of variable ‘x’ is 5 then value of variable ‘b’ will be 5 because old value of ‘x’ is used.

b = ++y;
In this example suppose the value of variable ‘y’ is 5 then value of variable ‘b’ will be 6 because the value of ‘y’ gets modified before using it in a expression.

我的理解有什么问题吗?

【问题讨论】:

    标签: c post-increment pre-increment


    【解决方案1】:

    说明:

    第 1 步: int a[5] = {5, 1, 15, 20, 25};变量 arr 被声明为一个大小为 5 的整数数组,它被初始化为 a[0] = 5, a[1] = 1, a[2] = 15, a[3] = 20, a[4 ] = 25。

    第二步: int i, j, m;变量 i,j,m 被声明为整数类型。

    第三步: i = ++a[1];变为 i = ++1;因此 i = 2 和 a[1] = 2

    第四步: j = a[1]++;变为 j = 2++;因此 j = 2 和 a[1] = 3。

    第五步: m = a[i++];变成 m = a[2];因此 m = 15 并且 i 增加 1(i++ 表示 2++ 所以 i=3)

    第六步: printf("%d, %d, %d", i, j, m);它打印变量 i、j、m 的值

    因此程序的输出是 3, 2, 15

    【讨论】:

      【解决方案2】:

      您的理解并不完全正确。 前自增和后自增运算符是一元运算符。

      因此,最初如果 b = 5,则 ++b 或 b++ 将 b 的值增加到 6。但是,当您使用赋值运算符“=”时,pre 和 post 之间的区别就出现了。

      所以,

      if b=5
      a=b++ // after this statement a=5 and b=6 as it is post increment
      c=++b // after this statement c=7 and b=7
      

      为了便于理解,可以将以上语句划分为:

      a=b;  
      b=b+1; //post increment  
      b=b+1; //pre increment  
      c=b;`  
      

      那么,你给出的例子:

      main( )    
      {      
       int a[5] = { 5, 1, 15, 20, 25 } ;     
       int i, j, k = 1, m ;  
       i = ++a[1] ; // a[1] = 2 and i = 2  
       j = a[1]++ ; // j = 2 and a[1] = 3  
       m = a[i++] ; // m = a[2++] = 15, i now becomes 3  
       printf ( "\n%d %d %d", i, j, m ) ; // so i =3, j= 2 and m =15  
      }
      

      为了清楚起见,我将上面的代码分成多个语句:

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

      我希望上面的解释能消除你的疑惑和你正在运行的程序的输出。

      【讨论】:

        【解决方案3】:

        你一针见血。你的理解是正确的。前增量表达式和后增量表达式之间的区别就像听起来一样。预增量意味着变量在设置或评估表达式之前递增。后增量意味着设置或评估表达式,然后更改变量。很容易将其视为一个两步过程。

        b = x++;
        

        真的是:

        b = x;
        x++;
        

        b = ++x;
        

        真的是:

        x++;
        b = x;
        

        编辑:您提供的示例中棘手的部分(可能会让您失望)是数组索引与其值之间存在巨大差异。

        i = ++a[1];
        

        这意味着将存储在 a[1] 中的值递增,然后将其设置为变量 i。

        m = a[i++];
        

        这意味着将 m 设置为 a[i] 的值,然后递增 i。两者之间的区别是一个很大的区别,一开始可能会让人感到困惑。

        第二次编辑:代码分解

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

        第一:

        i = ++a[1];
        

        此时我们知道 a[1] = 1(记住数组是零索引的)。但是我们先增加它。因此 i = 2。

        j = a[1]++;
        

        记住我们之前增加了 a[1],所以它现在是 2。我们设置 j = 2,然后将它增加为 3。所以 j = 2,现在 a[1] = 3。

        m = a[i++];
        

        我们知道i = 2。所以我们需要设置m = a[2],然后增加i。在这个表达式的末尾,m = 15,并且 i = 3。

        总之,

        i = 3, j = 2, m = 15.
        

        【讨论】:

        • 感谢 Eric 澄清疑问,但为什么程序的输出会如此不同?
        • 我再次编辑了代码,详细说明了正在发生的事情。我认为这很清楚,如果您需要更多说明,请告诉我。 :D
        • 感谢 Eric 的详细理解。
        猜你喜欢
        • 2011-09-18
        • 2021-04-04
        • 2012-09-15
        • 2012-03-07
        • 2013-05-04
        • 2012-06-01
        • 2014-06-03
        • 2013-08-26
        相关资源
        最近更新 更多