在这个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:1995
和ISO/IEC 9899/AMD1:1995
.
从以前的版本的主要变化包括:
.....
.....
-删除隐式int
.....
.....
a=8;
函数外部看起来像一个声明语句,其中a
是声明说明符,= 8
是初始值设定项。C 过去允许在声明说明符中省略类型,int
在这种情况下默认为。(从 C99 开始,这不再被允许。)
然而,在函数中,a=8;
看起来像一个表达式语句(一个赋值表达式)并且符号a
没有被解析。(请注意,您没有函数之外的表达式语句。)
例如static a = 8;
,如果您尝试这样做,那么它看起来又像一个声明,并且应该编译,因为类型将默认为 int。
无论如何,不要依赖那个:-) 清楚地写下你的类型。