c语言声明语法(参考其他文章)

来源:互联网 发布:java string compare 编辑:程序博客网 时间:2024/05/29 04:59
C语言的声明语法本身就是小的编程语言。其基本思想为让声明符模仿标识符的最终语法。

C89对声明的形式的规定:
声明说明符   初始化声明符表opt  [opt的意思是option,可选]
  • 声明说明符
存储类型说明符  声明说明符opt
基本类型说明符    声明说明符opt
类型限定符    声明说明符opt
  • 声明符
包含字符 * ,[] , ( ) 与被声明的标识符(即名称),其声明了一个新的标识符,还表示标识符是数组、指针、函数还是其他任意组合。
声明符是初始化声明符表的主体,声明符规定如下:
指针opt  直接声明符
指针opt指的是指针声明符*,要注意的是,*属于声明符,而不是声明说明符的一部分。
指针opt又包含:
* 类型限定符表opt               (如:int *const p)
* 类型限定符表opt 指针   (如:const int * const *** const ** const p;
 第二条使得指针可以嵌套,这条规定产生复杂的声明形式
  • 直接声明符和类型限定词表的内容:
直接声明符:
标识符
(声明符)
直接声明符[常量表达式opt]
直接声明符(形式参数类型表)
直接声明符(标识符表opt)
  • 类型限定符表:
类型限定符
类型限定符表 类型限定符


C的声明的组织形式是以嵌套为基础的,是用嵌套声明组织起来的。一个声明说明符可以包含另一个声明说明符,这就是声明的嵌套,这种嵌套贯穿于整个声明之中。
一个非常简单的声明,其实就是由多个声明嵌套组成的,例如:
static const  int  i=10, j=20, k=30;
变量i前面就是声明说明符部分,有三个声明说明符:static const int,static是一个存储类说明符,它属于这种形式:
static 声明说明符
static后面的声明说明符就是const int,const是一个类型限定符,这也是个嵌套,它是由
const 声明说明符
组成,最后的int是一个类型说明符,到这里已经没有嵌套了,int就是最底的一层。对于存储类说明符、类型说明符和类型限定符的排列顺序,C标准并没有规定其顺序,谁嵌套谁都可以。换言之,上面的声明可以写成:  int static const i=10, j=20, k=30;    或者const int static i=10, j=20, k=30;

声明符模仿标识符思想:
我们最常见到的对声明的描述是这样的:
存储类型  基本类型  类型限定词  最终声明符(可能包含初始化列表)
在c语言中,声明的语法与解释为
               基本类型  生成基本类型的东西;
而不是
               类型  标识符;
生成基本类型的东西,即——声明符——或是简单的标识符,或是如同*p,a[10],或f()这样符号,表明声明变量为指向基本类型的指针,基本类型的数组,或返回基本类型的函数。

例子:
<1>const int *p;                                                                                                                                                                                                         
 <2>int const *p;                                                                                                                                                 
 <3>int *const p;
由c语言的声明标准可以知道<1>与<2>是等价的,表示指向只读常量的指针,可以从让声明符模仿标识符的思想考虑,即*p 在使用时表示一个被  const  修饰的  int 型只读常量,所以p表示指向常量的指针。
对于<3>,同样 *const p 为int型,const修饰p,表示p的值不可修改,p为指针,所以为指针常量。

typedef用来声明一个别名,typedef后面的语法,是一个声明
教材中介绍typedef的时候通常会写出如下形式:
typedef int PARA;
其中int PARA 为一个声明,声明中的标识符即为别名,其代表最终声明符,如
typedef int a[10];               (a代表a[10])
typedef void (*p)(void);          (p 代表 (*p)(void) )
虽然在功能上,typedef可以看作一个跟int PARA分离的动作,但语法上typedef属于存储类声明说明符,因此严格来说,typedef int PARA整个是一个完整的声明。
0 0