在此c
计划中
a=8;
main()
{
printf("%d", a);
}
变量a已声明没有任何数据类型,但该程序仍然成功编译并提供所需的输出 输出::
8
在ideone上看到它 但是,当我在main中声明相同的变量时,它会产生编译错误。
main()
{
a=8;
printf("%d", a);
}
输出::
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’
请参阅here。
第一个程序如何工作但第二个程序正在运行?
答案 0 :(得分:23)
您在此处看到的是 "Implicit Int Rule" 。简单地说规则说:
“没有显式类型名称的 变量声明 被假定为
int
类型。”
请注意,此规则在c99标准 [Ref 1] 中被撤销。但是,根据您的编译器及其设置,第一个示例可能会带有警告进行编译,或者无法编译( 具有严格的编译设置)
如果您使用符合c99标准的严格设置编译您的第一个示例,编译器将告诉您根本原因。
检查 here 。
cc1:警告被视为错误
prog.c:1:错误:数据定义没有类型或存储类
prog.c:1:错误:在'a'的声明中类型默认为'int' prog.c:3:错误:返回类型默认为'int'
prog.c:在函数'main'中:
prog.c:4:错误:函数'printf'的隐式声明
prog.c:4:错误:内置函数'printf'的不兼容的隐式声明
编辑:
为什么第一个示例有效,但第二个没有?
注意强调规则中的“变量声明”字样。
在第一个示例中,由于语句位于全局范围,因此将其视为 隐式声明 ,并且隐式Int规则获取适用于它。
在第二个示例中,该语句用作 分配,而不是声明 。由于没有声明,隐式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 .....
.....
答案 1 :(得分:4)
a=8;
看起来像声明声明,其中a
是声明说明符,= 8
是初始值设定项。 C用于允许在声明说明符中省略类型,在这种情况下默认为int
。 (自C99以来,不再允许这样做。)
但是,在函数中,a=8;
看起来像表达式语句(赋值表达式),而符号a
未解析。 (请注意,在函数之外没有表达式语句。)
如果你试图做,例如static a = 8;
,那么它将再次看起来像一个声明,并且应该编译,因为该类型将默认为int。
无论如何,不要依赖于:-)清楚地写下你的类型。
答案 2 :(得分:0)
这是因为在C中,任何变量/函数都是隐式的int
。
这与您使用register
代替register int
或unsigned
代替unsigned int
,auto
而不是{{1}的原因相同}和auto int
代替static
。我个人总是使用static int
明确限定我的变量,但不管你是否这样做都是你的选择。
答案 3 :(得分:0)
即使您没有编写数据类型,您的变量也有数据类型(int)。
利用该功能是不好的做法。
显然你的编译器不允许在函数内部发生这种情况。这是有道理的,因为如果它确实允许“a = 8;”在一个函数中,很难捕获某些错字。
答案 4 :(得分:0)
在C ++ 11中,有auto
关键字。遗憾的是,C和C ++是强类型语言,需要为每个声明的变量定义严格类型。一些编制者假设int是默认值,但它是他们的心态,不应该使用它,因为它已被承认
作为一种错误的编程习惯。
答案 5 :(得分:0)
甚至函数参数也可以写为隐式int。 例如:
fun(n){printf("%d",n);}
上面的代码工作正常,但一旦参数中包含固定数据类型,例如
fun(n,char c){ printf("%d",n);}
显示错误: 错误:预期')'之前' char' |