变量在没有赋值的情况下具有值 C++

Variable has value without being assigned C++

#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 这很奇怪,因为该值没有在代码中的任何地方分配。

你能解释一下为什么我会得到这个结果吗?

只需将函数更改为

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; 

如果您尝试访问未初始化的变量,您将获得垃圾值,因为这是未定义的行为。编译器只会给它一些垃圾值。

这个 link 可能有用

What happens to a declared, uninitialized variable in C? Does it have a value?

编译程序时,您创建的变量(在本例中为number_placement)将分配一些内存space(内存中的一个位置,有一个地址) .如果您尝试访问此地址(我谈到过这个 space),并且您之前没有为其分配任何内容,您将读取那里留下的内容,即当前值。我们称它为 garbage,因为它是其他一些应用程序的剩余内存,这些应用程序之前可能一直在使用这个内存位置,或者只是一些内存在之前没有分配任何值内存已开机(或损坏,因为内存未使用,因此未刷新此位置)。

总是初始化你的变量。

我的意思是:不要从之前未赋值的变量中读取值。

在你的情况下,如果你想从零开始你的计数器,你应该用零初始化它:

int number_placement = 0;

访问它之前(在您的情况下,递增它)。