赋值语句中右边的递增表达式是按什么顺序求值的?它是未定义的吗?
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中的逗号运算符是一个序列点,这意味着保证之前计算的所有副作用都已经执行,并且后续计算的副作用还没有执行。
我最近了解了 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中的逗号运算符是一个序列点,这意味着保证之前计算的所有副作用都已经执行,并且后续计算的副作用还没有执行。