第一章:表达式、语句
1.1 概述
- C 语言中,
表达式和语句是构建程序的基石,即:表达式负责计算,而语句负责执行动作。
1.2 表达式
1.2.1 概述
表达式是由运算符和操作数(变量、常量、函数返回值等)组合而成的式子。
提醒
表达式的核心特点是:一定会返回一个值(value),并且该值有特定的数据类型。
- 示例:
c
3 + 5 // 返回一个整数 8 ,是表达式1
- 示例:
c
a = 10 // 赋值表达式,返回 10,并产生修改 a 的副作用1
- 示例:
c
x > y // 关系表达式,如果成立返回 1 ,不成立返回 01
1.2.2 常见的表达式
- 在 C 语言中,常见的表达式,如下所示:
| 类型 | 示例(a = 10,b = 20) | 结果 |
|---|---|---|
| 算术表达式 | a + b | 30 |
| 关系表达式 | a > b | 0 |
| 逻辑表达式 | a && b | 1 |
| 赋值表达式 | a = 100 | 100 |
| 自增表达式 | a++ | 一个值,同时修改 a |
| 条件表达式 | a > b ? a : b | 20 |
| 函数调用表达式 | printf("Hi") | 函数返回值 |
| 逗号表达式 | (a = 1, b = 2, a + b) | 3 |
- 示例:
c
// 相当于 a = 10 ,表达式的值是 10
// 然后 b = 10
// 最终 a = 10 b = 10
b = a = 101
2
3
4
2
3
4
1.3 语句
1.3.1 概述
语句是控制计算机执行某个具体动作的指令。在 C 语言中,大部分语句都是以;结尾。
提醒
- ① 语句是顺序执行、选择执行或循环执行的最小独立单位。
- ② 表达式与语句的转化:任何表达式后面加上一个分号
;,就变成了一个表达式语句。
c
a = 10 // 是表达式(计算机并返回结果)
a = 10; // 是语句(命令计算机执行赋值操作)1
2
3
2
3
1.3.2 语句的分类
1.3.2.1 概述
- C 语言中的语句根据功能和结果,通常可以分为 5 大类,如下所示:
1.3.2.2 空语句
- 格式:
c
;1
提醒
- ① 只有一个孤零零的分号
;的语句。 - ② 它什么都不做,常用于在语法上需要一条语句、但在逻辑上不需要执行任何操作的场合。
- 示例:
c
#include <stdio.h>
#include <stdlib.h>
int main(void) {
// 在循环体中做空等待,用于过滤输入流,直到遇到换行符
while (getchar() != '\n') ;
return 0;
}1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
1.3.2.3 表达式语句
- 格式:
c
表达式;1
提醒
- ① 表达式语句就是在表达式的后边加上分号。
- ② 表达式语句是 C 语言中最常见的语句。
- 示例:
c
#include <stdio.h>
int main(void) {
int x = 10;
// 赋值语句
int y = x+ 5 ;
return 0;
}1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
- 示例:
c
#include <stdio.h>
int main(void) {
int x = 10;
// 自增语句
int y = x++;
return 0;
}1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
1.3.2.4 复合语句
- 格式:
c
{
}1
2
3
2
3
提醒
- ① 复合语句其实就是代码块。
- ② 复合语句用一对大括号
{}把多个语句括起来,在逻辑上它们被看作一条单语句。
- 示例:
c
#include <stdio.h>
int main(void) {
{ // 复合语句,也就是代码块
int a = 10;
int b = a;
}
return 0;
}1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
- 示例:
c
#include <stdio.h>
static void print(int arr[], int sz) { // 函数的大括号中的代码也构成复合语句
int i = 0;
for (i = 0; i < sz; i++) {
printf("%d ", arr[i]);
}
}
int main() {
int i = 0;
int arr[10] = {0};
for (i = 0; i < 10; i++) { // for循环的循环体的大括号中的就是复合语句
arr[i] = 10 - i;
printf("%d\n", arr[i]);
}
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
1.3.2.5 函数调用语句
- 格式:
c
函数名(...);1
提醒
- ① 函数调用语句由函数名、实际参数以及分号组成。
- ② 函数调用语句本质上属于表达式语句;但是,因为非常常用,通常单独列出。
- 示例:
c
#include <stdio.h>
/**
* 求两个整数的最大值
* @param a 整数
* @param b 整数
* @return 最大值
*/
static int max(const int a, const int b) {
return a +b;
}
int main(void) {
int x = 10;
int y = 20;
// 函数调用语句,因为函数调用本质上也是一种表达式
int result = max(x,y);
// 函数调用语句,只不过,其返回值我们没有用而已
printf("Hello World");
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
1.3.2.6 控制语句
控制语句用于控制程序的执行流程,实现条件分支、循环或跳转。控制语句共有 9 种,可细分为三类:
1.4 总结
- C 语言中表达式和语句的区别和联系,如下所示:

第六章:运算符的优先级
| 优先级 | 名称 | 符号 | 结合性 | 举例 |
|---|---|---|---|---|
| 1 | 数组取下标 | [] | 左结合性 (从左到右) | value = array[index] |
| 函数调用 | () | result = sum(a, b) | ||
| 取结构和联合的成员 | . | point.x | ||
-> | point_ptr->x | |||
| 自增(后缀) | ++ | value = count++ | ||
| 自减(后缀) | -- | value = count-- | ||
| 2 | 自增(前缀) | ++ | 右结合性 (从右到左) | value = ++count |
| 自减(前缀) | -- | value = --count | ||
| 取地址 | & | ptr = &value | ||
| 间接寻址 | * | value = *ptr | ||
| 一元正号 | + | value = +number | ||
| 一元负号 | - | value = -number | ||
| 按位取反 | ~ | result = ~mask | ||
| 逻辑非 | ! | if (!ready) | ||
| 计算所需空间 | sizeof | size = sizeof(int) | ||
| 3 | 强制类型转换 | () | 右结合性 (从右到左) | average = (double)sum / count |
| 4 | 乘法类运算符 | * | 左结合性 (从左到右) | area = width * height |
/ | average = sum / count | |||
% | remainder = value % 10 | |||
| 5 | 加法类运算符 | + | 左结合性 (从左到右) | total = a + b |
- | distance = end - start | |||
| 6 | 移位 | << | 左结合性 (从左到右) | result = value << 1 |
>> | result = value >> 1 | |||
| 7 | 关系 | < | 左结合性 (从左到右) | a < b |
> | a > b | |||
<= | a <= b | |||
>= | a >= b | |||
| 8 | 判等 | == | 左结合性 (从左到右) | choice == 1 |
!= | result != 0 | |||
| 9 | 按位与 | & | 左结合性 (从左到右) | result = flags & mask |
| 10 | 按位异或 | ^ | 左结合性 (从左到右) | result = a ^ b |
| 11 | 按位或 | | | 左结合性 (从左到右) | result = flags | mask |
| 12 | 逻辑与 | && | 左结合性 (从左到右) | age >= 18 && enabled |
| 13 | 逻辑或 | || | 左结合性 (从左到右) | is_admin || is_owner |
| 14 | 条件 | ? : | 右结合性 (从右到左) | max = a > b ? a : b |
| 15 | 赋值 | = | 右结合性 (从右到左) | value = 10 |
*= | value *= 2 | |||
/= | value /= 2 | |||
%= | value %= 10 | |||
+= | value += 5 | |||
-= | value -= 5 | |||
<<= | value <<= 1 | |||
>>= | value >>= 1 | |||
&= | flags &= mask | |||
^= | flags ^= mask | |||
|= | flags |= mask | |||
| 16 | 逗号 | , | 左结合性 (从左到右) | value = (a++, b++) |