概念术语

当我们在和其他人交流一个特定的话题的时候,不可避免的会涉及到相关的术语,本节我们就来介绍一下C语言一些相关的术语。

标识符与关键字

先来说标识符

标识符其实就是“名字”,我们可以为编程过程中的函数变量指针结构体联合体等进行命名(以下统称为标识符命名),而我们给他们起的名字就叫做标识符。标识符命名具有有一定的规则:

  • 只能由字母、数字和下划线组成;
  • 不能以数字开头;
  • 有一定的长度限制(一般因编译器而异,但是一般都不会触及长度限制);

此外需要补充的是:C语言的标识符是大小写敏感的,即:varVar在C语言中会被视为两个不同的标识符。

一个对规则的简单概括其实就是:我们可以为标识符起一个不带标点(包括空格)的、由任意形式(大小写、顺序)的字母构成的、长度任意的、不可重复的名字。换句话说,我们从英文字典中随便拎出一个单词都可以作为标识符,甚至乱序的字母组合(例如:alksjdhgflakjs)也可以作为标识符。

说到这我们来引出关键字

上面提到了,任意的字母组合都可以作为标识符,但是部分语言内特性(比如分支、循环等)也需要占用部分单词,所以这部分具有特殊意义的单词就不能用作标识符,我们为这部分特殊的单词规定了特殊的术语----关键字

C语言中基本常用的关键字如下:

关键字 功能
auto 修饰关键字,默认的变量修饰关键字
break 语句,跳出整个循环
case 语句,与switch语句搭配,用于进入特定分支
char 类型声明,声明字符型的变量或返回字符类型的函数
const 修饰关键字,用于定义常量
continue 语句,结束当前循环,开始下一次循环
default 语句,与switch语句搭配,用于进入其他分支
do 语句,后面紧跟的语句块将作为循环的循环体
double 类型声明,声明双精度浮点型的变量或返回双精度浮点类型的函数
else 语句,与if语句搭配,用于进入其他分支
enum 类型声明,用于声明枚举类型
extern 修饰关键字,用于指明被修饰的变量或函数将在其他文件中定义
float 类型声明,声明单精度浮点型的变量或返回单精度浮点类型的函数
for 语句,用于构建循环
goto 语句,用于函数内无条件跳转
if 语句,用于进入分支
int 类型声明,声明整型的变量或返回整型的函数
long 修饰关键字,用于定义长类型的变量
register 修饰关键字,用于指明被修饰的变量为寄存器类型
return 语句,用于函数返回
short 修饰关键字,用于定义短类型的变量
signed 修饰关键字,用于定义有符号类型的变量
sizeof 语句,用于计算变量长度(单位为字节数)
static 修饰关键字,用于声明静态变量
struct 类型声明,用于声明结构体类型
switch 语句,用于构建分支结构
typedef 用于给一致的数据类型取别名
union 类型声明,用于声明联合体类型
unsigned 修饰关键字,用于定义无符号类型的变量
void 类型声明,用于声明返回无类型或无参数函数,以及无类型指针
volatile 修饰关键字,用于指明被修饰的变量可能随时被该程序外的其他因素改变
while 语句,用于构建循环

此外还有有后续各标准引进的关键字:

C99引进的inlinerestrict_Bool_Complex_Imaginary

C11引进的:_Alignas_Alignof_Atomic_Generic_Noreturn_Static_Assert_Thread_Local

考虑到真正的C23标准尚未发布,一些即将在C23标准中引入的关键字就不在此处提及了。

空白符与注释

首先我们来了解一下什么叫做空白符:空白符,顾名思义,就是那些展示出的效果是空白的字符。例如:空格(`)、制表符( `)、换行与回车等。

C语言中对于空白符是不敏感的

也就是说,在同一个语句的语法解析中,多余的空格或其他空白符最终会被忽略。举个简单的例子,在实际的语法解析中,下面两段代码是等价的:

// 示例代码1
int a = 100;
// 示例代码2
int     a 
    = 
    100;

同理,在不同语句之间的换行其实也是不影响语法表达的,故以下几段代码的表达仍然是等价的:

// 示例代码3
int a = 1,b = 2,c;
c = b + a;
// 示例代码4
int a = 1,b = 2,c;c = b + a;
// 示例代码5
int a = 1,b = 2,c;


c = b + a;

不难看出,虽然空白符对于代码的语法表达并没有什么大的影响,但是空白符对代码的可读性影响其实是很大的。因此笔者在此处建议读者从一开始学习C语言的时候就应该养成良好的编程习惯,利用好空白符来提高代码的可读性。

说完了空白符我们再来说说注释:

看了上面的示例,虽然读者并不一定能够看懂代码的内容,但是应该不难注意到每一段的开头都添加了这样的内容:// 示例代码x,用来说明这段代码的作用。这种说明性质的内容在C语言或者说绝大部分编程语言中都拥有一个共同的名字----注释

所谓注释,即批注解释,其在代码中没有任何实际作用,仅仅是起到一个对代码的解释说明的作用。

C语言中的注释语法有两种:行注释块注释

顾名思义,行注释就是标志着从注释符号开始当前行的内容作为注释存在,语法上使用//来表示,例子就如同上面写的// 示例代码x

而块注释则代表着对一块内容进行注释,语法上使用/*来表示注释的开始,并且使用*/来表示注释的结束。举个简单的例子:

/*这是第一行注释
这是第二行注释
这是第三行注释
*/int a = 0;

显然,夹在/**/之间的内容被作为了注释,而不在中间的内容,即使和*/在同一行内也会被认为是代码的一部分。(当然一般出于可读性考虑也不会把*/和下一行代码放在同一行内。)

语句、表达式与语句块

先来说说语句

一个完整的C代码一定是由无数的语句构成的,而一个语句就像是我们说的一句话,往往能够表达一个完整的意思。

正因为一个语句就具有一个完整的意思,所以在每个完整的语句后,都需要用一个英文分号;来将多个语句分开。

这是一个合法的语句:int a = 0; 而这样的语句就会被认为是不合法的:int a = 0

不得不提到的一件事情是:在C语言初学者易犯的错误中,忘加分号或者用错分号(用成中文分号)往往高居榜首。

此外还需要提到的一件事是:单独的分号是可以作为一个语句的,我们称其为空语句,但是空语句不但没有任何实际意义,还会在特定情况下影响到代码的可读性,故很少使用。

接下来说说表达式

C语言中所谓的表达式其实和数学中的表达式概念十分相似,都是指一系列运算符与数字的组合,用于获取一系列计算的值。

一般表达式都会将一系列运算的结果作为返回值,表达式本身不构成语句,但是可以作为语句的组成部分。例如:

int a = 8 + 10;

其中8 + 10就是一个典型的表达式,其作用是返回数学计算的值作为变量a的初始值。

最后我们来说一说语句块

在C语言中,我们将用一对花括号括起来的一系列语句称为一个语句块,例如:

{// 插播复习:行注释的用法,以及多余空白符会被忽视
    int a = 0;
    int b = a + 15;
}

值得注意的是,花括号具有限制变量作用域的作用,即花括号内的变量的作用域仅限于变量定义后以及花括号结束前。(不知道作用域是什么没关系,看完变量章节再回来回顾即可)

此外,语句块之后并不需要另加分号。

results matching ""

    No results matching ""