主题
判断 int x = ++i + i++; 是否具有未定义行为,并改写为无未定义行为的版本。
int x = ++i + i++;
前缀递增和后缀递增都会修改 i。+ 不规定两个操作数的求值次序,因此这两次修改彼此未排序,原代码具有未定义行为。
i
+
未定义行为没有需要保留的标准结果。改写必须明确选择一种执行次序。下面采用先完成左操作数的意图。
int i = 0; int left = ++i; int right = i++; int x = left + right;
最终得到:
left == 1 right == 1 i == 2 x == 2