下面介绍C语言的陷阱和缺陷:
词法陷阱:
1、= 不同于==不要在程序中将两者写错,小心。将表达式与常量比较时,可将常量放在左边。
2、&和| 不同于&& 和 ||.
3、词法分析中的贪心法:每个符号应该包含尽可能多的字符。如果(编译器的)输入流截至某个字符前都已经分解为一个个符号,那么下一个符号将包括从该字符之后可能组成一个字符的最长字符串。如y = x/*p,那么/*将作为一个符号对待。
4、如果一个整形变量第一个字符是0,那么该常量被视为8进制数。
5、Char c = ‘cxf’。在vc和Gcc中,依次用后一个字符覆盖前一个字符,最后得到的整数值是最后一个字符的整数值。
语法陷阱:
1、c变量声明由类型和一组类似表达式的声明符组成。声明符与表达式类似,对他求值返回一个声明中给定类型的结果。如float f, ((f))。
知道了如何声明一个变量,那么该类型的类型转换符就很容易得到了:将声明中的变量名和分号去掉,再将剩余的部分用个括号“封装”起来即可。如float(*h) (),则float(*)()就是“指向返回值是浮点类型的函数的指针”的类型转换符。(*(void(*)())0)()调用地址为0位置的的例程。
2、运算符优先级:单目运算符,算术运算符,移位,关系,逻辑,条件, 赋值。
3、switch语句中case中,不要忘记break,若刻意要省略,请加注释。
4、C语言中只有一维数组,而且数组的大小必须在编译期间就作为一个常数确定下来。多维数组是通过一维数组仿真的,因为数组的元素可以是任何对象,当然也可以是数组。
对数组,我们只能做两件事,确定其大小,以及获得指向该数组下标为0的元素的指针。其它的有关数组的操作,实际上是通过指针进行的。
语义陷阱:
1、空指针并不等于空字符串。编译器保证由0转换而来的指针不等于任何有效的指针。当将0赋值非一个指针变量时,绝对不能企图使用该指针指向的内存中存储的内容。
2、在使用范围时,使用不对称边界方式。第一个是“入界点”(序列中第一个被占用的元素),第二个是“出界点”(序列中第一个被释放的元算)。For(int I = 0 ; I < 10; i++)。尽量不要使用For(int I = 0 ; I <=9; i++)。
3、数组的下标如果用入界口加出界口来表达(即10个元素,其下标为0 <= n < 10 ),则元素个数即为上界与下界之差,即下界。若为空,则上界等于下界。任何情况下上界也永远不可能小于下界。
尽量采用非对称边界法。
一个有N个元素的数组 ,我们可以使用a[N]进行比较和赋值,但不能引用其内容。
4、C语言中只有4个运算符存在规定的求值顺序:&&,| |, ?:和,。其他的运算符对器操作数求值的顺序是未定义的。特别的是,赋值运算符并不保证任何求值顺序。Y[i]=X[i++] 错误。
5、记得为main提供返回值。
连接:
1、为避免命名冲突,请对变量或函数使用static修饰符。为了定义与库函数中同名的函数,可将文件中要定义的函数加static修饰。
2、使用外部函数前,一定要声明。否则,没有声明,函数返回值将默认为整型。
3、外部声明要与定义类型一致。不能声明是extern int n,而定义是long n.
4、同一个外部变量在不同的地方被声明为不同的类型,这种错误大部分编译器是检不出来的。
char file[]= "/etc/password"; |
与
extern char* file; |
是不一样的。