c - 为什么我们不允许在 C 文件范围内有赋值语句?

标签 c global-variables

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

#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 是 this question 的绝佳信息来源,也是。

C 试图保持简单,对程序员来说简单易用,对编译器构建者来说易于实现。

关于c - 为什么我们不允许在 C 文件范围内有赋值语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26195619/

相关文章:

c++ - C和C++中的全局变量有什么区别?

c++ - 全局变量笑话

c - 数组元素乘法的二叉树方法

C函数将数组分成 block

c - 由于重新声明,我无法编译程序

C#define 语句、枚举、结构

c++ - 尝试使用 ffmpeg C API 取消执行和删除文件

python-3.x - Python - 为什么需要声明非局部和全局变量?

c - C 中的外部声明和头文件

javascript - Node.js:全局变量是否在实例之间共享?