С++: Преобразование типов
Как мы уже поняли разные типы данных по-разному хранятся в памяти компьютера. Например, целочисленное значение 3 может быть сохранено как двоичное 0000 0000 0000 0000 0000 0000 0000 0011, тогда как значение с плавающей запятой 3.0 может быть сохранено как двоичное 0100 0000 0100 0000 0000 0000 0000 0000.
Так что же происходит когда мы инициализируем переменную типа float целым числом.
float f_age { 18 };А произойдет следующее: поскольку компилятор не может просто сохранить целое число в переменную с плавающей точкой, он преобразует это число в эквивалентное, но типа float.
Процесс преобразования значения из одного типа данных в другой тип данных называется преобразованием типа.
Преобразования типов могут быть неявные - по решению компилятора и явные по решению программиста.
Неявное преобразование типа выполняется компилятором автоматически, когда требуется один тип данных, но предоставляется другой тип. Подавляющее большинство преобразований типов в C++ являются неявными преобразованиями типов.
Неявное преобразование может происходить в следующих случаях:
- если мы делаем арифметическую операцию двух разных типoв. Преобразование идет в тот тип который шире.
double d_result { 4.2 / 3 } // 3 будет пеобразованна в double- если происходит инициализация переменной другого типа. Тут уже может быть, что мы например сохраним число типа
longв переменную типаintи тут уже зависит от способа инициализации переменной.
double d_num { 3 }; // 3 будет преобразованна в double
int num = 3.14; // будет потерянна вещевственная часть
int num = { 3.14 }; // ошибка компиляции- Забегая вперед. При использовании небулевого значения в инструкции if
if (5) { } // 5 будет преобразованно в trueНо явное всегда лучше, чем неявное. В C++ существует 5 различных видов приведений типа: приведения в стиле C, статические приведения, константные приведения, динамические приведения и реинтерпретирующие приведения. Последние четыре иногда называют именованными приведениями.
Здесь мы рассмотрим приведение в стиле С и статическое приведение.
В стандартном программировании на C приведение типов выполняется с помощью оператора (), при этом имя типа, в который необходимо преобразовать значение, помещается в круглые скобки. Вы всё еще можете увидеть, что они используются в коде, преобразованном из C.
int main() {
int x { 5 };
int y { 4 };
double d_result { (double)x / y }; // x преобразуется в тип double
}В приведенном выше коде мы явно указали компилятору чтобы он преобразовал int x в double.
C++ также позволяет вам использовать приведение в стиле C с синтаксисом, более похожим на вызов функций:
double d_result { double(x) / y };Это работает идентично предыдущему примеру, но тут преимущество в том, что преобразуемое значение заключено в скобки - это упрощает определение того, что конвертируется.
Приведение в стиле С не рекомендуется использовать поскольку под капотом он может выполнять множество различных преобразований в зависимости от контекста и даже убирать константность.
В C++ появился оператор приведения типов static_cast, который можно использовать для преобразования значения одного типа в значение другого типа. Этот способ наиболее безопасен и рекомендован в С++.
int main() {
int x { 5 };
int y { 4 };
double d_result { static_cast<double>(x) / y };
}В угловых скобках указывается тип к которому приводим, а в круглые передаем переменную или число которое приводим.
Задание
В прошлом модуле мы писали программу, которая переводила евро в доллары, а доллары в рубли. На тот момент мы не знали типов данных с плавающей точкой и использовали автоматический вывод типов с помощью auto. Отрефакторите ее используя новые знания, используйте явное приведение типов.
Напишите программу, которая берет исходное количество евро, записанное в переменную euros_count, переводит евро в доллары и выводит на экран. Затем полученное значение переводит в рубли и выводит на новой строчке.
Пример вывода для 100 евро:
125.0
7500.0Считаем, что:
- 1 евро = 1.65 долларов
- 1 доллар = 60 рублей
Полезное
С++: Преобразование типов
Как мы уже поняли разные типы данных по-разному хранятся в памяти компьютера. Например, целочисленное значение 3 может быть сохранено как двоичное 0000 0000 0000 0000 0000 0000 0000 0011, тогда как значение с плавающей запятой 3.0 может быть сохранено как двоичное 0100 0000 0100 0000 0000 0000 0000 0000.
Так что же происходит когда мы инициализируем переменную типа float целым числом.
float f_age { 18 };А произойдет следующее: поскольку компилятор не может просто сохранить целое число в переменную с плавающей точкой, он преобразует это число в эквивалентное, но типа float.
Процесс преобразования значения из одного типа данных в другой тип данных называется преобразованием типа.
Преобразования типов могут быть неявные - по решению компилятора и явные по решению программиста.
Неявное преобразование типа выполняется компилятором автоматически, когда требуется один тип данных, но предоставляется другой тип. Подавляющее большинство преобразований типов в C++ являются неявными преобразованиями типов.
Неявное преобразование может происходить в следующих случаях:
- если мы делаем арифметическую операцию двух разных типoв. Преобразование идет в тот тип который шире.
double d_result { 4.2 / 3 } // 3 будет пеобразованна в double- если происходит инициализация переменной другого типа. Тут уже может быть, что мы например сохраним число типа
longв переменную типаintи тут уже зависит от способа инициализации переменной.
double d_num { 3 }; // 3 будет преобразованна в double
int num = 3.14; // будет потерянна вещевственная часть
int num = { 3.14 }; // ошибка компиляции- Забегая вперед. При использовании небулевого значения в инструкции if
if (5) { } // 5 будет преобразованно в trueНо явное всегда лучше, чем неявное. В C++ существует 5 различных видов приведений типа: приведения в стиле C, статические приведения, константные приведения, динамические приведения и реинтерпретирующие приведения. Последние четыре иногда называют именованными приведениями.
Здесь мы рассмотрим приведение в стиле С и статическое приведение.
В стандартном программировании на C приведение типов выполняется с помощью оператора (), при этом имя типа, в который необходимо преобразовать значение, помещается в круглые скобки. Вы всё еще можете увидеть, что они используются в коде, преобразованном из C.
int main() {
int x { 5 };
int y { 4 };
double d_result { (double)x / y }; // x преобразуется в тип double
}В приведенном выше коде мы явно указали компилятору чтобы он преобразовал int x в double.
C++ также позволяет вам использовать приведение в стиле C с синтаксисом, более похожим на вызов функций:
double d_result { double(x) / y };Это работает идентично предыдущему примеру, но тут преимущество в том, что преобразуемое значение заключено в скобки - это упрощает определение того, что конвертируется.
Приведение в стиле С не рекомендуется использовать поскольку под капотом он может выполнять множество различных преобразований в зависимости от контекста и даже убирать константность.
В C++ появился оператор приведения типов static_cast, который можно использовать для преобразования значения одного типа в значение другого типа. Этот способ наиболее безопасен и рекомендован в С++.
int main() {
int x { 5 };
int y { 4 };
double d_result { static_cast<double>(x) / y };
}В угловых скобках указывается тип к которому приводим, а в круглые передаем переменную или число которое приводим.
Задание
В прошлом модуле мы писали программу, которая переводила евро в доллары, а доллары в рубли. На тот момент мы не знали типов данных с плавающей точкой и использовали автоматический вывод типов с помощью auto. Отрефакторите ее используя новые знания, используйте явное приведение типов.
Напишите программу, которая берет исходное количество евро, записанное в переменную euros_count, переводит евро в доллары и выводит на экран. Затем полученное значение переводит в рубли и выводит на новой строчке.
Пример вывода для 100 евро:
125.0
7500.0Считаем, что:
- 1 евро = 1.65 долларов
- 1 доллар = 60 рублей
Полезное
Ваше упражнение проверяется по этим тестам
#include "test_helper.h"
TEST_CASE("testing solution") {
std::string expected = "165\n9900\n";
std::string actual = get_output(sizeof(expected));
CHECK(actual == expected);
}Решение учителя откроется через:
20:00
