- •6 Глава 1
- •12 Глава 1
- •14 Глава 1
- •16 Глава 1
- •18 Глава 1
- •20 Глава 1
- •22 Глава 1
- •24 Глава 1
- •26 Глава 1
- •31 Глава 1
- •34 Глава 2
- •36 Глава 2
- •Puc. 2.4. Дополнительные опции консольного приложения Win32
- •38 Глава 2
- •40 Глава 2
- •42 Глава 2
- •44 Глава 2
- •48 Глава 2
- •50 Глава 2
- •52 Глава 2
- •54 Глава 2
- •56 Глава 2
- •58 Глава 2
- •60 Глава 2
- •62 Глава 2
- •64 Глава 2
- •66 Глава 2
- •68 Глава 2
- •70 Глава 2
- •74 Глава 2
- •76 Глава 2
- •79 Глава 2
- •82 Глава 2
- •84 Глава 2
- •86 Глава 2
- •88 Глава 2
- •92 Глава 2
- •94 Глава 2
- •96 Глава 2
- •98 Глава 2
- •103 Глава 2
- •105 Глава 2
- •107 Глава 2
- •110 Глава 2
- •115 Глава 3
- •119 Глава 3
- •121 Глава 3
- •123 Глава 3
- •125 Глава 3
- •129 Глава 3
- •131 Глава 3
- •133 Глава 3
- •139 Глава 3
- •141 Глава 3
- •143 Глава 3
- •145 Глава 3
- •148 Глава 3
- •150 Глава 3
- •155 Глава 3
- •165 Глава 4
- •168 Глава 4
- •170 Глава 4
- •173 Глава 4
- •175 Глава 4
- •178 Глава 4
- •184 Глава 4
- •186 Глава 4
- •188 Глава 4
- •190 Глава 4
- •192 Глава 4
- •194 Глава 4
- •198 Глава 4
- •201 Глава 5
- •203 Глава 5
- •205 Глава 5
- •207 Глава 5
- •213 Глава 5
- •217 Глава 5
- •219 Глава 5
- •221 Глава 5
- •223 Глава 5
- •225 Глава 5
- •227 Глава 5
- •232 Глава 5
- •234 Глава 5
- •236 Глава 5
74 Глава 2
-
Любой операнд типа char, signed char, unsigned char, short или unsigned short преобразуется в тип int.
-
Перечислимый тип преобразуется сначала в int, unsigned int, long или unsigned long, в зависимости от того, какого из них достаточно, чтобы вме- стить диапазон перечислителей.
-
Если один из операндов типа unsigned long, то другой преобразуется в unsigned long.
-
Если один из операндов типа long, а другой — типа unsigned int, то оба опе- ранда преобразуются к типу unsigned long.
-
Если любой из операндов типа long, то второй преобразуется в тип long.
Это выглядит неимоверно сложным, но базовый принцип прост: всегда преобразу- ется значение того типа, которые имеет более ограниченный диапазон, к типу второ- го значения. Это увеличивает вероятность получения правильного результата. Чтобы увидеть, как работают эти правила, вы можете попробовать их на примере гипоте- тического выражения. Предположим, что у вас есть следующая последовательность объявлений переменных:
Также предположим, что у вас есть следующее, достаточно произвольное арифме- тическое выражение:
Теперь вы можете попробовать предположить, какие приведения выполнит ком- пилятор при выполнении этого оператора.
Первая операция, которую нужно вычислить — это (value — count). Правило 1 здесь не применимо, зато подходит правило 2, поэтому значение count преобразует- ся в double, и в результате получается значение 15.0 типа double.
Следующим должно выполниться (count — num), и здесь первое подходящее пра- вило из последовательности — это правило 4, поэтому num преобразуется из char в int, и получается результат 12 типа int.
Следующий шаг вычисления — перемножение двух первых результатов — double, равное 15.0, и int, равное 12. Здесь применимо правило 2, и 12 преобразуется в 12.0 с типом double, в результате получается значение double, равное 180.0.
Полученный результат теперь должен быть разделен на many, поэтому опять при- меняется правило 2, и значение many преобразуется в double перед генерацией double результата 90.0.
Следующим вычисляется выражение num/many, и здесь применяется правило 3, чтобы получить значение float, равное 2 . Of, после преобразования типа num из char в float.
В конце к double-значению 90.0 прибавляется float-значение 2 . Of, для чего применяется правило 2, которое требует преобразования 2 . Of в double-значение 2.0, и окончательный результат 92.0 присваивается value.
Хотя чтение этой последовательности несколько напоминает "песню аукционис- та", основную идею вы поняли.
Данные,
переменные и вычисления
Приведения в операторах присваивания
Как вы видели ранее в этой главе на примере, вы можете вызвать не-
явное приведение, записав справа от оператора присваивания выражение, тип кото- рого отличается от типа переменной, находящейся слева от него. Это может изме- нить значение, и информация будет утеряна. Например, если вы присвоите float или double переменной типа int или long, то дробная часть float или double будет потеряна, а сохранена только целая часть. (Вы можете потерять даже больше инфор- мации, если ваша переменная с плавающей точкой содержит значение, выходящее за диапазон допустимых значений целочисленных типов).
Например, после выполнения следующего фрагмента кода:
значение number будет равно 2. Обратите внимание на f в конце константы 2 . 5f. Это указывает компилятору, что это константа с плавающей точкой одинарной точ- ности. Без f по умолчанию она бы имела тип double. Любая константа, содержащая десятичную точку, является значением с плавающей точкой. Если вам не нужно, что- бы она имела двойную точность, добавляйте к ней f. Заглавная F тоже подходит.
Явные приведения
Когда смешанные выражения включают базовые типы, то компилятор при необхо- димости выполняет нужные приведения, но вы также можете принудительно указать приведение одного типа к другому, используя явные приведения. Чтобы привести значение выражения к определенному типу, необходимо написать так:
Ключевое слово staticcast отражает тот факт, что приведение выполняется статически — то есть, когда программа компилируется. Никаких дальнейших прове- рок безопасности приведения во время выполнения программы не осуществляется. Позднее, когда вы будете иметь дело с классами, вы познакомитесь с dynamic_cast — когда преобразование проверяется динамически, то есть, во время выполнения программы. Есть еще два других вида приведений: const_cast — для исключения константности выражения и reinterpretcast, которое означает безусловное при- ведение, но о них я пока не буду говорить.
Эффект операции static_cast заключается в преобразовании значения-ре- зультата вычисления выраженья к типу, который указан между угловыми скобками. Выражение может любым — от отдельной переменной, до сложнейшего составного, содержащего множество вложенных скобок.
Вот специфический пример применения:
Инициализирующим выражением для whole_number является сумма целых частей valuel и value2, в которых остается 10.5 и 15.5 соответственно. Значения 10 и 15, порожденные приведением, сохраняются лишь временно, для использования в вы- числении суммы, а затем теряются. Хотя оба приведения приводят при вычислении к потере информации, компилятор предполагает, что вы знаете, что делаете, приме- няя явное приведение.