增量后为指数混乱

问题描述 投票:0回答:1

我更想通过展示代码的方式把这个问题说清楚。

如果这个帖子已经有了答案,欢迎把它作为重复的帖子(因为我没有找到答案

这是我的代码。

#include <stdio.h>
#include <stdlib.h>

int main ()
{
    int test=3;
    int *arr=(int*)malloc (5*sizeof (int));
    for (int x=0; x<5; x++) *(arr+x)=x+1;
    *(arr+(test++))=999;
    for (int x=0; x<5; x++) printf ("%d ", *(arr+x));

    return 0;
}

输出:

1 2 3 999 5

问题是,我说test++意味着test会被递增到4,对吗?但是为什么 999 是插入到索引[3]而不是[4]?

据我所知。test 前应递增。999 分配给 arr. 这段代码有什么解释吗?(是不是不一样?因为它的结果是一样的,而我认为它应该是不同的)

*(arr+(test++))=999;
*(arr+test)=999; test++;

/*
Or,
arr[test++]=999;        //999 goes to [3] instead of [4]
arr[test]=999; test++;  //The right syntax should be like this right?
*/

顺便说一下,预增也可以,就像我做了 arr[++test]=999, 999 将被分配到索引[4]。

如果我说话的方式太乱,很抱歉,如果你觉得我的解释有什么遗漏的地方,可以问我,希望通过这个帖子,其他同样有困惑的人也能理解。

c arrays pointers post-increment
1个回答
0
投票

预增操作符 。 预增运算符( ++i )用于在表达式中使用一个变量的值之前对其进行增量。在Pre-Increment中,先递增值,然后在表达式中使用。

后增量运算符。 增量后运算符( i++ )用于在完全执行表达式后对变量的值进行增量,其中使用了后增量。在Post-Increment中,首先在表达式中使用值,然后再进行递增。

所以,在你的例子中,你的 test++ 将首先返回值,即3,然后再递增。因此, arr[test++] 转到索引3而不是4,如果你是这样做的--。arr[++test] = 999,那么首先就会把test的值增加到4,然后就会把这个值作为语句中的索引。这就是后增量和前增量的主要区别。

希望这能解开你的疑惑!


1
投票

我无法重现结果

1 2 3 4 999 5

运行你的程序,我得到了

1 2 3 999 5

我觉得你的问题有一个错别字。

至于这个问题

问题是,我在这里说test++意味着test会被递增到4,对吗?但是为什么999会被插入到索引[3]而不是[4]?

那么根据C标准(6.5.2.4 Postfix增量和减量运算符)

2 后缀++运算符的结果是操作数的值。. 作为一个副作用,操作数对象的值会被递增(也就是说,相应类型的值1会被加到它上面)。

所以你可以考虑这条语句

*(arr+(test++))=999

喜欢

*(arr+(test))=999
++test;

0
投票

是什么让你感到困惑。结果是 1 2 3 999 5 用gcc.

https:/godbolt.orgzfgm5Xg

© www.soinside.com 2019 - 2024. All rights reserved.