11

これは、何よりも言語理論に関する問題だと思います。2 番目のステートメントはそうではないのに、なぜ最初のステートメントはメイン リーガルなのですか? 同じものと評価されませんか?

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

2 に答える 2

19

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) を使用できます。

于 2013-05-16T23:43:03.813 に答える
0

最初のステートメントでは実際に関数を呼び出しており、2 番目のステートメントは値を与えません。戻り値を処理する場合は、戻り値の型の変数を呼び出す必要があります

例えば:

public class Main {

    public static void main(String[] args) {
        int n = foo();
    
         //do whatever you want with return 
    }

    public static int foo() {
        return 0;
    }
}
于 2019-02-23T07:39:54.530 に答える