第二章语法陷阱

来源:互联网 发布:通达信行情分析软件 编辑:程序博客网 时间:2024/05/19 21:04

一、函数指针

1.我们先来看一下,一下几个表达式的区别:

int *a;//表示一个指向int型数的指针

int *a();//即int *(a());a是一个函数,函数a的返回值为一个int型的指针

int (*a)();//a是一个函数指针,表示指向返回值为int型的函数指针

(int (*)());//表示一个“指向返回值为int型的函数指针”的类型转换

2.接下来,我们来看一个函数指针的例子:

#include <stdio.h>void fun(){puts("hello world!");}int main(){void (*p)() = fun;//函数指针//两种用法p();(*p)();return 0;}
运行结果如下:


3.最后我们来分析一个稍微复杂一点的例子

(*(void(*)())0)();

这个式子的含义是什么呢?这个应该怎么分析呢?

我们可以这样来看:令p = (void(*)())0;则原式可表示为 (*p)();这样显然是用函数指针p来调用一个函数,下面我们再具体看一下p的含义,p表示一个函数指针,void(*)()是一个强制类型转换,p表示的是将0转换为指向返回类型为void型函数的一个函数指针。


二、运算符优先级问题

一个小例子:

while(c = getchar() != EOF) {};//相当于while(c = (getchar() != EOF)) {};显然,这不是这段代码的原意while((c = getchar()) != EOF) {};


三、注意作为语句结束符的分号

1.多写分号引起的问题:

if(a > b); b = a;//相当于 if(a > b) {}; b = a;无论什么情况,赋值语句都会执行if(a > b) b = a;


四、else悬挂引起的问题:

if(0 == x)if(0 == y) f();else{z = x + y;}

这段代码原意是第一个if与else匹配,但是,由于没有括号,导致第二个if与else匹配,条件判断出错。





0 0
原创粉丝点击