当舍入的值不为0时,为什么此浮点除法会产生零?

时间:2020-09-23 04:16:00

标签: c++

我正在练习C ++,但遇到了一些问题:

#include <iostream>
#include <string>
using namespace std;

int main() {
    int a = 2;
    {
        cout << a;
        cout << "\n";
        float a = a / 2;
        cout << "a= a/2 = ";
        cout << a;

    }
    cout << "\n";
    a = 2;
    {
        cout << a;
        cout << "\n";
        float b = a / 2;
        cout << "b= a/2 = ";
        cout << b;

    }
}

此返回:

2 
a= a/2 = 0 
2 
b= a/2 = 1

我想知道为什么a = a / 2 = 0吗?

谢谢

2 个答案:

答案 0 :(得分:7)

这是一个细微的错误。看这段代码:

int a = 2;
{
    float a = a / 2;
}

在花括号外,名称a表示int a,即在顶部声明的整数。但是在花括号内,一旦到达声明float a的行,名称a就是指括号内的float a而不是括号外的int a。 / p>

这是一个问题,因为该行

float a = a / 2;

表示“创建一个类型为a的名为float的新变量。哦,它需要一个初始值。没关系!给定值float a除以2。 ”在这里看到问题了吗?变量a就其自身而言正在初始化,因此在计算a / 2a尚未初始化,结果不确定。

要解决此问题,只需为float a改一个新名称即可。

答案 1 :(得分:2)

因为您实际上使用的是声明的变量,但从未声明float a = a/2时初始化变量。我的计算机可以打印4.49985e-039,但可以是任何数字。
您感到困惑,因为您有两个具有相同名称的intfloat变量。最好仔细选择变量的名称,否则您必须跟踪代码以查看哪个指示哪个。
我将在每一行中注释使用变量a的地方。

#include <iostream>
#include <string>
using namespace std;

int main() {
  int a = 2;  // int a declared in main scope used;
  {
    cout<<a;  // int a declared in main scope; since there is no a declared in local scope.
    cout<<"\n";
    float a = a/2; // block scope variable a used without initialization to initialize itself. UB. 
    cout<<"a= a/2 = ";  // block scope variable used
    cout<<a;  // block scope variable used
  }
  cout << "\n";   a = 2;  // int a declared in main scope; Since it's block scope is within main scope only.
  {
    cout<<a;  // int a declared in main scope; since no a has been declared in local scope
    cout<<"\n";
    float b = a/2; // int a declared in main scope; since no a has been declared in local scope
    cout<<"b= a/2 = "; // int a declared in main scope; since no a has been declared in local scope
    cout<<b;
  }
}
相关问题