总结C陷阱与缺陷条款
本站文章均为Jensen抹茶喵原创,转载务必在明显处注明:
转载自【博客园】 原文链接:http://www.cnblogs.com/JensenCat/p/4954332.html
条款一:语法分析中的“贪心法”
//表达式 a---b //等价于 a-- - b //不同于 a - --b
此例子可说明语法分析中分析到的字符尽可能的做左结合,此策略称为贪心法;
条款二:尽可能用typedef来简化函数指针
//用了简写以后 typedef void (*HANDLER)(int); HANDLER signal(int , HANDLER); //不用简写会简直一塌糊涂 void ( *signal(int , void(*)(int)) )(int)
条款三:运算符优先级
1)优先级最高:(数组下标,函数调用,结构成员)
() [] -> ,
2)单目运算符
! ~ ++ -- -(此处符号为取负数,而非减) (type) *(此符号为解引用的*,不是乘) & sizeof
3)双目运算符
(算术运算符在前)
* / % + -
(然后到移位运算符)
<< >>
(然后到关系运算符)
< <= > >= == !=
(然后到逻辑运算符)
& ^ | && || ?:
(然后是赋值运算符)
assignments
条款四:注意作为语句结束标志的分号
//由于例子1多了个分号,后果不堪设想...例子2为原意图 //例子1 if( a > b); a = 0; //例子2 if( a > b) a = 0;
条款五:数组指针除了用作运算符sizeof时能计算数组长度,其余情况都代表指向数组下标为0的元素指针
//情况1:sizeof情形 int a[10] = {0}; sizeof(a); //得出的结果为10 sizeof(int *) //得出结果为一个long的长度,我编译的为32位,所以为4 //情况2:作为参数时的情况 void main(int argc , char* argv[]) //等价于 void main(int argc , char** argv) //情况3:由于做了参数,指针被拷贝了,等价于首地址指针 void func(int a[]) { cout<<sizeof(a); } //所以运行如下代码后 int b[100]; func(b); //输出结果为:4(一个指针的长度)
条款六:宏定义不能乱用
1)不能忽视宏定义中的空格
//例子 #define f (x) ((x) - 1) //这个宏到底代表的是什么 f(x) ((x) - 1) (x) ((x) - 1) //答案是第二种
2)宏不是函数,不是语句,不是类型定义;执行的是宏展开(这里由于每个人习惯不同,可能产生很多很经典的BUG)
解决方案为尽可能把语句用 do{}while(0); 包起来,不懂原因请度娘