Я назвал функцию вот так,

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. скажите пожалуйста причину.

0
Balayesu Chilakalapudi 15 Мар 2014 в 13:53
У вашего компилятора закончились имена переменных? Если нет, то зачем вам такой код?
 – 
Abhineet
15 Мар 2014 в 14:21
Я использую mingw для компилятора С++
 – 
Balayesu Chilakalapudi
15 Мар 2014 в 14:23
Все в порядке, но я не понимаю причину вашего блока else. Почему вы хотите назвать свою локальную переменную другого блока так же, как переменную уровня вашей функции? Почему вы не можете просто переименовать переменную «m» внутри else?
 – 
Abhineet
15 Мар 2014 в 14:24
అభినీట్ గారు , నాకు చాల బాగా అర్ధమయ్యింది.
 – 
Balayesu Chilakalapudi
25 Мар 2014 в 10:32

4 ответа

Лучший ответ

Вы определили другую переменную с именем m в блоке else, которая затеняет аргумент функции m, ее область действия начинается сразу после int m, и она не инициализирована в выражении { {X4}}.

2
Yu Hao 15 Мар 2014 в 13:58
Почему эта повторяющаяся переменная m создает необработанные данные
 – 
Balayesu Chilakalapudi
15 Мар 2014 в 14:01
m в m/2 уже является новой переменной, а не m снаружи, она не инициализирована.
 – 
Yu Hao
15 Мар 2014 в 14:05

В операторе int m=m/2; здесь m с правой стороны содержит новый m, имеющий значение мусора. если вы замените строку int m=m/2; на строку int m;//=m/2;, вы увидите, что значение на самом деле является мусорным значением m, то есть 2368340 для 1-го случая, когда вы делите это значение на 2, чтобы получить 1184170(m/2) into m(m)

1
Balu 15 Мар 2014 в 14:17

Вы определяете другую переменную с тем же именем m внутри блока else и выполняете операцию

int m =m/2;

Поэтому компилятор будет обрабатывать локальный m, а не посторонний m; и его ценность непредсказуема, потому что вы не инициализируете его;

1
Yu Hao 15 Мар 2014 в 14:18

Переменная 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 ;
0
Balu 15 Мар 2014 в 14:11