2012-06-16 33 views
20

En este programa cla declaración de variables sin cualquier tipo de datos en c

a=8; 
main() 
{ 
    printf("%d", a); 
} 

variable a se ha declarado sin ningún tipo de datos y todavía este programa compila con éxito y da la salida deseada.
de salida ::

8 

ver en ideone.
pero, cuando declare la misma variable dentro de main, da error de compilación.

main() 
{ 
    a=8; 
    printf("%d", a); 
} 

de salida ::

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’ 

ver here.

¿Cómo funciona el primer programa, pero el segundo?

Respuesta

22

Lo que ves aquí es "Implicit Int Rule" en el trabajo. En pocas palabras la regla dice:

"A variable declared without an explicit type name is assumed to be of type int ."

Tenga en cuenta que esta regla fue revocada en el estándar C99 [Ref 1] .Sin embargo, dependiendo de su compilador y su configuración, el primer ejemplo podría compilar con una advertencia, o no compilará (con configuración de compilación estricta)

Si compila su primer ejemplo con una configuración estricta que cumpla con c99 Standard, el compilador le dirá la causa raíz.

check here.

cc1: warnings being treated as errors
prog.c:1: error: data definition has no type or storage class
prog.c:1: error: type defaults to ‘int’ in declaration of ‘a’
prog.c:3: error: return type defaults to ‘int’
prog.c: In function ‘main’:
prog.c:4: error: implicit declaration of function ‘printf’
prog.c:4: error: incompatible implicit declaration of built-in function ‘printf’

EDIT:

why does the first example work but second does not?

nota el énfasis en las palabras "variable declarada" en la regla.

En primer ejemplo, ya que la declaración es en el ámbito global que es tratada como una declaración implícita , y el implícito Regla Int se aplica en ella.

En segundo ejemplo, la declaración actúa como una asignación y no una Declaración. Como no hay declaración, la regla implícita implícita no se aplica aquí. En ausencia de cualquier tipo, el compilador no puede determinar cuál es el tipo de a y, por lo tanto, informa el error.


[Ref 1]

C99 Standard: Prólogo
Para 5:

This edition replaces the previous edition, ISO/IEC 9899:1990 , as amended and corrected by ISO/IEC 9899/COR1:1994 , ISO/IEC 9899/COR2:1995 , and ISO/IEC 9899/AMD1:1995 .
Major changes from the previous edition include:
.....
.....
— remove implicit int
.....
.....

+0

Lo cancelé ;-) – sczizzo

+0

Siento que tiene valor. Sin embargo, para una respuesta más completa, podría explicar que en el segundo ejemplo, 'a = 8' es una asignación, no una declaración. – sczizzo

+2

@pmr: Espero que la respuesta editada satisfaga tu objeción. –

0

Es porque en C, cualquier variable/función es implícitamente int.

Esta es la misma razón que se puede utilizar en lugar de registerregister int, o en lugar de unsignedunsigned int, en lugar de autoauto int y static en lugar de static int. Personalmente siempre califico explícitamente mis variables con int, pero si lo hace o no es su opción.

+0

En Shakespearean C. –

0

Su variable tiene un tipo de datos (int) aunque no haya escrito el tipo de datos.

Es una mala práctica aprovechar esta característica.

Aparentemente su compilador no permite que eso suceda dentro de una función. Eso tiene sentido porque si permitía "a = 8"; en una función, sería muy difícil capturar ciertos tipos de letra.

0

En C++ 11, existe la palabra clave auto .Lamentablemente, C y C++ son lenguajes fuertemente tipados, que requieren la definición de un tipo estricto para cada variable declarada. Algunos cumplidores asumen int como predeterminado, pero es su buena voluntad y no debe usarse, porque se reconoce como un hábito de programación incorrecto.

+0

Esta pregunta es sobre C en lugar de C++. C es un lenguaje con un estándar que puede usarse para responder esta pregunta. –

4

a=8; fuera de la función se parece a un DECLARACIÓN declaración, donde a es el especificador de declaración y = 8 es el inicializador. C solía permitir omitir los tipos en los especificadores de declaración y los valores predeterminados a int en ese caso. (Desde C99, esto ya no es permitido.)

Sin embargo, en una función, a=8; se parece a una declaración expresión (una expresión de asignación) y el símbolo a no se resuelve. (Tenga en cuenta que no tiene declaraciones de expresión fuera de las funciones).

Si intentó hacer, por ejemplo static a = 8;, entonces volvería a parecerse a una declaración, y debería compilarse porque el tipo predeterminado sería int.

De todos modos, no confíe en eso :-) Escriba sus tipos con claridad.

+0

@AnttiHaapala Realmente me gustaría que C99 fuera un lugar común hace 18 años. :(Actualizado la respuesta, se ve bien ahora? – Kos

+0

Mucho mejor ;-) –

0

incluso un parámetro de función puede escribirse como implícito int. ejemplo:

fun(n){printf("%d",n);} 

El código anterior funciona bien, pero una vez que un tipo de datos fija está incluido en los parámetros, como

fun(n,char c){ printf("%d",n);} 

Muestra de error: de error: se esperaba ')' antes de 'carbón' |

+0

Este es un problema separado a la pregunta. 'fun (n)' introduce una definición de función estilo K & R –

Cuestiones relacionadas