10304:修复未排序的两次修改
题目
判断 int x = i++ + ++i; 是否具有未定义行为,并给出无未定义行为的改写。
解析
后缀递增和前缀递增都会修改 i。二元 + 不规定先求左操作数还是右操作数,这两次修改彼此未排序,因此原表达式具有未定义行为。
未定义行为没有可依赖的“原结果”。改写时必须先选定一种明确次序。下面采用从左到右完成原意的方式。
解析
c
int i = 0;
int left = i;
++i;
++i;
int right = i;
int x = left + right;1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
也可以更直接地写成:
c
int i = 0;
int left = i++;
int right = ++i;
int x = left + right;1
2
3
4
5
2
3
4
5
两种改写最终都得到 i == 2、x == 2。