CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

一个很怪的C程序

楼主97712(玉浪子)2005-04-03 04:33:03 在 C/C++ / C语言 提问

int   GetV()  
  {  
  return(   getchar()   );  
  }  
  void   main()  
  {  
  printf("%c   %c   %c   %c   %c",   getchar(),   GetV(),   GetV(),   getchar(),   GetV());  
  }  
  输入:   abcdefg  
   
  结果我知道;  
   
  如果知道结果,请你说出理由好吗? 我并不是说要什么答案  
  问题点数:0、回复次数:31Top

1 楼MagicCarmack(MagiC++)回复于 2005-04-03 05:22:49 得分 0

在很多环境中,函数中参数的执行顺序是从右向左!  
   
  所以得出的结果是e   d   c   b   aTop

2 楼zhousqy(标准C匪徒)(甩拉,甩拉)回复于 2005-04-03 06:07:27 得分 0

参数是从右到左压入堆栈的。Top

3 楼szws(克米帅)回复于 2005-04-03 10:17:30 得分 0

我的结果是:  
  b   e   d   a   c啊  
   
  Top

4 楼longhaobo11()回复于 2005-04-03 10:23:50 得分 0

怪事,我在VC里面编译通过,运行结果却什么都没有。Top

5 楼shine51151(美丽心情)回复于 2005-04-03 10:44:29 得分 0

楼上的   程序并没运行完   是在等你输入数据呢  
   
  输入数据abcdefg后你就能看到结果了Top

6 楼shine51151(美丽心情)回复于 2005-04-03 10:48:26 得分 0

我的结果也是:  
  b   e   d   a   c  
   
  这个结果依赖于编译环境的不同而不同  
   
  Top

7 楼wodeyouxian(人生如梦)回复于 2005-04-03 10:56:43 得分 0

楼上已经说得很清楚了。Top

8 楼copygirl(wa!)回复于 2005-04-03 11:47:43 得分 0

以前有人发过这样的贴子。Top

9 楼eaglejun(翱翔的№狼)回复于 2005-04-03 12:45:45 得分 0

我的结果也是e   d   c   b   aTop

10 楼nasi00(莫傲·逍遥)回复于 2005-04-03 13:02:47 得分 0

这个取决于编译器了,估计也就老谭能问出这样的问题……  
   
  如果无法确定的话,就分开来写(工程上)。如果是考试的话,那就按照老师讲的编译顺序写。Top

11 楼ycom__net(一恒)回复于 2005-04-03 13:23:23 得分 0

printf函数中参数的执行顺序是从右向左的,Top

12 楼szwpc(风色鸟)回复于 2005-04-03 21:00:58 得分 0

古怪啊……Top

13 楼zwzzj(独学而无友,则孤陋而寡闻. )回复于 2005-04-04 12:01:04 得分 0

