意外输出涉及具有后期和预增量的数组值

时间:2015-07-20 13:54:10

标签: c post-increment pre-increment

以下程序的输出不应该是 -

  

2 3 20

而是显示

  

3 2 15

有谁可以解释这背后的原因?

#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",i,j,m);
}

3 个答案:

答案 0 :(得分:7)

  

3 2 15

是正确的输出。

  1. i为3,因为ii = ++a[1];中变为2,用于预增量,然后在m = a[i++];
  2. 中后递增
  3. j为2,因为j = a[1]++;,之后没有变化。
  4. m为15,因为m = a[i++]; i正在递增,i的旧值(2)用于索引和在评估i声明后,=的后增量已排序
  5. 话虽如此,main()的推荐签名为int main(int argc, char *argv[])或至少为int main(void)

答案 1 :(得分:2)

此时,变量值为:

a = {5,1,15,20,25};
i = uninitialized
j = uninitialized
m = uninitialized

现在,

i = ++a[1];

获取a[i]的值,该值为1,递增,然后变为2,然后将其存储在i中。

此时,变量值为:

a = {5,2,15,20,25};
i = 2
j = uninitialized
m = uninitialized

接下来,

j = a[1]++;

获取a[1]中的值2(因为它在前一个语句中递增),将此值存储在j中,然后递增a[1]中存储的值。 / p>

此时,变量值为:

a = {5,3,15,20,25};
i = 2
j = 2
m = uninitialized

然后,

m = a[i++];

获取a[i]a[2]以来i当前为2)的值,即15,此值存储在m中。然后,i递增。

此时,变量值为:

a = {5,3,15,20,25};
i = 3
j = 2
m = 15

答案 2 :(得分:1)

3 2 15 is correct

#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",i,j,m);
    }

现在让我们一行一行假设i,j,m等于0 {更好地初始化}

来自第3行,i = ++a[1]; i = 2 as(++ pre increment,change then use,a [1] = 1 so i = 2)

来自第4行,j = a[1]++; j = 2 as(++这里是后增量,使用然后改变,a [1]变为3但j等于2)

来自第5行,m = a[i++]; i = 2 by line 3,这里++ post increment然后我将增加到3但是会使用[2]。

  

因此i = 3,j = 2,m = 15

希望你明白了..........