В C++ различают явное и неявное преобразование типов данных. Неявное преобразование типов данных выполняет компилятор С++, ну а явное преобразование данных выполняет сам программист. О преобразовании типов данных скажу следующее: «Результат любого вычисления будет преобразовываться к наиболее точному типу данных, из тех типов данных, которые участвуют в вычислении». Для наглядного примера представлю таблицу с преобразованиями типов данных. В таблице рассмотрим операцию деления. В качестве целочисленного типа данных возьмем int, ну и вещественный тип данных у нас будет float.
x | y | Результат деления | Пример |
---|---|---|---|
делимое | делитель | частное | x = 15 y = 2 |
int | int | int | 15/2=7 |
int | float | float | 15/2=7.5 |
float | int | float | 15/2=7.5 |
Из таблицы видно, что меняя переменные различных типов данных местами, результат остается тот же (в нашем случае это делимое и делитель). О неявном преобразовании типов данных все. Что же касается явного преобразования, то оно необходимо для того чтобы выполнять некоторые манипуляции, тем самым меняя результат вычисления. Самый простой способ явного преобразования типов данных, пример: допустим нам необходимо разделить такие числа 15 и 2, делим! 15/2=7
. Результат тот же, что и в таблице. Но если сделать незначительные преобразования, например: 15.0/2=7.5
при таком делении число 15 является вещественным, значит и результат будет вещественный. Само число 15 с точки зрения математики не изменилось, ведь 15=15.0. Этот же прием можно было применить к двойке, результат был бы тем же, а можно было сразу к двум числам, но зачем ,если хватает одного из двух.
Еще один способ явного преобразования типов данных:
float(15) / 2 // результат равен 7.5, число 15 преобразуется в вещественный тип данных float. double(15) / 2 // результат равен 7.5 – тоже самое!!!
В С++ также предусмотрена унарная операция приведения типа:
static_cast</*тип данных*/>(/*переменная или число*/)
пример: static_cast<float>(15)/2
результат равен 7.5
Пример с переменной:
int ret=15; static_cast<float>(ret)/2 //результат равен 7.5
В случае с переменной надо понимать, что в строке 2 переменная ret
не преобразуется в тип данных float
, а всего лишь на всего создается временная копия переменной ret
с типом данных float
. Рассмотрим на практике все способы явного и неявного преобразования типов данных.
// pryeobrazovanie.cpp: определяет точку входа для консольного приложения. #include "stdafx.h" #include <iostream> #include <iomanip> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { int int_value15 = 15, int_value2 = 2; // объявляем две переменные типа int float float_value15 = 15, float_value2 = 2; // объявляем две переменные типа float cout << fixed << setprecision(2) // определяем, при выводе чисел с плавающей точкой, два знака после запятой << "15 / 2 = " << int_value15 / int_value2 << endl //неявное преобразование типов данных << "15 / 2 = " << int_value15 / float_value2 << endl //неявное преобразование типов данных << "15 / 2 = " << float_value15 / int_value2 << endl //неявное преобразование типов данных << "15 / 2 = " << float_value15 / float_value2 << endl; //неявное преобразование типов данных cout << "15.0 / 2 = " << 15.0 / 2 << endl // явное преобразование типа данных, число 15.0 - число с плавающей точкой << "15 / 2.0 = " << 15 / 2.0 << endl; // явное преобразование типа данных, число 2.0 - число с плавающей точкой cout << "float(int_value15) / int_value2 = " << float(int_value15) / int_value2 << endl // явное преобразование типа данных << "15 / double(2) = " << 15 / double(2) << endl; // используя приводимый тип как функцию cout << "static_cast<float>(15) / 2 = " << static_cast<float>(15) / 2 << endl // унарная операция приведения типа << "static_cast<char>(15) = " << static_cast<char>(15) << endl // можно печатать различные символы из таблицы ASCII, << "static_cast<char>(20) = " << static_cast<char>(20) << endl; // в скобочках прописываем код символа, который находим в таблице ASCII system("pause"); return 0; }
В строке 5 подключена библиотека манипуляций ввода/вывода <iomanip>
, эта библиотека нужна для использования различных манипуляторов, в нашем случае — fixed setprecision()
. В строке 10 специально создал две переменные типа int
, аналогично создал две переменный типа float
в строке 11, эти переменные нужны будут для преобразования их значений в другие типы данных. В строке 12 после оператора cout
и операции сдвига в поток вывода <<
стоят два манипулятора fixed
и setprecision()
. Манипулятор fixed
— это не параметризированный манипулятор, так как никаких параметров не принимает, пишется без круглых скобок. Данный манипулятор применяется в паре с параметризированным манипулятором setprecision()
и выполняет фиксированное отображение разрядов после запятой. А манипулятор setprecision()
отображает количество знаков после запятой, причём то, которое указано в скобочках. В строках 13, 14, 15, 16 показаны примеры неявного преобразования типов данных, эти примеры взяты из таблицы 1. В строках 17, 18 показан один из способов явного преобразования данных. Суть такого способа заключается в том, что нужно дописать запятую и нуль к целому числу. В строках 19, 20 явное преобразование выполняется посредством использования приводимых типов как функций, внутри скобочек которых, нужно указать значение или переменную, которую необходимо преобразовать. В строках 21, 22, 23 выполняется явное преобразование типов данных с помощью унарной операции преобразования данных. В круглых скобочках указывается, переменная или значение, которое нужно преобразовать, а в обрамлении знаков < >
тип данных, к которому нужно преобразовать. Пример работы программы показан ниже (см. Рисунок 1).
Рисунок 1 — Явное и неявное преобразование типов данных C++
В строках 22, 23 выполняется унарная операция преобразования данных, причём преобразуются числа 15 и 20 к типу данных char
. Этот тип данных пока вам не известен, но запомните, что char
— тип данных для хранения символов. Так вот, из рисунка 1 видно, что в конце появились символы. Эти символы получились путём преобразования чисел в char
. Числами являлись коды из таблицы ASCII. Таким образом, если необходимо вывести какой-нибудь символ из таблицы ASCII, это можно сделать как показано в строках 22, 23, при этом подставив только нужный код.
Комментарии
timurtataev
Для тех кто работает с CodeBlocks
#include <iostream>
#include <iomanip>
#include <windows.h> // Обязательно добавлять для тех кто работает с CodeBlocks и удалять
"stdafx.h"
using namespace std;
int main(int argc, _TCHAR* argv[]) // Подправлено под ide » код блок »
{
int int_value15 = 15, int_value2 = 2; // объявляем две переменные типа int
float float_value15 = 15, float_value2 = 2; // объявляем две переменные типа float
cout << fixed << setprecision(2) // определяем, при выводе чисел с плавающей точкой, два знака после запятой
<< «15 / 2 = » << int_value15 / int_value2 << endl //неявное преобразование типов данных
<< «15 / 2 = » << int_value15 / float_value2 << endl //неявное преобразование типов данных
<< «15 / 2 = » << float_value15 / int_value2 << endl //неявное преобразование типов данных
<< «15 / 2 = » << float_value15 / float_value2 << endl; //неявное преобразование типов данных
cout << «15.0 / 2 = » << 15.0 / 2 << endl // явное преобразование типа данных, число 15.0 — число с плавающей точкой
<< «15 / 2.0 = » << 15 / 2.0 << endl; // явное преобразование типа данных, число 2.0 — число с плавающей точкой
cout << «float(int_value15) / int_value2 = » << float(int_value15) / int_value2 << endl // явное преобразование типа данных
<< «15 / double(2) = » << 15 / double(2) << endl; // используя приводимый тип как функцию
cout << «static_cast<float>(15) / 2 = » << static_cast<float>(15) / 2 << endl // унарная операция приведения типа
<< «static_cast<char>(15) = » << static_cast<char>(15) << endl // можно печатать различные символы из таблицы ASCII,
<< «static_cast<char>(20) = » << static_cast<char>(20) << endl; // в скобочках прописываем код символа, который находим в таблице ASCII
system(«pause»);
return 0;
}
n196184611
мне кажется у тебя не работает
system
(
"pause"
);
попробуй его отключить и перезапустить? если из-за него то просто нужно подключить библиотеку: #include <cstdlib>
она в stdafx.h и хранится
a1
До етого урока еще кое как получалось обходится без stdafx.h но теперерь уже код не работает. Я устанавливал VS 12 и делал новый проект в тютельку по вашей инструкции, так какого х.. оно не работает. Че я по гуглю токо не творил: создавал 50 проектов, и к ним stdafx.h и stdafx.cpp добавлял, прописывал в них и нет #include «stdafx» и в < >… и ключи создавал (/Yu) и (/Yc) и зю и ………………Все в разных вариация но все равно н…ра не работает, и IDE етот гр….ый Project.cph не хочет создавать. Может сейчас можно убрать #include «stdafx.h» , поменять
_tmain
_TCHAR*
но уже и в дальнейшем не хочу заморачиваться с етой ерундой. Обьясните пожалуйста от начала и до конца что нужно сделать чтоб ваш вышеизложеный код работал так как есть. Думаю не у меня 1 проблемы с stdafx. Спасибо.lucifer
та же проблема была. я убрала #include «stdafx.h» и заменила int _tmain на просто int main(). всё работает
Дмитрий Петров
Тип данных Char уже был описан тут: http://cppstudio.com/uchebniki/yazyk-programmirovaniya-s/tipy-dannyx-s/
А сейчас пишете: «Этот тип данных пока вам не известен….»
Логическая ошибка))))))))))))))