| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> 最最最详细的C语言教程笔记零起步(4)小白必备 同笔者一起学习 -> 正文阅读 |
|
[C++知识库]最最最详细的C语言教程笔记零起步(4)小白必备 同笔者一起学习 |
C语言教程笔记九. printf 函数1. printf函数使用公式printf(“XXX占位1 XXX占位2 XXX占位3”,替换1,替换2,替换3); 示例代码:
1.1 printf是一个变参函数它的参数个数是不确定的,同时参数类型也是不确定的。
1.2 第一个参数必须字符串
1.3 第一个参数包含需要输出的字符以及需要被替换的占位符
这个字符串包含了需要输出的字符,以及需要被替换的占位符。 1.4 第二及后续参数将依次替换占位符
1.5 占位符的类型和数量需要与后续的参数类型和数量对应
%d 整型int的占位 2. 整型类型的占位符在前面的 printf 函数的使用当中, %d 作为整型 int 类型的占位符。对于其他的整型类型, 它们的占位符分别都是什么呢? printf 是一个可变参数函数,在C语言中将参数传入函数的可变参数中,变量会发生自动类型提升。 2.1 有符号整型的类型提升对于有符号位的整型 char , short ,传入 printf 的可变参数时,会被提升为 int 。而比 int 更高级的 整型则不发生变化。
所以,在处理 char , short , int 时,均可使用 %d 来占位。 而在Visual Studio 2019中 int 与 long 的范围一致,按理来说也可以使用 %d 来占位。 但是为了程序的可移植性,在切换到别的平台下时, int 和 long 有可能不一致。 所以,请使用 %ld 来为 long 占位。更高级的 long long 则需要使用 %lld 来占位。 结论:
2.2 无符号整型的类型提升
对于无符号整型,需要将 d 替换成 u 表明最高位不被看做符号位,而是数值位。 结论:
2.3 浮点类型的类型提升float 会被提升为 double , double 不发生变化。 结论: float,double均使用 %f 。
3. 转换规范为了易于理解,前面称以 % 开始的一串字符 为 占位符 。这是一个为了让大家理解的说法,其实这个说法并不准确。 更准确地说,它们应该被称为转换规范。 3.1 转换规范总览转换规范以%百分号开始,依次具有下面这些元素:
3.2 转换操作转换操作由单个字符表示,取自下面这个集合: c、d、e、E、f、i、o、s、u、x、X 。 printf可以根据 转换操作 使用不同的 转换方式 ,取 n字节的二进制数据 并转换成字符。
4. 长度指示符
要正常输出long long数据类型,我们必须加宽转换操作获取的二进制数据长度。也就是我们即将讨论的 长度指示符。
5. 精度转换操作可以制定一个可选的精度范围,用一个点号以及它后面一个可选的十进制正数表示。 精度范围用于控制:
6. 最小字段宽度
7. 标志
十. printf 函数深入讨论1. printf 将二进制转换成字符串printf函数从参数中获取二进制数据,并将它根据转换规范转换成字符串,并打印在控制台上。 运行以下代码,并根据其结果,分析其中原理,从而理解为什么将 以% 开始的一串字符称作转换规范?
下面通过它们的二进制表示来分析问题出现的原因,在这之前先回忆一个知识点。 1.1 aNum进入printf 后的转换情况
当我们 使用 %u 来做转换规范时,printf会获取4字节的数据,并认为其为无符号整数。 它没有符号位, 因此肯定为一个正数的补码。可以直接将它转换为十进制,转换结果为字符串"2147483647"。 当我们 使用 %d 来做转换规范时,printf会获取4字节的数据,并认为其为有符号整数。 最高位看做符号位,其余为数据位。而在这个二进制中最高位为0,因此它是一个正数的补码,可以直接将它转换为十 进制,转换结果为字符串"2147483647"。 在这种情况下,使用 %u 或 %d 均可以得到正确的转换结果。 由于, 以%开始的一串字符 指示printf函数如何转换二进制数据,所以将其称为转换规则更为准确。
1.2 aBiggerNum进入printf后的转换情况
在aBiggerNum进入printf函数后,由于aBiggerNum的类型为unsigned int,所以类型并不会发生转换, 仍然为4个字节。 当我们使用 %u 来做转换规范时,printf会获取4字节的数据,并认为其为无符号整数。 它没有符号位, 因此肯定为一个正数的补码。可以直接将它转换为十进制,转换结果为4294967295。 而在这个二进制中最高位为1,因此它是某一个负数的补码,我们设这个负数为n。 回忆一下补码的计算规则:若 n 为负数,设 dec = mod - |n| , n 的补码为 dec 的二进制。 n 的补码为 11111111 11111111 11111111 11111111 ,则dec为4294967295。 1.3 请使用对应的转换规范2. printf 取用参数的问题2.1 长度造成的转换规范与参数不匹配
在第一个printf函数中,变量 l 被正确打印了。 而在第二个printf函数中,第一个 %u 获取并打印了 ll 的4个字节,第二个 %u 获取并打印了ll的另外4个字节。 unsigned long 和 unsigned long long 均为比 unsigned int 高级的类型,因此它们进入printf函数的时候仍然保持有类型。但是转换规范 %u 或 %d ,它们仅仅取了int或unsigned int类型的大小,也就是4个 字节进行转换。 2.2 长度指示符增加或缩短数据长度
与上面的相反,长度指示符 h hh ,可以缩短转换数据字节长度。
2.3 缩短时先获取再丢弃值得注意的是,长度指示符 h hh 是通过先获取原有长度的数据,再丢弃一部分数据。从而达到缩短转换数据长度的。
第一个 %hu ,根据 u 获得了n1的4个字节,而 h 导致其丢弃了已经获取的2字节。第二个 %u 正常获得了 n2的4个字节。 点个赞呗? |
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 0:42:45- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |