在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;
}
答案 0 :(得分:2)
声明
fNumber = static_cast<float>(iNumber / 2);
在整数转换为浮点数之前将整数除以整数。这导致以下步骤:
int iNumber
除以int 2
- &gt;结果为2 如果您改为:
fNumber = static_cast<float>(iNumber / 2.0);
现在,在演员阵容之前,除法的结果将是2.5的浮动类型,你应该按照预期得到2.5。
这一切都很好,但是为什么呢
fNumber = (float) iNumber / 2;
工作?这是因为你在除法运算之前将iNumber
转换为浮点数,所以再一次,你将浮点数除以int,结果将是2.5的浮点数。
答案 1 :(得分:-1)
static_cast<float>(expression)
期望括号中的表达式,括号中的表达式将决定操作的顺序。
为了有效地将int转换为浮点数而不丢失C ++风格的数据,第三个表达式需要单独用iNumber
左右的括号重写,如fNumber = static_cast<float>(iNumber) / 2;
所示,以最终打印&#34 ; Number is 2.5
&#34;:
iNumber
被转换为浮动,2
被隐式转换为2.0
和iNumber
除以2.0
。请注意,定义操作顺序的括号是围绕C中的数据类型,但围绕C ++中的变量。