Литмир - Электронная Библиотека
A
A

Иначе говоря,

length
— это имя объекта типа
int
, содержащего значение 99. Иногда (в качестве
lvalue
) имя
length
относится к ящику (объекту), а иногда (в качестве
rvalue
) — к самому значению, хранящемуся в этом ящике.

Комбинируя выражения с помощью операторов, таких как 

+
 и
*
, мы можем создавать более сложные выражения, так, как показано ниже. При необходимости для группировки выражения можно использовать скобки.

int perimeter = (length+width)*2; // сложить и умножить

Без скобок это выражение пришлось бы записать следующим образом:

int perimeter = length*2+width*2;

что слишком громоздко и провоцирует ошибки.

int perimeter = length+width*2; // сложить width*2 с length

Последняя ошибка является логической, и компилятор не может ее обнаружить. Компилятор просто видит переменную с именем

perimeter
, инициализированную корректным выражением. Если результат выражения не имеет смысла, то это ваши проблемы. Вы знаете математическое определение периметра, а компилятор нет.

В программах применяются обычные математические правила, регламентирующие порядок выполнения операторов, поэтому

length+width*2
означает
length+(width*2)
. Аналогично выражение
a*b+c/d
означает
(a*b)+(c/d)
, а не
a*(b+c)/d
. Таблица приоритетов операторов приведена в разделе A.5.

Первое правило использования скобок гласит: “Если сомневаешься, используй скобки”. И все же программист должен научиться правильно формировать выражения, чтобы не сомневаться в значении формулы

a*b+c/d
. Слишком широкое использование операторов, например
(a*b)+(c/d)
, снижает читабельность программы.

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

a*b+c/d*(e–f/g)/h+7 // слишком сложно

и всегда старайтесь выбирать осмысленные имена.

4.3.1. Константные выражения

В программах, как правило, используется множество констант. Например, в программе для геометрических вычислений может использоваться число “пи”, а в программе для пересчета дюймов в сантиметры — множитель 2.54. Очевидно, что этим константам следует приписывать осмысленные имена (например,

pi
, а не
3.14159
). Аналогично, константы не должны изменяться случайным образом. По этой причине в языке С++ предусмотрено понятие символической константы, т.е. именованного объекта, которому после его инициализации невозможно присвоить новое значение. Рассмотрим пример.

const double pi = 3.14159;

pi = 7;  // ошибка: присваивание значения константе

double c = 2*pi/r; // OK: мы просто используем переменную pi,

                   // а не изменяем ее

Такие константы полезны для повышения читабельности программ. Увидев фрагмент кода, вы, конечно, сможете догадаться о том, что константа

3.14159
является приближением числа “пи”, но что вы скажете о числе
299792458
? Кроме того, если вас попросят изменить программу так, чтобы число “пи” было записано с точностью до 12 десятичных знаков, то, возможно, вы станете искать в программе число
3.14
, но если кто-нибудь неожиданно решил аппроксимировать число “пи” дробью
22/7
, то, скорее всего, вы ее не найдете. Намного лучше изменить определение константы
pi
, указав требуемое количество знаков.

const double pi = 3.14159265359;

 

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

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

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

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

int val = 19;

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

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

 

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

4.3.2. Операторы

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

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

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

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

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

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

45
{"b":"847443","o":1}