友来友网 发表于 2012-5-14 22:18:56

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

#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++);

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

湮汐 发表于 2012-5-14 23:00:34

这个是编译器的问题
关于自增自减,请楼主参见
http://bbs.fishc.com/thread-15954-1-1.html
这个帖子里面说的很清楚!

越野e族 发表于 2012-5-15 09:20:21

编译器的问题。
其实自增自减的问题楼主还是别去想太多了。只要你懂i++ i-- --i ++i就可以了。
大可不必深入研究,因为这个问题没意义。没有哪个程序员会用自增自减用得很复杂的。
这是我的经验。

小王子之歌 发表于 2012-5-15 10:27:51

个人认为无需为 i++ 或 ++i 或多次多层调用纠结,本身就是个无标准的问题,平时写程序也绝对不会这样写(小甲鱼老湿(^_^,开玩笑,没任何贬义)说了,写程序的最高境界是让所有人都看得明白而不是让自己都看不明白),研究出来也没任何意义,所以个人从来都不纠结这个问题,也不会去看别人的研究,另外,实践是检验真理唯一标准,在VC上反汇编一下,不就知道答案了?何苦如此纠结??

onezgm 发表于 2012-5-16 13:25:01

printf()函数的参数,在printf()函数读取时是从左往右读取的,然后将读取到的参数放到栈里面去,最后读取到的就放在栈顶,处理参数的时候是从栈顶开始的,所以是从右边开始处理的.--printf()函数的特点.

      注意点:

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

         2.我们在写代码时,尽量避免无确定意义的表达式出现,因为不同的编译器,可能会采用不同的理解方式.

等雨 发表于 2012-5-16 15:19:15

因为第一个程序用了两个printf,第一个printf的 i 值已经加1了,所以第二个printf会输出1                     而第二个程序只有一句printf,

难得糊涂 发表于 2012-5-22 20:16:09

学多了你就知道了,这个真的不需要纠结!知道什么是自增什么是自检就行了。。。

fujian810 发表于 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
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

游戏人生 发表于 2012-5-25 23:03:20

若上面的输出0和1,下面的输出0和0的话,这就是这个题的结果。先看第一段代码:初始化为0,第一个输出0,然后+1,现在i=1了,第二个输出1,然后再+1,现在i=2了,不过用不到输出了。下面看第二段代码:初始化为0,但是同时输出相同的数值0,再同时+1。你明白?

398548528 发表于 2012-5-26 16:28:45

5楼说得对printf()对于自增和减的是从右往左算的,
例如:
#include <stdio.h>

void main()
{

}

398548528 发表于 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 从右边往左加过来的
}

阔怀 发表于 2015-8-13 11:00:02

{:1_1:}

jl646360594 发表于 2015-8-13 15:20:25

自右向左执行啊

迷雾少年 发表于 2015-8-17 19:13:38

反汇编看了下 就造 了 编译器问题啦

Damn_it 发表于 2016-11-24 15:14:44

这个很简单,你没想通这个,是因为你没有学过C++的函数重载,并且也没必要深究,因为编译器对这样的表达式的
求值结果不太一样{:10_254:}
页: [1]
查看完整版本: 想了好久都没想通——帮帮忙