局部变量产生不同的价值

时间:2014-03-15 09:53:02

标签: c++ scope

我已经调用了这个函数,

decimal2binary(1, 4);  

我错误地在以下函数的定义部分中重新定义了变量m

void decimal2binary(int m, int n) {
int arr[n];
cout<<"m:"<<m<<endl;
for(int i=0;i<n;i++)
{
if(m==0)
{
    arr[i]=0;
}
else
{       
    arr[i]=m%2;     
    int m=m/2;
    cout<<"m:"<<m<<endl;
}
}

当我运行代码时,我得到了这样的输出,

m:1
m:1184170
m:592085
m:296042
m:148021

为什么这个重复变量m会产生奇怪的值,例如1184170..592085。请告诉我原因。

4 个答案:

答案 0 :(得分:2)

您在m块中定义了名为else的另一个变量,该变量隐藏了函数参数m,其范围在int m之后开始,并且&#39 ; s未在表达式m/2中初始化。

答案 1 :(得分:1)

在声明int m=m/2;右侧m右侧包含具有垃圾值的新m。如果您使用行int m=m/2;替换行int m;//=m/2;,您会看到该值实际上是m的垃圾值,2368340对于第一种情况,您将此值除以2得到1184170(m/2) into m(m)

答案 2 :(得分:1)

在else块中定义另一个具有相同名称m的变量并执行操作

int m =m/2;

所以编译器这将对待本地m而不是局外人m; 并且它的价值是不可预测的,因为你没有初始化它;

答案 3 :(得分:0)

int m块内的变量else未初始化。它包含一些垃圾值。您将垃圾值除以2.现在,当我们说它未初始化时,它意味着,它可以包含int范围内的任何值。

我想,你想做的是::

// Inside else block
int temp = m ; // Store the older m value here
int m = temp/2 ;

或简单方法::

int temp = m/2 ;