请问个i++的有关问题
请教个i++的问题。
main()
{
int i,a[10];
for(i=0;i<=9;)
{
a[i++]=i;
}
for(i=9;i>=0;i--)
{
printf("%d",a[i]);
}
}
为什么程序的输出是9876543210,而不是10987654321?
------解决方案--------------------
VC调试时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
------解决方案--------------------
i++,先让i参与表达式中的计算,再自增。
++i,先让i自增,自增的结果再参与表达式的计算。
比如,
i=5;
j=i++; //执行后j=5
a=5;
b=++a; //执行后b=6
至于同一个表达式中有多个++,可能需要考虑编译器的执行顺序等因素。
------解决方案--------------------
具体请参看副作用和顺序点,i++和i--这种情况在不同的编译器有时会有不同的结果
至于你举的这个例子,我只能说对于 a = (i++)*i+6*(4*(i--))+6;这是一个完整的表达式,一般一个完整的表达式属于一个顺序点,所以在执行这一整句之后,才执行i++和i--,而不是在执行了i++后i就加了1,所以才有楼主那个结果6.
更具体的,请参看C primer plus和本帖置顶这位大神的文章:
[置顶] C,C++表达式求值顺序 裘老的解释。 [推荐]
main()
{
int i,a[10];
for(i=0;i<=9;)
{
a[i++]=i;
}
for(i=9;i>=0;i--)
{
printf("%d",a[i]);
}
}
为什么程序的输出是9876543210,而不是10987654321?
------解决方案--------------------
VC调试时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
------解决方案--------------------
i++,先让i参与表达式中的计算,再自增。
++i,先让i自增,自增的结果再参与表达式的计算。
比如,
i=5;
j=i++; //执行后j=5
a=5;
b=++a; //执行后b=6
至于同一个表达式中有多个++,可能需要考虑编译器的执行顺序等因素。
------解决方案--------------------
具体请参看副作用和顺序点,i++和i--这种情况在不同的编译器有时会有不同的结果
至于你举的这个例子,我只能说对于 a = (i++)*i+6*(4*(i--))+6;这是一个完整的表达式,一般一个完整的表达式属于一个顺序点,所以在执行这一整句之后,才执行i++和i--,而不是在执行了i++后i就加了1,所以才有楼主那个结果6.
更具体的,请参看C primer plus和本帖置顶这位大神的文章:
[置顶] C,C++表达式求值顺序 裘老的解释。 [推荐]