我对以下代码感到困惑:
#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对我来说有点混乱;我不知道这些是为我产生输出的方式。有人可以对此有所了解吗?
答案 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:
gcc -g -o so stackoverflow.c
gdb ./so
list
的行
break 6
(第一个断点是第6行)step
print i
或print a[1]
。但要注意,如果你在gdb中调用print ++a[1]
,你可能会改变你的程序行为!