Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
C++ для начинающих (Стенли Липпман) 3-е хххх.pdf
Скачиваний:
85
Добавлен:
30.05.2015
Размер:
5.92 Mб
Скачать

С++ для начинающих

 

171

 

 

 

 

 

ИЛИ

 

 

 

 

 

 

|

побитовое ИЛИ

expr | expr

&&

логическое И

expr && expr

 

||

логическое ИЛИ

expr || expr

 

?:

условный оператор

expr ? expr * expr

 

=

присваивание

l-значение = expr

 

=, *=, /=, %=,

составное присваивание

l-значение += expr и т.д.

 

+=, -=, <<=, >>=,

 

 

 

&=, |=, ^=

 

 

 

throw

возбуждение

throw expr

 

 

исключения

 

 

 

 

 

 

,

запятая

expr, expr

4.14. Преобразования типов

int ival = 0;

// обычно компилируется с предупреждением

Представим себе следующий оператор присваивания: ival = 3.541 + 3;

Врезультате ival получит значение 6. Вот что происходит: мы складываем литералы разных типов 3.541 типа double и 3 типа int. C++ не может непосредственно сложить подобные операнды, сначала ему нужно привести их к одному типу. Для этого существуют правила преобразования арифметических типов. Общий принцип таков: перейти от операнда меньшего типа к большему, чтобы не потерять точность вычислений.

Внашем случае целое значение 3 трансформируется в тип double, и только после этого производится сложение. Такое преобразование выполняется независимо от желания программиста, поэтому оно получило название неявного преобразования типов.

Результат сложения двух чисел типа double тоже имеет тип double. Значение равно 6.541. Теперь его нужно присвоить переменной ival. Типы переменной и результата 6.541 не совпадают, следовательно, тип этого значения приводится к типу переменной слева от знака равенства. В нашем случае это int. Преобразование double в int производится автоматически, отбрасыванием дробной части (а не округлением). Таким образом, 6.541 превращается в 6, и этот результат присваивается переменной ival. Поскольку при таком преобразовании может быть потеряна точность, большинство компиляторов выдают предупреждение.

Так как компилятор не округляет числа при преобразовании double в int, при

double dva1 = 8.6; int iva1 = 5;

необходимости мы должны позаботиться об этом сами. Например: