2013-05-16 8 views
9

これは何よりも言語理論に関する質問です。最初の声明はなぜ主要な法律にあるのですか?彼らは同じものであると評価しないのですか?Java:ステートメントではありません

public class Main { 
     public static void main(String[] args) { 
       foo(); 
       0; 
     } 
     public static int foo(){ 
       return 0; 
     } 
} 
+0

これは原始的なプリミティブなので、ステートメントではありません。 – greedybuddha

+0

これを読んでください:http://docs.oracle.com/javase/specs/jls/se7/jls7.pdf特に文に関する章です。 – user643011

答えて

14

Javaは、いわゆる「式文」で許可されている式の種類を制限します。副作用の可能性がある意味のある表現だけが許可されます。それは0;またはa + b;のような意味的に無意味な文を許可しません。それらは単に言語文法から除外されます。

foo()のような関数呼び出しでは、通常は副作用があり、意味のない文ではありません。コンパイラは、foo()のボディを深く調べて、実際に何かを行うかどうかをチェックしません。関数を呼び出すには副作用があるため、構文的に有効です。

これは、C/C++とJavaの哲学的な違いを反映しています。 Javaは、死んだコードや無意味なコードをもたらすさまざまな構造を禁止しています。

return; 
foo(); // unreachable statement 

CおよびC++は、それについてすべて比較的自由度があります。あなたが望むものを書いてください。彼らはあなたを育てる時間がありません。


Java Language Specification, §14.8 Expression Statementsから引用:

表現の特定の種類は、以下 それらをセミコロンによってステートメントとして使用することができます。

ExpressionStatement: 
    StatementExpression ; 

StatementExpression: 
    Assignment 
    PreIncrementExpression 
    PreDecrementExpression 
    PostIncrementExpression 
    PostDecrementExpression 
    MethodInvocation 
    ClassInstanceCreationExpression 

式を評価することによって式が実行されます。 式に値がある場合、値は破棄されます。

式の評価が正常に完了した場合は、 の場合にのみ、式ステートメントの実行は正常終了します。

CおよびC++とは異なり、Javaプログラミング言語では、表現形式として特定の 形式のみを使用できます。

(void)... ; // incorrect! 

は動作しませんので、のような表現 文を書くの伝統的なCのトリック - 空 はタイプではありません - Javaプログラミング言語は「voidにキャスト」許可しないことに注意してください。一方、Javaプログラミング言語では、 は式文で最も有用な種類の式であり、 であり、式 の文として使用されるメソッド呼び出しを必要としないため、このようなトリックはほとんどありません が必要です。トリックが必要な場合は、代入文(15.26) またはローカル変数宣言文(14.4)のいずれかを代わりに使用できます。

関連する問題