为什么我们不允许在C中的文件范围中有赋值语句



为什么我们只允许在全局部分声明和定义变量?为什么不将作业包括在全局部分?示例:

#include<stdio.h>
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<stdio.h> 
int i=5;
int j=i+5;//[Error] initializer element is not constant
void main(){
 ...
}

同样,如果没有这条规则,我们将面临什么后果

请注意,我的问题不是为什么会发生这种情况?我想弄清楚为什么一开始就有这些限制。

对于这两个问题,答案是相同的,在文件范围内没有执行语句或评估表达式,所有这些都是在编译时完成的。

其他语言(C++就是一个例子)有一个在程序启动时进行动态初始化的模型。这是一个复杂的问题,例如,因为来自不同编译单元的初始值设定项之间没有自然的顺序,但可能隐含地相互依赖。SO也是这个问题的一个极好的信息来源。

C试图保持简单,程序员使用简单,编译器构建者实现简单。

我们不允许在文件范围内使用赋值,因为程序执行从main开始。编译器创建_start函数,该函数首先执行,然后从那里跳转到main。当main返回时,控制返回到_start,它有适当的退出过程来终止程序。因此,在函数之外编写的任何内容都只适用于编译时进行的初始化

初始化不同于声明和赋值。当我们初始化变量时,编译器会做出这样的安排,当程序开始执行时,它的值将是我们初始化的值。但当我们声明一个变量时,它将具有由其作用域指定的默认初始值。分配是在运行时完成的,而不是在编译时

相关内容

  • 没有找到相关文章

最新更新