2009-11-11 4 views
2

quelqu'un peut me dire s'il vous plaît la différence entre les deux extraits de code suivant:le code Ill formé snippets

//Code snippet A: Compiles fine 
int main() 
{ 
    if(int i = 2) 
    { 
     i = 2 + 3; 
    } 
    else 
    { 
     i = 0; 
    } 
} 

//Code Snippet B: Doesn't compile :(
int main() 
{ 
    if((int i = 2)) 
    { 
     i = 2 + 3; 
    } 
    else 
    { 
     i = 0; 
    } 
} 

Si vous remarquez que la diff est juste une parenthèse supplémentaire à l'instruction if. J'utilise g ++ compiler.Error est "expression primaire attendue avant âintâ"

+0

Pourquoi voudriez-vous faire cela? Aucun code n'a beaucoup de sens. –

+2

en double: http: // stackoverflow.com/questions/1516919/declaration-and-initializing-a-variable-in-a-conditionnel-or-control-statement-in-c – AraK

+0

juste en essayant de comprendre C++ Graham. –

Répondre

18

article 6.4 de la norme C (projet n2914 de C++ 0x) a ceci à dire au sujet du format des if déclarations:

Selection statements choose one of several flows of control.
    selection-statement:
       if (condition) statement
       if (condition) statement else statement
       switch (condition) statement
    condition:
       expression
       type-specifier-seq attribute-specifieropt declarator = initializer-clause
       type-specifier-seq attribute-specifieropt declarator braced-init-list

Ce bit à la fin signifie une condition peut être une expression ou une construction de type décaleur.

Et la minute où l'analyseur frappe cette deuxième parenthèse, il devient une expression, donc aucune déclaration n'est permise, j'ai peur.

L'extrait:

if (int i = 2) { ... } else { ... } 

est parfaitement valable C++, dans lequel le si l'article définit un nombre entier i pendant la durée de la if/else et il met à 2. Il utilise alors que 2 comme entrée à la if (2 est toujours vrai, étant non nul).

L'extrait if((int i = 2)) est pas différent syntaxiquement à int x = (int i = 2;); if (x) qui est pas valide C++.

+0

J'aime votre réponse ainsi mec :) Vous faites certainement un bon travail ici .. –

1

Les deux semblent faux.

Ce n'est pas parce que le code compile qu'il est valide. Je suis surpris que le premier cas soit en train de compiler, puisqu'il semble que i ne soit pas défini dans l'autre cas.

edit: Je me trompe ici, les définitions dans la condition if sont valables pour l'ensemble de cette instruction if/else.

+4

La portée du déclarant int est à la fin de l'instruction * whole * if. – paxdiablo

+1

Non seulement cela, mais l'expression à l'intérieur du if effectue une assignation et non une comparaison, et en tant que tel, le cas de l'autre ne sera jamais atteint. –

+0

Le premier cas est parfaitement valide C++. Cela n'a pas besoin d'être utile. 'if (0)' est aussi parfaitement valide C++ malgré son inutilité. – paxdiablo

5

Voici une autre variante de deuxième erreur d'extrait:

int main() 
{ 
    int i = (int j = 0); 
    return 0; 
} 

Vous ne pouvez pas déclarer des variables à l'intérieur de toute expression. La deuxième() à l'intérieur de est le même cas - vous pouvez déclarer la variable i à l'intérieur de() mais pas à l'intérieur d'une expression imbriquée placée dans(). J'espère que je l'ai expliqué correctement, peut-être une explication plus correcte existe-t-elle? En fait, les deux fragments de code sont étranges.

10

L'extrait A est correct - la condition if supprime et initialise une variable qui peut être interprétée comme une valeur booléenne. La variable est définie dans les blocs if et else.

L'extrait B est erroné, car vous ne pouvez pas mettre de parenthèses autour d'une déclaration - vous pouvez seulement les mettre en rond. Ce qui suit est également faux pour la même raison:

int main() 
{ 
    int i;  // OK 
    (i = 2);  // OK 

    (int x = 2); // compile error 
} 
+0

Merci Mike! simple et la meilleure réponse :) ..wish je pourrais voter .. pas encore inscrit. –

+0

Eh bien, inscrivez-vous donc vous pouvez. Bien que je ne puisse pas être d'accord, c'est la * meilleure * réponse, c'est certainement une bonne réponse, surtout pour ceux qui ne veulent pas s'asseoir dans mes essais habituels pour trouver une gemme de bonne information :-) Je l'ai déjà surclassé. – paxdiablo

+0

upvoting est d'encourager..right? ..et je suis philanthrope de toute façon :) –

Questions connexes