概念术语
当我们在和其他人交流一个特定的话题的时候,不可避免的会涉及到相关的术语,本节我们就来介绍一下C语言一些相关的术语。
标识符与关键字
先来说标识符。
标识符其实就是“名字”,我们可以为编程过程中的函数、变量、指针、结构体与联合体等进行命名(以下统称为标识符命名),而我们给他们起的名字就叫做标识符。标识符命名具有有一定的规则:
- 只能由字母、数字和下划线组成;
- 不能以数字开头;
- 有一定的长度限制(一般因编译器而异,但是一般都不会触及长度限制);
此外需要补充的是:C语言的标识符是大小写敏感的,即:var
与Var
在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引进的:inline
、restrict
、_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;
}
值得注意的是,花括号具有限制变量作用域的作用,即花括号内的变量的作用域仅限于变量定义后以及花括号结束前。(不知道作用域是什么没关系,看完变量章节再回来回顾即可)
此外,语句块之后并不需要另加分号。