浮点数、进制、重定义(代码经验记录4)

本文介绍了浮点数的转换和精度问题,包括%m.nf格式化输出的规则;探讨了16进制、8进制表示;讨论了C语言中重定义的问题,如头文件包含、全局变量和函数定义,以及如何通过wrapper解决冲突;最后提到了do-while(false)结构和续行符在代码编写中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、浮点数

  1. (float)10 是先有一个值为 10 的 int(整数),然后将这个 int 强制转换成 float 型的。10.0f 本身就是一个单精度浮点类型。
    虽然 int 到 float 是显式转换(即小存储容量数据类型转换到大存储容量数据类型,该过程不会造成数据丢失),但 float 本身存在精度问题,在参与运算中其实二者还是有区别的。
  2. %m.nf中m代表输出数长,n代表小数点后的数长,即保留n位小数。如果小数点后的数大于n,例如12.4567按照%5.2f输出得12.46(四舍五入),如果总位数大于m(小数只到两位),按照实际位数输出,例如111.4567按%5.2f输出,111.46(总数长6)。(注意小数点也算一位数字,占据一个数长)
    如果实际位数小于m,则要补齐空格,例如1.23按照%5.2f输出,_1.23(表示空格)(四位数长加空格一共五位)再来讨论小数小于n的情况,小数小于n空格补齐,例如23.1按照%5.2f输出,得到23.1(_表示空格)。
    综上,m多了不限制小数点前,n多了四舍五入,mn少了空格补足。
  3. abs的用法是针对整形变量的,double型变量取绝对值为fabs, float型变量取绝对值函数为fabsf。

二、进制

0x开头是16进制 英文:hexadecimal 简称HEX
0开头是8进制 英文: octal 简称OCT

int a = 12; //把数 a 分别 以十进制,八进制,十六进制形式 输出打印
printf("%d  %o  %x\n", a, a, a);//不显示数制前缀
printf("%#d  %#o  %#x\n", a, a, a);//显示数制前缀
输出结果:
12  14  c
12  014  0xc

三、重定义

1.头文件重复包含导致的编译阶段类型重定义错误。常见于define/struct/union等虚类型,用条件编译防止
2.头文件中的全局变量和函数定义导致的链接阶段实体重定义错误。常见于头文件中的全局变量和函数定义,解决办法是在.c文件中定义全局变量,然后建一个包含所有全局变量extern声明的头文件,其他所有使用这些变量的.c文件中都要包含这个头文件。在头文件中定义函数,错误现象和原因类似。
如果遗漏struct前的typedef,就变成无名结构体变量而不是原来的自定义类型,放在头文件里也会出错。
因此头文件中可以包含类型定义和实体声明,不应该包含实体定义。
3.用wrapper合理使用作用域
有时源文件要同时包含两个有同名定义的系统或SDK头文件,如同时包含的两个第三方库的API里有同名的自定义类型,也会导致错误。因为一般不方便修改第三方SDK头文件,为解决冲突,可考虑对其中一个库用wrapper方式封装。也就是程序员自己在一个单独.c文件中封装一套全新API,这套API直接调用封装对象lib里的函数并一一对应。这样原lib对应的.h只在wrapper.c文件里包含,而对外API的新.h文件中就可以去掉和其他系统相冲突的定义。

四、其他

1.do{…}while(false);
使用do{…}while(false)结构可以简化多级判断时代码的嵌套。
do{…}while(false)的用法

2.续行符\ , VC编译器会自动判断是否续行,但是代码中因为宏定义关键字“#define”只是对当前行有效,所以需要使用续行符,注意最后一行不需要加

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值