为什么static标志而不是static int标志不会给出任何错误?

为什么static标志而不是static int标志不会给出任何错误?,c,C,看一眼我匆匆写的 #include <stdio.h> static flag; int main() { printf("flag is %d",flag); return 0; } #包括 静态标志; int main() { printf(“标志为%d”,标志); 返回0; } 它不会给出任何警告或错误,工作正常。我不明白为什么会这样?标志被初始化为0,作为一个全局静态变量。如果您尝试使用未初始化的变量,其他语言(如Java)将给出错误。我假设

看一眼我匆匆写的

#include <stdio.h>

static flag;            
int main()
{
printf("flag is %d",flag);
return 0;
} 
#包括
静态标志;
int main()
{
printf(“标志为%d”,标志);
返回0;
} 

它不会给出任何警告或错误,工作正常。我不明白为什么会这样?

标志被初始化为0,作为一个全局静态变量。如果您尝试使用未初始化的变量,其他语言(如Java)将给出错误。我假设这是C,在这种情况下,标志默认为int类型。请不要这样做。这是一种非常糟糕的编程实践。

C在缺少类型时假定
int
。函数定义及其参数也是如此:

// same as int add(int x, int y)
add(x,y) { return x + y; }

// same as int main()
main()
{
}

Staic始终默认为int,static int为0。

int
与另一个关键字结合使用时,
int
是可选的

static int  <--> static
volatile int  <--> volatile
short int <--> short
long int <--> long
static int static
volatile int volatile
短整型短整型
长整长
虽然
short
long
是公认的短格式,但应避免将其与存储关键字(
static
volatile
)一起省略。

主要数据类型是

char , int , float , double
存储类如

auto,static,extern etc
数据类型修饰符,如

long,signed,unsigned etc,
如果存储类或数据类型修饰符缺少变量的主数据类型,则编译器默认情况下将它们视为整数,即使函数返回类型也是如此 未定义。默认情况下,它们被视为int

范例

long i is similar to long int i
static i is similar to static int i

但你不能简单地说i,然后问编译器为什么不把它当作int来处理。这在C语言中是一件很奇怪的事情。比如说@downvoter先生,你能告诉我原因吗?这样我就可以用
标志来声明我的整数?:-)@显然,必须至少有一个存储说明符或类型,不能同时省略这两个,尽管我的GCC接受这一点(带有警告)。