我正在练习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吗?
谢谢
答案 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 / 2
时a
尚未初始化,结果不确定。
要解决此问题,只需为float a
改一个新名称即可。
答案 1 :(得分:2)
因为您实际上使用的是声明的变量,但从未声明float a = a/2
时初始化变量。我的计算机可以打印4.49985e-039
,但可以是任何数字。
您感到困惑,因为您有两个具有相同名称的int
和float
变量。最好仔细选择变量的名称,否则您必须跟踪代码以查看哪个指示哪个。
我将在每一行中注释使用变量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;
}
}