一、函数指针
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匹配,条件判断出错。