Java: Keine Aussage

Lesezeit: 3 Minuten

Benutzer-Avatar
Skyler

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;
        }
}

  • 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

Benutzer-Avatar
John Kugelmann

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.

Benutzer-Avatar
SaravanaKumar KKB

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;
    }
}

  • Diese Antwort geht nicht auf die Frage ein. Bei dieser Frage geht es darum, wie der Code in irgendeiner Weise repariert werden kann. Die Frage ist zu erklären, warum eine Sache von dieser Sprache erlaubt ist, aber eine andere ähnliche Sache einen Kompilierungsfehler erzeugt.

    – Lii

    23. Februar 2019 um 8:58 Uhr

  • @Lii Ich habe mein Antwortbit geändert.

    – SaravanaKumar KKB

    23. Februar 2019 um 12:29 Uhr

1014830cookie-checkJava: Keine Aussage

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy