我更想通过展示代码的方式把这个问题说清楚。
如果这个帖子已经有了答案,欢迎把它作为重复的帖子(因为我没有找到答案
这是我的代码。
#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]。
如果我说话的方式太乱,很抱歉,如果你觉得我的解释有什么遗漏的地方,可以问我,希望通过这个帖子,其他同样有困惑的人也能理解。
预增操作符 。 预增运算符(
++i
)用于在表达式中使用一个变量的值之前对其进行增量。在Pre-Increment中,先递增值,然后在表达式中使用。后增量运算符。 增量后运算符(
i++
)用于在完全执行表达式后对变量的值进行增量,其中使用了后增量。在Post-Increment中,首先在表达式中使用值,然后再进行递增。
所以,在你的例子中,你的 test++
将首先返回值,即3,然后再递增。因此, arr[test++]
转到索引3而不是4,如果你是这样做的--。arr[++test] = 999
,那么首先就会把test的值增加到4,然后就会把这个值作为语句中的索引。这就是后增量和前增量的主要区别。
希望这能解开你的疑惑!
我无法重现结果
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;
是什么让你感到困惑。结果是 1 2 3 999 5 用gcc.