《C陷阱与缺陷》第二章

《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运算符的优先级
0_1524459342597_1524375315962-tim截图20180422133640-resized.png
记忆方法:其他运算符>单目运算符>双目运算符(算数运算符>移位运算符>关系运算符>逻辑运算符)>三目运算符>赋值运算符
实例: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);
    }

猜你喜欢

转载自blog.csdn.net/hhouxiang/article/details/80653619