Чтение онлайн

на главную - закладки

Жанры

Программирование. Принципы и практика использования C++ Исправленное издание
Шрифт:

const double pi = 3.14159265359;

Следовательно, в программах предпочтительнее использовать не литералы (за исключением самых очевидных, таких как
0
и
1
). Вместо них следует применять константы с информативными именами. Неочевидные литералы в программе (за рамками определения констант) насмешливо называют “магическими”.

В некоторых местах, например в метках оператора

case
(см. раздел 4.4.1.3), язык С++ требует использовать константные выражения, т.е. выражения, имеющие целочисленные значения и состоящие исключительно из констант. Рассмотрим пример.

const int max = 17; //
литерал является константным выражением

int val = 19;

max+2 // константное выражение (константа плюс литерал)

val+2 // неконстантное выражение: используется переменная

Кстати, число
299792458
— одна из универсальных констант Вселенной, означающая скорость света в вакууме, измеренную в метрах в секунду. Если вы ее сразу не узнали, то вполне возможно, будете испытывать трудности при распознавании остальных констант в программе. Избегайте “магических” констант!

4.3.2. Операторы

До сих пор мы использовали лишь простейшие операторы. Однако вскоре для выражения более сложных операций нам потребуются намного более широкие возможности. Большинство операторов являются привычными, поэтому мы отложим их подробный анализ на будущее. Перечислим наиболее распространенные операторы.

В выражениях, в которых оператор изменяет операнд, мы использовали имя

lval
(сокращение фразы “значение, стоящее в левой части оператора присваивания”). Полный список операторов приведен в разделе А.5.

Примеры использования логических операторов

&&
(И),
||
(ИЛИ) и
!
(НЕ) приведены в разделах 5.5.1, 7.7, 7.8.2 и 10.4.

Обратите внимание на то, что выражение
a<b<c
означает
(a<b)<c
, а значение выражения
a<b
имеет тип
bool
, т.е. оно может быть либо
true
, либо
false
. Итак, выражение
a<b<c
эквивалентно тому, что выполняется либо неравенство
true<c
, либо неравенство
false<c
. В частности, выражение
a<b<c
не означает “Лежит ли значение
b
между значениями
a
и
c
?”, как многие наивно (и совершенно неправильно) думают. Таким образом, выражение
a<b<c
в принципе является бесполезным. Не используйте такие выражения с двумя операциями сравнения и настораживайтесь, когда видите их в чужой программе — скорее всего, это ошибка.

Инкрементацию можно выразить по крайней мере тремя способами:

++a

a+=1

a=a+1

Какой из способов следует предпочесть? Почему? Мы полагаем, что лучшим среди них является первый,

++a
, поскольку он точнее остальных отражает идею инкрементации. Он показывает, что мы хотим сделать (добавить к значению переменной
a
единицу и записать результат в переменную). В целом всегда следует выбирать тот способ записи, который точнее выражает вашу идею. Благодаря этому ваша программа станет точнее, а ее читатель быстрее в ней разберется. Если мы запишем
a=a+1
, то читатель может засомневаться, действительно ли мы хотели увеличить значение переменной
a
на единицу. Может быть, мы просто сделали опечатку вместо
a=b+1
,
a=a+2
или даже
a=a–1
; если же в программе будет использован оператор
++a
, то простора для сомнений останется намного меньше. Пожалуйста, обратите внимание на то, что этот аргумент относится к области читабельности и корректности
программы, но не к ее эффективности. Вопреки распространенному мнению, если переменная
a
имеет встроенный тип, то современные компиляторы для выражений
a=a+1
и
++a
, как правило, генерируют совершенно одинаковые коды. Аналогично, мы предпочитаем использовать выражение
a *= scale
, а не
a = a*scale
.

4.3.3. Преобразования

Типы в выражениях можно “смешивать”. Например, выражение

2.5/2
означает деление переменной типа
double
на переменную типа
int
. Что это значит? Какое деление выполняется: целых чисел или с плавающей точкой? Целочисленное деление отбрасывает остаток, например
5/2
равно
2
. Деление чисел с плавающей точкой отличается тем, что остаток в его результате не отбрасывается; например
5.0/2.0
равно
2.5
. Следовательно, ответ на вопрос “Какие числа делятся в выражении
2.5/2
: целые или с плавающей точкой?” совершенно очевиден: “Разумеется, с плавающей точкой; в противном случае мы потеряли бы информацию”. Мы хотели бы получить ответ
1.25
, а не
1
, и именно
1.25
мы и получим. Правило (для рассмотренных нами типов) гласит: если оператор имеет операнд типа
double
, то используется арифметика чисел с плавающей точкой и результат имеет тип
double
; в противном случае используется целочисленная арифметика, и результат имеет тип
int
.

