2

在下面的代码中,为什么全局变量“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);
      }
4

3 回答 3

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]
于 2013-03-31T21:49:28.483 回答
3

原因是这两行:

  int x;
  x = 303;

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

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

int x = 1;

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

x = 303;

在这里,xmyFunction看到什么值?它会看到值 1,还是会看到值 303?

另一方面,如果我们有

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

更清楚一点的是,我们应该按顺序执行这些语句,所以303会被打印出来。

希望这可以帮助!

于 2013-03-31T21:49:20.720 回答
1

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

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

于 2013-03-31T21:47:13.893 回答