在C,SPECIAL CASE中增加数组

时间:2011-04-14 09:15:02

标签: c arrays

我对以下代码感到困惑:

#include <stdio.h>

int main()
{
    int a[] = {5, 15, 1, 20, 25};
    int i, j, m;

    i = ++a[1];   /*statement 1*/
    j = a[1]++;   /*statement 2*/
    m = a[i++];   /*statement 3*/

    printf("\n%d\n%d\n%d\n", i, j, m);

    return 0;
}

陈述1,2,3对我来说有点混乱;我不知道这些是为我产生输出的方式。有人可以对此有所了解吗?

4 个答案:

答案 0 :(得分:3)

i=++a[1];   /*statement 1*/   // increments the value of a[1] and assigns to i
j=a[1]++;   /*statement 2*/   // assign the value of a[i] and then increments the value of a[i] to j
m=a[i++];   /*statement 3*/   //  assign a[i] to m, and increment i


i=++a[1];   // a[1] is 15 here so i =16, and a[1] =16
j=a[1]++;   // a[1] is 16 so j =16 and a[1] =17
m=a[i++];   // i is 16 here but index 16 does not exists here, so program fails

答案 1 :(得分:2)

i = ++a[1];   /*statement 1*/

听到a [1]将为15.而Pre Increment运算符将使用1 S0增加[1] i will be 16

j = a[1]++;   /*statement 2*/

后增量运算符也会将[1]的值增加1.所以j will be 16

m = a[i++];   /*statement 3*/

这里,它是i ++,所以后增量oprator会将i增加1 ..之前我计算16。现在i will now be 17

So a[17] has no value. so m will be junk value

答案 2 :(得分:0)

第一个声明

i = ++a[1] ---&gt;增加a [1](即)i值的值将为16

第二声明

j = a[1]++ ---&gt;将a [1]的值分配给j,然后递增(即)j将为16。

第三声明

m = a[i++] - &gt;将[i]的值分配给m和i递增。

答案 3 :(得分:0)

如有疑问,您可以使用gdb:

  1. 编译代码设置调试标志(-g for gcc)gcc -g -o so stackoverflow.c
  2. 运行gdb gdb ./so
  3. 在gdb
  4. 中标识要中断list的行
  5. 设置断点break 6(第一个断点是第6行)
  6. 前进step
  7. 例如,显示值print iprint a[1]
  8. 但要注意,如果你在gdb中调用print ++a[1],你可能会改变你的程序行为!