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 个保留字,也称为关键字,这些字不能用于预定义之外的任何目的:

序号关键字描述
1auto给局部变量局部寿命
2break退出复合语句
3caseswitch 语句的一个分支
4char数据类型:字符型
5const创建一个不可修改的变量
6continue继续从循环顶部运行代码
7defaultswitch 语句的默认分支
8do开始一个 do-while 循环
9double数据类型:双精度浮点型
10elseif 语句的 else 分支
11enum定义一组 int 常量
12extern声明一个标识符是外部定义的
13float数据类型:浮点型
14for开始一个 for 循环
15goto跳到某个标签
16ifif 语句的开始
17int数据类型:整型
18long数据类型:长整型
19register声明一个变量,令其存储在 CPU 寄存器中
20return从函数中返回
21short数据类型:短整型
22signed表示整数类型的有符号修饰符
23sizeof确定数据的大小
24static在作用域退出后依然保留变量值
25struct将多个变量合并到一条记录中
26switch开始一个 switch 语句
27typedef创建一个新类型
28union开始一个 union 语句
29unsigned表示整数类型的无符号修饰符
30void声明数据类型为空
31volatile声明变量可能会在别处被改动
32while开始一个 while 循环

C99 追加五个保留字:

序号关键字描述
1_Bool数据类型:布尔类型
2_Complex数据类型:复数类型
3_Imaginary数据类型:虚数类型
4inline声明内联函数
5restrict指针修饰符

C11 追加七个保留字:

序号关键字描述
1_Alignas
2_Alignof
3_Atomic
4_Generic
5_Noreturn
6_Static_assert
7_Thread_local

大多数最近保留的字都以下划线开头,后跟大写字母,因为这种形式的标识符以前由 C 标准保留,仅供实现使用。

5. 字符串字面量

6. 标点符号

字符集

源码字符集

基本的 C 源代码字符集包括以下字符:

  • ISO基本拉丁字母的小写和大写字母:az AZ
  • 十进制数字:0-9
  • 图形字符:! " # % & ' ( ) * + , - . / : ; < = > ? [ \ ] ^ _ { | } ~
  • 空白字符:空格、水平制表符、垂直制表符、换页符、换行符

换行表示文本行的结束;它不必对应于实际的单个字符,尽管为了方便 C 将其视为一个字符。

换行表示文本行的结束;它不必对应于实际的单个字符,尽管为了方便 C 将其视为一个字符。

额外的多字节编码字符可以在字符串文字中使用,但它们不是完全可移植的。

目标字符集

空白

C 语言需要空格来分隔相邻的关键字、标识符和常量。否则,C 编译器会忽略空格,除非它出现在字符或字符串常量中。空白通常用于分隔标记并使程序更易于阅读。标记之间的空白量并不重要。

注释

C 编译器将注释视为空格。C 预处理器用空格替换注释。预处理器会忽略注释分隔符之间的文本,并且不会检查该文本以查找命令或宏调用。

/*
  多行注释
  不能嵌套使用
/*

// 自 C99 起支持单行注释
最后更新时间为2021年03月29日