Найти в Дзене

Основы С++: Что такое неопределенное поведение и почему переменные нужно инициализировать?

С самой инициализацией мы познакомились в этой статье. Тем не менее в ней я не объяснял опасности исходящие от неинициализированных переменных. Разберемся с тем, что же такое инициализация и зачем переменные инициализировать в этом, отдельном материале. Многие языки программирования автоматически инициализируют созданные переменные значением "0". В C++ этого не происходит, созданная, но неинициализированная переменная принимает мусорное значение (любое) из области памяти, в которой она хранится. Почему в C++ нет автоматической инициализации? Отсутствии автоматической инициализации пришло в C++ из его предшественника C. Во времена C, компьютеры были достаточно медленные, и автоматическая инициализация множества (допустим 100000) значений в переменных приводила бы к тому, что программа была бы слишком медленной. Именно поэтому в языке C инициализация была "по необходимости". В языке C++ затраты мощностей на инициализацию ничтожны. Вы можете пропускать инициализацию в целях оптимизации ра
Оглавление

С самой инициализацией мы познакомились в этой статье. Тем не менее в ней я не объяснял опасности исходящие от неинициализированных переменных. Разберемся с тем, что же такое инициализация и зачем переменные инициализировать в этом, отдельном материале.

Многие языки программирования автоматически инициализируют созданные переменные значением "0". В C++ этого не происходит, созданная, но неинициализированная переменная принимает мусорное значение (любое) из области памяти, в которой она хранится.

Почему в C++ нет автоматической инициализации?

Отсутствии автоматической инициализации пришло в C++ из его предшественника C. Во времена C, компьютеры были достаточно медленные, и автоматическая инициализация множества (допустим 100000) значений в переменных приводила бы к тому, что программа была бы слишком медленной. Именно поэтому в языке C инициализация была "по необходимости".

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

Есть ли разница между инициализированной и неинициализированной переменной?

Инициализация, на самом деле означает только одно: объекту (переменной) было предоставлено какое-либо известное значение в точке (строке кода), где объект был определен. Напротив, отсутствии инициализации — это всего лишь показатель того, что объекту (переменной) не было присвоено известное значение и он выбрал любое из области памяти, в котором хранится.

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

Резюме:

Инициализация — действие с переменной, в результате которого ей присваивается известное значение в точке ее определения.

Отсутствии инициализации — создание переменной, без присваивания ей известного значения в точки определения.

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

Неопределенное поведение

Неопределенное поведение — это свойство некоторых языков программирования, суть которого в том, что результат выполнения программы по некоторым причинам начинает меняться в зависимости от различных случайных факторов.

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

Если в коде проявляется неопределенное поведение, ваша программа может проявлять следующие негативные свойства:

1. Вы получаете разные результаты при каждом запуске программы.

2. Вы получаете неверный результат, хотя вам кажется, что все должно работать верно.

3. Программа демонстрирует непоследовательное поведение. Код выполняется иногда правильно, а иногда неправильно в разные запуски программы.

4. Программа самопроизвольно прекращает работу сразу после запуска или во время работы.

5. Программа работает на вашем компиляторе, но не работает на других.

6. Программа работает до тех пор, пока вы не внесете в нее изменения, которые, как вам казалось, не были связаны с появившейся позже ошибкой.

Резюме

Вся статья подводит к одному простому утверждению:

Возьмите себе за правило: Всегда инициализировать переменные.