#include <iostream>
#include <string>
using namespace std;
int count_number_place(int number)
{
int number_placement;
while (number >= 1)
{
number_placement++;
cout << number_placement <<endl;
number/=10;
}
return number_placement;
}
int main(int argc, const char * argv[])
{
// insert code here...
int user_input_number;
cout << "Please enter your number here" << endl;
cin >> user_input_number;
cout << "User input number is "<< user_input_number <<endl;
cout << "The numbers of digits in the input number is :" << count_number_place(user_input_number) << endl;
return 0;
}
我正在尝试创建一个计算给定数字位数的小程序
每当我输入200
之类的数字时,预期结果为3
。相反,我得到了7963
。当我在第number_placement
行放置断点时,我得到了一个默认值7961
这很奇怪,因为该值未在代码中的任何位置分配。
你能解释一下为什么我得到那个结果吗?
答案 0 :(得分:5)
只需将您的功能更改为
即可int count_number_place(int number)
{
int number_placement = 0; // assign 0
while (number >= 1)
{
number_placement++;
cout << number_placement <<endl;
number/=10;
}
return number_placement;
}
即改变
int number_placement;
到
int number_placement = 0;
如果您尝试访问未初始化的变量,您将获得垃圾值,因为它是未定义的行为。编译器只会给它一些垃圾值。
此链接可能有用
What happens to a declared, uninitialized variable in C? Does it have a value?
答案 1 :(得分:3)
编译程序时,您创建的变量(在本例中为number_placement
)将分配一些内存空间(内存中的一个位置,其中包含一个地址)。如果你试图访问这个地址(这个我谈过的空间),而你之前没有给它分配任何东西,你会看到那里留下的东西,它是当前的值。我们称之为 garbage ,因为它是来自其他应用程序的剩余内存,可能之前一直在使用此内存位置,或者只是一些内存在没有任何值分配给它之前自内存供电以来on(或损坏,因为内存没有刷新此位置,因为它未被使用)。
始终初始化您的变量。
我的意思是:不要从之前没有赋值的变量中读取值。
在你的情况下,如果你想从零开始你的计数器,你应该用零初始化它:
int number_placement = 0;
在访问它之前(在你的情况下,递增它)。