Логический тип и логические операции

В языке Си нет логического типа, вместо него используется целый тип, причем нулевое значение принято считать ложью, а отличное от нуля значение – истиной. В C++ введен специальный логический тип, обозначаемый ключевым словом bool, имеющий два значения: true – истина и false – ложь.

По определению, true имеет значение 1 при преобразовании к целому типу, а false – 0.

Целые можно преобразовывать в логические значения, причем ненулевое значение преобразуется true, а ноль – в false, например,

bool bb = 7; // Целое 7 будет преобразовано в bool и bb будет true

int i = true; // int(true) равно 1, поэтому i будет равно 1

В арифметических и логических выражениях логические значения преобразуются в целые (int) и операции выполняются над преобразованными величинами. Если результат приводится обратно к логическому типу, то 0 преобразуется в false, а ненулевое значение – в true.

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

int a, b;

bool amoreb = a > b;

Здесь amoreb будет true, если a больше b и false в противном случае.

В C++ имеются три логических оператора:

логическое умножение И &&,

логическое сложение ИЛИ ||,

логическое отрицание НЕ !.

В табл.5 приводится результаты выполнения логических операторов. Вместо true и false показаны совместимые значения 1 и 0.

Таблица 5. Таблица истинности логических операторов

Выражение a b a && b a || b ! a
  Значение

В языке C++ каждый оператор имеет приоритет, определяющий очередность его выполнения. Приоритет оператора ! выше, чем операторов && и ||, а приоритет && выше, чем у ||. В выражении a || b && !c сначала будет вычислено !c, затем b && !c и, наконец, логическое сложение. С помощью круглых скобок можно изменять очередность вычислений, например, в выражении (a || b) && !c первым будет выполняться логическое сложение в скобках.

Выражения с использованием логических операторов вычисляются только до тех пор, пока не станет известной истинность или ложность результата. Например, в следующем фрагменте программы проверяется существование треугольника со сторонами a, b, c:

float a, b, c; // Стороны треугольника

if(a + b >c && a + c > b && b + c > a)

cout << ”Существует \n”;

else

cout << ”Не существует \n”;

Если окажется, что a + b <c, то первый операнд оператора && будет ложным и все выражение будет ложным независимо от значений выражений a + c > b и b + c > a, поэтому они не будут вычисляться.

Математические функции

Стандартом языка C++ предусмотрена библиотека математических функций, заголовочный файл которой math.h. Упомянем наиболее употребительные математические функции:

sin(x), cos(x), tan(x) – тригонометрические (x в радианах);

asin(x), acos(x), atan(x) – обратные тригонометрические;

exp(x), sinh(x), cosh(x), tanh(x) – экспонента и гиперболические;

log(x) – натуральный логарифм; log10(x) – десятичный логарифм;

sqrt(x) – Логический тип и логические операции - student2.ru , x≥0; pow(x, y) – возведение x в степень y.

Аргументы и возвращаемые значения функций имеют тип double.

Глава 4. Операторы. Ключевые слова

Ниже приведен справочный материал по языку C++.

Операторы

Операторывыполняют действия, например, производят сложение двух чисел. Операторы различаются числом операндов, участвующих в соответствующей операции. Существуют унарные, бинарные операторы, а также единственный оператор с тремя операндами.

Арифметические операторы языка C++, такие как сложение, умножение, похожи на соответствующие математические действия. Но есть операторы, не имеющие прямой аналогии в математике, например, вызов функции (), доступ к элементу массива [].

Унарные операторы

В табл.6 перечислены имеющиеся в языке одноместные (унарные) операторы, которые применяются к единственному операнду.

Таблица 6. Унарные операторы

Знак оператора Операция Пример выражения Значение выражения
– + ~ ! sizeof (тип) тип() * & new delete ++ –– Унарный минус Унарный плюс Побитовое логическое отрицание Логическое отрицание Размер объекта в байтах Приведение типа   Доступ к объекту по указателю Вычисление адреса Выделение памяти Освобождение памяти Увеличение на единицу Уменьшение на единицу -(-1) +(-1) ~(0) !(0) sizeof(char) (int)1.0 int(1.0) *p &x p=new char delete p ++k; k++ ––k, k–– -1 -1   адрес x  

