10314:读写冲突与安全拆分
题目
判断两段代码是否具有未定义行为,并用拆分语句修复有问题的表达式。
解析
第一段
c
int i = 0;
int x = i++ + i;1
2
2
这段代码具有未定义行为。+ 的两个操作数之间没有顺序保证:左侧修改 i,右侧又读取 i,两次访问彼此未排序。
若想明确采用从左到右的意图,可以写成:
c
int i = 0;
int left = i++;
int right = i;
int x = left + right;1
2
3
4
5
2
3
4
5
结果为 i == 1、x == 1。
第二段
c
int i = 0;
int x = ++i + 1;1
2
2
这段代码没有未定义行为。表达式只通过 ++i 修改一次 i,另一个操作数是常量 1,没有对 i 的冲突访问。结果为 i == 1、x == 2。