En C, pourquoi la définition d’une variable globale dans une instruction distincte génère-t-elle un avertissement, mais est-elle acceptable pour une variable locale?

Dans le code suivant, pourquoi la définition de la variable globale “x” affiche-t-elle l’avertissement “la définition de données n’a pas de type ou de classe de stockage”, mais la même chose fonctionne bien pour la variable locale “y”? Tout ce que je fais pour chaque variable est d’abord les déclarer dans une déclaration et ensuite les définir dans une autre déclaration. Quelle est la différence que cela fonctionne bien pour une mais montre un avertissement pour l’autre?

#include int x; x=303; int main(void) { int y; y=776 ; printf("The value of x is %d,and of y is %d",x,y); } 

Vous comstackz en mode C89.

  int x; 

est une définition provisoire de x .

  x=303; 

est alors interprété comme une définition de la variable x de type implicite int ( int x = 303; ). Sous C99 ou ultérieur, ce code ne serait pas compilé car la règle “implicit int ” avait été supprimée et sans la règle “implicitement int “, la deuxième ligne ne pourrait être interprétée que comme une instruction, ce qui n’est pas autorisé à la scope du fichier.

Comstackr avec -std=c89 -Wall -Wextra -pedantic (et append un return 0; to main ), avertit gcc

 redef.c:4:1: warning: data definition has no type or storage class [enabled by default] redef.c:4:1: warning: type defaults to 'int' in declaration of 'x' [-Wimplicit-int] 

La raison en est que ces deux lignes:

  int x; x = 303; 

Consiste en une déclaration déclaration ( int x; ) et une expression utilisée en tant qu’instruction ( x = 303; ). Le langage de programmation C n’autorise que les déclarations et les définitions au niveau de la scope globale et interdit les expressions à la scope globale. Cependant, les déclarations et les déclarations d’expression sont légales à l’intérieur des fonctions C.

Une façon intuitive d’y réfléchir est la suivante: quand le code x = 303; être exécuté à l’échelle mondiale? Imaginez que nous ayons ce programme:

 int x = 1; void myFunction() { printf("%d\n", x); } x = 303; 

Ici, quelle valeur de x myFunction verrait-il? Est-ce qu’il verrait la valeur 1, ou verrait-il la valeur 303?

D’autre part, si nous avons

 void myFunction() { int x; x = 303; printf("%d\n", x); } 

Il est un peu plus clair que nous sums censés exécuter ces instructions dans l’ordre, de sorte que 303 seraient imprimées.

J’espère que cela t’aides!

Vous ne pouvez pas exécuter de code en dehors d’une fonction ou d’un bloc. x=303; n’est pas valide dans la position où vous l’avez écrit.

Dans ce cas précis (étendue globale), vous ne pouvez initialiser la variable directement qu’avec int x=303 .