Оператор ++ увеличивает свой операнд на 1, а оператор –– уменьшает на 1. Данные операторы могут быть префиксными (приставочными) и постфиксными (суффиксными). Если оператор стоит перед операндом, то сначала изменяется значение операнда, а затем измененное значение используется в вычислениях, например,

int i = 1, j = 1, n, m;

n = ++i; // i = 2, n = 2

Если оператор стоит после операнда, то в вычислениях используется начальное значение операнда, а затем его значение изменяется, например,

m = j––; // m = 1, j = 0

Бинарные операторы

В табл.7 перечислены двухместные (бинарные) операторы, требующие двух операндов. Операторы арифметические, логические и сравнения уже обсуждались. Побитовые операторы применимы к целым типам и действуют на отдельные разряды их двоичного представления, подробнее они будут рассмотрены ниже (см. §13.5).

Таблица 7. Бинарные операторы

Знак оператора Операция Пример выражения Значение выражения
* /   % + – < > <= >= == != << >> & | ^   && || , Умножение Деление   Вычисление остатка Сложение Вычитание Меньше Больше Меньше или равно Больше или равно Тождество Не равно Сдвиг влево Сдвиг вправо Побитовое И Побитовое ИЛИ Побитовое исключающее ИЛИ Логическое И Логическое ИЛИ Запятая (–1) * (–1) 3 / 2 3.0 / 2.0 3 % 2 3 + 2 3 – 2 3 < 2 3 > 2 3 <= 2 3 >= 2 3 == 2 3 != 2 3 << 2 7 >> 2 3 & 2 3 | 2 3 ^2   3 && 2 3 || 2 (1, 2, 2+1) 1.5  

Оператор запятая

Рассмотрим здесь оператор запятая. Несколько выражений, разделенных запятыми, вычисляются слева направо и рассматриваются как одно выражение. Типом и значением результата является тип и значение правого выражения. Примеры использования оператора запятая будут приведены ниже.

Запятые, разделяющие аргументы функций и переменные в описаниях, операторами не являются и не обеспечивают вычисления слева направо.

Условное выражение

Оператор условного выражения – единственный, требующий трех операндов. Для его обозначения используются знак вопроса и двоеточие (? :). Условное выражение имеет вид:

a ? b : c;

Если a есть истина (не нуль), то результатом всего выражения будет значение выражения b, иначе результатом будет значение выражения c. Например, в следующей инструкции переменной max присваивается максимум из x и y:

max = x > y ? x : y;

Операторы присваивания

В языке C++, кроме обычного оператора присваивания, обозначаемого одним знаком =, существуют операторы присваивания, совмещенные с основными операциями, табл. 8. Они позволяют писать инструкции вида:

a = a + b;

в более краткой форме

a+= b;

Таблица 8. Операторы присваивания

Знак оператора Выполняемое действие Примеры выражений Значе- ние k
= += –= *= /= %= <<= >>= &= |= ^= Простое присваивание Сложение и присваивание Вычитание и присваивание Умножение и присваивание Деление и присваивание Вычисление остатка и присваивание Сдвиг влево и присваивание Сдвиг вправо и присваивание Побитовое И и присваивание Побитовое ИЛИ и присваивание Побитовое исключающее ИЛИ и присваивание k = 2 k+=2 k–=2 k*=3 k/=2 k%=2 k<<=2 k>>=2 k&=2 k|=2 k^=2

Приоритеты операторов

В языке C++ операторы выполняются в очередности, определяемой их приоритетом. Всего существует 16 приоритетов операторов. В табл.9 перечислены операторы в порядке убывания их приоритетов.

Таблица 9. Приоритеты и порядок выполнения операторов

