有关C语言有趣的坑
变量赋值与常量比较
先看个例子:
#include <stdio.h>
int main()
{
char c = 0xff;
if(c == 0xff){
printf("true");
}else{
printf("false");
}
return 0;
}
你觉得是打印true还是false? 结果出乎意料是false!
因为c赋值为0xff之后, c的值就会变为-1. -1当然就不等于255了.
另外, c要和255比较, 估计还需要升位到int才行, 因为char类型装不下255, unsignd char装不下-1, 就得升到int才能比较.
length选择哪种数据类型
length取值最好为int. 原因是很多第三方返回length的函数都是使用int, 如uart读取. 虽然有时候你觉得char就够用了, 但为了避免反复的类型转换, 还是统一int比较好.
length常常用来确定数组的长度, 此时表示length的变量会被用作数组下标, 而数组下标不能为char.
除非内存真的要非常节约...
字符串和二进制缓存用那种数据类型
字符串多选择char类型, 指针是char , 数组是char string[]. 因为标准库中字符串的处理函数都是char的.
而二进制(16进制)缓存,也就是buffer, 最好使用unsigned char类型. 原因是buffer的值常常表示十六进制也就是0x, 在进行比较的时候会出现被赋值的变量不等于赋值的常量的情况, 如char c = 0xff
,而比较时c != 0xff
, 因为已经溢出为-1了.