读书人

有关i++的有关问题

发布时间: 2012-03-23 12:06:21 作者: rapoo

有关i++的问题!

C/C++ code
/* */#include <stdio.h>main(){    int a=5,b,c,i=10;    b=a++;    c=++b;    printf("a = %d, b = %d, c = %d\n",a,b,c);    printf("i,i++,i++ = %d,%d,%d\n",i,i++,i++);    printf("%d\n",++i);    printf("%d\n",--i);    printf("%d\n",i++);    printf("%d\n",i--);    printf("%d\n",-i++);    printf("%d\n",-i--);    getchar();}

b=a++;不是a=5先赋给b,再a自增1变成6的吗?怎么b也是6

[解决办法]
VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)”

提醒:
“学习用汇编语言写程序”

“VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)”
不是一回事!

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!

不要写连自己也预测不了结果的代码!

[解决办法]
c=++b;

[解决办法]
int a=5,b,c,i=10;
b=a++;
c=++b;

printf("a = %d, b = %d, c = %d\n",a,b,c);


楼主注意b=a++后,c=++b,更改了b
[解决办法]
别纠结这种和编译器 有关的问题了。
[解决办法]
printf("i,i++,i++ = %d,%d,%d\n",i,i++,i++);
============

这个是未定义行为的.
http://topic.csdn.net/u/20110826/09/601ebe9c-c2ae-4d63-a4e2-506c618bb654.html?80504
[解决办法]
b = a++;这一句已经修改b的值了,因为a的值是5,a自增后变成6再赋给b,所以b的值是6,没错啊。
[解决办法]
printf("i,i++,i++ = %d,%d,%d\n",i,i++,i++);
这个和调用惯例有关貌似,c语言默认参数压栈是从右到左。
另外,如楼上大神们所言,这段代码是未定义行为。
[解决办法]
10楼要注意学习哟,b=a++,a是先赋值后自加的,所以b=5.
楼主的问题和编译器没关系,3楼,4楼和7楼的解释已经很清楚了。关键在于printf 之前 c=++b这句,b当然就变成6了。

读书人网 >C语言

热点推荐