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

 

Программирование. Принципы и практика использования C++ Исправленное издание - _003.png
 Обратите внимание на то, что выражение
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
.

 

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

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

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