Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 作为索引的后期增量_C_Arrays_Pointers_Post Increment - Fatal编程技术网

C 作为索引的后期增量

C 作为索引的后期增量,c,arrays,pointers,post-increment,C,Arrays,Pointers,Post Increment,我宁愿通过显示代码来说明这一点 如果这篇文章已经有了答案,请随意复制(因为我还没有找到答案) 这是我的代码: #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;

我宁愿通过显示代码来说明这一点

如果这篇文章已经有了答案,请随意复制(因为我还没有找到答案)

这是我的代码:

#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;
}
问题是,这里我说test+,这意味着test将增加到4,对吗?但是为什么将
999
插入索引[3]而不是[4]

据我所知,
test
应该在
999
分配给
arr
之前递增。这段代码有什么解释吗?(它不同吗?因为当我认为它应该不同时,它会产生相同的结果)

顺便说一句,预增量工作得很好,就像我执行
arr[++test]=999
999
将分配给索引[4]

如果我说话的方式太混乱,我很抱歉,如果你认为我的解释遗漏了什么,我希望通过这篇文章,其他同样感到困惑的人能够理解

预增量运算符:预增量运算符(
++i
)用于增量 在表达式中使用变量之前的变量值。在 在增量之前,值首先递增,然后在 表情

增量后运算符:增量后运算符(
i++
)用于 在完全执行表达式后增加变量的值 其中使用了后期增量。在后增量中,值是第一位的 在表达式中使用,然后递增

因此,在您的例子中,
test++
将首先返回值,即3。然后,它将增加。因此,
arr[test++]
转到索引3而不是索引4。如果您这样做-
arr[++test]=999
,那么首先test的值将增加到值4,然后该值将用作语句中的索引。这是增量后和增量前的主要区别


希望这能消除你的疑虑

什么让你困惑。结果是:1 2 3 999 5使用gcc


我无法重现结果

1 2 3 4 999 5
运行我得到的你的程序

1 2 3 999 5
我觉得你的问题有点错

至于这个问题

问题是,我说的是test++,这意味着test将是 增加到4对吗?但为什么要将999插入索引[3] 而不是[4]

然后根据C标准(6.5.2.4后缀递增和递减运算符)

2后缀++运算符的结果是操作数的值。 作为一种副作用,操作数对象的值会增加(即 是,则会向其添加相应类型的值1)

所以你可以考虑这个声明

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


所以你的意思是
test++
仅仅意味着
test
在完成某项操作后将递增,对吗?@LastSecond959正确!首先返回/使用它的当前值,然后再递增。因此
arr[test++]=999
相当于
arr[test]=999;测试+=1断言前缀/后缀增量运算符在生成is值之前或之后递增值是不正确的,断言后缀增量的增量是“完全执行表达式之后”是特别错误的。对于后缀运算符,C标准说生成的值是操作数的值,并且,作为副作用,该值会增加。它没有说明该增量是在表达式求值期间还是之后(或者甚至在之前,只要表达式中产生了正确的值)。@Abhishek:在
i++
中,使用的值是增量之前的
i
。有时,
i
也会递增。这种增加可能在不同的时间发生。如果说它发生在发生
i
的表达式完成之后,则不正确。说它是原子操作甚至是不正确的。例如,
i=3;printf(“%d\n”,i+i++)
可以产生6,因为增量发生在
printf
之后,它可以产生
7
,因为增量发生在为
i++
生成值之后,并且在用于第一个
i
之前,它也可以具有未定义的行为。因此,增量后运算符的工作依赖于编译器,增量发生的时间取决于编译器的设计方式?或者这种未定义的行为是完全的,并且可能在不同的时间在同一个编译器上以不同的方式发生?我问的是过程(它是如何完成的,它是如何工作的),而不是结果。“问题是,这里我说test+,这意味着test将增加到4,对吗?但为什么要将999插入索引[3]而不是[4]?”@LastSecond959但问题中显示的结果是错误的-这个问题没有意义。顺便说一句,任何一本C语言书都很好地解释了增量后运算符和增量前运算符。哦,我明白了,我刚刚意识到我在那里输入了一个错误,谢谢你的提醒。你是如何得到这个输出的?
*(arr+x)
最好写成
arr[x]
@P\u J\u。这是一个输入错误,谢谢你的提醒,刚刚意识到。我输入了1234995,应该是123995。是的,我输入1234995是错误的,我读了@P_uj_uu的评论后才意识到。反正是Thx。我刚刚发了垃圾邮件(习惯,抱歉XD)。
1 2 3 999 5
*(arr+(test++))=999
*(arr+(test))=999
++test;