Составное присваивание в 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;

person Rahul    schedule 20.01.2021    source источник
comment
Начните с самых внутренних скобок. В случае одинаково заключенных в скобки операций см. порядок старшинства.   -  person eerorika    schedule 20.01.2021
comment
Просто погуглить приоритет оператора cppreference? Составное присваивание здесь не особенное.   -  person underscore_d    schedule 20.01.2021
comment
Я был не очень уверен.   -  person Rahul    schedule 20.01.2021


Ответы (2)


Это утверждение

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-квалифицированный. Во всех остальных случаях Е1 должен иметь арифметический тип.

person Vlad from Moscow    schedule 20.01.2021