I would like to know the execution flow of compound assignments in C++. I came across a CodeChef question, where I am calculating NCR mod p values and adding them together to get the final answer:
// 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;
}
This is happening because of integer overflow.
So, what is the execution sequence of compound assignment?
Let's say, if we have an equation a+=b%c
then what would be the execution sequence:
a = (a+b)%c
// OR
a = a+(b)%c;
This statement
ans+=ncr_mod_p(n,i)%mod;
is equivalent to the statement
ans = ans + ( ncr_mod_p(n,i)%mod );
As you can see it differs from the statement
ans = (ans+ncr_mod_p(n,i))%mod;
From the C++ 14 Standard (5.18 Assignment and compound assignment operators)
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.