当向下舍入的值不是 0 时,为什么这个浮点除法会产生零?

Huỳ*_*Huy 1 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;

    }
}
Run Code Online (Sandbox Code Playgroud)

这个回报:

2 
a= a/2 = 0 
2 
b= a/2 = 1
Run Code Online (Sandbox Code Playgroud)

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

谢谢

tem*_*def 7

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

int a = 2;
{
    float a = a / 2;
}
Run Code Online (Sandbox Code Playgroud)

在花括号之外,名称a指的是在int a顶部声明的整数。但是在花括号内,一旦到达float a声明所在的行,该名称a指的是float a大括号内部而不是int a大括号外部。

这是一个问题,因为线

float a = a / 2;
Run Code Online (Sandbox Code Playgroud)

意思是“创建一个名为atype的新变量float。哦,它需要一个初始值。没关系!给它值float a,除以 2。” 看到这里的问题了吗?变量a正在根据自身进行初始化,因此a / 2计算时间a尚未初始化并且结果未定义。

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