参数一般为从右往左压栈的。  
  ifndef ??version  
  ?debug macro  
  endm  
  endif  
  ?debug S   "test.c"  
  _TEXT segment byte   public   'CODE'  
  DGROUP group _DATA,_BSS  
  assume cs:_TEXT,ds:DGROUP,ss:DGROUP  
  _TEXT ends  
  _DATA segment   word   public   'DATA'  
  d@ label byte  
  d@w label word  
  _DATA ends  
  _BSS segment   word   public   'BSS'  
  b@ label byte  
  b@w label word  
  ?debug C   E90B5F843206746573742E63  
  _BSS ends  
  _TEXT segment byte   public   'CODE'  
  ; ?debug L   1  
  _max proc near  
  push bp  
  mov bp,sp  
  ; ?debug L   2  
  mov ax,word   ptr   [bp+4]  
  cmp ax,word   ptr   [bp+6]  
  jle @3  
  mov ax,word   ptr   [bp+4]  
  jmp short   @2  
  @3:  
  mov ax,word   ptr   [bp+6]  
  @2:  
  jmp short   @1  
  @1:  
  ; ?debug L   3  
  pop bp  
  ret  
  _max endp  
  ; ?debug L   5  
  _main proc near  
  push bp  
  mov bp,sp  
  sub sp,2  
  push si  
  push di  
  ; ?debug L   6  
  mov si,4  
  ; ?debug L   6  
  mov di,5  
  ; ?debug L   7  
  push di  
  push si  
  call near   ptr   _max  
  pop cx  
  pop cx  
  mov word   ptr   [bp-2],ax  
  ; ?debug L   8  
  push word   ptr   [bp-2]  
  mov ax,offset   DGROUP:s@  
  push ax  
  call near   ptr   _printf  
  pop cx  
  pop cx  
  ; ?debug L   9  
  mov ax,1  
  jmp short   @4  
  @4:  
  ; ?debug L   10  
  pop di  
  pop si  
  mov sp,bp  
  pop bp  
  ret  
  _main endp  
  _TEXT ends  
  ?debug C   E9  
  _DATA segment   word   public   'DATA'  
  s@ label byte  
  db 109  
  db 97  
  db 120  
  db 32  
  db 110  
  db 117  
  db 109  
  db 98  
  db 101  
  db 114  
  db 32  
  db 105  
  db 115  
  db 32  
  db 37  
  db 100  
  db 0  
  _DATA ends  
  _TEXT segment byte   public   'CODE'  
  extrn _printf:near  
  _TEXT ends  
  public _max  
  public _main  
  end  
  Top

14 楼luckx(蜂鸟)回复于 2005-04-04 14:39:15 得分 0

楼上的,请问vc中如何查看编译后程序的汇编代码??Top

15 楼nodummy(三甲 之 Linux/Unix里面甭给我分,谁给我分我和谁急)回复于 2005-04-04 14:49:50 得分 0

又是这个……  
   
  C默认采用cdecl协议(而且对于printf来说,只能cdecl),入栈顺序就是从右往左来着……Top

16 楼nodummy(三甲 之 Linux/Unix里面甭给我分,谁给我分我和谁急)回复于 2005-04-04 14:50:54 得分 0

说实话,这种东西真的是fxxking   boring……Top

17 楼QQ503503()回复于 2005-04-04 14:52:53 得分 0

不懂Top

18 楼dsygr520yy(沙漠中的鱼)回复于 2005-04-04 15:29:12 得分 0

