【问题标题】:Can someone clear this concept for the output I am getting?有人可以为我得到的输出清除这个概念吗?
【发布时间】:2015-09-27 14:25:00
【问题描述】:

这是在一次采访中被问到的。下面sn-p的输出是什么?

#include <iostream>
using namespace std;

int main() {
    cout << (3,2,1)-(1,2,3) << endl; // in C++ too this prints -2
    printf("%d\n",(3,2,1)-(1,2,3)); // prints -2
    printf("%d\n",("%d",3,2,1)-(1,2,3)); // prints -2
    return 0;
}

通过输出,我猜测它的 (1-3) = -2。但是如何从(3,2,1)1 中选择,同样从(1,2,3)3 中选择?我的猜测是对的吗?

【问题讨论】:

标签: c++ comma-operator


【解决方案1】:

这里,comma operator 和它的属性正在被使用。

详细说明,来自C11,第 §6.5.17 章,逗号运算符

逗号运算符的左操作数被评估为 void 表达式;在它的求值和右操作数的求值之间有一个序列点。然后对右操作数求值;结果有它的类型和值

并且,来自C++11,第 5.18 章,

一对用逗号分隔的表达式从左到右计算;左边的表达式是丢弃值表达式(第 5 条)。与左表达式关联的每个值计算和副作用都在与右表达式关联的每个值计算和副作用之前排序。结果的类型和值是右操作数的类型和值;结果是相同的值类别 作为它的右操作数,如果它的右操作数是一个左值和一个位域,则它是一个位域。

所以,如果是这样的陈述

  (3,2,1)-(1,2,3)

为了评价,

  • (3,2,1),3 和 2 被(评估为 void 表达式并)被丢弃,1 是值。
  • (1,2,3),1 和 2 被(评估为 void 表达式并)被丢弃,3 是值。

因此,该语句简化为1 - 3,等于-2

同样的方法,你也可以使用更多的元素。

【讨论】:

  • +5 用于引用标准。
【解决方案2】:

逗号运算符总是返回最后一个值,即

  1. 在您的第一个 cout 中是 1-3=-2
  2. 接下来,printf 再次是 1-3=-3
  3. 终于在最后一个printf,又是1-3=-2

逗号运算符总是解决所有左边的表达式(操作数)并且只返回最右边的操作数作为rvalue的结果。

【讨论】:

    【解决方案3】:

    必须考虑逗号运算符 (,)

    逗号运算符 (,) 用于分隔两个或多个表达式 包含在只需要一个表达式的地方。当集 的表达式必须被评估一个值,只有最右边的 表达式被考虑。

    在你的情况下:

    (3,2,1) //evaluates to 1
    (1,2,3) //evaluates to 3
    

    来源: http://www.cplusplus.com/doc/tutorial/operators/

    【讨论】:

      【解决方案4】:

      (3,2,1) 表示计算所有表达式并最后返回。 所以,它确实:

      • 3 - 没有
      • 2 - 没有
      • 1 - 返回 1

      其他:

      • 1 - 没有
      • 2 - 没有
      • 3 - 返回 3

      所以你的

      cout << (3,2,1)-(1,2,3) << endl;
      

      意思是:

      cout << 1 - 3 << endl;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-26
        • 1970-01-01
        相关资源
        最近更新 更多