"Мюррэй Хилл, Бьярн Страустрап. Язык С++" - читать интересную книгу автора

int x; // ошибка
}

содержит ошибку, так как x определено дважды в одной и той же
области видимости.

2.1.2 Объекты и Адреса (Lvalue)

Можно назначать и использовать переменные, не имеющие имен, и
можно осуществлять присваивание выражениям странного вида
(например, *p[a+10]=7). Следовательно, есть потребность в имени
"нечто в памяти". Вот соответствующая цитата из справочного
руководства по C++:"Объект есть область памяти; lvalue есть
выражение, ссылающееся на объект"(#с.5). Слово "lvalue"
первоначально было придумано для значения "нечто, что может стоять
в левой части присваивания". Однако не всякий адрес можно
использовать в левой части присваивания; бывают адреса, ссылающиеся
на константу (см. #2.4).

2.1.3 Время Жизни

Если программист не указал иного, то объект создается, когда
встречается его описание, и уничтожается, когда его имя выходит из
области видимости, Объекты с глобальными именами создаются и
инициализируются один раз (только) и "живут" до завершения
программы. Объекты, определенные описанием с ключевым словом
static, ведут себя так же. Например*:

____________________
* Команда #include была выброшена из примеров в этой
главе для экономии места. Она необходима в примерах, производящих
ввывод, чтобы они были полными. (прим. автора)

- стр 51 -

int a = 1;

void f()
{
int b = 1; // инициализируется при каждом вызове f()
static int c = 1; // инициализируется только один раз
cout << " a = " << a++
<< " b = " << b++
<< " c = " << c++ << "\n";
}

main()
{
while (a < 4) f();
}