3.10 求值
求值讨论表达式怎样得到结果,以及求值过程中会发生哪些副作用。一个表达式中有多个子表达式时,还要判断它们之间是否存在标准保证的先后关系。
1. 一个需要拆开的表达式
c
int i = 0;
int x = i++ + ++i; /* UB */1
2
2
这里对 i 的两次修改之间没有标准保证的先后关系,因此行为未定义。不要根据某次运行结果猜测顺序,应把操作拆开:
c
int i = 0;
int a = i++;
int b = ++i;
int x = a + b;1
2
3
4
2
3
4
2. 本节内容
- 3.10.1 求值和副作用:区分值计算与副作用。
- 3.10.2 求值顺序:判断子表达式之间的先后关系。
3. 习题
#10314
⚡4⏳3
判断下面每段代码是否可能产生未定义行为 (Undefined Behavior, UB);如果是,请写出一个等价且无 UB 的版本(要求:用拆分语句的方式修复)。
c
int i = 0;
int x = i++ + i;1
2
2
c
int i = 0;
int x = ++i + 1;1
2
2