赋值语句中右边的递增表达式是按什么顺序求值的?它是未定义的吗?

In which order are the increment expressions on the right evaluated in the assignment statement? Is it undefined?

我最近了解了 C 中的未定义行为,但该特定代码在站点中用作 'comma as an operator' 的示例,虽然我理解第 2 行中的 y = x++,但我不明白其中的含义order 计算第 2 行中的子表达式。我认为这是未定义的行为,但我不确定,因为该网站没有提及任何此类内容。

int main()
{
    int x = 10, y;

    y = (x++, printf("x = %d\n", x), ++x, printf("x = %d\n", x), x++);

    printf("y = %d\n", y);
    printf("x = %d\n", x);

    return 0;
}

输出:

x = 11
x = 12
y = 12
x = 13

这不是未定义的行为。
您首先将 x 增加到 11,打印它,然后将它增加到 12 并打印它,然后在评估后增加它,所以 x 将为 13,整个表达式将评估为 12。

这是因为C中的逗号运算符是一个序列点,这意味着保证之前计算的所有副作用都已经执行,并且后续计算的副作用还没有执行。