【问题标题】:Why are we not allowed to have assignment statements in the file scope in C?为什么我们不允许在 C 的文件范围内有赋值语句?
【发布时间】:2014-10-04 18:03:29
【问题描述】:

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

#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(){
 ...
}

同样,如果不存在此规则,我们将面临什么后果?

请注意我的问题不完全是为什么会发生这种情况?我试图弄清楚为什么首先给出这些限制。

【问题讨论】:

  • 全局区域(函数之间的空间)没有被执行。只有函数被执行。函数之间的全局区域用于告诉编译器为什么目的留出哪些内存。
  • 不仅仅是作业。文件范围内不允许声明,只能声明。
  • 这意味着什么?该代码何时执行,以什么顺序执行?
  • @delnan 我会用更好的语法改变它
  • 您询问的是哪种语言?第二个例子是完美的 C++;只有 C 需要全局变量的常量初始化器。

标签: c global-variables


【解决方案1】:

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

其他语言(例如 C++)在程序启动时有一个动态初始化模型。这是一个复杂的问题,例如因为来自不同编译单元的初始化器在它们之间没有自然顺序,但可能隐含地相互依赖。 SO 也是 this question 的绝佳信息来源。

C 力求保持简单,程序员易于使用,编译器构建者易于实现。

【讨论】:

  • +1 感谢您的快速回复。如果您能对第二段稍作解释或指出一些文章或任何解释该内容的内容,我将不胜感激。看起来很有趣。
【解决方案2】:

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

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

【讨论】:

  • +1 获取优秀信息。很高兴你帮助我学到了一些有用的东西。
猜你喜欢
  • 2015-04-07
  • 2013-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多