1. ホーム
  2. java

[解決済み] Javaです。ステートメントではありません

2022-03-01 18:22:35

質問

これは、何よりも言語理論に関する質問だと思います。なぜmainの最初の文は合法で、2番目の文は合法でないのでしょうか?それらは同じものであると評価されないのでしょうか?

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 言語仕様書、§14.8 式言語ステートメント :

ある種の式は、その後に続くことでステートメントとして使用することができます。 はセミコロンで囲みます。

ExpressionStatement:
    StatementExpression ;

StatementExpression:
    Assignment
    PreIncrementExpression
    PreDecrementExpression
    PostIncrementExpression
    PostDecrementExpression
    MethodInvocation
    ClassInstanceCreationExpression

expression文は、式を評価することで実行されます。 式が値を持つ場合、その値は破棄されます。

式文の実行が正常に終了するのは、以下の場合のみです。 式の評価が正常に終了した場合。

CやC++とは異なり、Javaプログラミング言語では、特定のものしか使用できません。 を式文として使用することができます。ただし Java プログラミング言語では、void へのキャスト(" cast to void")は許可されていません。 は型ではないので、伝統的なC言語のトリックである式 というような文があります。

(void)... ;  // incorrect!

は動作しません。一方、プログラミング言語であるJavaでは は、最も有用な種類の式をすべて式文に含めることができます。 また、式として使用されるメソッドの呼び出しは必要ありません。 ステートメントで void メソッドを呼び出すことはほとんどないので、このようなトリックはほとんどありません。 が必要です。トリックが必要な場合は、代入文(15.26節)か やローカル変数宣言文 (14.4節) で代用することができます。