3

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

#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

4 回答 4

10

在这里,使用了逗号运算符及其属性。

详细说明,从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

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

于 2015-07-09T09:37:16.350 回答
3

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

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

和别的:

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

所以你的

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

方法:

cout << 1 - 3 << endl;
于 2015-07-09T09:37:39.117 回答
1

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

逗号运算符 (,) 用于分隔两个或多个表达式,这些表达式包含在只需要一个表达式的情况下。当必须对一组表达式求值时,只考虑最右边的表达式。

在你的情况下:

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

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

于 2015-07-09T09:40:43.637 回答
1

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

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

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

于 2015-07-09T09:41:07.967 回答