C陷阱与缺陷(小结2)

  语法分析

(语句、声明的语法细节)

1.理解函数声明

任何C变量的声明都由两部分组成:类型以及一组类似表达式的声明符

如:float (*h)(); 其中类型为float,声明符为:(*h)()。整个声明表示:h 为一个函数指针,h所指向函数的返回值为浮点型。

由一个给定类型的变量的声明得到该类型的类型转换符:将变量名和声明部分末尾的分号去掉,再将剩余的部分用一个括号整个“封装”起来。

如:float (*h)(); (float (*)()),表示“指向返回值为浮点型的函数的指针”的类型转换符。

若fp是一个函数指针,则(*fp)()表示调用fp所指向的函数。

2.运算优先级

() [] -> . 高于 单目运算符 高于 算术运算符 高于 移位运算符 高于关系运算符 高于 按位操作 高于 逻辑操作符 高于条件运算符 高于 赋值运算符 高于 逗号

结合性:自右向左,其它为自左向右

记住:逻辑运算符低于任意一个关系运算符;移位运算符低于算术运算符高于关系运算符;在关系运算符中,==和!=的优先级最低。

如:*p++,*与++都为单目运算符,即同一优先级,此时主要考虑结合性—自右向左,所以翻译为*(p++),即取指针p所指向的对象,然后将p递增1;而(*p)++是取指针p所指向的对象,然后该对象递增1。

3.注意作为语句结束标志的分号

(1)   在if和while语句之后需要紧跟一条语句时,若多了一个分号,此时原来紧跟if或while语句之后的语句就是一条单独的语句,与条件判断部分没有任何关系。当然,也要注意不能遗漏一个分号。

(2)   当一个声明的结尾紧跟一个函数定义时,若声明结尾的分号被省略,编译器可能会把声明的类型视作函数的返回值类型

4.Switch语句

不要遗漏各个case部分的break语句;若对某一个分支情况的处理只要稍作改动,剩余部分就完全等同于另一个分支情况下的处理,则可以有意略去一个break语句(最好在略去break语句的地方加上如下注解:

/*此处没有break语句*/,来提示程序阅读者,此处是有意省去一个break语句)。

5.函数调用

          在函数调用时,即使函数不带参数,也应包括(空)参数列表。

6.悬挂else引发的问题

          记住:else始终与同一对括号内最近的未匹配的if结合。

猜你喜欢

转载自blog.csdn.net/xiaobaixiongxiong/article/details/82964271