Pourquoi aucun point-virgule ne donne d’erreurs mais trop d’entre elles ne le font pas

Considérez ce code C:

#include ; int main(void) { puts("Hello, world!");; ; ; return 0; ; ; ; }; 

Ici, j’ai mis des points-virgules presque partout possible. Juste pour s’amuser . Mais étonnamment cela a fonctionné ! J’ai reçu un avertissement concernant le point-virgule après include, mais d’autres points-virgules tout à fait incorrects ont fonctionné. Si j’oublie de mettre un point-virgule après, je vais avoir l’erreur suivante

erreur: attendu ‘;’ avant le ‘retour’


Pourquoi beaucoup de points-virgules faux et inutiles ne provoquent-ils des erreurs? À mon avis, elles devraient être traitées comme des erreurs de syntaxe.

Un seul point-virgule construit une instruction null . Ce n’est pas seulement légal, c’est aussi utile dans certains cas, par exemple, une boucle while / for qui n’a pas besoin d’un corps réel. Un exemple:

 while (*s++ = *t++) ; 

C11 6.8.3 Expression et déclarations nulles

Une instruction null (constituée uniquement d’un point-virgule) n’effectue aucune opération.


La seule erreur de syntaxe est cette ligne:

 #include ; 

le point-virgule signifie la fin d’une instruction, qu’elle soit vide ou non. Pas de point-virgule signifie que vous n’avez pas fermé / mis fin à la dernière déclaration, mais en commencé une nouvelle qui donne une erreur. trop de points-virgules indiquent la fin de la déclaration vide. Donc, cela ne donne pas d’erreur

Pourquoi une instruction vide serait-elle une erreur? Ce n’est pas.

Le ; (délimiteur d’instruction) est toujours utilisé pour spécifier que l’instruction en question est terminée. Là après la prochaine déclaration est exécutée.

Si vous ne mettez pas delimeter, il considérera la prochaine instruction avec l’instruction en cours et s’exécutera. Et cela donne une erreur de syntaxe.

Mais dans d’autres cas, lorsque nous mettons plusieurs délimètres, par exemple:

int a;;;;;

Dans ce cas, nous avons 5 instructions, dans lesquelles int a est la première instruction et les quatre suivantes sont des instructions nulles qui seront supprimées par le compilateur lors de la compilation.

Voir quelques cas intéressants pour cette question :

 int main() { int a=0 ;,; return 0; } 

quand on change de programme ci-dessus ça marche toujours:

 int main() { int a=0 ,; /*change done*/ return 0; } 

Le ; est un délimiteur de déclaration en C tel que mentionné dans la réponse ci-dessus. La réponse de Rahul est parfaitement correcte, mais vous pouvez voir cette réponse à une question qui demande pourquoi une déclaration en C se termine par un point-virgule. Ainsi, lorsque vous comprendrez pourquoi un point-virgule est utilisé, vous comprendrez ce qui se passe lorsque vous mettez trop de points-virgules.