3

我想知道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;
4

2 回答 2

5

这个说法

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 应具有算术类型。

于 2021-01-20T14:45:28.947 回答
5

复合赋值运算符在 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;
于 2021-01-20T14:48:20.333 回答