为什么我不能将值赋给C中函数外的全局变量?

假设我有一个全局变量,我想为它分配另一个变量。 我发现你可以为函数内的全局变量赋值:

int i = 8; int main(void) { i = 9; /* Modifies i */ return 0; } 

但是,在函数外部分配全局变量不起作用!

 int i = 8; i = 9; /* Compiler error */ int main(void) { return 0; } 

我收到以下错误消息:

 warning: data definition has no type or storage class warning: type defaults to 'int' in declaration of 'i' error: redefinition of 'i' note: previous definition of 'i' was here int i = 8; ^ 

为什么会这样?

这是全局变量的定义,可选的初始化为特定值:

 int i = 8; 

请注意,它不是可执行的代码,变量只会被设置为最初包含8.要么将其视为“魔法”(对于许多未经标准定义的事物的有用模型),要么考虑具有值的表在执行任何代码之前复制到内存位置。

这是一段没有执行“框架”的代码。
(或者你打算成为。编译器有其他意见,见下文。)

 i = 9; 

没有包含它的function。 目前尚不清楚何时应该执行。 这就是编译器不喜欢的东西。
在C中,所有代码都必须在函数内部,并且只有在调用该函数时才会执行,例如从main()

其他语言,主要是那些通过解释它们来执行“脚本”(而不是将代码转换为可执行程序,例如通过编译器)的语言,允许在任何地方使用代码。 C是不同的。

编译器看到的不同:

 i = 9; 
  • 它不在函数内部,所以它不能是代码
  • 它看起来像一个变量定义,假设你的意思是它是一个int ,即默认值
  • 但依赖默认值并不是一个好主意,所以警告缺少类型并使用默认值
  • 另外,如果它一个定义,那么它是i的第二个,现在确实是错误的,所以显示错误并且编译失败
  • 只是为了提供帮助,请提一下i的第一个定义

这是如何读取您引用的编译器输出。