Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
A.doc
Скачиваний:
36
Добавлен:
09.04.2015
Размер:
5.6 Mб
Скачать

66 Глава 2

После этого программа перестанет компилироваться, а будет выдана ошибка (ошибка С2166: lvalue специфицирует константный объект).

Иногда бывает очень удобно определять константы, используемые в программе, снабжая модификатором const типы переменных, в частности, когда вы используе- те некоторые константы в программе несколько раз. Во-первых, это гораздо лучше, чем разбрасывать по всей программе литералы, назначение которых не очевидно. Например, значение 42 в программе может означать все что угодно, но если вы ис- пользуете константную переменную по имени myAge, имеющую значение 42, то ее назначение сразу становится совершенно очевидным. Кроме того, если вам понадо- бится изменить значение применяемой константной переменной, то вам придется сделать это один-единственный раз, в одном исходном файле, дабы гарантировать, что это изменение автоматически появится везде, где упомянутая переменная исполь- зуется. Эту технику вы будете использовать очень часто.

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

Константная переменная rolllength также инициализируется арифметическим выражением (12. 0*33.0). Возможность использования константных выражений для инициализации переменных избавляет вас от необходимости вычислять их вручную при написании программы. К тому же такие выражения могут оказаться более ин- формативными, потому что, например, 33 фута по 12 дюймов каждый более ясно указывает на смысл величины, чем если просто написать 396. Обычно компилятор точно вычисляет константные выражения, в то время как если вы станете делать это вручную, то в зависимости от сложности выражения и ваших способностей к вычис- лениям, появляется вероятность того, что оно будет вычислено неверно.

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

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

Ввод программы

После объявления некоторых целочисленных переменных следующие четыре опе- ратора программы обрабатывают ввод с клавиатуры:

Здесь выводится текст в cout, приглашающий пользователя ввести необходимую информацию с клавиатуры, используя с in, который представляет собой стандартный входной поток. Сначала вы получаете значение height, а затем последовательно чи- таете length и width. В реальной программе вам понадобилось бы проверить введен-

Данные, переменные и вычисления 67

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

Вычисление результата

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

Первый оператор вычисляет количество полос обоев длиной, равной высоте ком- наты, которые получаются при разрезке одного стандартного рулона, разделив длину рулона на высоту комнаты. То есть, если комната имеет высоту 8 футов, то вы делите 96 на 396, что должно дать результат с плавающей точкой, равный 4,125. Но здесь име- ется одна тонкость. Переменная, куда вы помещаете результат — stripsperroll — была объявлена как int, поэтому она может хранить только целые значения. Как следствие, попытка сохранить любое значение с плавающей точкой как целое приво- дит к округлению к ближайшему меньшему целому — в данном случае, к 4 — и это зна- чение сохраняется. В общем, это тот результат, который вам нужен, поскольку хотя они и могут подойти для оклейки стены под окном или над дверью, дробные части полос обоев лучше проигнорировать при расчете потребности в рулонах.

Преобразование значения одного типа к другому называется приведением (casting). Этот конкретный случай является примером неявного приведения (implicit cast), потому что в коде явно не указано, что приведение необходимо, и компилятор должен делать это самостоятельно. Два предупреждения, которые вы получите во время компиляции, касаются именно неявного приведения, которое может привести к утере части информации из-за преобразования одного типа в другой, менее точ- ный.

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

Но поскольку такие присваивания неизбежны, вы можете специфицировать при- ведение явно, чтобы продемонстрировать компилятору, что здесь нет ничего случай- ного, и это именно то, что вы намеревались сделать. Делается это посредством явно- го приведения значения в правой части присваивания к типу int, то есть оператор становится таким:

Добавкасо скобками вокруг выражения в правой части явно

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