C语言 赋值语句中右侧的增量表达式按什么顺序计算?它是未定义的吗?



我最近了解了 C 语言中的未定义行为,但这个特定的代码在站点中用作"逗号作为运算符"的示例,虽然我了解第 2 行中的 y = x++,但我不明白第 2 行中的子表达式的计算顺序。我认为这是未定义的行为,但我不确定,因为该网站没有提到任何此类内容。

int main()
{
int x = 10, y;
y = (x++, printf("x = %dn", x), ++x, printf("x = %dn", x), x++);
printf("y = %dn", y);
printf("x = %dn", x);
return 0;
}

输出:

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

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

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

最新更新