《C陷阱与缺陷》第二章
2.1 ,理解函数声明
提出问题:如何调用0指针指向的函数
分析((void()())0)();
首先分析
float g(),(h)();
在上例中g是一个函数返回值为float指针
h为一个函数指针,此函数返回值为float
即定义一个返回值指向float的函数指针为
float (h)();
表示这种类型只需要将变量名去掉,即
float ()();
则返回值为void的函数指针的类型为 void ()();
如果一个函数指针为fp则调用函数可写为(fp)()或简写为fp();
则以上那个问题可以先将0转换为指针然后再用函数指针调用函数
即可得答案为:(fp)()=>(((void ()())0))();
如函数有参数,则只需要添加进参数的类型即可
2.2运算符的优先级
记忆方法:其他运算符>单目运算符>双目运算符(算数运算符>移位运算符>关系运算符>逻辑运算符)>三目运算符>赋值运算符
实例:tax_rate=income>40000 && residency<5 ? 3.5:2.0
为:tax_rate=(income>40000 && residency<5) ? 3.5:2.0;
补充逗号优先级是最低的
2.3,注意语句结束的分号
逗号作为语句的结束符,遗漏或新增都会出现很大的难以发现的问题
遗漏:
if(n<3)
return
logrec.data=x[0];
logrec.data=x[1];
以上相当于
if(n<3)
return logrec.data=x[0];
logrec.data=x[1];
新增:
if(x[i]>big);
big=x[i];
相当于
if(x[i]>big){}
big=x[i];
2.4,switch语句
注意在编写时每一个分支break的书写,合理调用
2.5,函数调用
f()调用,f为计算函数f的地址
2.6,悬挂else引发的问题
实例:
if(x == 0)
if (y == 0) error();
else
{
z = x + y;
f(&z);
}
相当于
if(x == 0)
if (y == 0) error();
else
{
z = x + y;
f(&z);
}