Объявление переменной вне основной функции изменяет вывод, даже если есть только основная функция - PullRequest
2 голосов
/ 29 апреля 2020

Итак, я работал над вопросом, и эта мысль наткнулась на меня. Когда я объявляю переменную вне основной функции, программа работает правильно, то есть она достигает другого случая «Friendship is magi c», но если переменная объявлена ​​внутри, вместо выражения Friendship возвращается Chris.

int mis, chr;
int main() {
    int a, n, m; 
    cin >> a;
    for (int i = 0; i < a; i++) {
       //code here
    }
    if(mis > chr) 
        cout << "Mishka";
    else if(chr > mis)
        cout << "Chris";
    else
        cout << "Friendship is magic!^^";
}

Используемый мною ввод делает значения chr и mis равными, поэтому он должен вычисляться в операторе else, но вместо этого он просто останавливается на else, если.

Ответы [ 2 ]

5 голосов
/ 29 апреля 2020

" С большой силой (предоставленной C ++) также должна быть большая ответственность "

И

" С неинициализированными переменными приходит неопределенное поведение"

Переменные, объявленные в глобальной области видимости, инициализируются компилятором. Однако переменные, определенные внутри любой функции (т. Е. Имеющие automati c storage ), могут содержать значения мусора (которые могут различаться при каждом вызове программы). Я рекомендую всегда инициализировать ваши переменные некоторым значением.

int main() 
{
    int mis = 0, chr = 0;
    // ...

    return 0;
}

Давайте теперь перейдем к вашей программе:

Когда я объявляю переменную вне главной функции, программа работает правильно, то есть он достигает еще одного случая: «Дружба - это волхвы» c

Это происходит потому, что переменные (от которых зависит ваша лестница) инициализируются в 0. Поскольку обе переменные имеют одинаковое значение (0), выполняется другая часть оператора if.

, но если переменная объявлена ​​внутри, вместо выражения Friendship возвращается Chris.

Это прекрасный пример неопределенного поведения. Если они определены внутри вашей функции, они будут содержать некоторое значение мусора, которое может быть не равным. Следовательно, то, что вы наблюдаете, является неопределенным поведением, и вы можете получить разные результаты на разных машинах или даже иногда на одной машине.

1 голос
/ 29 апреля 2020

Я попробовал ваш код, и он работает одинаково для меня в обоих случаях. Итак, я бы сказал, что он меняется с редактором на редактор и всегда инициализирует переменную перед ее использованием. В противном случае мы можем столкнуться с той же проблемой, что и вы. Как это инициализирует переменные со значениями мусора.

...