Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么不允许在C中的文件范围中有赋值语句?_C_Global Variables - Fatal编程技术网

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

为什么不允许在C中的文件范围中有赋值语句?,c,global-variables,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 voi

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

#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++是一个例子,它有一个在程序启动时动态初始化的模型。这是一个复杂的问题,例如,因为来自不同编译单元的初始值设定项之间没有自然的顺序,但可能会隐含地相互依赖。这也是一个很好的信息来源


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

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

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


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

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


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

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


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

函数之间的空间的全局区域不会执行。只执行函数。函数之间的全局区域用于告诉编译器为什么目的预留什么内存,而不仅仅是赋值。文件范围中不允许任何语句,只允许声明。这意味着什么?该代码将在何时执行,以何种顺序执行?@delnan我将使用更好的语法对其进行更改,然后您询问的是哪种语言?第二个例子是完全的CulMeund C++;只有C才需要全局变量的常量初始化器。全局区域(函数之间的空间)不会被执行。只执行函数。函数之间的全局区域用于告诉编译器为什么目的预留什么内存,而不仅仅是赋值。文件范围中不允许任何语句,只允许声明。这意味着什么?该代码将在何时执行,以何种顺序执行?@delnan我将使用更好的语法对其进行更改,然后您询问的是哪种语言?第二个例子是完全的CulMeund C++;只有C需要全局变量的常量初始化器。+1感谢您的快速回复。如果你能解释一下第二段,或者给我指一些文章,或者其他解释的话,我会非常感激。这似乎很有趣。谢谢你的快速回复。如果你能解释一下第二段,或者给我指一些文章,或者其他解释的话,我会非常感激。这似乎很有趣。+1表示出色的信息
反倾销。很高兴你帮我学到了一些有用的东西。很高兴你帮我学到了一些有用的东西。