(expr1, expr2)在赋值的右边做什么?

What does (expr1, expr2) do on the right side of an assignment?

本文关键字:右边 什么 赋值 expr1 expr2      更新时间:2023-10-16

我最近看了看我的旧代码,我不知道这是做什么的,或者它是否有效。代码类似于:

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

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

(还要注意逗号本身是一个排序点)

string2成为映射中的值,键为string1。

表达式"s", string2使用内置的1逗号操作符。它具有以下语义:

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

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

在你的代码片段中,

根本没有用,它的唯一目的是迷惑读者。由于计算"s"没有副作用,因此代码与以下相同:

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


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

这可能是逗号操作符,它计算所有值,然后丢弃除右侧值外的所有值。

但是,如果operator,( char const*, string2 )被重载,它可以做任何事情(其中string2string2的类型)。

查找这样的重载。

注意,如果string2std::string,这样的重载可能会使您的程序不正确,不需要诊断。不会阻止人们这么做。它可以"工作",并且仍然允许,(例如)引起字符串的连接。

逗号是运算符,从左到右计算参数,值为最右元素。

例如:

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

因此,从左起,先求a+=b,将a设置为2+3,然后求a*b,表达式的值为5*3,使用该值。所以c15