在下面的代码中,为什么全局变量“x”的定义显示警告“数据定义没有类型或存储类”,但同样的事情适用于局部变量“y”?我只是在做什么对于每个变量,首先在一个语句中声明它们,然后在另一个语句中定义它们。它对一个变量有效但是对另一个变量显示警告的区别是什么?
#include<stdio.h>
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);
}
答案 0 :(得分:6)
您正在C89模式下进行编译。
int x;
是x
的暂定定义。
x=303;
然后将解释为具有隐式类型x
(int
)的变量int x = 303;
的定义。在C99或更高版本下,该代码将无法编译,因为“隐式int
”规则被废除且没有“隐式int
”规则,第二行只能被解释为语句,而不是允许在文件范围内。
使用-std=c89 -Wall -Wextra -pedantic
进行编译(并向return 0;
添加main
),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]
答案 1 :(得分:3)
原因是这两行:
int x;
x = 303;
由声明语句(int x;
)和用作语句(x = 303;
)的表达式组成。 C编程语言仅允许在全局范围级别进行声明和定义,并且不允许在全局范围内使用表达式。但是,声明语句和表达式语句在C函数内部都是合法的。
考虑这一点的一种直观方式如下:何时在全局范围内执行代码x = 303;
?想象一下,我们有这个程序:
int x = 1;
void myFunction() {
printf("%d\n", x);
}
x = 303;
此处x
会myFunction
看到什么价值?它会看到值1,还是会看到值303?
另一方面,如果我们有
void myFunction() {
int x;
x = 303;
printf("%d\n", x);
}
我们应该按顺序执行这些语句,这样会更清楚,因此会打印303
。
希望这有帮助!
答案 2 :(得分:1)
您无法在任何函数/块之外执行代码。 x=303;
在您编写它的位置无效。
在这个精确的情况下(全局范围),您只能使用int x=303
直接初始化变量。