Rah*_*hul 3 c++ assignment-operator compound-assignment
我想知道C++中复合赋值的执行流程。我遇到了一个CodeChef 问题,其中我正在计算 NCR mod p 值并将它们加在一起以获得最终答案:
// correct
for(int i=min1; i<=max1; i+=2){
     ans = (ans+ncr_mod_p(n,i))%mod;
}
// incorrect
for(int i=min1; i<=max1; i+=2){
     ans+=ncr_mod_p(n,i)%mod;
}
这是由于整数溢出而发生的。
那么,复合赋值的执行顺序是怎样的呢?
比方说,如果我们有一个方程a+=b%c,那么执行顺序是什么:
a = (a+b)%c
// OR
a = a+(b)%c;
复合赋值运算符在 C++ 中属于第二低优先级组(仅优先于逗号运算符)。因此,您的a += b % c情况相当于a += ( b % c ), 或a = a + ( b % c )。
这解释了为什么您的两个代码片段不同。第二:
    ans+=ncr_mod_p(n,i)%mod;
相当于:
    ans = ans + ( ncr_mod_p(n,i) % mod );
这与第一个(正确的)表达式明显不同:
    ans = ( ans + ncr_mod_p(n,i) ) % mod;
这个说法
ans+=ncr_mod_p(n,i)%mod;
相当于声明
ans = ans + ( ncr_mod_p(n,i)%mod );
正如你所看到的,它与声明不同
ans = (ans+ncr_mod_p(n,i))%mod;
来自 C++ 14 标准(5.18 赋值和复合赋值运算符)
7 E1 op = E2 形式的表达式的行为与 E1 = E1 op E2 等效,只是 E1 仅计算一次。在 += 和 -= 中,E1 要么具有算术类型,要么是指向可能 cv 限定的完全定义对象类型的指针。在所有其他情况下,E1 应具有算术类型。