有人可以为我得到的输出清除这个概念吗?

时间:2015-07-09 09:35:18

标签: c++ comma-operator

这在接受采访时被问到过。以下代码段的输出是什么?

#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类似,是如何选择的?我猜对了吗?

4 个答案:

答案 0 :(得分:10)

此处正在使用comma operator及其属性。

详细说明,从C11,章节§6.5.17,逗号运算符

  

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

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

  

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

所以,如果是像

这样的陈述
  (3,2,1)-(1,2,3)

进行评估,

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

因此,该语句缩减为1 - 3,等于-2

同样,您也可以使用更多元素。

答案 1 :(得分:3)

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

  • 3 - 没什么
  • 2 - 没什么
  • 1 - 返回1

其他:

  • 1 - 没什么
  • 2 - 没什么
  • 3 - 返回3

所以你的

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

表示:

cout << 1 - 3 << endl;

答案 2 :(得分:1)

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

  

逗号运算符(,)用于分隔两个或多个表达式   包含在只有一个表达式的地方。什么时候设定   必须评估表达式的值,只评估最右侧的值   表达被认为。

在你的情况下:

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

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

答案 3 :(得分:1)

逗号运算符始终返回最后一个值,即

  1. 在您的第一个cout中,它是1-3 = -2
  2. 接下来,再次在printf中,它是1-3 = -3
  3. 最后在最后printf,再次是1-3 = -2
  4. 逗号运算符总是求解所有左表达式(操作数),只返回最右边的操作数,结果为rvalue