【问题标题】:Post-increment operator behaviour w.r.t comma operator?后增量运算符行为 w.r.t 逗号运算符?
【发布时间】:2020-07-14 23:39:42
【问题描述】:

在以下代码中:

int main() {
   int i, j;

   j = 10;
   i = (j++, j+100, 999+j);

   cout << i;

   return 0;
}

输出为 1010

但是不应该是 1009,因为 ++ 应该在使用整个表达式之后完成吗?

【问题讨论】:

标签: c++ comma post-increment


【解决方案1】:

逗号运算符是一个序列点:例如在 C++17 标准中所说,

与左表达式相关的每个值计算和副作用都是有序的 在与正确表达式相关的每个值计算和副作用之前。

因此,++ 运算符的效果保证在评估 999+j 之前发生。

【讨论】:

    【解决方案2】:

    ++应该在整个表达式使用后完成?

    没有。后缀运算符计算旧 j 的值,并具有递增 j 的副作用。

    逗号运算符第一个操作数被评估并评估其副作用之后评估第二个操作数。

    一对用逗号分隔的表达式从左到右计算; 左边的表达式是丢弃值表达式(第 5 条)83。 与左相关的每个值计算和副作用 表达式在每个值计算和副作用之前排序 与正确的表达相关联。

    https://stackoverflow.com/a/7784819/2805305

    【讨论】:

      【解决方案3】:

      逗号运算符的结合性是从左到右的。

      所以从j++开始,这将首先被评估(j变成11

      然后j + 100 被评估(没用)

      然后评估999 + j 等于1010

      这个最右边的值被分配给i

      因此,输出为1010

      长答案:

      内置逗号运算符

      comma operator 表达式的格式为

      E1 , E2   
      

      在逗号表达式 E1, E2 中,表达式 E1 被求值,它的 结果被丢弃(尽管如果它具有类类型,则不会 销毁直到包含完整表达式的末尾),以及它的 在计算表达式 E2 之前完成副作用 开始(请注意,用户定义的运算符,不能保证 排序)(直到 C++17)。

      这已经回答了你的问题,但我会参考你的代码来完成它:

      从简单的开始

      int value = (1 + 2, 2 + 3, 4 + 5); // value is assigned 9

      因为...表达式 E1 被求值,它的结果被丢弃... 这里,由于我们有两个以上的操作数,逗号运算符的关联性也发挥了作用。 p>

      但是不应该是1009,因为'++'应该在整个之后完成 使用表达式?

      现在看:

      int j = 0;
      int i = (j++, 9 + j);
      

      这里,i 的值是 10,因为 ...并且它的副作用在表达式 E2 开始计算之前完成... 因此,j 的增量有其9 + j评估前的效果。

      我想现在你可以清楚地理解为什么你的

      j = 10;
      i = (j++, j+100, 999+j);
      

      i 被赋值为 1010

      【讨论】:

      • 我在我的手机上,所以我无法用良好的格式写出高质量的答案:P
      • @idclev463035818 感谢您的编辑!我会在早上改进这个,现在是午夜 rn 哈哈
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-30
      • 2010-10-04
      • 2017-07-11
      • 2010-12-16
      • 1970-01-01
      • 2011-03-08
      • 1970-01-01
      相关资源
      最近更新 更多