在c中声明没有任何数据类型的变量

Eig*_*ght 24 c variables

在这个c计划中

a=8;
main()
{
    printf("%d", a);
}   
Run Code Online (Sandbox Code Playgroud)

已声明变量a没有任何数据类型,并且此程序仍然成功编译并提供所需的输出.
输出::

8  
Run Code Online (Sandbox Code Playgroud)

ideone上看到它.
但是,当我在main中声明相同的变量时,它会产生编译错误.

main()
{
     a=8;
    printf("%d", a);
}  
Run Code Online (Sandbox Code Playgroud)

输出::

prog.c:2: warning: return type defaults to ‘int’
prog.c: In function ‘main’:
prog.c:3: error: ‘a’ undeclared (first use in this function)
prog.c:3: error: (Each undeclared identifier is reported only once
prog.c:3: error: for each function it appears in.)
prog.c:4: warning: implicit declaration of function ‘printf’
prog.c:4: warning: incompatible implicit declaration of built-in function ‘printf’  
Run Code Online (Sandbox Code Playgroud)

看到这里.

第一个程序如何工作但第二个程序如何工作?

Alo*_*ave 26

你在这里看到的是"Implicit Int Rule".简单地说规则说:

" 声明没有显式类型名称的变量被认为是类型int."

请注意,此规则在c99标准[参考1]中被撤销.但是,根据您的编译器及其设置,第一个示例可能会带有警告进行编译,或者无法编译(使用严格的编译设置)

如果您使用符合c99标准的严格设置编译您的第一个示例,编译器将告诉您根本原因.

检查这里.

cc1:警告被视为错误
prog.c:1:错误:数据定义没有类型或存储类
prog.c:1:错误:在'
a'prog.c的声明中类型默认为'int' :3:错误:返回类型默认为'
int'prog.c:在函数'main'中:
prog.c:4:错误:函数'printf'的隐式声明
prog.c:4:错误:内置函数的不兼容的隐式声明' printf的"

编辑:

为什么第一个例子有效,但第二个没有?

请注意强调规则中的"变量声明".

在第一个示例中,由于语句位于全局范围,因此将其视为Implicit声明,并将Implicit Int Rule应用于它.

在第二个例子中,该陈述充当分配而不是宣言.由于没有声明,因此Implicit int规则不适用于此处.在没有任何类型的情况下,编译器无法确定什么类型,a因此报告错误.


[参考1]

C99标准:前言
第5段:

此版本取代了以前的版本,ISO/IEC 9899:1990如通过经修正和更正ISO/IEC 9899/COR1:1994,ISO/IEC 9899/COR2:1995ISO/IEC 9899/AMD1:1995.
从以前的版本的主要变化包括:
.....
.....
-删除隐式int
.....
.....

  • @pmr:希望编辑的答案满足您的反对意见. (2认同)
  • @ nitish712:您需要通过启用所有编译器警告来编译您的程序.`-Wall`以防您使用gcc.C和C++标准不要求编译器检查函数是否在所有代码路径中返回值,因此默认情况下编译器不会提供此诊断,您需要明确告诉编译器这样做.另外,请注意wrt函数`main `虽然某些功能在某些方面受到标准的特殊处理,但您可能需要检查这些规则的标准. (2认同)

Kos*_*Kos 7

a=8;函数外部看起来像一个声明语句,其中a是声明说明符,= 8是初始值设定项。C 过去允许在声明说明符中省略类型,int在这种情况下默认为。(从 C99 开始,这不再被允许。)

然而,在函数中,a=8;看起来像一个表达式语句(一个赋值表达式)并且符号a没有被解析。(请注意,您没有函数之外的表达式语句。)

例如static a = 8;,如果您尝试这样做,那么它看起来又像一个声明,并且应该编译,因为类型将默认为 int。

无论如何,不​​要依赖那个:-) 清楚地写下你的类型。