déclaration de variables sans aucun type de données en c

Dans ce programme c

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

la variable a a été déclarée sans aucun type de données et ce programme est toujours compilé avec succès et donne la sortie souhaitée.
sortie ::

 8 

le voir sur ideone .
mais, quand j’ai déclaré la même variable dans main, cela donne une erreur de compilation.

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

sortie ::

 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' 

voir ici .

Comment fonctionne le premier programme mais le second?

Ce que vous voyez ici est la “règle int implicite” au travail. En termes simples, la règle dit:

“Une variable déclarée sans nom de type explicite est supposée être de type int .”

Notez que cette règle a été révoquée dans la norme c99 [Ref 1]. Cependant, en fonction de votre compilateur et de ses parameters, le premier exemple peut être compilé avec un avertissement ou échouera lors de la compilation ( avec des parameters de compilation ssortingcts ).

Si vous comstackz votre premier exemple avec des parameters ssortingcts respectant c99 Standard, le compilateur vous en indiquera la cause.

vérifier ici .

cc1: les avertissements sont traités comme des erreurs
prog.c: 1: error: la définition de données n’a pas de type ni de classe de stockage
prog.c: 1: error: le type par défaut est ‘int’ dans la déclaration de ‘a’
prog.c: 3: error: le type de retour par défaut est ‘int’
prog.c: dans la fonction ‘main’:
prog.c: 4: error: déclaration implicite de la fonction ‘printf’
prog.c: 4: erreur: déclaration implicite incompatible de la fonction intégrée ‘printf’

MODIFIER:

pourquoi le premier exemple fonctionne-t-il mais le second ne fonctionne pas?

Notez l’accent mis sur les mots “variable déclarée” dans la règle.

Dans le premier exemple, étant donné que l’instruction est à la scope globale, elle est traitée comme une déclaration implicite et la règle implicite int est appliquée à celle-ci.

Dans le deuxième exemple, la déclaration agit comme une cession et non comme une déclaration . En l’absence de déclaration, la règle implicite int ne s’applique pas ici. En l’absence de tout type, le compilateur ne peut pas déterminer quel est le type de a et, par conséquent, signale l’erreur.


[Ref 1]

C99 Standard: Avant-propos
Para 5:

Cette édition remplace l’édition précédente ISO/IEC 9899:1990 , telle que modifiée et corrigée par l’ ISO/IEC 9899/COR1:1994 , l’ ISO/IEC 9899/COR2:1995 et l’ ISO/IEC 9899/AMD1:1995 .
Les principaux changements par rapport à l’édition précédente incluent:
…..
…..
– supprime int implicite
…..
…..

a=8; en dehors de la fonction ressemble à une déclaration , où a est le spécificateur de déclaration et = 8 l’initialiseur. C utilisé pour autoriser l’omission de types dans les spécificateurs de déclaration et la valeur par défaut de int dans ce cas. (Depuis C99, cela n’est plus autorisé.)

Cependant, dans une fonction, a=8; ressemble à une déclaration d’expression (une expression d’affectation) et le symbole a n’est pas résolu. (Notez que vous n’avez pas d’énoncé d’expression en dehors des fonctions.)

Si vous avez essayé de le faire, par exemple, static a = 8; , il ressemblerait alors à une déclaration et devrait être compilé car le type par défaut serait int.

Quoi qu’il en soit, ne comptez pas sur cela 🙂 Ecrivez clairement vos types.

C’est parce qu’en C, toute variable / fonction est implicitement int .

C’est la même raison pour laquelle vous pouvez utiliser register au lieu de register int ou unsigned au lieu de unsigned int , auto au lieu de auto int et static au lieu de static int . Personnellement, je qualifie toujours explicitement mes variables avec int , mais que vous le fassiez ou non est votre option.

Votre variable a un type de données (int) même si vous n’avez pas écrit le type de données.

C’est une mauvaise pratique de tirer parti de cette fonctionnalité.

Apparemment, votre compilateur ne permet pas que cela se produise dans une fonction. Cela a du sens car si cela permettait “a = 8;” dans une fonction, il serait très difficile d’attraper certaines typo.

En C ++ 11, il existe le mot auto clé auto Malheureusement, C et C ++ sont des langages fortement typés, qui nécessitent la définition d’un type ssortingct pour chaque variable déclarée. Certains compliers supposent que int est le paramètre par défaut, mais c’est leur esprit et il ne devrait pas être utilisé, car c’est une mauvaise habitude de programmation.

même un paramètre de fonction peut être écrit comme int implicite. Exemple:

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

Le code ci-dessus fonctionne bien, mais une fois qu’un type de données fixe est inclus dans les parameters, comme

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

Il montre erreur: erreur: attendu ‘)’ avant ‘char’ |