web-dev-qa-db-fra.com

Erreur C: Expression attendue avant int

Lorsque j'ai essayé le code suivant, l'erreur mentionnée est apparue.

if(a==1)
  int b =10;

Mais ce qui suit est syntaxiquement correct

if(a==1)
{
   int b = 10;
}

Pourquoi est-ce?

33
MsPillai

C'est en fait une question assez intéressante. Ce n'est pas aussi simple que cela en a l'air au début. Pour référence, je vais me baser sur la dernière grammaire en langage C11 définie dans N157

Je suppose que la partie contre-intuitive de la question est la suivante: si cela est correct C:

if (a == 1) {
  int b = 10;
}

alors pourquoi est-ce pas aussi correct C?

if (a == 1)
  int b = 10;

Je veux dire, une instruction conditionnelle à une ligne if devrait convenir avec ou sans accolades, n'est-ce pas?

La réponse réside dans la grammaire de l'instruction if, telle que définie par le standard C. Les parties pertinentes de la grammaire que j'ai citées ci-dessous. Succinctement: le int b = 10 ligne est une déclaration et non une déclaration et la grammaire pour l'instruction if, il faut une instruction après la condition qu'il teste. Mais si vous mettez la déclaration entre accolades, cela devient une déclaration et tout va bien.

Et juste pour répondre à la question complètement, cela n’a rien à voir avec la portée. La variable b qui existe à l'intérieur de cette étendue sera inaccessible de l'extérieur, mais le programme est toujours correct du point de vue de la syntaxe. Strictement parlant, le compilateur ne devrait pas jeter une erreur dessus. Bien sûr, vous devriez construire avec -Wall -Werror de toute façon ;-)

 (6.7) déclaration: 
 spéci fi cateurs de déclaration init-declarator-listopt;static_assert-declaration
 
 (6.7) init-déclarator-list: 
 déclarateur initinit-déclarator-list,déclarateur init
 
 (6.7) déclarateur init: 
 déclarantdéclarant=initialiseur
 
 (6.8) déclaration: 
 déclaration étiquetéedéclaration composéeexpression-statementdéclaration de sélectiondéclaration d'itérationdéclaration de saut
 
 (6.8.2) déclaration composée: 
 {liste d'éléments de blocopt}
 
 (6.8.4) déclaration de sélection: 
 si (expression)déclarationsi (expression)déclarationelsedéclarationcommutateur (expression)déclaration
53
sheu

{ } ->

définit la portée, donc if(a==1) { int b = 10; } indique que vous définissez int b, pour {} - cette portée. Pour

if(a==1)
  int b =10;

il n'y a pas de portée. Et vous ne pourrez utiliser b nulle part.

2
Pranit Kothari