C++中的复合赋值

Compound assignment in C++

我想知道C++复合赋值的执行流程。我遇到了一个 CodeChef question,我正在计算 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;

此声明

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 The behavior of an expression of the form E1 op = E2 is equivalent to E1 = E1 op E2 except that E1 is evaluated only once. In += and -=, E1 shall either have arithmetic type or be a pointer to a possibly cv-qualified completely-defined object type. In all other cases, E1 shall have arithmetic type.

复合赋值运算符在 C++ 中的 second lowest precedence group 中(仅优先于逗号运算符)。因此,您的 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;