【问题标题】:c++ explicit type cast gives wrong answerC++ 显式类型转换给出了错误的答案
【发布时间】:2014-03-07 06:45:12
【问题描述】:

为什么我会在 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

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

感谢您的帮助。

【问题讨论】:

  • 除非您实际向我们展示您所描述的内容,否则我们无法解释。
  • 不看代码谁也说不准。
  • 在重复问题中,整数不会转换为浮点数进行操作。在这种情况下,转换后我得到了错误的答案。
  • Seems to work fine for me(注意底部的标准输出是float n is 2 float sum is 24)。

标签: c++ scope explicit-conversion


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您的程序中的问题在于您的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 &lt;&lt; " float n is " &lt;&lt; float(n) &lt;&lt; " float sum is "&lt;&lt; float(sum) &lt;&lt; endl; 中,您尝试输出的 sum 变量是在程序开头声明为 int sum; 的变量,它也是 sum variablesecond instance 和它尚未被初始化或赋值。 这就是你的问题。 编译器如何将您的int sum 转换为float sum 并在没有分配值时将其输出到屏幕上?

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

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

    请记住,局部变量的生命周期或范围仅在 一个过程或一个代码块,而全局变量的范围是 在整个程序中,这意味着它在任何地方都可以被识别 或引用。

    希望这会有所帮助!

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-02-17
        • 1970-01-01
        • 1970-01-01
        • 2014-06-04
        • 1970-01-01
        • 1970-01-01
        • 2018-09-13
        • 1970-01-01
        相关资源
        最近更新 更多