Почему нам не разрешено иметь инструкции присваивания в области файлов в C?

Почему нам разрешено объявлять и определять переменные в глобальном разделе? Почему бы не включить назначение в глобальный раздел? Пример:

#include int a; a=5;//Valid because its similar to int a=5; Therefore a initialiser to a Tentative definition a=8;//Invalid because We can have only one initialiser for a tentative definition void main(){ ... } 

Почему нам это надо? Каковы были бы последствия, если бы нам разрешили иметь более одного инициализатора до пробного определения

Мой следующий вопрос: почему разрешены только постоянные элементы инициализатора?

 #include int i=5; int j=i+5;//[Error] initializer element is not constant void main(){ ... } 

Точно так же были бы последствия, с которыми мы сталкиваемся, если бы этого правила не было?

Пожалуйста, обратите внимание, что мой вопрос не совсем точно, почему это происходит? Я пытаюсь понять, почему эти ограничения были даны в первую очередь.

Нам не разрешено использовать назначение в области файлов, потому что выполнение программы начинается с основного. Компилятор создает функцию _start, которая выполняется сначала, а затем происходит переход к основному. Когда основные возвраты, управление возвращается к _start, который имеет правильную процедуру выхода для завершения программы. Итак, все, что написано вне функций, предназначено только для инициализаций, которые будут выполняться во время компиляции

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

По обоим вопросам ответ один и тот же, в области файлов нет выполнения инструкций или оценки выражений, все это делается во время компиляции.

Другие языки (пример C ++) имеют модель для динамической инициализации при запуске программы. Это сложная проблема, например, поскольку инициализаторы, которые поступают из разных единиц компиляции, не имеют естественного порядка среди них, но могут неявно зависеть друг от друга. SO также является отличным источником информации для этого вопроса .

C пытается оставаться простым, простым в использовании для программиста и простым в реализации для компиляторов.