C陷阱与缺陷(二)语法"陷阱"

第二章 语法"陷阱"
1、理解函数声明
1)任何C变量的声明都有两部分组成:类型以及一组类似表达式的声明符
例子:
①float f; 和 float ((f)); 相似,可以任意使用括号
②float *g(),(*h)();
因为()结合优先级高于*,*g()也就是*(g()):g是一个函数,返回类型是指向浮点数的指针
h是一个函数指针,返回值是一个浮点类型
2)声明变量=>>类型转换符
把声明中的变量名和分号去掉,再将剩余的部分用一个括号括起来即可
例子:
①float (*h)(); =>> (float (*)())
②常数0转型为指向返回值为void的函数的指针
(void (*)())0
③typedef
(*(void (*)())0)();
等效于:typedef void (*func)();
             (*(fun)0)();
④signal库函数
接受两个参数:一个是代表需要被捕获的特定signal整数值,另一个是指向用户提供的函数的指针
该函数用于处理捕获到的特定的signal,返回类型为void
void (*signal(int, void(*)(int)))(int);
使用typedef简化上面的函数声明
typedef void (*HANDLER)(int);
HANDLER signal(int, HANDLER);

2、运算符的优先级问题
各组运算符的相对优先级
1)数组下标、函数调用操作符、结构成员选择操作符,自左向右
例:a.b.c的含义是(a.b).c
2)单目运算符,自右向左
例:*p++被解释成*(p++)
3)双目运算符,自左向右
算数>移位>关系>逻辑>赋值>三目运算符
①逻辑优先级低于关系
②移位优先级比算数低,但是比关系高
③6个关系的优先级不相同,==和=!低于其它
④赋值是自右向左

3、注意作为语句结束标志的分号
注意if,while,return,结构体

4、switch语句
漏泄break,后面的会顺序执行,case只是一个标号
注:对于处理相同时,有时候是故意省去,但是最好添加适当的注释

5、函数调用
加括号调用函数,不加只是计算函数的地址

6、"悬挂"else引发的问题
else始终与同一对括号内最近的未匹配的if结合

你可能感兴趣的:(C,读书笔记)