【问题标题】:In which order are the increment expressions on the right evaluated in the assignment statement? Is it undefined?右边的增量表达式在赋值语句中的求值顺序是什么?它是未定义的吗?
【发布时间】:2017-12-28 23:07:09
【问题描述】:

我最近了解了 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;
}

输出:

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

【问题讨论】:

  • 逗号运算符从左到右求值
  • @EdHeal 这段代码不是他写的,网上找的,想看懂。没有理由不礼貌。
  • 请发布指向您找到此“代码”的网站的链接,以便 SO 的未来用户避免使用它。
  • 链接到网站?

标签: c undefined-behavior comma-operator


【解决方案1】:

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

这是由于C中的逗号操作符是一个序列点造成的,这意味着它保证了之前评估的所有副作用都会执行,并且没有执行后续评估的副作用。

【讨论】:

  • 您可能想补充一点,这是因为逗号运算符在 C 中引入了“序列点”,从而强制计算顺序和副作用。如果您使用其他一些运算符,例如乘法,则行为将是未定义的。
  • 是的。但是,如果将相同的值传递给函数,我认为它将是未定义的。在 ++ 情况下,它是相同的,但 += 不同的值会很有趣。但正如@edheal 暗示的那样,不要这样做。
  • 值得注意的是,函数参数列表中的逗号不是逗号运算符——函数参数没有保证从左到右的求值顺序。
猜你喜欢
  • 1970-01-01
  • 2018-03-04
  • 1970-01-01
  • 2016-11-25
  • 1970-01-01
  • 2021-06-10
  • 1970-01-01
  • 2017-08-09
  • 2020-09-09
相关资源
最近更新 更多