Булевы переменные не всегда ложны по умолчанию? - PullRequest
35 голосов
/ 07 января 2011

Я объявил в классе логическую переменную bool abc; и подумал, что по умолчанию она будет ложной. Условие if в моей программе if (abc) оказалось верным, поэтому я вывел значение abc и увидел, что оно содержит значение 55. Это нормально? Всегда ли мы должны присваивать 'bool abc = false', чтобы быть уверенным, что оно ложно?

Ответы [ 5 ]

31 голосов
/ 07 января 2011

Говоря о примитивных встроенных типах данных (bool, char, wchar_t, short, int, long, float, double, long double), согласно стандарту C ++, получают только глобальные переменные значение по умолчанию ноль , если они не инициализированы явно.

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

28 голосов
/ 07 января 2011

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

Чтобы инициализировать bool в false, достаточно построить его по умолчанию:

struct X
{
  bool b;
  X() : b() {}
};
6 голосов
/ 05 июня 2015

По умолчанию только глобальным переменным присваивается 0 (ложь), любые локальные переменные получают ненулевое значение мусора, которое будет иметь значение true в логической переменной.

3 голосов
/ 07 января 2011

Да. ВСЕГДА инициализируйте ваши переменные перед использованием.Даже если язык гарантирует, что они будут иметь конкретные значения.Если вы не можете заставить себя, найдите компилятор, который будет жаловаться, а затем заставьте себя сделать это.:)

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

int i = 0;
while ((i = getNum()) == 5)
{
}

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

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

3 голосов
/ 07 января 2011

Да. Вам нужно либо сделать bool x=false или bool x(false). Примитивы, которые не инициализированы, могут иметь ЛЮБОЕ значение.

см. Википедия

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...