在C中,为什么在单独的语句中定义全局变量会引发警告,但是对于局部变量是否可以?

在下面的代码中,为什么全局变量“x”的定义显示警告“数据定义没有类型或存储类”,但同样的事情适用于局部变量“y”?我正在为每个变量做什么首先在一个语句中声明它们,然后在另一个语句中定义它们。它对一个语句有效但是对另一个语句显示警告的区别是什么?

#include int x; x=303; int main(void) { int y; y=776 ; printf("The value of x is %d,and of y is %d",x,y); } 

您正在以C89模式进行编译。

  int x; 

x的暂定定义。

  x=303; 

然后将其解释为变量x ,隐式类型为intint x = 303; )。 在C99或更高版本下,该代码将无法编译,因为“隐式int ”规则已废除且没有“隐式int ”规则,第二行只能被解释为语句,这在文件范围内是不允许的。

使用-std=c89 -Wall -Wextra -pedantic-std=c89 -Wall -Wextra -pedantic添加return 0; ),gcc警告

 redef.c:4:1: warning: data definition has no type or storage class [enabled by default] redef.c:4:1: warning: type defaults to 'int' in declaration of 'x' [-Wimplicit-int] 

原因是这两行:

  int x; x = 303; 

由声明语句( int x; )和用作语句的表达式( x = 303; )组成。 C编程语言仅允许在全局范围级别进行声明和定义,并且不允许在全局范围内使用表达式。 但是,声明语句和表达式语句在C函数内部都是合法的。

考虑这一点的一种直观方式如下:何时代码x = 303; 在全球范围内执行? 想象一下,我们有这个程序:

 int x = 1; void myFunction() { printf("%d\n", x); } x = 303; 

在这里, myFunction看到的x值是多少? 它会看到值1,还是会看到值303?

另一方面,如果我们有

 void myFunction() { int x; x = 303; printf("%d\n", x); } 

更清楚的是我们应该按顺序执行这些语句,因此将打印303

希望这可以帮助!

您不能在任何函数/块之外执行代码。 x=303; 在您编写它的位置无效。

在这个精确的情况下(全局范围),您只能使用int x=303直接初始化变量。