Почему это неинициализированное значение, похоже, работает для других, но не для меня? (чрезвычайно простой код на C )

#c

Вопрос:

Этот код не должен работать, так как guess не инициализирован, но инструктору в этом видео на YouTube, которое я смотрел, удалось запустить этот код без каких-либо проблем. Могу ли я узнать причину, по которой я не могу запустить код, но он может?

Видеосвязь со временем == https://youtu.be/vLnPwxZdW4Y?t=8615

 int main() {
    int SecretNum = 7;
    int guess;

    while(SecretNum != guess) {
        cout << "Enter guess: ";
        cin >> guess;
    }
    cout << "You win!";
    return 0;
}
 

Комментарии:

1. Что сделал ваш код?

2. Использование неинициализированных переменных является неопределенным поведением. Переменная может содержать что угодно.

3. Определите «не должно работать». Каким образом, по-вашему, он должен потерпеть неудачу?

4. @user4581301 Сейчас я опубликовал комментарий к видео.

5. «Могу ли я узнать причину, по которой я, похоже, не могу запустить код, но он может?» — Трудно ответить без более подробной информации. (На самом деле, ваш вопрос настолько лишен деталей, что эта цитата-единственный намек на то, что вы не можете запустить код.) Что, по-видимому, мешает вам запустить код? Разве он не компилируется? Заставляет ли это ваш компьютер взрываться, когда вы пытаетесь его запустить? (Обратите внимание, что выполнение кода и получение неожиданного результата отличается от невозможности выполнения кода. Вы хотели сказать, что программа работала не так, как ожидалось?) Сосредоточьтесь больше на наблюдаемых результатах.

Ответ №1:

Этот код не должен работать, так как guess не инициализирован

Правильный. Код имеет неопределенное поведение. Я опубликовал комментарий к видео, в котором говорится об этом.

но инструктору в этом видео на YouTube, которое я смотрел, удалось запустить этот код без каких-либо проблем.

Только по чистой случайности.

Могу ли я узнать причину, по которой я не могу запустить код, но он может?

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

Ответ №2:

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

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

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

Поскольку большую часть времени это не то, чего вы хотите, если, конечно, вы не хотите практиковать навыки отладки своих коллег, вам следует избегать этого.

Всякий раз, когда возникает неопределенное поведение, компилятор, скорее всего, сделает самую простую вещь, в данном случае он ничего не делает.

Ответ №3:

В C локальные переменные по умолчанию не инициализируются. Неинициализированные переменные могут содержать любое значение, и их использование приводит к неопределенному поведению. Однако наличие неинициализированных переменных не является ошибкой. Таким образом, программа будет скомпилирована и запущена.