- 尽量不要用浮点数差值来做判断(分支、循环等),因为浮点数的精度会导致各种问题 ```c double x = 3; double y = x (1 / 3); /*
- 1 / 3是0.3333333
- 3 0.333333就不一定是1 /
if(y - 1 > 0.00001) {
// some statements
}
- 如果真的要比较浮点数,建议使用fabs,fabsf两个绝对值函数,避免两个值先后顺序写错,同时将精度确定好
```c
int abs(int i); //处理int类型的取绝对值,stdlib.h
double fabs(double i); //处理double类型的取绝对值, math.h
float fabsf(float i); //处理float类型的取绝对值,math.h
- 没有必要别使用goto,虽然goto在跳出多重循环有特效,但是仅限于此,如果随意使用goto会使程序逻辑混乱,人难看懂代码
- c语言没有引用,c++才有引用,本质都是指针
- 无名结构体、联合体
```c
struct {
int a;
}test;
union { int b; char c[100]; }make;
// 可以直接使用test和make,但是不能声明别的变量
- [结构体位域](https://blog.csdn.net/xiaominthere/article/details/27377021)
```c
struct _test{
int a: 8;
}
c中printf的format格式含义
%A 浮点数、bai十六进du制数字和p-记法(C99)
%c 一个字符
%d 有符号十进制整数
%e 浮点数、e-记数法
%E 浮点数、E-记数法
%f 浮点数、十进制记数法
%g 根据数值不同自动选择%f或%e.
%G 根据数值不同自动选择%f或%e.
%i 有符号十进制数(与%d相同)
%o 无符号八进制整数
%p 指针
%s 字符串
%u 无符号十进制整数
%x 使用十六进制数字0f的无符号十六进制整数
%X 使用十六进制数字0f的无符号十六进制整数
%% 打印一个百分号 使用printf ()函数 printf()的基本形式: printf("格式控制字符串",变量列表);
strncpy和memcpy的区别
Linux 怎么获取某个字节数据
对于置空但不指向NULL的字符串,如果需要判断是否为空串有一下两种常用方式 ```c char *str; char s[20];
/ 正确方式:/ // 一:直接使用string.h内部库函数strcmp(str, “”) if(strcmp(str, “”) == 0)
// 二:使用str种第一个字符进行判空 if(str[0])
/ 错误方式:/ // 一:直接将字符串放到if内判断 if(str)
// 二:没有考虑空格
- 进一步抛出问题:str和str[0]的地址相同,但是用于判断时为何str为真,str[0]为假?
- 注意不要将两个无符号数相减作为判断表达式
```c
unsigned int a, b; // size_t也是无符号数
if(a - b > 0) { // 永远为真
} else {
}
/*
* a = 11, b = 23
* a - b == 4294967284
*/
// 从此引出strlen的加减作为判断表达式是不合理的,因为strlen返回值类型是size_t
/*
* 相对于函数 strlen,这里的示例代码运行结果为 7(因为它包括结束字符 null)。
* 同时,对 sizeof 而言,因为缓冲区已经用已知字符串进行了初始化,其长度是固定的,
* 所以 sizeof 在编译时计算缓冲区的长度。也正是由于在编译时计算,
* 因此 sizeof 不能用来返回动态分配的内存空间的大小。
*/
- 左右值!blog