在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
,隐式类型为int
( int 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
直接初始化变量。