Явное и неявное преобразование типов данных C++

В C++ различают явное и неявное преобразование типов данных. Неявное преобразование типов данных выполняет компилятор С++, ну а явное преобразование данных выполняет сам программист. О преобразовании типов данных скажу следующее: «Результат любого вычисления будет преобразовываться к наиболее точному типу данных, из тех типов данных, которые участвуют в вычислении». Для наглядного примера представлю таблицу с преобразованиями типов данных. В таблице рассмотрим операцию деления. В качестве целочисленного типа данных возьмем int, ну и вещественный тип данных у нас будет float.

Таблица 1 — Явное и неявное преобразование типов данных в С++
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).

Явное и неявное преобразование типов данных в C++

Рисунок 1 — Явное и неявное преобразование типов данных C++

В строках 22, 23 выполняется унарная операция преобразования данных, причём преобразуются числа 15 и 20 к типу данных char. Этот тип данных пока вам не известен, но запомните, что char — тип данных для хранения символов. Так вот, из рисунка 1 видно, что в конце появились символы. Эти символы получились путём преобразования чисел в char. Числами являлись коды из таблицы ASCII. Таким образом, если необходимо вывести какой-нибудь символ из таблицы ASCII, это можно сделать как показано в строках 22, 23, при этом подставив только нужный код.

Автор: admin
Дата: 25.08.2012
Поделиться:

Комментарии

  1. 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;
    }

  2. n196184611

    n196184611

    мне кажется у тебя не работает system("pause");

    попробуй его отключить и перезапустить? если из-за него то просто нужно подключить библиотеку: #include <cstdlib>

    она в stdafx.h и хранится

  3. a1

    До етого урока еще кое как получалось обходится без   stdafx.h но теперерь уже код не работает. Я устанавливал VS 12 и делал новый проект в тютельку по вашей инструкции, так какого х.. оно не работает. Че я по гуглю токо не творил: создавал 50 проектов, и к ним stdafx.h и stdafx.cpp добавлял, прописывал в них и нет  #include «stdafx» и в < >… и ключи создавал (/Yu) и (/Yc) и зю и  ………………Все в разных вариация но все равно н…ра не работает, и IDE етот гр….ый Project.cph не хочет создавать. Может сейчас можно убрать #include «stdafx.h» , поменять _tmain _TCHAR* но уже и в дальнейшем не хочу заморачиваться с етой ерундой. Обьясните пожалуйста от начала и до конца что нужно сделать чтоб ваш вышеизложеный код работал так как есть. Думаю не у меня 1 проблемы с stdafx. Спасибо.

  4. Дмитрий Петров

    Тип данных Char уже был описан тут: http://cppstudio.com/uchebniki/yazyk-programmirovaniya-s/tipy-dannyx-s/

    А сейчас пишете: «Этот тип данных пока вам не известен….»

    Логическая ошибка))))))))))))))

Оставить комментарий

Вы должны войти, чтобы оставить комментарий.