Переменная объявление говорит: «в программе есть переменная со следующим именем и типом».
Переменная определение говорит: «Уважаемый мистер Компилятор, пожалуйста, выделите память для переменной со следующим именем и типом сейчас».
Таким образом, для одной и той же переменной может быть несколько объявлений, но должно быть только одно определение.
В C чистым объявлениям (которые также не являются определениями) предшествует ключевое слово extern
. Итак, поскольку в первом примере у вас нет этого ключевого слова, у вас есть два определения. На первый взгляд, это может показаться проблемой (а на самом деле это ошибка в C ++), но в C есть специальное правило «предварительного определения», которое допускает несколько определений для одной и той же переменной, если они все совпадают и не превышают имеет инициализатор. За кулисами компилятор C объединяет все предварительные определения в одно определение.
Вы пытались инициализировать оба определения, например так:
int a = 1;
int a = 2;
Тогда у вас была бы ошибка.
Ваш второй вопрос более прост. В C вы просто не можете иметь исполняемые операторы вне тела функции. Это просто запрещено. Подумайте об этом: когда вы ожидаете, что он запустится, если это будет разрешено?