e   d   c   b   a  
  我的   在ADS1.2运行的,不过有3个警告  
  看看就知道为什么了,  
   
  1 int   GetV()  
  2 {  
  3       return(   getchar()   );  
  GetV [0xea000018]       b                 getchar  
  4 }  
  5 void   main()  
  6 {  
  main [0xe92d40fe]   *   stmfd         r13!,{r1-r7,r14}  
  7       printf("%c   %c   %c   %c   %c",   getchar(),   GetV(),   GetV(),   getchar(),   GetV());  
  000080b0 [0xebfffffc]       bl               GetV  
  000080b4 [0xe1a04000]       mov             r4,r0  
  000080b8 [0xeb000014]       bl               getchar  
  000080bc [0xe1a05000]       mov             r5,r0  
  000080c0 [0xebfffff8]       bl               GetV  
  000080c4 [0xe1a06000]       mov             r6,r0  
  000080c8 [0xebfffff6]       bl               GetV  
  000080cc [0xe1a07000]       mov             r7,r0  
  000080d0 [0xeb00000e]       bl               getchar  
  000080d4 [0xe1a01000]       mov             r1,r0  
  000080d8 [0xe28f0018]       add             r0,pc,#0x18   ;   #0x80f8  
  000080dc [0xe1a03006]       mov             r3,r6  
  000080e0 [0xe1a02007]       mov             r2,r7  
  000080e4 [0xe58d4004]       str             r4,[r13,#4]  
  000080e8 [0xe58d5000]       str             r5,[r13,#0]  
  000080ec [0xeb00000a]       bl               printf  
  8 }  
  000080f0 [0xe3a00000]       mov             r0,#0  
  000080f4 [0xe8bd80fe]       ldmfd         r13!,{r1-r7,pc}  
  000080f8 [0x25206325]       dcd             0x25206325     %c   %  
  000080fc [0x63252063]       dcd             0x63252063     c   %c  
  00008100 [0x20632520]       dcd             0x20632520       %c    
  00008104 [0x00006325]       dcd             0x00006325     %c..  
   
   
  C中潜套汇编码,方便对照查看.  
  Top

19 楼Gfire(风之蓝歌)回复于 2005-04-04 15:47:18 得分 0

UPTop

20 楼tuoliao722(鸵鸟)回复于 2005-04-04 16:01:39 得分 0

有点搞不懂了哈  
  Top

21 楼lgecxf(code)回复于 2005-04-04 16:16:22 得分 0

up~~Top

22 楼xiaoyaocainiao(逍遥菜鸟)回复于 2005-04-04 21:54:17 得分 0

头都晕了  
  明天我试下  
  我是菜鸟类  
  不懂   不要见笑Top

23 楼zhouonline(安然梦)回复于 2005-04-04 22:05:20 得分 0

拒絕評論Top

24 楼zsh6709(世界上没有后悔药吃的!!!)回复于 2005-04-04 22:35:48 得分 0

就怎么一个小程序,至于吗?  
  说实话,我也不大清楚!Top

25 楼defyer007(深入浅出)回复于 2005-04-04 22:46:09 得分 0

printf函数中参数的执行顺序是从右向左的,  
  如果是这样的话,那么平常输出的都是正常的顺序呢?  
   
  顺便问一下,什么是cdecl协议??这类东东要到哪里去查Top

26 楼xjp6688(大平/要做必须最好)回复于 2005-04-05 08:49:15 得分 0

在BCB6下面是edcba  
  的确与编译器的压栈顺序有关Top

27 楼ren1983(路人甲)回复于 2005-04-07 18:54:57 得分 0

就是看不懂Top

28 楼SailorK(态度决定一切!)回复于 2005-04-07 22:51:48 得分 0

哈哈  
  楼上各位都说了  
  楼主  
  试一下这个程序就知道啦  
  #include<stdio.h>  
   
  main()  
  {  
          int   i=0;  
          printf("%d   %d",i++,i);  
  }Top

29 楼janms()回复于 2005-04-07 23:29:06 得分 0

我的结果是:  
                                        b   e   d   a   c啊  
   
   
  如果你是用的VC,把getchar()换成GetV()就会得到edcba了,这和编译器有关,一般情况下printf函数的参数是从右向左运算,也就是从右向左压栈的,所以最后一个函数会得到缓冲区的第一个字符,依此类推,结果会是edcbaTop

30 楼luoxq_263()回复于 2005-04-10 01:51:54 得分 0

哈哈  
  楼上各位都说了  
  楼主  
  试一下这个程序就知道啦  
  #include<stdio.h>  
   
  main()  
  {  
          int   i=0;  
          printf("%d   %d",i++,i);  
  }  
   
  输出为0   0   不知为何原因,gcc与vc6都是一样  
  而#include<stdio.h>  
  main()  
  {  
              int   i=0  
              printf("%d   %d",++i,i);  
  }  
  输出为1   0可以理解Top

31 楼luruqing()回复于 2005-04-10 10:56:54 得分 0

根据系统的顺序得出的结果是不同的,一般是从右到左,然后呢```就是有返回值的就有返回值,就是这么简单,在这里我们都是以潭浩强那本C来标准我们,我们一起自律点````!!!!!!Top

相关问题

  • C#的winform程序一件怪事!
  • c源程序。
  • C++程序
  • 用winsock做了个C/S的通信程序,但是有些很怪的问题
  • 哪位高人帮我把这个c++程序转换成c程序呀,程序很简单,谢谢了
  • 一C++程序,不是很懂,请C++高手指点...
  • C++程序转换为C程序
  • 招聘C/C++程序员!!!
  • 招聘C/C++程序员
  • c/c++的编译程序

关键词

  • 函数
  • 编译器
  • 编译
  • db
  • 执行
  • word
  • debugl
  • getv
  • movax
  • xe

得分解答快速导航

  • 帖主:97712

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo