以下是未定义的还是实现定义的:
int x = 0;
printf("%d%d", ++x, x);
未指定评估参数的顺序,因此:
- 如果
++x
首先评估,则打印11
. - 如果
x
首先评估,则打印10
.
以下是未定义的还是实现定义的:
int x = 0;
printf("%d%d", ++x, x);
未指定评估参数的顺序,因此:
++x
首先评估,则打印11
.x
首先评估,则打印10
.printf("%d%d", ++x, x);
这显然是 C++ 中未定义的行为。
(C++11, 1.9p15) “如果标量对象的副作用相对于同一标量对象的另一个副作用或使用同一标量对象的值的值计算是未排序的,则行为未定义。”
C 相同(强调我的):
(C99,6.5.p2)“在前一个和下一个序列点之间,对象的存储值最多只能通过表达式的评估修改一次。72)此外,应只读先前的值以确定要被存储0.73"
请注意,C11 现在的措辞与 C++11 中的类似:
(C11,6.5p2)“如果标量对象的副作用相对于同一标量对象的不同副作用或使用相同标量对象的值的值计算是未排序的,则行为未定义。”