Ich nehme an, das ist mehr eine Frage der Sprachtheorie als alles andere. Warum ist die erste Aussage im Wesentlichen legal, die zweite nicht? Beurteilen sie nicht dasselbe?
public class Main {
public static void main(String[] args) {
foo();
0;
}
public static int foo(){
return 0;
}
}
Java schränkt die Arten von Ausdrücken ein, die in sogenannten “Expression Statements” erlaubt sind. Nur sinnvolle Ausdrücke, die potenzielle Nebenwirkungen haben, sind erlaubt. Es verbietet semantisch bedeutungslose Aussagen wie 0;
oder a + b;
. Sie werden einfach von der Sprachgrammatik ausgeschlossen.
Ein Funktionsaufruf wie foo()
kann und hat normalerweise Nebenwirkungen, also ist es keine bedeutungslose Aussage. Der Compiler untersucht den Körper von nicht gründlich foo()
um zu prüfen, ob es wirklich etwas bringt. Aufruf einer Funktion kann Nebeneffekte haben, also ist es syntaktisch gültig.
Dies spiegelt einen philosophischen Unterschied zwischen C/C++ und Java wider. Java verbietet verschiedene Konstrukte, die zu totem oder bedeutungslosem Code führen.
return;
foo(); // unreachable statement
C und C++ sind bei allem relativ laissez faire. Schreiben Sie, was Sie wollen; Sie haben keine Zeit, dich zu babysitten.
Zitat aus der Java-Sprachspezifikation, §14.8 Ausdrucksanweisungen:
Bestimmte Arten von Ausdrücken können als Anweisungen verwendet werden, indem ihnen ein Semikolon folgt.
ExpressionStatement:
StatementExpression ;
StatementExpression:
Assignment
PreIncrementExpression
PreDecrementExpression
PostIncrementExpression
PostDecrementExpression
MethodInvocation
ClassInstanceCreationExpression
Eine Ausdrucksanweisung wird ausgeführt, indem der Ausdruck ausgewertet wird; Wenn der Ausdruck einen Wert hat, wird der Wert verworfen.
Die Ausführung der Ausdrucksanweisung wird nur dann normal abgeschlossen, wenn die Auswertung des Ausdrucks normal abgeschlossen wird.
Im Gegensatz zu C und C++ erlaubt die Programmiersprache Java nur die Verwendung bestimmter Ausdrucksformen als Ausdrucksanweisungen. Beachten Sie, dass die Java-Programmiersprache keine “Umwandlung in void” zulässt – void ist kein Typ – also der traditionelle C-Trick, eine Ausdrucksanweisung zu schreiben, wie zum Beispiel:
(void)... ; // incorrect!
funktioniert nicht. Andererseits erlaubt die Programmiersprache Java alle nützlichen Arten von Ausdrücken in expressions-Anweisungen und erfordert keinen Methodenaufruf, der als expression-Anweisung verwendet wird, um eine void-Methode aufzurufen, sodass ein solcher Trick fast nie benötigt wird. Wenn ein Trick erforderlich ist, kann stattdessen entweder eine Zuweisungsanweisung (§15.26) oder eine Deklarationsanweisung für lokale Variablen (§14.4) verwendet werden.
In der ersten Anweisung rufen Sie tatsächlich eine Funktion auf und die zweite Anweisung gibt keinen Wert an. Falls Sie den Rückgabewert verarbeiten möchten, müssen Sie eine Variable für den Rückgabetyp aufrufen
Z.B:
public class Main {
public static void main(String[] args) {
int n = foo();
//do whatever you want with return
}
public static int foo() {
return 0;
}
}
Weil es ein rohes Primitiv ist, keine Aussage.
– gieriger Buddha
16. Mai 2013 um 23:39 Uhr
Lesen Sie dies: docs.oracle.com/javase/specs/jls/se7/jls7.pdf Besonders das Kapitel über Aussagen.
– Benutzer643011
16. Mai 2013 um 23:43 Uhr