Работая над приведением между различными типами данных в C ++ … Программа, приведенная ниже, печатает:
>"Number is 2">"Number is 2.5">"Number is 2"
Пожалуйста, объясните, почему последняя распечатка не «Number is 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;
}
Заявление
fNumber = static_cast<float>(iNumber / 2);
делит целое число на целое число ДО приведения к числу с плавающей точкой. Это приводит к следующим шагам:
int iNumber
от int 2
-> приводит к int 2Если вы вместо этого сделаете:
fNumber = static_cast<float>(iNumber / 2.0);
Теперь результатом деления будет плавающий тип 2.5 перед кастом, и вы должны получить 2.5, как и ожидалось.
Это все хорошо, но тогда почему
fNumber = (float) iNumber / 2;
Работа? Это потому, что вы кастуете iNumber
в число с плавающей точкой ДО операции деления, поэтому и здесь вы делите число с плавающей точкой на целое число, и результатом будет число с плавающей точкой 2,5.
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 ++.