3

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;
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 が 1 回だけ評価されることを除いて、E1 = E1 op E2 と同等です。+= および -= では、E1 は算術型を持つか、または cv 修飾されている可能性のある完全に定義されたオブジェクト型へのポインターでなければなりません。他のすべての場合、E1 は算術型を持ちます。

于 2021-01-20T14:45:28.947 に答える