Чтение онлайн

на главную - закладки

Жанры

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

bool
в
char

bool
в
int

bool
в
double

char
в
int

char
в
double

int
в
double

Наиболее полезным является преобразование переменной типа

int
в переменную типа
double
,
поскольку это позволяет использовать смесь этих типов в одном выражении.

double d1 = 2.3;

double d2 = d1+2; // перед сложением число преобразуется в число 2.0

if (d1 < 0) // перед сравнением число 0 преобразуется в число 0.0

cout("d1 — отрицательно");

Для действительно больших чисел типа

int
при их преобразовании в переменные типа
double
мы можем (в некоторых компьютерах) потерять точность. Однако эта проблема возникает редко.

3.9.2. Опасные преобразования

Безопасные преобразования обычно не беспокоят программистов и упрощают разработку программ. К сожалению, язык С++ допускает (неявные) опасные преобразования. Под опасными преобразованиями мы подразумеваем то, что значение может неявно превратиться в значение иного типа, которое не равно исходному.

Рассмотрим пример.

int main

{

int a = 20000;

char c = a; // попытка втиснуть большое значение типа int

// в маленькую переменную типа char

int b = c;

if (a != b) // != означает "не равно"

cout << "Ой!: " << a << "!=" << b << '\n';

else

cout << "Ого! Мы получили большие значения типа char\n";

}

Такие преобразования называют “сужающими”, поскольку они заносят значение в объект, размер которого слишком мал (“узок”) для их хранения. К сожалению, лишь некоторые компиляторы предупреждают об опасной инициализации переменной типа

char
значением переменной типа
int
. Проблема заключается в том, что тип
int
, как правило, намного больше типа
char
, так что он может (в нашем случае так и происходит) хранить значение типа
int
, которое невозможно представить как значение типа
char
. Попробуйте выяснить, чему равна переменная
b
на вашей машине (обычно должно получиться 32); поэкспериментируйте.

int main

{

double d = 0;

while (cin>>d) { //
повторяем последующие инструкции,

// пока мы вводим целые числа

int i = d; // попытка втиснуть double в int

char c = i; // попытка втиснуть int в char

int i2 = c; // получаем целое значение переменной типа char

cout << " d==" << d // исходное значение типа double

<< " i==" << i // преобразуется в значение типа int

<< " i2==" << i2 // целое значение переменной типа char

<< " char(" << c << ")\n"; // значение типа char

}

}

Использованная в этой программе инструкция

while
позволяет ввести много значений (см. раздел 4.4.2.1).

ПОПРОБУЙТЕ

Выполните эту программу, вводя разные значения. Попробуйте ввести небольшие значения (например,

2
и
3
); большие значения (больше чем
127
, больше чем
1000
); отрицательные значения; введите число
56
;
89
;
128
; неотрицательные целые числа (например,
56.9
и
56.2
). Кроме демонстрации преобразования типа
double
в тип
int
и типа
int
в тип
char
на вашем компьютере, эта программа показывает, какое значение типа
char
выводится для заданного целого числа.

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

double
в
int

double
в
char

double
в
bool

int
в
char

int
в
bool

char
в
bool

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

double x = 2.7;

// какой-то код

int y = x; // значение переменной y становится равным 2

Поделиться:
Популярные книги

Моя на одну ночь

Тоцка Тала
Любовные романы:
современные любовные романы
короткие любовные романы
5.50
рейтинг книги
Моя на одну ночь

Черный Маг Императора 8

Герда Александр
8. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Черный Маг Императора 8

Измена. Отбор для предателя

Лаврова Алиса
1. Отбор для предателя
Фантастика:
фэнтези
5.00
рейтинг книги
Измена. Отбор для предателя

Кодекс Крови. Книга II

Борзых М.
2. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга II

Шаг в бездну

Муравьёв Константин Николаевич
3. Перешагнуть пропасть
Фантастика:
фэнтези
космическая фантастика
7.89
рейтинг книги
Шаг в бездну

Часовая битва

Щерба Наталья Васильевна
6. Часодеи
Детские:
детская фантастика
9.38
рейтинг книги
Часовая битва

Вечная Война. Книга II

Винокуров Юрий
2. Вечная война.
Фантастика:
юмористическая фантастика
космическая фантастика
8.37
рейтинг книги
Вечная Война. Книга II

Хроники странного королевства. Вторжение. (Дилогия)

Панкеева Оксана Петровна
110. В одном томе
Фантастика:
фэнтези
9.38
рейтинг книги
Хроники странного королевства. Вторжение. (Дилогия)

Часовой ключ

Щерба Наталья Васильевна
1. Часодеи
Фантастика:
фэнтези
9.36
рейтинг книги
Часовой ключ

Инвестиго, из медика в маги

Рэд Илья
1. Инвестиго
Фантастика:
фэнтези
городское фэнтези
попаданцы
5.00
рейтинг книги
Инвестиго, из медика в маги

Кротовский, может, хватит?

Парсиев Дмитрий
3. РОС: Изнанка Империи
Фантастика:
попаданцы
альтернативная история
аниме
7.50
рейтинг книги
Кротовский, может, хватит?

Драконий подарок

Суббота Светлана
1. Королевская академия Драко
Любовные романы:
любовно-фантастические романы
7.30
рейтинг книги
Драконий подарок

Очешуеть! Я - жена дракона?!

Амеличева Елена
Фантастика:
юмористическая фантастика
5.43
рейтинг книги
Очешуеть! Я - жена дракона?!

Идеальный мир для Лекаря 9

Сапфир Олег
9. Лекарь
Фантастика:
боевая фантастика
юмористическое фэнтези
6.00
рейтинг книги
Идеальный мир для Лекаря 9