(expr1,expr2)在作业的右侧做了什么?

时间:2016-09-24 12:25:18

标签: c++ dictionary

我最近查看了我的旧代码,但我无法弄清楚这是做什么的,或者它是否有效。代码类似于:

map<string, string> map;
map[string1] = ("s", string2);

4 个答案:

答案 0 :(得分:14)

这是一种混淆。逗号运算符从左到右计算所有参数,但丢弃除最后一个参数之外的所有参数。整个表达式的形式类型是最终参数的类型。

(另请注意,逗号本身就是一个排序点。)

string2成为地图中的值,位于键string1下。

答案 1 :(得分:6)

表达式"s", string2使用内置的 1 comma operator。它具有以下语义:

  

在逗号表达式E1, E2中,表达式E1被评估,其结果被丢弃,并且在表达式E2的评估开始之前完成其副作用(注意用户定义的运算符,不能保证排序) (直到C ++ 17 )。

     

逗号表达式结果的类型,值和值类别正是第二个操作数E2的类型,值和值类别。

如果是您的代码段,它根本不是很有用,它的唯一目的是让读者感到困惑。由于评估"s"没有副作用,因此代码与此相同:

map<string, string> map;
map[string1] = string2;

<小时/> 1 这假设没有定义与参数匹配的用户定义的operator,。如果有,它可以做任何事情,这个答案的其余部分不适用。您必须查看源代码以找出表达式的评估结果。

答案 2 :(得分:4)

这可能是逗号运算符,它会评估所有内容,然后丢弃除右侧值之外的所有内容。

但是,如果operator,( char const*, string2 )超载,则可以执行任何操作(string2类型为string2)。

寻找这样的重载。

请注意,如果string2std::string,此类重载可能会导致您的程序生成错误,则无需进行诊断。不会阻止人们这样做。并且它可以&#34;工作&#34;并且仍允许,(例如)导致字符串连接。

答案 3 :(得分:1)

逗号是运算符,它从左到右计算参数,并且具有最右边元素的值。

例如:

int a=2, b=3, c;
c = (a+=b, a*b); 

因此,从左侧开始,a+=b首先进行评估,将a设置为2+3,然后a*b进行评估,并且表达式的值为5*3 ,使用哪个值。因此c15