Как рассчитываются значения val1, val2, val3, val4? - PullRequest
1 голос
/ 15 марта 2020
int main(){
   int a = 1, b = 0, c = 1, val1, val2, val3, val4;
   val1 = a || b || c;
   val2 = a && b && c;
   val3 = a || b && c;
   val4 = a && b || c;

   cout<< val1 << val2 << val3 << val4;
   return 0;
}

Как рассчитываются значения от val1 до val4?

Ответы [ 2 ]

4 голосов
/ 15 марта 2020
val1  =  a || b || c  =  (1 or 0) or 1    =  1 or 1   =  1
val2  =  a && b && c  =  (1 and 0) and 1  =  0 and 1  =  0
val3  =  a || b && c  =  1 or (0 and 1)   =  1 or 0   =  1
val4  =  a && b || c  =  (1 and 0) or 1   =  0 or 1   =  1

Операция or, ||, равна 1, когда любая из сторон равна 1, или обе стороны равны 1.

Операция and, &&, равна 1, только когда обе стороны равны 1.

Операция and всегда имеет приоритет (вычисляется до операций or), при условии, что нет скобок.

Если все операторы имеют тот же приоритет, они рассчитываются слева направо.

C ++ использует Оценка короткого замыкания для && и ||, то есть не все шаги необходимы для оценки (так же, как если вы умножаете на 0 в серии умножений, вы знаете, что результат равен 0 без выполнения каждого вычисления).

Это будет означать для val2, поскольку a && b оценивается в 0, это не мешает оценить c. Поскольку следуют только операции &&, правая часть должна иметь значение 0.

То же самое относится к val3 с оператором ||. Поскольку a оценивается как 1, он не потрудится оценить b && c. Поскольку, если какой-либо один член равен 1 (в данном случае a), правая часть должна иметь значение 1.

С учетом оценки короткого замыкания выполняемые вычисления будут выглядеть следующим образом:

val1  =  a || b || c  =  1 or ...         =  1
val2  =  a && b && c  =  1 and 0 and ...  =  0
val3  =  a || b && c  =  1 or ...         =  1
val4  =  a && b || c  =  1 and 0 or 1     =  0 or 1  =  1

Чтобы увидеть оценку короткого замыкания в действии, вы можете написать программу, которая печатает при оценке переменных, например:

#include <iostream>
using namespace std;

int print(int x) {
  cout << x;
  return x;
}

int main(){
  int a = 1, b = 0, c = 1, val1, val2, val3, val4;

  val1 = print(a) || print(b) || print(c);
  cout << endl;

  val2 = print(a) && print(b) && print(c);
  cout << endl;

  val3 = print(a) || print(b) && print(c);
  cout << endl;

  val4 = print(a) && print(b) || print(c);
  cout << endl;

  return 0;
}

Вывод этой программы:

1
10
1
101
1 голос
/ 15 марта 2020

Приоритет логических операторов

    !       High
    &&   Medium
    ||      Low

Вот расчет

   val1 = a || b || c; => 1 || 0 || 1 => 1 || 1 => 1

   val2 = a && b && c; => 1 && 0 && 1 => 0 && 1 => 0

   val3 = a || b && c;  => 1 || 0 && 1 => 1 || 0 =>1

   val4 = a && b || c; => 1 && 0 || 1 => 0 || 1 => 1
...