Подтвердить что ты не робот

Булевы переменные не всегда ложны по умолчанию?

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

4b9b3361

Ответ 1

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

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

struct X
{
  bool b;
  X() : b() {}
};

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

см. wikipedia

Ответ 5

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

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

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

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

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