Рассмотрим пример.

5/2 равно 2 (а не 2.5)

2.5/2 равно 2.5/double(2), т.е. 1.25

'a'+1 означает int('a')+1

Иначе говоря, при необходимости компилятор преобразовывает (“продвигает”) операнд типа

int
в операнд типа
double
, а операнд типа
char
— в операнд типа
int
. Вычислив результат, компилятор может преобразовать его снова для использования при инициализации или в правой части оператора присваивания. Рассмотрим пример.

double d = 2.5;

int i = 2;

double d2 = d/i; // d2 == 1.25

int i2 = d/i; // i2 == 1

d2 = d/i; // d2 == 1.25

i2 = d/i; // i2 == 1

Будьте осторожны: если выражение содержит числа с плавающей точкой, можно легко забыть о правилах целочисленного деления. Рассмотрим обычную формулу для преобразования температуры по Цельсию в температуру по Фаренгейту:

f = 9/5*с+32
. Ее можно записать так:

double dc;

cin >> dc;

double df = 9/5*dc+32; // осторожно!

К сожалению, несмотря на вполне логичную запись, это выражение не дает точного преобразования шкалы: значение

9/5
равно
1
, а не
1.8
, как мы рассчитывали. Для того чтобы формула стала правильной, либо
9
, либо
5
(либо оба числа) следует представить в виде константы типа
double
.

double dc;

cin >> dc;

double df = 9.0/5*dc+32; // лучше

4.4. Инструкции

Выражение вычисляет значение по набору операндов, используя операторы наподобие упомянутых в разделе 4.3. А что делать, если требуется вычислить несколько значений? А что, если что-то необходимо сделать многократно? А как поступить, если надо сделать выбор из нескольких альтернатив? А если нам нужно считать входную информацию и вывести результат? В языке С++, как и во многих языках программирования, для создания таких выражений существуют специальные конструкции.

Поделиться:
Популярные книги

Черный Маг Императора 9

Герда Александр
9. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Черный Маг Императора 9

Не грози Дубровскому! Том II

Панарин Антон
2. РОС: Не грози Дубровскому!
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Не грози Дубровскому! Том II

Идеальный мир для Социопата 7

Сапфир Олег
7. Социопат
Фантастика:
боевая фантастика
6.22
рейтинг книги
Идеальный мир для Социопата 7

Бремя империи

Афанасьев Александр
Бремя империи - 1.
Фантастика:
альтернативная история
9.34
рейтинг книги
Бремя империи

Приручитель женщин-монстров. Том 5

Дорничев Дмитрий
5. Покемоны? Какие покемоны?
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Приручитель женщин-монстров. Том 5

Мастер...

Чащин Валерий
1. Мастер
Фантастика:
героическая фантастика
попаданцы
аниме
6.50
рейтинг книги
Мастер...

Эфемер

Прокофьев Роман Юрьевич
7. Стеллар
Фантастика:
боевая фантастика
рпг
7.23
рейтинг книги
Эфемер

Приручитель женщин-монстров. Том 4

Дорничев Дмитрий
4. Покемоны? Какие покемоны?
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Приручитель женщин-монстров. Том 4

Идеальный мир для Лекаря 3

Сапфир Олег
3. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 3

Дракон

Бубела Олег Николаевич
5. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.31
рейтинг книги
Дракон

Не грози Дубровскому! Том V

Панарин Антон
5. РОС: Не грози Дубровскому!
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Не грози Дубровскому! Том V

Первый пользователь. Книга 2

Сластин Артем
2. Первый пользователь
Фантастика:
боевая фантастика
рпг
4.80
рейтинг книги
Первый пользователь. Книга 2

Последний попаданец 9

Зубов Константин
9. Последний попаданец
Фантастика:
юмористическая фантастика
рпг
5.00
рейтинг книги
Последний попаданец 9

Запретный Мир

Каменистый Артем
1. Запретный Мир
Фантастика:
фэнтези
героическая фантастика
8.94
рейтинг книги
Запретный Мир