总结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); 包起来,不懂原因请度娘

 

posted @ 2015-11-11 02:26  Jensen抹茶喵  阅读(188)  评论(0编辑  收藏  举报