语法分析
(语句、声明的语法细节)
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结合。