有人可以解释速记分配运算符的实际工作方式吗?

时间:2019-09-12 16:15:34

标签: c++ assignment-operator shorthand

#include <iostream>
using namespace std;
int main()
{   
    int x=2,a=3,b=2;
    x*=a/b;
    cout<<x<<" ";
    x=2;
    x=x*a/b;
    cout<<x;
    return 0;
}

我得到的输出为: 2 3 而我认为x * = a / b;和x = x * a / b;意思是一样的。 有人可以解释这种行为吗?

4 个答案:

答案 0 :(得分:6)

它们完全不同

x *= a / b被分组为 x *= (a / b),并且a / b发生在整数算术(其为1)中。

x = x * a / b被分组为x = ((x * a) / b)。整数除法的作用不那么剧烈和不同。

答案 1 :(得分:5)

使用整数除法:3/21

  • x*=a/b;被评估为x *= (a / b),因此x *= 3 / 2-> x *= 1
  • x=x*a/b;被评估为x = (x * a) / b;,因此(2 * 3) / 3-> 6 / 2-> 3

答案 2 :(得分:4)

  

我得到的输出为:2 3在我看来x * = a / b;和x = x * a / b;   意思是一样的。有人可以解释这种行为吗?

x *= a / b;
//   ^^^^^

这是整数除法,其余部分被舍弃,因此3 / 21
因此,表达式x *= a / bx *= 1相同,其余为2

x = x * a / b;

另一方面,其评估为

x = (x * a) / b;

结果是

x = (2 * 3) / 2;

成为

x = 6 / 2;

3

答案 3 :(得分:3)

每个[expr.ass]/6 E1 *= E2E1 = E1 * E2完全相同。这并不意味着x*=a/b;x=x*a/b;相同。由于E2a/b,因此x*=a/b;实际上等效于x=x*(a/b);,它的结果相同。