逗号运算符如何工作

时间:2020-03-05 18:50:45  来源:igfitidea点击:

逗号运算符如何在C ++中工作?

例如,如果我这样做:

a = b, c;

结局等于b还是c?

(是的,我知道这很容易测试,只需在此处进行记录即可让别人快速找到答案。)

更新:使用逗号运算符时,这个问题暴露了细微差别。只是为了证明这一点:

a = b, c;    // a is set to the value of b!

a = (b, c);  // a is set to the value of c!

这个问题实际上是受代码输入错误的启发。打算是什么

a = b;
c = d;

转换成

a = b,    //  <-  Note comma typo!
c = d;

解决方案

回答

等于b

逗号运算符的优先级低于赋值的优先级。

回答

b的值将分配给a。
什么都不会发生

回答

请注意,逗号操作符在C ++中可能会重载。因此,实际行为可能与预期的行为有很大不同。

例如,Boost.Spirit非常巧妙地使用逗号运算符来实现符号表的列表初始化器。因此,它使以下语法成为可能和有意义:

keywords = "and", "or", "not", "xor";

请注意,由于运算符的优先级,该代码(故意!)与

(((keywords = "and"), "or"), "not"), "xor";

也就是说,第一个调用的运算符是keywords.operator =(" and"),该运算符返回一个代理对象,在该对象上将调用其余的operator

keywords.operator =("and").operator ,("or").operator ,("not").operator ,("xor");

回答

由于逗号运算符的优先级低于赋值运算符的优先级,因此a的值将等于b。

回答

" a"的值将为" b",但表达式的值将为" c"。也就是说,在

d = (a = b, c);

a等于b,而d等于c。

回答

在所有C / C ++运算符中,逗号运算符的优先级最低。因此,它始终是绑定到表达式的最后一个,这意味着:

a = b, c;

等效于:

(a = b), c;

另一个有趣的事实是逗号运算符引入了序列点。这意味着表达式:

a+b, c(), d

保证按顺序评估其三个子表达式(a + b,c()和d)。如果它们有副作用,这是很重要的。通常,允许编译器以他们认为合适的任何顺序评估子表达式。例如,在函数调用中:

someFunc(arg1, arg2, arg3)

参数可以按任意顺序求值。注意,函数调用中的逗号不是运算符;它们是分隔符。