2016-03-18 7 views
1

短いif文と短いif文はありません。 Java言語仕様書でこれを見つけました。 It saysJavaのステートメントはShortとは何ですか?

を次のように「ステートメントは、このように文法的に2つのカテゴリに分類されます:何もelse節(持っていないif文で終わるかもしれないものを 『』 if文の短い)間違いないものを

のみ

文が キーワード他のelse節を持っていない場合 文の前に即時のサブステートメントとして表示されます。

この単純なルールは、「ダングリング電子を妨げる可能性がある場合は間違いなく短期的に終わらないステートメントlse "の問題です。実行制限 「短い場合」の制限付きのステートメントの動作は、同じ種類のステートメント の実行動作と同じですが、「短い場合」の制限はありません。区別は構文困難を解決するために 純粋に描かれている「

誰もが、この2つのカテゴリに分かれ

+4

あなたは本当に前の行を追加するべきです: "CやC++や多くのプログラミング言語のようなJavaプログラミング言語は、else節がおそらくそれに属している可能性のあるifに属することを任意に宣言します。 " –

+0

@ NathanHughesはい、質問は文脈なしで少しばかり読まれます。それを提供していただきありがとうございます。 –

答えて

2

説明していただけます:。?持ってif文で終わるかもしれない

もの何else節ません( "ショートif文")

if (condition) { 

} 

間違い

if (condition) { 

} else { 

} 

は、中括弧を残していないものは、あなたが1行ifとelseステートメントを取得します。

4

あなたが参照した段落の定義によると、短いif文は、パターンに合うif文である

if (condition) { 
} 

if (condition) { 
} else if (condition) { 
} 

非短い文はそのパターンに適合しない場合、例えばそれはあるかもしれない次

if (condition) { 
} else { 
} 

if (condition) { 
} else if (condition) { 
} else { 
} 

などの任意のに。

基本的に、「短いif」文は、と知られているif文であり、elseブロックを持たないと考えられます。

+1

これらの 'elseif'にスペースを入れる必要があります。 –

+0

@PaulBoddingtonポールにはあま​​りにも多くの言語がありました。寒い中で(IDEで書かないで)ちょうどそれを入力することで、スペースがなくなりました。今編集中: –

1

他の2つの回答に加えて、このルールが避けている問題が何かを知ることは良いことです。

たとえば、これは何を印刷しますか?

int a = 0; if (a == 1) if (a == 2) System.out.println("A"); else System.out.println("B"); 

それは

int a = 0; 
if (a == 1) 
    if (a == 2) 
     System.out.println("A"); 
    else 
     System.out.println("B"); 

(何も印刷していないと思われる)、または(それが"B"を印刷する必要がありますように見えた)

int a = 0; 
if (a == 1) 
    if (a == 2) 
     System.out.println("A"); 
else 
    System.out.println("B"); 

などと解釈できます。

ただし、このif (a == 1)の部分にはelse句が含まれていますが、if (a == 2) System.out.println("A");という文は短い場合はルールの2番目を除きます。

したがって、これは何も印刷しません。一方

if (a == 2)だった場合 ない短い場合、それは次のようになり、そして心配するあいまいさはないだろう。何else節(「if文の短い」)を持たないif文で終わるかもしれないものと間違いそうでないもの:

int a = 0; 
if (a == 1) 
    if (a == 2) 
     System.out.println("A"); 
    else 
     System.out.println("C"); 
else 
    System.out.print("B"); 
+0

返信ありがとうございます。あなたがint = 0として与えたコードでは、 if(a == 1) if(a == 2) System.out.println( "A"); else System.out.println( "B");しかし、どうすればいいですか?(a == 2)System.out.println( "A");もし私が= 1でthsesコードを実行すると、cozの短いです。私はBとして出力を得ました。そして、もしそれが短期的であるなら、どのように2番目のことを言うのですか? – BabyboB

0

書は、このように文法的に2つのカテゴリに分類されています。

それは、StatementNoShortIf声明に分かれていることを意味します。どちらのステートメントが "短いifステートメント"とStatementNoShortIfで表示されないことができます。

短いif文は、else節のないif文です。文はelse節を持たないif文のキーワードelseの直前のサブステートメントとして表示されることがあれば、間違いなく短期で終わっていない

IfThenStatement: // short if statement 
    if (Expression) Statement 

IfThenElseStatement: // not short if statement 
    if (Expression) StatementNoShortIf else Statement 

IfThenElseStatementNoShortIf: // not short if statement 
    if (Expression) StatementNoShortIf else StatementNoShortIf 

文だけ。

のみStatementNoShortIfがあれば非短い文でifelse間に入れることができます。

そして、このようなStatementNoShortIfはそのif else文の即時サブステートメントでなければなりません。

この単純なルールは、「dangling else」問題を防止します。 「短い場合」の制限があるステートメントの実行動作は、「短くない場合」の制限がない同じ種類のステートメントの実行動作と同じです。その区別は純粋に構文上の困難を解決するために引き出される。

したがって、このようなダングリング他の問題のサンプル考える:elseは最初ifの一部にすることはできません

if (door.isOpen()) 
    if (resident.isVisible()) 
     resident.greet("Hello!"); 
else door.bell.ring(); // A "dangling else" 

を。もしそうならStatementNoShortIfは常にelseを必要とするため

即時サブステートメントルールに従って、ライン2-3はStatementNoShortIfの文である必要がありますが、それは実際にIfThenStatemtn(if文短い)であります。したがって、elseは2番目のifの一部でなければならず、したがって、他の問題が解決されます。

関連する問題