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;