求值顺序
求值顺序讨论的是:在一个包含多个子表达式的表达式中,它们的求值是否有标准保证的先后关系。
你在写 C 表达式时,需要区分三种情况:
- 有明确先后(顺序确定);
- 先后未指定(顺序可能不同,但仍然合法);
- 没有先后且发生“冲突的读写”(会触发未定义行为)。
1. 一条足够实用的规则
如果你在同一个表达式里:
- 对同一个标量对象做了两次修改;或
- 一边修改它,一边又读它的值;
并且你说不清这两件事谁先谁后,那么这段代码大概率是 UB。最安全的修复方式是拆成多条语句。
2. 例子
c
int i = 0;
int x = i++ + 1; /* OK:只有一次修改 */1
2
2
c
int i = 0;
int x = i++ + i; /* UB:对 i 的修改与对 i 的取值没有确定先后关系 */1
2
2
3. 习题
#10433
⚡6⏳3
判断下列代码是否是 UB;如果是,改写为无 UB 的版本:
c
int i = 0;
int x = ++i + i++;1
2
2