一个很怪的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




