赋值语句中右侧的增量表达式以哪种顺序排列?这是不确定的?

mom*_*omo 1 c comma-operator undefined-behavior

我最近在C中学到了未定义的行为,但是这个特定的代码在一个站点中用作"逗号作为运算符"的示例,虽然我理解第2行中的y = x ++,但我不明白子表达式的顺序在第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;
}
Run Code Online (Sandbox Code Playgroud)

输出:

x = 11
x = 12
y = 12
x = 13
Run Code Online (Sandbox Code Playgroud)

Yuv*_*rie 7

它不是未定义的行为.
首先将x增加到11,打印它,然后将其增加到12并打印,然后在评估后增加它,因此x将为13,整个表达式将评估为12.

这是由于C中的逗号运算符是序列点引起的,这意味着可以保证先前评估的所有副作用都已执行,并且尚未执行后续评估的副作用.

  • 您可能想补充一点,这是因为逗号运算符在C中引入了"序列点",强制执行评估和副作用的顺序.如果使用某些其他运算符(例如乘法),则行为将是未定义的. (4认同)