您的位置:首页 > 编程语言 > C语言/C++

C专家编程-分析C语言的声明

2014-11-07 11:22 363 查看

1 理解C语言声明的优先级规则

A 声明从它的名字开始读取,然后按照优先级顺序依次读取。
B 优先级从高到低依次是:
   1 声明中被括号括起来的那部分
   2 后缀操作符:括号() 表示这是一个函数,而方括号[] 表示这是一个数组。
   3 前缀操作符:星号* 表示“指向…的指针”
C 如果const 和(或)volatile 关键字的后面紧跟类型说明符(如int,long等),它作用于类型说明符。在其他情况下,const 和(或)volatile 关键字作用于它左边紧邻的指针星号。

2 用优先级分析C语言声明一例

char * const * (*next) ();
表1.1 用优先级规则解决一个声明
适用规则 解释
A首先,看变量名"next”,并注意到它直接被括号所括住
B.1所以先把括号里的东西作为一个整体,得出"next“是一个只想…的指针
B然后考虑括号外面的东西,在星号前缀和括号后缀之间做出选择
B.2B.2规则告诉我们优先级较高的是右边的函数括号,所以得出"next”是一个函数指针,只想一个返回…的函数
B.3然后,处理前缀"*",得出指针所指的内容
C最后,把"char * const” 解释为指向字符的常量指针
    把上述分析结果加以概括,这个声明表示"next” 是一个指针,它直线给一个函数,该函数返回另一个指针,该指针指向一个类型为char 的常量指针。

3 typedef int x[10] 和define x int [10]的区别

typedef 为数据类型创建别名,而不是创建新的类型。
在typedef 和宏文本替换之间存在一个关键性的区别。正确思考这个问题的方法就是把typedef 看成一种彻底的“封装”类型----在声明它之后不能再往里面增加别的东西。
typedef和宏的区别:
首先,可以用其他类型说明符对宏类型名进行扩展,但对typedef 所定义的类型名却不能这样做。
[code]#define peach int
unsigned peach i; // 没问题
typedef int banana;
unsigned banana i; // 错误!
其次,在连续几个变量的声明中,用typedef 定义的类型能够保证声明中所有的变量均为同一种类型,二用#define 定义的类型则无法保证。

[code] #define int_ptr int *
int_ptr chalk, cheese;
经过宏扩展,第二行变为:
int *chalk, cheese;
这使得chalk 和cheese 成为不同的类型,chalk是一个只想int 的指针,而cheese则是一个int。
typedef char * char_ptr;
char_ptr Bentley, Rolls_Royce;
Bentley和Rolls_Royce的类型依然相同,都是只想char的指针。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: