Выбрать главу

// Эта программа демонстрирует использование функции хоr().

#include <iostream>

using namespace std;

bool хоr(bool a, bool b);

int main()

{

 bool p, q;

 cout << "Введите P (0 или 1): ";

  cin >> p;

 cout << "Введите Q (0 или 1): ";

  cin >> q;

 cout << "P И Q: " << (p && q) << ' \n';

 cout << "P ИЛИ Q: " << (p || q) << ' \n';

 cout << "P XOR Q: " << xor(p, q) << '\n';

 return 0;

}

bool хоr(bool a, bool b)

{

 return (a || b) && !(a && b);

}

Вот как выглядит возможный результат выполнения этой программы.

Введите Р (0 или 1): 1

Введите Q (0 или 1): 1

Р И Q: 1

Р ИЛИ Q: 1

Р XOR Q: 0

В этой программе обратите внимание вот на что. Хотя параметры функции xor() указаны с типом bool, пользователем вводятся целочисленные значения (0 или 1). В этом ничего нет странного, поскольку C++ автоматически преобразует число 1 в true, а 0 в false. И наоборот, при выводе на экран bool-значения, возвращаемого функцией xor(), оно автоматически преобразуется в число 0 или 1 (в зависимости от того, какое значение "вернулось": false или true). Интересно отметить, что, если типы параметров функции хоr() и тип возвращаемого ею значения заменить типом int, эта функция будет работать абсолютно так же. Причина проста: все дело в автоматических преобразованиях, выполняемых С++-компилятором между целочисленными и булевыми значениями.

Как операторы отношений, так и логические операторы имеют более низкий приоритет по сравнению с арифметическими операторами. Это означает, что такое выражение, как 10 > 1+12 будет вычислено так, как если бы оно было записано в таком виде: 10 >(1 + 12)

Результат этого выражения, конечно же, равен значению ЛОЖЬ. Кроме того, взгляните еще раз на инструкции вывода результатов работы предыдущей программы на экран.

cout << "Р И Q: " << (р && q) << '\n';

cout << "Р ИЛИ Q: " << (р | | q) << '\n';

Без круглых скобок, в которые заключены выражения р && q и р || q, здесь обойтись нельзя, поскольку операторы && и || имеют более низкий приоритет, чем оператор вывода данных.

С помощью логических операторов можно объединить в одном выражении любое количество операций отношений. Например, в этом выражении объединено сразу три операции отношений.

var>15 || !(10<count) && 3<=item

Приоритет операторов отношений и логических операторов показан в следующей таблице.

Выражения

Операторы, литералы и переменные — это все составляющие выражений. Вероятно, вы уже знакомы с выражениями по предыдущему опыту программирования или из школьного курса алгебры. В следующих разделах мы рассмотрим аспекты выражений, которые касаются их использования в языке C++.

Преобразование типов в выражениях

Если в выражении смешаны различные типы литералов и переменных, компилятор преобразует их к одному типу. Во-первых, все char- и short int-значения автоматически преобразуются (с расширением "типоразмера") к типу int. Этот процесс называется целочисленным расширением (integral promotion). Во-вторых, все операнды преобразуются (также с расширением "типоразмера") к типу самого большого операнда. Этот процесс называется расширением типа (type promotion), причем он выполняется по операционно. Например, если один операнд имеет тип int, а другой — long int, то тип int расширяется в тип long int. Или, если хотя бы один из операндов имеет тип double, любой другой операнд приводится к типу double. Это означает, что такие преобразования, как из типа char в тип double, вполне допустимы. После преобразования оба операнда будут иметь один и тот же тип, а результат операции — тип, совпадающий с типом операндов.