想了好久都没想通——帮帮忙
#include<stdio.h>void main()
{
int i=0;
printf("%d\n",i++);
printf("%d\n", i++);
}
#include<stdio.h>
void main()
{
int i=0;
printf("%d\n%d\n",i++,i++);
}
请问一下为什么这两个的值为什么会不一样?
这个是编译器的问题
关于自增自减,请楼主参见
http://bbs.fishc.com/thread-15954-1-1.html
这个帖子里面说的很清楚! 编译器的问题。
其实自增自减的问题楼主还是别去想太多了。只要你懂i++ i-- --i ++i就可以了。
大可不必深入研究,因为这个问题没意义。没有哪个程序员会用自增自减用得很复杂的。
这是我的经验。 个人认为无需为 i++ 或 ++i 或多次多层调用纠结,本身就是个无标准的问题,平时写程序也绝对不会这样写(小甲鱼老湿(^_^,开玩笑,没任何贬义)说了,写程序的最高境界是让所有人都看得明白而不是让自己都看不明白),研究出来也没任何意义,所以个人从来都不纠结这个问题,也不会去看别人的研究,另外,实践是检验真理唯一标准,在VC上反汇编一下,不就知道答案了?何苦如此纠结?? printf()函数的参数,在printf()函数读取时是从左往右读取的,然后将读取到的参数放到栈里面去,最后读取到的就放在栈顶,处理参数的时候是从栈顶开始的,所以是从右边开始处理的.--printf()函数的特点.
注意点:
1.printf()函数中的计算是从右向左进行的.
2.我们在写代码时,尽量避免无确定意义的表达式出现,因为不同的编译器,可能会采用不同的理解方式.
因为第一个程序用了两个printf,第一个printf的 i 值已经加1了,所以第二个printf会输出1 而第二个程序只有一句printf, 学多了你就知道了,这个真的不需要纠结!知道什么是自增什么是自检就行了。。。 #include<stdio.h>
void main()
{
int i=0;
int j=0;
printf("i=%d\n",i++);
printf("i=%d\n", i++);
printf("j=%d,j=%d\n",j++,j++);
}
执行结果:
i=0
i=1
j=0,j=0
分析:看反编译的汇编文件就能知道,两个j++,在反编译后用的不是同一个寄存器,而是ecx,edx,因此结果为0也不难理解了。
6: printf("i=%d\n",i++);
00401036 mov eax,dword ptr
00401039 mov dword ptr ,eax
0040103C mov ecx,dword ptr
0040103F push ecx
00401040 push offset string "i=%d\n" (0042202c)
00401045 mov edx,dword ptr
00401048 add edx,1
0040104B mov dword ptr ,edx
0040104E call printf (004010f0)
00401053 add esp,8
7: printf("i=%d\n", i++);
00401056 mov eax,dword ptr
00401059 mov dword ptr ,eax
0040105C mov ecx,dword ptr
0040105F push ecx
00401060 push offset string "i=%d\n" (0042202c)
00401065 mov edx,dword ptr
00401068 add edx,1
0040106B mov dword ptr ,edx
0040106E call printf (004010f0)
00401073 add esp,8
9: printf("j=%d,j=%d\n",j++,j++);
00401076 mov eax,dword ptr
00401079 mov dword ptr ,eax
0040107C mov ecx,dword ptr
0040107F push ecx
00401080 mov edx,dword ptr
00401083 mov dword ptr ,edx
00401086 mov eax,dword ptr
00401089 push eax
0040108A push offset string "j=%d,j=%d\n" (0042201c)
0040108F mov ecx,dword ptr
00401092 add ecx,1
00401095 mov dword ptr ,ecx
00401098 mov edx,dword ptr
0040109B add edx,1
0040109E mov dword ptr ,edx
004010A1 call printf (004010f0)
004010A6 add esp,0Ch 若上面的输出0和1,下面的输出0和0的话,这就是这个题的结果。先看第一段代码:初始化为0,第一个输出0,然后+1,现在i=1了,第二个输出1,然后再+1,现在i=2了,不过用不到输出了。下面看第二段代码:初始化为0,但是同时输出相同的数值0,再同时+1。你明白? 5楼说得对printf()对于自增和减的是从右往左算的,
例如:
#include <stdio.h>
void main()
{
} 不注意按到回到了,没写完的
例如
include <stdio.h>
void mian()
{
int a=0;
printf("%d%d%d%d",++a,++a,++a,++a)//输出的值是4.3.2.1 从右边往左加过来的
} {:1_1:} 自右向左执行啊 反汇编看了下 就造 了 编译器问题啦 这个很简单,你没想通这个,是因为你没有学过C++的函数重载,并且也没必要深究,因为编译器对这样的表达式的
求值结果不太一样{:10_254:}
页:
[1]