Изменение поведения ошибки "неинициализированная локальная переменная"

Рассмотрим следующий код:

#include "stdafx.h"
using namespace std;


int _tmain(int argc, _TCHAR* argv[])
{
  int count123;
  for (int c = 0; c < 10; c++)
  {
    count123 += c;
  }

    return 0;
}

После компиляции я получаю предупреждение: warning C4700: uninitialized local variable 'count123' used

Я знаю, что причина заключается в объявлении count123, но не в инициализации.

Но если я объявлю count123 как глобальную переменную, как показано в коде ниже, предупреждение исчезнет.

#include "stdafx.h"
using namespace std;

int count123;
int _tmain(int argc, _TCHAR* argv[])
{

  for (int c = 0; c < 10; c++)
  {
    count123 += c;
  }

    return 0;
}

Насколько я знаю, объявление count123 в качестве глобальной переменной изменит ее область, но как это убирает предупреждение? Пожалуйста, руководство.

4 ответа

Решение

Глобальные переменные инициализируются нулями (кстати, то же самое относится и к статическим переменным). Вот почему вы не получаете это сообщение.

Вот стандартная цитата:

8.5 / 10: Каждый объект статической длительности хранения инициализируется нулями при запуске программы перед любой другой инициализацией. В некоторых случаях дополнительная инициализация выполняется позже.

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

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

- если он имеет тип указателя, он инициализируется нулевым указателем;

- если он имеет арифметический тип, он инициализируется равным (положительному или без знака) нулю;

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

Вы можете легко получить черновик стандартов C++, а затем прочитать раздел 8.5 Инициализаторы:

10 [Примечание: каждый объект статической длительности хранения инициализируется нулями при запуске программы перед любой другой инициализацией. В некоторых случаях дополнительная инициализация выполняется позже. —Конечная записка]

Другие вопросы по тегам