C “做”;int i=10&引用;及;int i;i=10&引用;当i是全局变量时,是否执行不同的函数?

C “做”;int i=10&引用;及;int i;i=10&引用;当i是全局变量时,是否执行不同的函数?,c,C,请参考下面显示的程序。我得到以下编译器警告 bash-3.2$gcc-Wall test1.c test1.c:6:警告:数据定义没有类型或存储类 test1.c:6:警告:在“j”的声明中,类型默认为“int” 通常,在函数外部写入运行时操作时会引发此警告。所以我想问,为什么在全局范围内,“intj;j=20”会发出警告,而“inti=10”不会 #include <stdio.h> int i = 10; int j; j=20; int

请参考下面显示的程序。我得到以下编译器警告

bash-3.2$gcc-Wall test1.c test1.c:6:警告:数据定义没有类型或存储类 test1.c:6:警告:在“j”的声明中,类型默认为“int”

通常,在函数外部写入运行时操作时会引发此警告。所以我想问,为什么在全局范围内,“intj;j=20”会发出警告,而“inti=10”不会

   #include <stdio.h>

   int i = 10;

   int j;
   j=20;

   int
   main(void)
   {
       int k;

       k = 30;

       printf("%d %d %d\n", i, j, k);

       return 0;
   }
#包括
int i=10;
int j;
j=20;
int
主(空)
{
int k;
k=30;
printf(“%d%d%d\n”,i,j,k);
返回0;
}
这一行

j=20;
这不是一项任务。它是
j
的声明,它使用了
int
的隐式类型

C允许您在全局范围内对同一变量进行多个声明,只要它们匹配:

int j;
int j;
int j = 20;
C99 C之前的标准在未指定任何类型时也假定类型为
int

以下是您如何打破您的示例:

double j;
j = 20;
这不会编译,因为
j
被声明为
double
,然后被重新声明为
int

int i; 这是一个初步的定义。
以下定义I=10;把它转换成声明。

你把警告读到最后了吗?@DeiDei:我现在看到了。“警告:在'j'的声明中,类型默认为'int'”实际上表明j=20是一个声明。谢谢。请注意,隐式int仅在C89中有效,在C99及更高版本中无效。@DeiDei您是对的,我应该提到这种做法已经被禁止了很长一段时间。在C99和C11中,暂定定义也是合法的。只有隐式int在C99中“停止工作”