нулевое значение равно нулю (0)?

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

{
    int max=0,x[5];
    for(int a=0;a<5;a++)
    {
        cout<<"Enter no "<<a+1<<" : ";
        cin>>x[a];
        if(max<x[a])
    {
        max=x[a];
    }

    }
    cout<<endl<<max;
}

выход:

Enter no 1 : 1
Enter no 2 : 5
Enter no 3 : 8
Enter no 4 : 7
Enter no 5 : 5

8

и когда тип max=0 означает, что в объявлении присваивается 0 значение max

это дает мне тот же результат, что означает, что нулевое значение равно 0. если да, то в чем разница между null value и 0


person user195081    schedule 17.11.2018    source источник
comment
это дает мне тот же результат что дает вам тот же результат?   -  person eerorika    schedule 17.11.2018
comment
Ваш программист смешивает концепции вводящим в заблуждение образом. В C++ нет такой вещи, как нулевое значение, возникающее из-за того, что переменная не инициализирована. Если int не инициализирован, то оценка его значения дает неопределенное поведение, что (в общих чертах) означает, что стандарт C++ не определяет, что происходит. Любое последствие, которое вы можете себе представить при его оценке, теоретически возможно (значение нежелательной почты, ноль, переформатирование жесткого диска, другое значение, если код создан с помощью другого компилятора, значение, изменяющееся в зависимости от фазы луны и т. д. и т. д.).   -  person Peter    schedule 17.11.2018


Ответы (3)


На самом деле это зависит от того, на каком языке программирования вы пишете свой код. Например, если вы получаете доступ для чтения к неинициализированной переменной в c/c++, вы не можете знать, какое значение она вам даст. Память не обнуляется при выделении переменной, поэтому какие бы биты там ни были, они будут прочитаны как значение типа этой переменной.

Собственный язык Game Maker, GML, позволяет вам решить во время компиляции, должны ли неинициализированные переменные быть установлены в 0 по умолчанию или нет; но любой порядочный программист отключил бы эту опцию и не стал бы полагаться на нее; я не знаю других языков, которые автоматически инициализируют значения переменных.

Я бы сказал, что полагаться на такую ​​функцию — плохая практика.


Что касается разницы между нулем и 0, на самом деле это зависит от базового типа вашей переменной. Целое число может хранить только целые числа, поэтому null по-прежнему будет читаться как целое число.

person Barnack    schedule 17.11.2018

Если вы по умолчанию инициализируете объект основного типа (например, int) в автоматическом хранилище, значение будет неопределенным. Поведение при чтении неопределенного значения не определено.

Неопределенное поведение означает, что стандарт никоим образом не ограничивает поведение программы. Что касается стандарта С++, возможное поведение включает, ни одно из которых не гарантируется:

  • Результат, который вы ожидаете.
  • Результат, которого вы не ожидаете.
  • Тот же вывод, что и у некоторых программ без UB.
  • Вывод отличается от вывода некоторых программ, у которых нет UB.
  • Любой выход.
  • Никакого вывода.
  • Побочные эффекты, которые вы ожидаете.
  • Побочные эффекты, которых вы не ожидаете.
  • Любые побочные эффекты.
  • Никаких побочных эффектов.
  • Possible side-effects include:
    • Corruption of data.
    • Уязвимости безопасности.
    • Все, что в пределах возможностей процесса, надеюсь, ограничено ОС.
  • Непоследовательное поведение в других системах.
  • Непоследовательное поведение даже в той же системе при повторной компиляции с использованием другого компилятора.
  • Непоследовательное поведение даже при повторной компиляции с использованием того же компилятора.
  • Inconsistent behaviour even without recompilation during another execution:
    • Possibly only when you're on vacation.
    • Возможно, только когда вы демонстрируете свою программу своему работодателю или важному клиенту.
  • Последовательное поведение во всех вышеперечисленных случаях.

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

В C++ нет такого понятия, как null value integer. Существует такая вещь, как нулевой указатель, а также нулевой символ, ни один из которых не связан напрямую друг с другом и не имеет ничего общего с неинициализированной переменной.

Ваш программист использует запутанную терминологию, но если под нулевое значение они имели в виду неопределенное значение, то они правы. И в этом случае ваш вопрос становится в чем разница между неопределенным значением и 0, а ответ заключается в том, что чтение неопределенного значения является поведением undefined (см. выше).

когда тип max=0 означает, что при объявлении присвоить 0 max

Чтобы быть педантичным, у вас есть int max=0, который является не присваиванием, а инициализацией.

person eerorika    schedule 17.11.2018
comment
Вы даже можете получить носовых демонов, когда у вас неопределенное поведение. catb.org/jargon/html/N/nasal-demons.html< /а> - person rsjaffe; 17.11.2018

В С++ нет нулевого значения. Локальные примитивы не инициализированы (вы получите мусор, который просто оказался в памяти в это время), в то время как статические и глобальные переменные инициализированы нулями. Таким образом, говоря int max;, вы либо получите случайный мусор, либо ноль (в зависимости от того, где вы его объявили).

person vrtex    schedule 17.11.2018
comment
что ноль окажется просто еще одним случайным мусором - person Barnack; 17.11.2018
comment
@barnack - этот ноль означает, что инициализация по умолчанию является нулевой инициализацией в некоторых контекстах, например. int длительности статического хранения по умолчанию инициализируется нулем. int max вне функции инициализируется нулем. Это не очередной случайный мусор. - person Peter; 17.11.2018