Java では、いわゆる「式ステートメント」で許可される式のタイプが制限されています。副作用の可能性がある意味のある式のみが許可されます。0;
またはのような意味のないステートメントは許可されませんa + b;
。それらは単に言語文法から除外されています。
のような関数呼び出しfoo()
には副作用があり、通常は副作用があるため、無意味なステートメントではありません。コンパイラは、foo()
実際に何かを行うかどうかを確認するために の本体を深く調べません。関数を呼び出すと副作用が生じる可能性があるため、構文的に有効です。
これは、C/C++ と Java の哲学的な違いを反映しています。Java では、デッド コードまたは無意味なコードを生成するさまざまな構造が禁止されています。
return;
foo(); // unreachable statement
C と C++ は、比較的自由放任主義です。好きなように書いてください。彼らはあなたをベビーシッターする時間がありません。
Java言語仕様、§14.8 Expression Statementsからの引用:
特定の種類の式は、セミコロンを続けてステートメントとして使用できます。
ExpressionStatement:
StatementExpression ;
StatementExpression:
Assignment
PreIncrementExpression
PreDecrementExpression
PostIncrementExpression
PostDecrementExpression
MethodInvocation
ClassInstanceCreationExpression
式ステートメントは、式を評価することによって実行されます。式に値がある場合、その値は破棄されます。
式の評価が正常に完了した場合にのみ、式ステートメントの実行が正常に完了します。
C や C++ とは異なり、Java プログラミング言語では、特定の形式の式のみを式ステートメントとして使用できます。Java プログラミング言語では「void へのキャスト」が許可されていないことに注意してください。void は型ではありません。
(void)... ; // incorrect!
動作しません。一方、Java プログラミング言語では、式ステートメントで最も有用な種類の式をすべて使用でき、void メソッドを呼び出すための式ステートメントとして使用されるメソッド呼び出しを必要としないため、このようなトリックはほとんど必要ありません。トリックが必要な場合は、代わりに代入ステートメント (§15.26) またはローカル変数宣言ステートメント (§14.4) を使用できます。