- 尽量不要用浮点数差值来做判断(分支、循环等),因为浮点数的精度会导致各种问题 ```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两个绝对值函数,避免两个值先后顺序写错,同时将精度确定好```cint abs(int i); //处理int类型的取绝对值,stdlib.hdouble fabs(double i); //处理double类型的取绝对值, math.hfloat 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)```cstruct _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]为假?- 注意不要将两个无符号数相减作为判断表达式```cunsigned 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
