一、浮点数
- (float)10 是先有一个值为 10 的 int(整数),然后将这个 int 强制转换成 float 型的。10.0f 本身就是一个单精度浮点类型。
虽然 int 到 float 是显式转换(即小存储容量数据类型转换到大存储容量数据类型,该过程不会造成数据丢失),但 float 本身存在精度问题,在参与运算中其实二者还是有区别的。 - %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少了空格补足。 - 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”只是对当前行有效,所以需要使用续行符,注意最后一行不需要加