这一章主要讲一些容易引起错误的C语言特性
1。switch相关的
1)switch语句的一般形式如下:
switch(表达式){
case 常量表达式:零条或多条语句
default:零条或多条语句
case常量表达式:零条或多条语句
}
2) 所有case都是可选的。任何形式的语句都是允许的。所以不容易发现错误。比如把default写成defau1t(字符l写成数字1)。都不会检测出语法错误。但程序则不会按你所希望的去执行
3)case 后面一定要接常量表达式,所以即使是const限定的变量也是不可以的。如
const int two =2;
switch(i){
case 1 : printf("case 1\n");
case two : printf("case 2\n");//错误
case 3 : printf("case 3\n");
default:
}
4)switch 不会在每个case标签后面的语句执行完后自动中止。一旦执行某个case语句。程序将会依次执行后面所有的case,除非遇到break语句。这就是所谓的 "fall through"
2、字符连接特性
ANSI C引入的一个新特性:相邻的字条串常量被自动合并成一个字符串。这就省掉了过去在书写多行时必须在行未加"\"的写法。它们会在编译时自动合并。除最后一行外。其余每个字符串未尾的"\0"字符会被自动删除.如:
printf("aaaaaa"
"bbbbbbbbb\n");
结果会打印出: aaaaaabbbbbbbbb;
这个特性可能会出现这样的问题:
在字符串数组初始化时,如果不小心漏掉了一个逗号,编译器不会发出错误信息,而是把两个字符串合并在一起。如:
char *string[] ={
"color monitor",
"big disk" //这里少了一个逗号
"Cray",
"on-line drwing routhines",
};
这里本意会有四个元素。但因为少了一个逗号。就只有三个元素了。后面如果引用了第四个元素就会出现错误
3、关于函数的可见性
定义C函数时,默认情况下函数的名字是全局可见的。可以在函数名字前加extern关键字。也可以不加,效果是一样的。
这样容易出的问题就是 如果用户编写和库函数同名的函数。就人取而代之
4)C语言的符合重载
1)staic 在函数内部。表示此变量的值在各个调用间一直保持延续性
在函数这一级,表示函数只对本文件可见
2)extrn 用于函数定义,表示全局可见
用于变量,表示它在其它地方定义
等等;
3)p = N*sizeof*q;
这句怎么解释呢?正确的应该是 p=N*sizeof(*p)
因为sizeof是个操作符,这里把指针q指向的内容(即*q)作为操作数,它返回q所指向对象的类型的字节数,当sizeof的操作数是个类型名是,两边必须加上括号,但操作数如果是变量则不必加括号。
apple = sizeof(int) * p;
这里应该是(sizeof(int)) * (P)
5)因为优先级容易理解错误的地方
1).的优先级高于* 那么 *p.f 很容易理解为: (*p).f 正解为 *(p.f)
2).函数()高于 * int *pf() 错解: int (*pf)()正解:int *(fp())
3)算术运算符高于移位运算符 msb<<4+lsb 正解为 msb << (4+lsb)
4)==和!=高于位操作符 (val & mask != 0) 正解: val & (mask != 0)
阅读(1754) | 评论(1) | 转发(0) |