C 语法
预计时间: 9分钟
本节主要介绍程序的基本概念、C 语言基本概念等。
程序元素
数据类型
数据类型是一组值和一组可以对这些值执行的操作。在 C 语言中,每种数据类型都有自己的一组值和自己的一组操作。C语言中有三组数据类型。
- 基本数据类型包括字符、整数和浮点值。
- 派生数据类型由基本数据类型的组合组成。派生的数据类型包括数组、指针、结构、联合、枚举和函数。
- void 类型是一组空值。
语句
作为一种命令式语言,C 使用语句来指定动作。语句后面跟一个分号结尾;
- 表达式
- 调用用函数
- 为变量分配新值
- 控制流
函数
在 C 语言中,函数类似于其他语言中的子例程或过程。函数是单独定义的代码段,可以被其他函数调用。
定义函数时包含以下信息:
- 函数名称
- 形式参数的类型和数量
- 存储类说明符
- 调用函数时要执行的语句
- 函数返回值的类型
声明
- 声明定义变量
- 使用关键字定义新类型
- 为新变量分配类型,可能需要为变量保留存储空间
- 代码段用大括号
{}
括起来,限制声明范围
预处理
预处理器在编译开始之前处理 C 程序的源代码。 C 预处理器能够进行宏替换、条件编译和包含文件。
有两个常用的预处理器指令:
#include
指令,它从另一个文件插入文本#define
指令,它定义一个预处理器宏
语言元素
标记
标记(Token) 是 C 语言中最小的词法元素。编译器将 C 源程序中的字符收集到标记中。
空白或注释分隔相邻的关键字、标识符和常量。C 语言包含六类标记:
1. 标识符
标识符被用于语句、变量、参数、标记等
2. 常量
- 整数常量
- 浮点数常量
- 一个字符常量是一个整数
- 常量表达式是仅仅包含常量的表达式
- 字符串常量也叫字符串字面值
- 枚举常量,枚举是一个常量整型值的列表
3. 运算符
C 支持一组丰富的运算符,它们是在表达式中使用的符号,用于指定在评估该表达式时要执行的操作。C 有以下操作符:
3.1 算术运算
算术运算符 | 描述 |
---|---|
+ | 加 |
- | 减 |
* | 乘 |
/ | 除 |
% | 取模 |
++ | 自增 |
-- | 自减 |
3.2 关系运算
关系运算符 | 描述 |
---|---|
== | 等于 |
!= | 不等于 |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
3.3 逻辑运算
逻辑运算符 | 描述 |
---|---|
&& | 逻辑与 |
|| | 逻辑或 |
! | 逻辑非 |
? : | 三元运算符 |
3.4 按位运算
按位运算符 | 描述 |
---|---|
& | 按位与 |
| | 按位或 |
^ | 按位异或 |
~ | 按位取反 |
<< | 按位左移 |
>> | 按位右移 |
3.5 赋值运算
赋值运算符 | 描述 |
---|---|
= | 赋值 |
+= | 加后赋值 |
-= | 减后赋值 |
*= | 乘后赋值 |
/= | 除后赋值 |
%= | 取模后赋值 |
<<= | 按位左移后赋值 |
>>= | 按位右移后赋值 |
&= | 按位与后赋值 |
^= | 按位异或后赋值 |
|= | 按位或后赋值 |
3.6 数据运算
数据运算符 | 描述 |
---|---|
sizeof() | 获取......的大小 |
[] | 数据下标 |
& | ......的地址 |
* | ......的值 |
-> | 结构体解引用 |
. | 结构体引用 |
3.7 其它
杂项 | 描述 |
---|---|
, | 逗号 |
() | 圆括号,小括号,调用函数,子表达式分组等等 |
(typename) | 类型转换 |
{} | 花括号,大括号 |
: | 冒号 |
// | 单行注释 |
/* | 多行注释开始 |
*/ | 多行注释结束 |
4. 关键字
C89 有 32 个保留字,也称为关键字,这些字不能用于预定义之外的任何目的:
序号 | 关键字 | 描述 |
---|---|---|
1 | auto | 给局部变量局部寿命 |
2 | break | 退出复合语句 |
3 | case | switch 语句的一个分支 |
4 | char | 数据类型:字符型 |
5 | const | 创建一个不可修改的变量 |
6 | continue | 继续从循环顶部运行代码 |
7 | default | switch 语句的默认分支 |
8 | do | 开始一个 do-while 循环 |
9 | double | 数据类型:双精度浮点型 |
10 | else | if 语句的 else 分支 |
11 | enum | 定义一组 int 常量 |
12 | extern | 声明一个标识符是外部定义的 |
13 | float | 数据类型:浮点型 |
14 | for | 开始一个 for 循环 |
15 | goto | 跳到某个标签 |
16 | if | if 语句的开始 |
17 | int | 数据类型:整型 |
18 | long | 数据类型:长整型 |
19 | register | 声明一个变量,令其存储在 CPU 寄存器中 |
20 | return | 从函数中返回 |
21 | short | 数据类型:短整型 |
22 | signed | 表示整数类型的有符号修饰符 |
23 | sizeof | 确定数据的大小 |
24 | static | 在作用域退出后依然保留变量值 |
25 | struct | 将多个变量合并到一条记录中 |
26 | switch | 开始一个 switch 语句 |
27 | typedef | 创建一个新类型 |
28 | union | 开始一个 union 语句 |
29 | unsigned | 表示整数类型的无符号修饰符 |
30 | void | 声明数据类型为空 |
31 | volatile | 声明变量可能会在别处被改动 |
32 | while | 开始一个 while 循环 |
C99 追加五个保留字:
序号 | 关键字 | 描述 |
---|---|---|
1 | _Bool | 数据类型:布尔类型 |
2 | _Complex | 数据类型:复数类型 |
3 | _Imaginary | 数据类型:虚数类型 |
4 | inline | 声明内联函数 |
5 | restrict | 指针修饰符 |
C11 追加七个保留字:
序号 | 关键字 | 描述 |
---|---|---|
1 | _Alignas | |
2 | _Alignof | |
3 | _Atomic | |
4 | _Generic | |
5 | _Noreturn | |
6 | _Static_assert | |
7 | _Thread_local |
大多数最近保留的字都以下划线开头,后跟大写字母,因为这种形式的标识符以前由 C 标准保留,仅供实现使用。
5. 字符串字面量
6. 标点符号
字符集
源码字符集
基本的 C 源代码字符集包括以下字符:
- ISO基本拉丁字母的小写和大写字母:
a
–z
A
–Z
- 十进制数字:
0
-9
- 图形字符:
! " # % & ' ( ) * + , - . / : ; < = > ? [ \ ] ^ _ { | } ~
- 空白字符:空格、水平制表符、垂直制表符、换页符、换行符
换行表示文本行的结束;它不必对应于实际的单个字符,尽管为了方便 C 将其视为一个字符。
换行表示文本行的结束;它不必对应于实际的单个字符,尽管为了方便 C 将其视为一个字符。
额外的多字节编码字符可以在字符串文字中使用,但它们不是完全可移植的。
目标字符集
空白
C 语言需要空格来分隔相邻的关键字、标识符和常量。否则,C 编译器会忽略空格,除非它出现在字符或字符串常量中。空白通常用于分隔标记并使程序更易于阅读。标记之间的空白量并不重要。
注释
C 编译器将注释视为空格。C 预处理器用空格替换注释。预处理器会忽略注释分隔符之间的文本,并且不会检查该文本以查找命令或宏调用。
/*
多行注释
不能嵌套使用
/*
// 自 C99 起支持单行注释
最后更新时间为2021年03月29日