0

Работа на кастинг между различными типами данных в C++ ... Программа здесь ниже принтами:Кастинг между различными типами данных в C++

>"Number is 2" 
>"Number is 2.5" 
>"Number is 2" 

Пожалуйста, объясните, почему последний Отпечаток не «Число: 2,5», который я бы ожидать, когда стиль C++ будет плавать?

#include <iostream> 
#include <conio.h> 
using namespace std; 

int main() { 

    int iNumber = 5; 
    float fNumber; 

    // No casting - C++ implicitly converts the result into an int and saves into a float 
    // which is a conversion from 'int' to 'float' with possible loss of data 
    fNumber = iNumber/2; 
    cout << "Number is " << fNumber << endl; 

    // C-style casting not recommended as not type safe 
    fNumber = (float) iNumber/2; 
    cout << "Number is " << fNumber << endl; 

    // C++ style casting using datatype constructors to make the casting safe 
    fNumber = static_cast<float>(iNumber/2); 
    cout << "Number is " << fNumber << endl; 

    _getch(); 

    return 0; 
} 
+1

(iNumber/2) становится 2, который затем преобразуется в поплавок, поэтому значение будет равно 2. Порядок операций. В том, что было до этого, вы бросаете iNumber в поплавок до его разделения, поэтому он выводит 2.5. –

ответ

2

Оператор

fNumber = static_cast<float>(iNumber/2); 

делит целое на целое число ДО броска к поплавку. Это приводит к следующим шагам:

  1. Divide int iNumber по int 2 -> найденным в междунар 2
  2. Cast результата в поплавок -> Результаты в поплавке 2.

Если вы вместо того, чтобы сделать:

fNumber = static_cast<float>(iNumber/2.0); 

Теперь результат деления будет плавающий тип 2,5 до броска, и вы должны получить 2.5, как и ожидалось.

Это все хорошо, но тогда почему

fNumber = (float) iNumber/2; 

работу? Это происходит из-за того, что вы выталкиваете iNumber в поплавок до операции деления, так что и здесь вы разделите float на int, и результат будет поплавок в 2.5.

-1

static_cast<float>(expression) ожидает выражения в круглых скобках, которые в скобках определяют порядок операций.

Чтобы эффективно бросить Int в поплавок без потери данных в стиле C++, третье выражение должно быть переписано с круглыми скобками вокруг только iNumber как в fNumber = static_cast<float>(iNumber)/2;, в конечном счете напечатать «Number is 2.5»:

  • iNumber отливают плавать,
  • 2 неявно приводится к 2.0 и
  • iNumber делится на 2.0.

Обратите внимание, что круглые скобки, определяющие порядок операций, находятся вокруг типа данных в C, но вокруг переменной в C++.

Смежные вопросы