Прио-ритет Знаки операторов Тип операторов Порядок вы­полнения
() [] . -> Вызов функции, выбор элемента массива, доступ к члену структуры Слева направо
– ~ ! * & ++ –– sizeof (тип) тип() Одноместные с одним операндом Справа налево
.* ->* Доступ к члену класса через указатель Слева направо
* / % Умножение, деление, остаток от деления Слева направо
+ – Сложение, вычитание Слева направо
<< >> Сдвиг влево и вправо Слева направо
< > <= >= Отношение (неравенство) Слева направо
== != Отношение (равно, не равно) Слева направо
& Побитовое И Слева направо
^ Побитовое исключающее ИЛИ Слева направо
| Побитовое ИЛИ Слева направо
&& Логическое И Слева направо
|| Логическое ИЛИ Слева направо
? : Условная Справа налево
= *= /= %= += -= <<= >>= &= |= ^= Простое и составное присваивание Справа налево
, Последовательное вычисление Слева направо

При вычислении выражений сначала выполняются операторы, заключенные в самые внутренние круглые скобки. Если скобок нет, то сначала выполняются операторы с более высоким приоритетом. В случае одинакового приоритета операторы выполняются либо слева направо, либо справа налево. Например, арифметические операторы выполняются слева направо. Инструкция

a = b + c + d + e;

в которой сложения будут выполняться слева направо по умолчанию, эквивалентна инструкции

a = ((b + c) + d) + e;

в которой порядок выполнения сложений явно указан скобками.

Операторы присваивания выполняются справа налево, поэтому инструкция

x = y = z = 10;

присвоит всем трем переменным одно значение 10.

Ключевые слова

В табл.10 перечислены ключевые слова языка Си, которые являются в то же время и ключевыми словами языка C++. Эти идентификаторы имеют предопределенный смысл и не могут использоваться для обозначения объектов, определяемых пользователем.

Таблица 10. Ключевые слова стандарта языка Cи

Ключевое слово Значение, использование
auto break case char const continue default do double else enum extern   float for goto if int long   register return short signed Устанавливает автоматический класс памяти для объектов Оператор выхода из цикла или переключателя switch Метка в операторе switch Спецификатор символьного типа Модификатор типа. Запрещает изменение объекта Оператор перехода к следующей итерации цикла Метка в операторе switch Первое слово цикла do ... while Спецификатор вещественного типа двойной точности Необязательная ветвь в операторе if Спецификатор перечислимого типа Класс памяти, указывающий, что идентификатор определяется позже или в другом файле Спецификатор вещественного типа одинарной точности Оператор цикла Оператор безусловного перехода Оператор выбора Спецификатор целого типа Спецификатор типа длинных целых. Используется также как префикс с int, float, double Указание разместить величину в регистрах процессора Оператор возврата в вызывающую функцию Спецификатор типа коротких целых Указывает на наличие знака у целочисленных типов

Продолжение таблицы 10. Ключевые слова стандарта языка Cи

Ключевое слово Значение, использование
sizeof static struct switch typedef union unsigned void volatile   while Оператор. Определяет размер операнда в байтах Класс памяти статических объектов Спецификатор типа структура Оператор выбора Используется для создания синонима типа Спецификатор типа объединение Префикс данных целочисленного типа без знака Тип выражения, не имеющего значения Модификатор типа объектов, которые могут быть прочитаны или записаны какой-либо другой программой Оператор цикла

В язык C++ введены дополнительные ключевые слова, с помощью которых реализуется концепция объектно-ориентированного программирования, обработка исключений (ошибок) и другие возможности. В табл.11 они перечислены с краткими пояснениями.

Таблица 11. Ключевые слова стандарта языка C++

Ключевое слово Значение, использование
asm bool catch class const_cast delete dynamic_cast explicit export false friend inline mutable namespace new operator private protected Используется для вставки в C++ программу ассемблерного кода Спецификатор логического типа Обрабатывает исключение, порожденное оператором throw Используется для объявления классов Оператор переопределения модификаторов const и/или volatile Оператор освобождения памяти, на которую указывает операнд Оператор динамической проверки законности приведения типа Запрещает приведение типов аргументов в конструкторах Разрешает использование шаблона из одного файла в другом Логическая константа со значением ложь Разрешает функциям доступ к закрытым членам класса Требует встраивать код функции в каждую точку ее вызова Разрешает изменять объекты, объявленные как const Создает пространство имен Оператор выделения динамической памяти Создает (перегружает) функции операторы Спецификатор доступа закрытых членов класса Спецификатор доступа закрытых членов класса, доступных в производных классах

Продолжение таблицы 11. Ключевые слова стандарта языка C++

