これは何よりも言語理論に関する質問です。最初の声明はなぜ主要な法律にあるのですか?彼らは同じものであると評価しないのですか?Java:ステートメントではありません
public class Main {
public static void main(String[] args) {
foo();
0;
}
public static int foo(){
return 0;
}
}
これは何よりも言語理論に関する質問です。最初の声明はなぜ主要な法律にあるのですか?彼らは同じものであると評価しないのですか?Java:ステートメントではありません
public class Main {
public static void main(String[] args) {
foo();
0;
}
public static int foo(){
return 0;
}
}
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)のいずれかを代わりに使用できます。
これは原始的なプリミティブなので、ステートメントではありません。 – greedybuddha
これを読んでください:http://docs.oracle.com/javase/specs/jls/se7/jls7.pdf特に文に関する章です。 – user643011