鱼C论坛

 找回密码
 立即注册
查看: 2827|回复: 14

想了好久都没想通——帮帮忙

[复制链接]
发表于 2012-5-14 22:18:56 | 显示全部楼层 |阅读模式
1鱼币
#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++);

}
请问一下为什么这两个的值为什么会不一样?

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-5-14 23:00:34 | 显示全部楼层
这个是编译器的问题
关于自增自减,请楼主参见
http://bbs.fishc.com/thread-15954-1-1.html
这个帖子里面说的很清楚!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-5-15 09:20:21 | 显示全部楼层
编译器的问题。
其实自增自减的问题楼主还是别去想太多了。只要你懂i++ i-- --i ++i就可以了。
大可不必深入研究,因为这个问题没意义。没有哪个程序员会用自增自减用得很复杂的。
这是我的经验。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-5-15 10:27:51 | 显示全部楼层
个人认为无需为 i++ 或 ++i 或多次多层调用纠结,本身就是个无标准的问题,平时写程序也绝对不会这样写(小甲鱼老湿(^_^,开玩笑,没任何贬义)说了,写程序的最高境界是让所有人都看得明白而不是让自己都看不明白),研究出来也没任何意义,所以个人从来都不纠结这个问题,也不会去看别人的研究,另外,实践是检验真理唯一标准,在VC上反汇编一下,不就知道答案了?何苦如此纠结??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-5-16 13:25:01 | 显示全部楼层
printf()函数的参数,在printf()函数读取时是从左往右读取的,然后将读取到的参数放到栈里面去,最后读取到的就放在栈顶,处理参数的时候是从栈顶开始的,所以是从右边开始处理的.--printf()函数的特点.

      注意点:

         1.printf()函数中的计算是从右向左进行的.

         2.我们在写代码时,尽量避免无确定意义的表达式出现,因为不同的编译器,可能会采用不同的理解方式.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-5-16 15:19:15 | 显示全部楼层
因为第一个程序用了两个printf,第一个printf的 i 值已经加1了,所以第二个printf会输出1                       而第二个程序只有一句printf,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-5-22 20:16:09 | 显示全部楼层
学多了你就知道了,这个真的不需要纠结!知道什么是自增什么是自检就行了。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-5-25 22:13:12 | 显示全部楼层
#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 [ebp-4]
00401039   mov         dword ptr [ebp-0Ch],eax
0040103C   mov         ecx,dword ptr [ebp-0Ch]
0040103F   push        ecx
00401040   push        offset string "i=%d\n" (0042202c)
00401045   mov         edx,dword ptr [ebp-4]
00401048   add         edx,1
0040104B   mov         dword ptr [ebp-4],edx
0040104E   call        printf (004010f0)
00401053   add         esp,8
7:    printf("i=%d\n", i++);
00401056   mov         eax,dword ptr [ebp-4]
00401059   mov         dword ptr [ebp-10h],eax
0040105C   mov         ecx,dword ptr [ebp-10h]
0040105F   push        ecx
00401060   push        offset string "i=%d\n" (0042202c)
00401065   mov         edx,dword ptr [ebp-4]
00401068   add         edx,1
0040106B   mov         dword ptr [ebp-4],edx
0040106E   call        printf (004010f0)
00401073   add         esp,8

9:    printf("j=%d,j=%d\n",j++,j++);
00401076   mov         eax,dword ptr [ebp-8]
00401079   mov         dword ptr [ebp-14h],eax
0040107C   mov         ecx,dword ptr [ebp-14h]
0040107F   push        ecx
00401080   mov         edx,dword ptr [ebp-8]
00401083   mov         dword ptr [ebp-18h],edx
00401086   mov         eax,dword ptr [ebp-18h]
00401089   push        eax
0040108A   push        offset string "j=%d,j=%d\n" (0042201c)
0040108F   mov         ecx,dword ptr [ebp-8]
00401092   add         ecx,1
00401095   mov         dword ptr [ebp-8],ecx
00401098   mov         edx,dword ptr [ebp-8]
0040109B   add         edx,1
0040109E   mov         dword ptr [ebp-8],edx
004010A1   call        printf (004010f0)
004010A6   add         esp,0Ch
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-5-25 23:03:20 | 显示全部楼层
若上面的输出0和1,下面的输出0和0的话,这就是这个题的结果。先看第一段代码:初始化为0,第一个输出0,然后+1,现在i=1了,第二个输出1,然后再+1,现在i=2了,不过用不到输出了。下面看第二段代码:初始化为0,但是同时输出相同的数值0,再同时+1。你明白?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-5-26 16:28:45 | 显示全部楼层
5楼说得对printf()对于自增和减的是从右往左算的,
例如:
#include <stdio.h>

void main()
{

}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-5-26 16:31:40 | 显示全部楼层
不注意按到回到了,没写完的
例如
include <stdio.h>
void mian()
{
      int a=0;
      printf("%d%d%d%d",++a,++a,++a,++a)//输出的值是4.3.2.1 从右边往左加过来的
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-8-13 11:00:02 | 显示全部楼层
{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-8-13 15:20:25 | 显示全部楼层
自右向左执行啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-8-17 19:13:38 | 显示全部楼层
反汇编看了下 就造 了 编译器问题啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-11-24 15:14:44 | 显示全部楼层
这个很简单,你没想通这个,是因为你没有学过C++的函数重载,并且也没必要深究,因为编译器对这样的表达式的
求值结果不太一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-9 08:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表