KnigkinDom.org» » »📕 Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп

Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп

Книгу Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп читаем онлайн бесплатно полную версию! Чтобы начать читать не надо регистрации. Напомним, что читать онлайн вы можете не только на компьютере, но и на андроид (Android), iPhone и iPad. Приятного чтения!

1 ... 27 28 29 30 31 32 33 34 35 ... 337
Перейти на страницу:

Шрифт:

-
+

Интервал:

-
+

Закладка:

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

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

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

 

 Эти преобразования являются опасными в том смысле, что значение, хранящееся в переменной, может отличаться от присвоенного. Почему эта ситуация считается проблемой? Поскольку вы не подозреваете об опасности, таящейся в таких преобразованиях.
1 ... 27 28 29 30 31 32 33 34 35 ... 337
Перейти на страницу:
Отзывы - 0

Прочитали книгу? Предлагаем вам поделится своим отзывом от прочитанного(прослушанного)! Ваш отзыв будет полезен читателям, которые еще только собираются познакомиться с произведением.


Уважаемые читатели, слушатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.

  • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
  • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
  • 3. Просьба отказаться от нецензурной лексики.
  • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

Надеемся на Ваше понимание и благоразумие. С уважением, администратор knigkindom.ru.


Партнер

Новые отзывы

  1. Christine Christine26 июнь 01:23 ​​​​Сначала было тежеловта читать, но потом всё изменилось, я с удовольствием прочитала, спасибо за книгу. Я прочитала весь цикл... Опасное влечение - Полина Лоранс
  2. Тамаринда Тамаринда21 июнь 12:33 Редко что-то цепляет, но тут было всё живое, жизненное, чувственное, сильное, читайте, не пожалеете о своём времени...... Хрупкая связь - Ольга Джокер
  3. Гость Марина Гость Марина20 июнь 06:08 Книга очень понравилась, хотя и длинная. Героиня сильная личность. Да и герой не подкачал. ... Странная - Татьяна Александровна Шумкова
Все комметарии
Новое в блоге