最近用C,出现了几个低级错误,现列举一下。
1、移位符<<、>>比+、-优先级低,如
int x,y;
x = 1;
y = x<<2+1; //等价于 y = x<<(2+1);
结果为8,而不是5
2、蹩脚的除法运算
float result;
result = 1/3;
result结果为多少?是0而不是0.333333,因为1和3都为整数,整除之后为0
可以强制为浮点数。
3、最好不要用char 判断数字
4、变量要初始化。
5、char *ptr = "hello";//并不是复制字符串,而是复制一个地址
不等于下面两条语句
char *ptr;
*ptr = "hello"; //试图将字符串的地址复制到ptr所指向的单元,而不是ptr本身。
而是等于
char *ptr;
ptr = "hello";
6、char s[20];
s = "hello"; //错误,因为s只是一个指针常量
char s[20] = "hello"; //正确,只有在定义时,可以赋初值,且为char型。
strcpy(s,"hello");//正确
7、const的局限性
在程序中,即使变量或参数有类型限定符const,仍然可以改变它的值,关键字const防止变量或参数作为左值使用,但在C语言中,仍然有其它方法可以改变这种单元的值。例如:strcpy函数。
char s[] = "hello"; const char *p = s; strcpy((char *)p, "XYZ");
最后s[] 为"XYZ",使用库函数strcpy以及强制类型转换,破坏了const类型限定符的功能。
8、const变量和宏
在C中,const变量不能用于指定数组的长度,也不准在swithc语句中把const变量作为case后的常量值来使用。
但在C++用,这两个限制,已经被取消了。
9、寄存器变量必须定义在函数体内,下面定义方式是非法的
register float x = 0; //错误
void g(void)
{
}
10、把地址符运算&应用于存储类别为register的变量是错误
11、对变量i取余操作
方法一:a = i%8;
方法二:a = i-(i>>3<<3); //注意,一定要加括号,因为移位符比减号优先级低
方法三:a = i & 0x07; //最优操作
|