2017-09-24 6 views
2

Sans utiliser d'accolades pourquoi ne pouvons-nous pas utiliser une déclaration déclarative après while boucle?Pourquoi ne pouvons-nous pas utiliser déclaration déclarative après boucle while sans accolades?

Avec Curley accolades il compails:

while(true){ 
    int u =89; 
} 

Sans accolades, une erreur de compilation se produit:

while(true) 
    int u =89; // compile time error 
+1

Je ne sais pas pourquoi une erreur de compilation se produirait, mais pourquoi déclarez-vous quelque chose dans une portée d'une instruction? La déclaration de 'int u' utilise votre seule déclaration. Vous ne seriez pas capable de l'utiliser, à l'intérieur ou à l'extérieur de la portée. – slothh

+0

oui, pas d'utilisation de déclarer une seule déclaration, mais c'est une question d'entrevue difficile. J'essaie de trouver le pourquoi de chaque code. il peut y avoir une raison pour l'erreur de compilation. merci pour le commentaire –

+0

Bienvenue! Désolé, je ne pourrais pas être plus utile. Bonne chance quand même. – slothh

Répondre

2

La raison syntaxique est que l'élément après l'instruction while est statement, qui inclut toutes les instructions exécutables, et en particulier les blocs, mais n'inclut pas les déclarations.

La raison de conception est que cela n'aurait pas le moindre sens. La portée de la variable déclarée se terminerait au point-virgule de conclusion, de sorte que la variable déclarée ne serait d'aucune utilité dans le texte du programme suivant.

1

Je viens d'avoir un coup d'oeil dans la grammaire de Java trouvée sur oracle.com : Chapter 18. Syntax. (je l'espère, est la version correcte qui applique à la question.)

Statement: 
    Block 
    ; 
    Identifier : Statement 
    StatementExpression ; 
    if ParExpression Statement [else Statement] 
    assert Expression [: Expression] ; 
    switch ParExpression { SwitchBlockStatementGroups } 
    while ParExpression Statement 
    do Statement while ParExpression ; 
    for (ForControl) Statement 
    break [Identifier] ; 
    continue [Identifier] ; 
    return [Expression] ; 
    throw Expression ; 
    synchronized ParExpression Block 
    try Block (Catches | [Catches] Finally) 
    try ResourceSpecification Block [Catches] [Finally] 

Ainsi, vous pouvez voir while est suivi par ParExpression (expression entre parenthèses) et Statement.

Pour

while(true){ 
    int u =89; 
} 

le Statement après du corps de while se développe pour Block qui à son tour peut étendre à un LocalVariableDeclarationStatement.

Pour

while(true) 
    int u =89; // compile time error 

le Statement du corps de while ne peut pas ÉTENDU pour LocalVariableDeclarationStatement comme où est pas Block.

Ainsi, le 2 et ne fait tout simplement pas partie du langage Java (basé sur sa grammaire).