这在接受采访时被问到过。以下代码段的输出是什么?
#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
类似,是如何选择的?我猜对了吗?
答案 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)
表示计算所有表达式并返回最后一个。
所以,它确实:
其他:
所以你的
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
答案 3 :(得分:1)
逗号运算符始终返回最后一个值,即
cout
中,它是1-3 = -2 printf
中,它是1-3 = -3 printf
,再次是1-3 = -2 逗号运算符总是求解所有左表达式(操作数),只返回最右边的操作数,结果为rvalue
。