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