来源:牛客网
int
main(){
int
a;
float
b,c;
scanf
(
"%2d%3f%4f"
,&a,&b,&c);
printf
(
"\na=%d,b=%d,c=%f\n"
,a,b,c);
}
若运行时从键盘上输入9876543210l,则上面程序在gcc编译器下的输出结果是:
a=98,b=0,c=0.000000
这道题涉及到字节序大小端问题、printf函数执行时的入栈机制等等。
首先解释一下printf打印多个数据时的原理,像是“a=%d,b=%d,c=%f”这样的一个字符串,printf会把a b c按逆序入栈,
也就是c放在栈底,b放在中间,a放在栈顶。
而栈是从高地址向低地址增长的,那我们入栈的时候高低字节到底怎么放到内存里呢?
在栈的结构中,高地址相当于存放低字节,低地址存放高字节。
所以00004321中的0000放在内存的低地址,4321放在内存的高地址。
所以栈的内存里放的数据应该是这样的:
栈底 栈顶
高字节。。。。。。。。。。。低字节
4321 0000 765 0000 98
4字节 4字节 4字节 4字节 4字节
打印c 打印b 打印a
打印的时候依次出栈,a = 98 b = 0 c = 0.000000