逗号运算符如何工作
时间: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)
参数可以按任意顺序求值。注意,函数调用中的逗号不是运算符;它们是分隔符。