- C语言不同数据类型的赋值和初始化
整形变量和char型变量的初始化:C语言不关心你是不是超过赋值范围了,比如char x = 555;这样的语句编译时会有警告,但是还是能运行的,编译器会自动进行截断。反正只要大方向的数据类型符合就对,不管你是个什么类型整数,是整数就行。字符型底层存储形式和整型相同,只是上层呈现不同。
对于unsigned整型变量的初始化:语句如uint8_t x = -15; 编译器甚至都不会发出警告,由于x是无符号整数,所以赋值的时候也不用符号位和数值位分开赋值,直接全部复制给x就完事。
整形变量的赋值:无符号变量的值赋给符号变量,按正数处理(这个可能跟编译器有关,C语言中没有规定怎么处理);无符号强制转换为有符号,把无符号的第一位当成符号位看,比如对于uint8_t x =251就是负数,uint8_t x = 13就是正数。C语言中不应该出现无符号和有符号数的相互转换,同时%u和%d也不能乱用。同时出现类型转换时一定要显式表明,并且应该十分小心地使用。
2.格式输出符号
unsigned:加个u
long:加个l
%d, %ld决定了数据以什么形式显示(多长,有无符号位),最短都是32位即%d。short,char自动转换为32位%d,中间补0。
3.side effect 问题
a++,++a:是由编译器决定的,C语言不规定其执行顺序。所以不应该出现
x = a++;这样的语句,执行顺序不确定!
同样的:ret = h() + g();h()先执行还是g()先执行顺序也不确定。
当然这个可能太细了。
unsigned,012, 0x231,&, |, ^, >>, <<, ~
位运算作为控制语言太好用了。而且节省内存。
5.enum对于存储同一类型常数数据也非常好。如果能选择enum,不要选择#define。
6.extern和static会自动进行初始化0。
7.&& ||的设计非常不错,多重判断时可以很好的规避掉一些内存访问问题。
8.+=, (c = getchar()) != EOFl,条件表达式都能使得代码更加紧凑,所以推荐使用。
9.如果传的是数组首地址,最好那么形参最好是int a[],而不是int *a。
同时使用const也是一个很好的做法,使得程序更加安全。
语法注意点:
变量命名:局部变量短点好,全局变量可以长点,避免重名。