- Любовные романы
- Фантастика и фэнтези
- Ненаучная фантастика
- Ироническое фэнтези
- Научная Фантастика
- Фэнтези
- Ужасы и Мистика
- Боевая фантастика
- Альтернативная история
- Космическая фантастика
- Попаданцы
- Юмористическая фантастика
- Героическая фантастика
- Детективная фантастика
- Социально-психологическая
- Боевое фэнтези
- Русское фэнтези
- Киберпанк
- Романтическая фантастика
- Городская фантастика
- Технофэнтези
- Мистика
- Разная фантастика
- Иностранное фэнтези
- Историческое фэнтези
- LitRPG
- Эпическая фантастика
- Зарубежная фантастика
- Городское фентези
- Космоопера
- Разное фэнтези
- Книги магов
- Любовное фэнтези
- Постапокалипсис
- Бизнес
- Историческая фантастика
- Социально-философская фантастика
- Сказочная фантастика
- Стимпанк
- Романтическое фэнтези
- Ироническая фантастика
- Детективы и Триллеры
- Проза
- Юмор
- Феерия
- Новелла
- Русская классическая проза
- Современная проза
- Повести
- Контркультура
- Русская современная проза
- Историческая проза
- Проза
- Классическая проза
- Советская классическая проза
- О войне
- Зарубежная современная проза
- Рассказы
- Зарубежная классика
- Очерки
- Антисоветская литература
- Магический реализм
- Разное
- Сентиментальная проза
- Афоризмы
- Эссе
- Эпистолярная проза
- Семейный роман/Семейная сага
- Поэзия, Драматургия
- Приключения
- Детская литература
- Загадки
- Книга-игра
- Детская проза
- Детские приключения
- Сказка
- Прочая детская литература
- Детская фантастика
- Детские стихи
- Детская образовательная литература
- Детские остросюжетные
- Учебная литература
- Зарубежные детские книги
- Детский фольклор
- Буквари
- Книги для подростков
- Школьные учебники
- Внеклассное чтение
- Книги для дошкольников
- Детская познавательная и развивающая литература
- Детские детективы
- Домоводство, Дом и семья
- Юмор
- Документальные книги
- Бизнес
- Работа с клиентами
- Тайм-менеджмент
- Кадровый менеджмент
- Экономика
- Менеджмент и кадры
- Управление, подбор персонала
- О бизнесе популярно
- Интернет-бизнес
- Личные финансы
- Делопроизводство, офис
- Маркетинг, PR, реклама
- Поиск работы
- Бизнес
- Банковское дело
- Малый бизнес
- Ценные бумаги и инвестиции
- Краткое содержание
- Бухучет и аудит
- Ораторское искусство / риторика
- Корпоративная культура, бизнес
- Финансы
- Государственное и муниципальное управление
- Менеджмент
- Зарубежная деловая литература
- Продажи
- Переговоры
- Личная эффективность
- Торговля
- Научные и научно-популярные книги
- Биофизика
- География
- Экология
- Биохимия
- Рефераты
- Культурология
- Техническая литература
- История
- Психология
- Медицина
- Прочая научная литература
- Юриспруденция
- Биология
- Политика
- Литературоведение
- Религиоведение
- Научпоп
- Психология, личное
- Математика
- Психотерапия
- Социология
- Воспитание детей, педагогика
- Языкознание
- Беременность, ожидание детей
- Транспорт, военная техника
- Детская психология
- Науки: разное
- Педагогика
- Зарубежная психология
- Иностранные языки
- Филология
- Радиотехника
- Деловая литература
- Физика
- Альтернативная медицина
- Химия
- Государство и право
- Обществознание
- Образовательная литература
- Учебники
- Зоология
- Архитектура
- Науки о космосе
- Ботаника
- Астрология
- Ветеринария
- История Европы
- География
- Зарубежная публицистика
- О животных
- Шпаргалки
- Разная литература
- Зарубежная литература о культуре и искусстве
- Пословицы, поговорки
- Боевые искусства
- Прочее
- Периодические издания
- Фанфик
- Военное
- Цитаты из афоризмов
- Гиды, путеводители
- Литература 19 века
- Зарубежная образовательная литература
- Военная история
- Кино
- Современная литература
- Военная техника, оружие
- Культура и искусство
- Музыка, музыканты
- Газеты и журналы
- Современная зарубежная литература
- Визуальные искусства
- Отраслевые издания
- Шахматы
- Недвижимость
- Великолепные истории
- Музыка, танцы
- Авто и ПДД
- Изобразительное искусство, фотография
- Истории из жизни
- Готические новеллы
- Начинающие авторы
- Спецслужбы
- Подростковая литература
- Зарубежная прикладная литература
- Религия и духовность
- Старинная литература
- Справочная литература
- Компьютеры и Интернет
- Блог
Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп
Шрифт:
Интервал:
Закладка:
Идеал типовой безопасности невероятно важен для создания кода. Вот почему мы поминаем о нем так рано. Пожалуйста, запомните об этой опасности и старайтесь избегать ее в своих программах.
3.9.1. Безопасные преобразования
В разделе 3.4 мы видели, что нельзя непосредственно складывать объекты типа char или сравнивать объекты типов double и int. Однако в языке С++ это можно сделать косвенным образом. При необходимости объект типа char можно преобразовать в объект типа int, а объект типа int — в объект типа double. Рассмотрим пример.
char c = 'x';
int i1 = c;
int i2 = 'x';
Здесь значения переменных i1 и i2 равны 120, т.е. 8-битовому ASCII коду символа 'x'. Это простой и безопасный способ получения числового представления символа. Мы называем это преобразование типа char в тип int безопасным, поскольку при этом не происходит потери информации; иначе говоря, мы можем скопировать результат, хранящийся в переменной типа int, обратно в переменную типа char и получить исходное значение.
char c2 = i1;
cout << c << ' ' << i1 << ' ' << c2 << 'n';
Этот фрагмент программы выводит на экран следующий результат:
x 120 x
В этом смысле — то, что значение всегда преобразуется в эквивалентное значение или (для типа double) в наилучшее приближение эквивалентного значения, — такие преобразования являются безопасными.
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 << "Ого! Мы получили большие значения типа charn";
}
Такие преобразования называют “сужающими”, поскольку они заносят значение в объект, размер которого слишком мал (“узок”) для их хранения. К сожалению, лишь некоторые компиляторы предупреждают об опасной инициализации переменной типа 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
Эти преобразования являются опасными в том смысле, что значение, хранящееся в переменной, может отличаться от присвоенного. Почему эта ситуация считается проблемой? Поскольку вы не подозреваете об опасности, таящейся в таких преобразованиях.

