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

时间:2012-06-16 14:33:58

标签: c variables

在此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

第一个程序如何工作但第二个程序正在运行?

6 个答案:

答案 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:1994ISO/IEC 9899/COR2:1995ISO/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 intunsigned代替unsigned intauto而不是{{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' |