研究标准没有关于如何扩展的信息。 我在visual studio 2008中尝试过,它确实是a = a *(b + c); 标准是否保证它将始终扩展到那个而不是a = a * b + c? 这总是表达式扩展到所有c ++标准版本的方式吗?
感谢。
答案 0 :(得分:16)
是的,这是有保障的。
a::operator*=(b + c);
编辑:
优先级没有列在标准的一个很好的表格中,5/4
有一个脚注说:
运营商的优先权不是 直接指定,但它可以 源自语法。
C++ Reference表是正确的。
答案 1 :(得分:6)
=, *=, etc.
等运算符(几乎)具有(几乎)最低优先级(请参阅此reference)。
这意味着无论你在赋值运算符的右侧有什么表达式,都会首先计算这些表达式。然后,评估结果将分配给赋值运算符左侧的变量(在*=
的情况下乘以路径)。
答案 2 :(得分:5)
a *= b + c
没有“扩展”为任何内容,*=
不是预处理器宏。
答案 3 :(得分:0)
是的,模糊一些模糊的编译器错误,右侧一直被评估为一个单元。
答案 4 :(得分:0)
*=
是它自己的运算符。它应该与写a = a * (b + c)
相同的后置条件,如果后者有效但不保证使用相同的执行路径到达那里。
+
的优先级高于*=
,因此保证首先评估b + c,即使a属于类类型且*=
是过载。
答案 5 :(得分:0)
* =是一个单独的运算符。对于所有内置函数,它与乘法和赋值完全相同,如果你为自己的一个类定义它,你真的应该让它做同样的事情,原因很明显。但是,你不必这样做。
也就是说,* =是它自己的运算符,具有自己的优先级,并且在内部它将表示为“乘法,然后赋值”,但在任何时候都不会使用乘法和赋值运算符重新解析该行。
鉴于此,可以通过两种方式解析该行:
所以你可以看到,没有任何优先权可以让它做“a =(a * b)+ c”这就是你所担心的。
实际上,第二个显然不是很有用,因此,所有赋值和赋值运算符的优先级都低于算术运算和其他“正常”运算,事实上,优先级低于除“,”以外的任何值。
通过谷歌搜索和查找如下表格很容易检查优先级:
http://www.cppreference.com/wiki/language/operator_precedence
我不记得所有的细节,所以检查你是否在相似的操作员之间不确定是可以的,但你可以通过记住像这样的一般原则来做大部分工作。