表达式
表达式 (Expression) 是 C 语言中“计算”的基本单位。表达式可以:
- 计算出一个结果值(例如
3 + 2); - 产生副作用 (Side effect)(例如
i++修改对象i)。
表达式永远和以下概念绑定:
- 类型 (Type):表达式求值后得到的结果是什么类型;
- 求值规则:表达式的操作数如何转换、如何组合、何时产生副作用;
- 求值顺序:哪些子表达式之间有确定的先后关系,哪些是未指定的。
1. 表达式语句与可观察行为
下面程序能通过编译,但运行时没有任何输出:
c
int main(void) {
3 + 2;
return 0;
}1
2
3
4
2
3
4
原因是:3 + 2; 是一个表达式语句 (Expression statement)。它会被求值,但它的结果值没有被使用,也没有产生可观察副作用。
如果你希望观察到结果,需要把结果用于 I/O:
c
#include <stdio.h>
int main(void) {
printf("%d\n", 3 + 2);
return 0;
}1
2
3
4
5
6
2
3
4
5
6
关于 printf 的格式化输出细节会在后续“输入输出”章节中系统介绍。
2. 本章目录
3. 习题
#10401
⚡2⏳2
写一个程序,分别计算并输出以下表达式的结果:
3 + 2 * 5(3 + 2) * 5
要求:解释为什么这两个结果不同(从“运算符优先级与括号”角度回答)。
#10402
⚡3⏳2
判断下列表达式是否会产生副作用,并说明副作用是什么:
a + bi++a = b + 1f(a, b)(假设f是一个普通函数)
#10403
⚡5⏳3
写一个函数 int add(int a, int b),在 main 中调用并打印返回值。
要求:不要在表达式里写“对同一对象既读又改且缺少确定顺序”的代码(例如 i = i++)。
#10404
⚡6⏳3
阅读并判断:以下代码是否具有未定义行为 (Undefined Behavior, UB)?若有,请指出原因并写出一个等价且无 UB 的版本。
c
int i = 0;
int x = i++ + ++i;1
2
2