有关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了。