【问题标题】:How is this getting evaluated?这是如何评估的?
【发布时间】:2013-10-25 08:05:47
【问题描述】:

我觉得问这个问题很愚蠢。但我自己无法弄清楚原因。

int main()
{
    int target;
    int buffer =10;
    const int source = 15;
    target = (buffer+=source) = 20;
    cout << target+buffer;
    return 0;
}

target = (buffer+=source) = 20; 将变为 target = (25) = 20

但如果我在源文件中给出相同的语句,则会给出左值错误。

target+buffer 的值如何打印 40。

【问题讨论】:

  • 使用调试器单步执行会对您有所帮助。
  • 我很确定这是由于排序导致的未定义行为。
  • @Bathsheba 的括号不足以确保正确排序?
  • @Dariusz 不,括号仅确保关联性。

标签: c++


【解决方案1】:

一些预定义的运算符,例如 +=,要求操作数是 应用于基本类型时的左值 [§13.5/7]

buffer+=source 返回一个对buffer 的左值引用。 所以你没有编译错误。

您的陈述可以评估为:

buffer+=source;
buffer=20;
target=20;

但是在一个语句中修改buffer 两次是未定义的行为,另一个编译器可以评估其他内容作为结果。 (在这种情况下也不确定!)

【讨论】:

  • @jrok:谢谢,一开始我没有注意到。已编辑。
  • 不要太早感谢我,我实际上已经不确定了。 :) “在所有情况下,赋值都是在左右操作数的值计算之后和赋值表达式的值计算之前进行排序的。 我很确定它在 C+ 中是未定义的+03,但这句话来自 C++11。
  • @jrok:所以你可以在 SO 中问一个很好的问题,你有我的 +1 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多