0

为什么我会在 c++ 中将 int 转换为浮动错误?在程序中的某个时刻,我将一个值为 10 或 14 的整数显式转换为浮点数,我得到 0。为什么会这样?我尝试了 static_cast,给了我同样的结果。由于 int 和 float 都是 4 个字节,我认为 int 到 float 的转换不是按大小降级或提升吗?它与舍入误差等有关吗?有人可以解释一下。

这是代码(这里有一个改动很好,但我仍然不知道为什么)---

#include <iostream>
using namespace std;

int main()
{

int n;
int sum;

cout << "Please enter the number:";
cin >> n;

int *elements = new int[n];

cout << "Please enter the elements:";
for(int i=0; i<n; i++)
{
   cin >> elements[i];
}
cout << endl;

///// this approach, gives the sum right, but float(sum) fails and always gives zero.

for(int i=0, sum=0; i < n; i++)
{
   sum = sum + elements[i];
}

////// This works, when sum is initialised outside of for loop. float(sum) does the right conversion as well.
//sum = 0;
//for(int i=0; i < n; i++)
//{
//   sum = sum + elements[i];
//}

cout << " float n is " << float(n) << " float sum is "<< float(sum) << endl;
// float(sum) is zero, when sum is initialised from within for loop.

delete[] elements;

return 0;
}

编译命令-> g++ 3.2.cpp -o 3.2

输入:n = 4;元素 = 1 2 3 4

感觉像是我忽略的一些小事。

谢谢您的帮助。

4

3 回答 3

1

你有两个不同的sum变量。sum您在循环中初始化的实际for范围是 for 循环,就像i计数器一样。当你这样做时,for (int i = 0, sum = 0; ...你正在为循环创建两个新变量isum。因此,sum您在 for 循环中更新的变量不是sum您认为的变量(它隐藏了sum您想要的变量)。

这就是为什么从一开始就发布你真实的、实际的代码很重要的原因。像这样的小细节很重要。

于 2014-03-07T08:45:55.050 回答
1

您的程序中的问题在于您的sum variable(s). 请注意,您的程序在其当前形式中具有two instances of the sum variable.

其中一个sum变量在您的 for 循环中。

for(int i=0, sum=0; i < n; i++) { sum = sum + elements[i]; }

在 for 循环内它有一个local scope,这意味着 sum 变量仅在 for 循环期间存在。在 for 循环之外它不存在!

然而,在您的代码的这一行中cout << " float n is " << float(n) << " float sum is "<< float(sum) << endl;,您尝试输出的 sum 变量是在程序开头声明的变量,int sum;它也是 thesecond instance的,sum variable并且尚未初始化或分配 value。这就是你的问题。当没有分配值时,编译器如何将您int sum转换为 a并将其输出到屏幕上?float sum

sum当在 for 循环外初始化时,程序运行良好,正如您自己所说的那样。这是因为在这种情况下,sum使用的变量是在顶部(之后int n)声明的变量。这个版本的sum变量global scope在整个代码体的持续时间内都有一个,当你最后输出它时,编译器会将总和识别为已经zero在 for 循环中初始化并递增。

所以输出是数组中所有数字的总和elements[i]

请记住,局部变量的生命周期或范围仅在过程或代码块内,而全局变量的范围在整个程序中,这意味着无论在何处使用或引用它都可以识别它。

希望这可以帮助!

于 2014-03-07T10:20:06.130 回答
0

如果你正在做除法,整数除法会截断。您可以做的是先使用浮点数进行除法,然后使用整数显示。例如,static_cast<float>(10/14)将没有效果,因为10/14is的结果0,并且您正在转换0为 float,它仍然是0。如果您尝试将结果存储在 int 中,则由于截断,它将为零。

于 2014-03-07T06:48:35.183 回答