Ключевое слово Значение, использование
public reinterpret_cast restrict static_cast template this throw true try typeid typename using virtual wchar_t Спецификатор доступа открытых членов класса Оператор преобразования одного типа в другой Квалификатор единственного указателя для доступа к объекту Оператор приведения типа Используется для объявления шаблонов функций и классов Указатель на объект, для которого вызвана функция член класса Оператор генерации исключения Логическая константа со значением истина Заголовок блока, где контролируются исключения Оператор определения типа объекта Используется вместо class в шаблонах template Открывает доступ к именам из пространства имен Спецификатор создания виртуальных функций Спецификатор типа двухбайтовых символов

Структура программы

Программа на языке C++ состоит из функций и переменных. Среди функций любой программы должна быть функция main. Переменные хранят данные, обрабатываемые программой.

Объявления переменных

Все переменные должны быть объявлены до их использования. Переменные можно объявлять внутри какой-либо функции или вне всех функций. Переменные, объявленные внутри функции, являются локальными, они существуют и доступны только внутри данной функции. Переменные, объявленные вне функций, называются глобальными или внешними, их можно использовать внутри любой функции.

Объявление задает тип и содержит список из одной или нескольких переменных. Например,

int lower, upper, step; // Три переменных типа int

char c, line[1000];

Здесь c – простая переменная типа char, line – массив из 1000 элементов типа char.

При объявлении переменная может быть инициализирована, например,

char simb = ’G’; // В апострофы заключается одиночный символ

int i = 0;

float eps = 1.0e-5;

Объявления и определения

Объявление (declaration) сообщает компилятору о том, что в программе будет существовать какой-либо объект, например, переменная или функция. Инструкция

extern int k;

является только объявлением. Теперь имя целой переменной k можно использовать в выражениях. Ключевое слово extern (внешний) указывает, что память под переменную k не выделяется при ее объявлении, а будет выделена где-то в другом месте.

Определение (definition) можно рассматривать как объявление, которое влечет за собой резервирование памяти для переменной или функции. Все объявления переменных из предыдущего пункта являются также и определениями, так как компилятор зарезервирует под них память.

Когда не требуется конкретизация, вместо терминов определение и объявление можно использовать термин описание.

Инструкции и блоки

Программа на языке C++ состоит их отдельных предложений или инструкций. Как правило, каждая инструкция завершается точкой с запятой. Другое часто используемое название для инструкции – оператор, например, оператор цикла. Инструкция задает какое-то действие в программе, например, вызывает функцию, изменяет переменную.

Для объединения нескольких инструкций в одну составную инструкцию или блок используются фигурные скобки { и }. Блок с точки зрения синтаксиса воспринимается как одна инструкция.

Внутри блока можно объявлять переменные, которые существуют только внутри этого блока. Переменные внутри блоков «затеняют» переменные с такими же именами в охватывающих блоках. Например,

int k = 2; // Глобальная переменная

int main()

{

cout << ”k = ” << k; // Блок с телом функции main

int k = 0;

{ // Внутренний блок

int i; // i локализована во внутреннем блоке

i = k; // Допустимо, k здесь доступна

cout << ”i = ” << i; // Будет напечатано i = 0

int k = 1; // Внутреннее k затеняет внешнее k

i = k; // Используется «внутреннее» k

cout << ”i = ” << i; // Будет напечатано i = 1

} // Конец внутреннего блока

k = i + 1; // Ошибка, i недоступна вне своего блока

::k = 0; // Обращение к внешней переменной k

}

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

int s = 0;

for(int i = 1; i <= 100; i++) // Зона действия i – цикл

s += i;

cout << i; // Ошибка, i недоступна

В Turbo C++ переменная, объявленная в заголовке цикла, существует не только в цикле, но до конца блока, поэтому приведенный выше фрагмент будет выполняться без ошибок.

Константы

Константы – это объекты, которые нельзя изменить. Константы объявляются с добавлением ключевого слова const. При определении констант их следует инициализировать. Например,

int main()

{

const int model = 90; // model является константой

const int x; // Ошибка, нет инициализации

model = 200; // Попытка изменить константу, ошибка

return 0;

}

Наши рекомендации