c语言scanf读取赋值规则,C中printf与scanf函数读取与储存参数实现办法

本文是C语言初学者对printf和scanf函数的深入理解,探讨了printf向堆栈传参的方式以及scanf的赋值方式。通过实例分析了格式说明符与变量类型不匹配时可能产生的错误,解释了输入流阻塞问题及其解决方案。
摘要由CSDN通过智能技术生成

我是C语言的初学者,学到printf和scanf时有一些疑惑,于是自己研究总结了一些东西,可能会有错误,所以希望各位大牛指正哦~\(≧▽≦)/~啦啦啦

===============================================

I   关于Printf向堆栈传参方式及储存读取方式

一、printf的格式为:

printf(“格式字符串”,参数1,参数2,……);

其传递原理是,先将参数1、参数2、…传递到计算机堆栈中,堆栈类似于一个寄存器。计算机根据变量类型(Datatype)去储存而非根据格式说明符(Format specifier)去储存这些数据。之后printf根据格式说明符的形式去从堆栈中读取这些数据而非根据变量类型。所以一旦变量类型与格式说明符不匹配就会出现错误。

二、考察一下代码

aab50533869d589fc18b07e3d623de62.png

输出结果如下所示

e72fc8d1ab55dbd79a584e0c6924ef64.png

甲行输出的n1、n2并没有问题,而n3、n4出现异常,这是因为n3、n4是长整形变量而使用%e的浮点指数格式符非法输出所导致。同理,乙行的四个参量输出均出现异常,这是因为当第一个浮点型变量用%ld格式符输出出现异常时导致后面都出现异常。

三、原因深层探究

首先根据1中所说,考察printf如何向堆栈传参。首先先将四个参数都变成二进制数,为了方便起见,统一以十六进制表示,两个十六进制数代表一个字节。需要指出,浮点型变量是以IEEE754标准储存(即包括符号位、阶码、尾数),另外,单精度浮点型float自动转换为双精度浮点型double(即64位,包括1个符号位、11个阶码位以及52位尾数位):

85c0b7b57c6ab1f813bb5dcedf6059b2.png

向堆栈传参的原则是:每传递一个参量,事先开辟一个与之匹配的大小的空间;由低字节位向高字节位依次储存;对于一个数,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值