C语言基础2-Decalarations-声明的语法规则

声明的定义

A declaration is a C language construct that introduces one or more identifiers into the program and specifies their meaning and properties.
声明是一种C语言构造,它将为程序引入一个或者多个标识符并指定其含义和属性。

声明的结构(抽象)

一个声明由以下四部分组成 :说明符(specifiers)、 限定符(qualifiers) 、声明器 (declarators) 、初始内容(initializers)。最后由一个分号;表示这个声明(若赋予初始值则是定义)结束。其中限定符和初始值是可有可无的,根据自己需要确定。
下面从简到难逐个分析结构形式:

1.说明符 声明器 
int a;           \\int是说明符 a 是声明器
int b , c;        \\int是说明符 b和c是声明器,同时也是标识符

2.说明符 声明器   初始值
int a = 5 ;    
int a,*b =NULL;  \\a和*b是声明器  b是标识符

3.说明符 限定符 声明器  初始内容
 int const  a =5;  \\const是限定符
 					\\等价于 const int a = 5;

4.限定符 说明符 声明器
const int *f(int)   \\这是一个函数的声明,要求参数类型为int,返回值类型为const int * (整型常量指针) 声明器为*f(int); f 为标识符

5.限定符 说明符 声明器
const int (*f)(int)   \\这是一个函数指针的声明,指向 返回值类型为const int,参数类型为int的函数 声明器为 (*f)(int);f 为标识符

在1中,我们看到说明符和声明器之间用逗号隔开。
在2中,我们看到说明符和初始内容之间用赋值号连接。
在3中,我们看到说明符和限定符之间用空格隔开,并且两者的顺序可以互换。(限定符和声明符、说明符和声明符也用空格隔开,但是顺序不能改变)
简单的总结:可以将声明分为两部分,第一部分为specifiers-and-qualifiers (总是位于声明的最前面,并且qualifiers不是必须的,如果有的话可以和specifier互换位置,两者之间并无顺序约定),第二部分是declarators-and-initializers(一个声明可以存在多对,initilizers不是必须的,如果有的话一定和declarators成对出现,先后顺序固定)
现在令人困扰的是声明器,a是声明器,*b是声明器,*f(int)和(*f)(int) 也都是声明器。这里面唯一的共性就是声明器都有标识符。其实只要满足下面格式的都算声明器。
对于4,5的声明后面另找时间在指针部分进行分析。

声明器 = 直接声明器( 标识符 or 标识符[下标] or 标识符(参数) or (声明器) ) + (零个或多个指针) -------来自参考2

上述博客的最后一页附上了 “声明分析”的代码。(给程序输入一段声明,最后返回一个对于该声明的文字描述)

变量的作用域和生命周期

在一个子函数里面声明和定义一个变量,那么这个变量只能在函数内被“看到”。它的作用范围就在函数内部,我们就认为这是一个局部作用域。如果是在头文件中声明和定义一个变量,那么这个变量在整个main函数中都能被“看见”,这就是全局作用域。比如:

在这里插入图片描述

第一个printf输出结果是5没有问题,但是在第二个printf中用到了foo函数,它既能看到局部作用域a也能看到全局作用域a,最后return了一个a。这个在c语言中,局部优于全局,所以返回的是局部a,最后结果为6。
上面简单探讨了一下作用域的问题,现在我们关注下局部a和全局a的生命长短。局部a在foo函数结束后被释放,而全局a在整个程序执行完成后被释放。
变量的生命周期和C的内存管理机制有关,局部变量一般放在栈中,使用后就被自动释放。而全局变量存放在静态区,会一直等程序结束后再释放。如果想让一个局部变量在程序结束前一直存在,那么我们将其放入静态区即可,这一操作可利用限定符static完成。

有关内存管理的细节,可以看一下:C语言变量的存储区域

这一章节简单地了解下声明的语法规则,后面在有关指针的篇章里继续研究下如何解读复杂声明。要想进一步了解可以看看知乎那篇文章,那里面有份文档也不错–C声明的右左规则.html.

参考和推荐

1.Declarations(CppReference)
2.分析C语言的声明(CSDN)
3.解析C语言声明的方法(知乎)
3.C prime plus 5th(无链接)

  • 21
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值