* = b + c扩展到什么?

时间:2011-03-14 13:40:41

标签: c++ standards

研究标准没有关于如何扩展的信息。 我在visual studio 2008中尝试过,它确实是a = a *(b + c); 标准是否保证它将始终扩展到那个而不是a = a * b + c? 这总是表达式扩展到所有c ++标准版本的方式吗?

感谢。

6 个答案:

答案 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)

* =是一个单独的运算符。对于所有内置函数,它与乘法和赋值完全相同,如果你为自己的一个类定义它,你真的应该让它做同样的事情,原因很明显。但是,你不必这样做。

也就是说,* =是它自己的运算符,具有自己的优先级,并且在内部它将表示为“乘法,然后赋值”,但在任何时候都不会使用乘法和赋值运算符重新解析该行。

鉴于此,可以通过两种方式解析该行:

  1. 作为* =(b + c)(对于任何理智类型,应与a = a *(b + c)具有相同的结果)
  2. As(a * = b)+ c (假设这是一个独立的语句,将a乘以b,将结果赋值为a。然后将新值乘以c,但它会把结果扔掉)
  3. 所以你可以看到,没有任何优先权可以让它做“a =(a * b)+ c”这就是你所担心的。

    实际上,第二个显然不是很有用,因此,所有赋值和赋值运算符的优先级都低于算术运算和其他“正常”运算,事实上,优先级低于除“,”以外的任何值。

    通过谷歌搜索和查找如下表格很容易检查优先级:

    http://www.cppreference.com/wiki/language/operator_precedence

    我不记得所有的细节,所以检查你是否在相似的操作员之间不确定是可以的,但你可以通过记住像这样的一般原则来做大部分工作。