2017-09-24 19 views
2

中括弧を使用しないとなぜwhileループの後に宣言文を使用できないのですか?カーリーとwhileループの後に中括弧なしで宣言文を使用できないのはなぜですか?

はそれがcompailsブレース:

while(true){ 
    int u =89; 
} 

を中括弧がなければ、コンパイル時エラーが発生します。

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

コンパイル時エラーが発生する理由はわかりませんが、なぜ1つのステートメントスコープで何かを宣言していますか? 'int u'の宣言はあなたの単一のステートメントを使い果たします。スコープの内部または外部で使用することはできません。 – slothh

+0

ええ、1つのステートメントを宣言するのは使用しませんが、それは難しい面接の質問です。私はすべての単一コードのWHY部分を見つけることを試みています。コンパイル時にエラーが発生する可能性があります。コメントありがとう –

+0

ようこそ!申し訳ありませんが、私はもっと助けになることはできませんでした。しかし、幸運。 – slothh

答えて

2

構文上の理由は、whileステートメントの後の要素が、すべての実行可能ステートメント、特にブロックを含み、宣言を含まないstatementであるということです。

設計上の理由は、それが意味をなさないことではないということです。宣言された変数のスコープは、セミコロンの終わりで終了するため、宣言された変数は後続のプログラムのテキストでは使用できません。

1

を私はただのJavaの文法に表情がoracle.comで見つけました:Chapter 18. Syntax。 (私はそれが問題に適用される正しいバージョンであると思います。)

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] 

したがって、あなたはwhileParExpression(括弧内の式)とStatementが続いている見ることができます。 whileの体の後

while(true){ 
    int u =89; 
} 

Statementについては

は順番にLocalVariableDeclarationStatementに拡大することBlockに展開されます。何Blockどこにではないとして

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

についてStatementwhile S体LocalVariableDeclarationStatementに拡張することができません。

したがって、2 ndは、(文法に基づいて)Java言語の一部ではありません。

関連する問題