我知道:
int b = 1, c = 2, d = 3, e = 4;
printf("%d %d %d", ++b, b, b++);
Run Code Online (Sandbox Code Playgroud)
导致未定义的行为。自从
在两个序列点之间多次修改任何对象是 UB。 未定义的行为和序列点
但我不知道是否:
int b = 1, c = 2, d = 3, e = 4;
printf("%d", b++ + ++c - --d - e--);
Run Code Online (Sandbox Code Playgroud)
也是UB吗?
我认为递增/递减运算符将首先评估,因为它们之间的优先级从右到左,因为 associativity 。然后算术运算符将从左到右计算。
这将是
(b) + (c + 1) - (d - 1) - (e)
即 1 + (2 + 1) - (3 - 1) - (4)
= (2 - 4)
= -2 …