为什么这个C程序打印的是3215而不是2320?

为什么这个C程序打印的是3215而不是2320?,c,C,你能解释一下这个程序背后的逻辑吗?像这样试试,或者使用调试器,或者在一张纸的帮助下仔细想想 #include<stdio.h> int 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、 e++foo首先

你能解释一下这个程序背后的逻辑吗?

像这样试试,或者使用调试器,或者在一张纸的帮助下仔细想想

#include<stdio.h>
int 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、 e++foo首先递增变量foo,然后为表达式生成递增的值。然而,foo++为您提供了foo的值,但是如果您想进一步使用它,foo将递增

因此逐行分析如下所示:

i=++a[1]:a[1]是1,其递增值是2。因此,变量i的值为2

j=a[1]++:记住a[1]现在是2。所以表达式的值是2。因此j得到值2。但是a[1]增加,得到值3

m=a[i++]:i的值为2。它是递增的,但这里不使用该值,而是使用旧值。因此,这里正在访问[2]。因此,m变为15

最后,i是3,j是2,m是15

编辑:正如评论中指出的那样,++操作符的讨论并不完全是技术性的。我只是用一种教育性的方式来解释事情@pmg在评论部分描述了实际发生的事情。

原因有二

第一,i++修改i,使其等于3

第二,post increment运算符将值递增1,但返回原始值。因此,不仅修改了i,还从中得到了错误的值。对于j也是一样,再次增加a[1],使其为2+1=3,但运算符返回原始值,即2。要返回新值,请使用预增量运算符

这是固定代码:

#include <stdio.h>
int main()
{
    int a[5] = {5, 1, 15, 20, 25};
    int i, j, m;
    i = ++a[1]; fprintf(stderr, "i is %d; a[1] is %d\n", i, a[1]);
    j = a[1]++; fprintf(stderr, "j is %d; a[1] is %d\n", j, a[1]);
    m = a[i++]; fprintf(stderr, "m is %d, i is %d; a[i] is %d\n", m, i, a[i]);
    printf("%d, %d, %d", i, j, m);
}

这将为您提供2、3、20。让我们逐行分析:

#include<stdio.h>

int main()
{
   int a[5] = {5, 1, 15, 20, 25};
   int i, j, m;
   i = ++a[1];
   j = ++a[1];
   m = a[i+1];
   printf("%d, %d, %d", i, j, m);
}
这里我们首先将a[1]的值增加1,然后将其分配给i

结果:a[1]==2,i==2

这里我们首先将a[1]的值指定给j,然后将a[1]的值增加1

结果:a[1]==3,i==2,j==2

这里我们首先将[i]分配给m,然后将i增加1

结果:a[1]==3,i==3,j==2,m=15


这将是理解它的一个有用参考:

因为i的值更改了两次,而对a[1]的最后一次更改是不相关的。在纸上写一个小图表,显示每行执行后每个变量(包括数组元素)的值。固定代码?OP不是在寻找代码修复,而是在寻找对现有代码行为的解释。挑剔:++foo首先递增变量foo,然后生成表达式的递增值在技术上不准确。++foo的值是foo+1。该表达式具有递增foo的副作用。当主表达式中使用foo+1之前或之后不一定发生foo的增量时。
i = ++a[1];
j = a[1]++;
m = a[i++];