Как c ++ оценивает операторы присваивания (оператор if) - PullRequest
0 голосов
/ 13 июня 2018

Рассмотрим следующее

int main() {
    int a = 8;
    int b = 10;

    while (true) {
        if (a /= 2 && b < 12) {
            b++;
            std::cout << b << std::endl;
        }
        else break;
    }

    return 0;
}

Теперь с ++ не является моим основным языком, но как с ++ оценивает это выражение if?

В этом случае, когда b>=12, компилятор выдаетисключение «деление на ноль», но почему?

Теперь, если я оберну состояния в скобках, я не получу исключение.

if( (a /= 2) && (b < 12))

Это как-то связано с тем, как c ++ оценивает операторы?

Если проблема не в оценке:

Мне известно, что

a = (a/2 && b<12)

также не будет выполняться.

P Λ Q не выполняетсядля P Λ ¬Q но состояние P не должно быть затронуто?Почему обвиняется P вместо ¬Q?

1 Ответ

0 голосов
/ 13 июня 2018
if (a /= 2 && b < 12)

аналогично:

if (a /= (2 && b < 12))

, поэтому:

  • 2 вычисляется, что преобразуется в true в контексте операндадо &&.Это не вызывает оценку короткого замыкания, поэтому мы продолжаем ...
  • b < 12, что в случае, о котором вы говорите, равно false
  • Так что 2 && b < 12 оценивается как false в целом
  • a /= 2 && b < 12, следовательно, эквивалентно a /= false здесь, что эквивалентно a /= 0.
...