Warum ist der Rückgabewert von y + 1 und y++ unterschiedlich

Gast #2152262
Lesenswert?
• ▲
▼
Bei y++ wird der Wert y zurückgegeben und danach y um 1 erhöht.

Bei ++y wird y um 1 erhöht und das Ergebnis zurückgegeben.

Das ++y b.z.w. y++ entscheidet über den Zeitpunkt der Erhöhung des 
Wertes von y.

Gruß JensM
Gast #2152323
Lesenswert?
• ▲
▼
Samuel K. schrieb:
> In c# funktioniert diese Zeile:
> ...
> Diese aber nicht:

Nachdem deine eigentliche Frage schon beantwortet wurde:
Verabschiede Dich von dem Gedanken, dass eine Zeile nicht funktioniert.
Gewöhne dich an den Gedanken, dass eine Zeile etwas anderes bedeutet, 
als Du erwartest.
Gast #2153432
Lesenswert?
• ▲
▼
Weite Verbreitung ist kein Indiz von "Brauchbarkeit" bzw. einer Eignung 
für einen bestimmten Zweck.

Unter Milliarden Fliegen z.B. ist das Verzehren von Sch...e recht weit 
verbreitet. Die somit (unter Fliegen, von denen es wohl deutlich mehr 
als Menschen gibt?!) breit angelegte Akzeptanz macht Sch...e jedoch noch 
lange nicht zu einer Delikatesse...

Praxistauglichkeit ist auch so eine Sache bei C und ähnlichen Sprachen, 
da das vom TO beschriebene Verhalten und andere ähnliche "kleine 
Absonderlichkeiten" eben immer wieder - gerade bei Einsteigern - für 
Ratlosigkeit sorgen.

Von "Supersprachen" zu sprechen halte ich für Unfug, es gibt bestenfalls 
Programmiersprachen, welche aufgrund Ihres Designs und 
Abstraktionsgrades bestimmte Fehler, Unklarheiten oder 
nicht-Eindeutigkeiten ausschließen.

Bestimmend ist aber letztlich noch immer die "Qualität" bzw. 
Qualifikation des Programmierers im Umgang mit "seinem" Werkzeug, d.h. 
Programmiersprache.

Und: Echte Programmierer codieren mit Diodenmatrix und Lötkolben!

In diesem Sinne...

Joachim
Persönliche Seite #2154336
Lesenswert?
• ▲
▼
Vlad Tepesch schrieb:
> Eine Zuweisung mit einem Rückgabewert auszustatten ist
> meiner Meinung nach ein Designfehler
Wohl dosiert kann es schon sinnvoll sein:
1
BufferedReader reader = ...;
2
String line;
3
while ((line = reader.readLine()) != null) {
4
    System.out.println(line);
5
}
Auf alle anderen Weisen hat man immer das Problem, dass man einmal line 
sinnvoll initialisieren muss (meisst durch ein weiteres ReadLine), und 
innerhalb der Schleife das ReadLine vergessen kann oder an der falschen 
Stelle aufruft.
Vergisst man das hier, erkennt das der Compiler, außerdem wird man im 
weiterem Verlauf gewarnt, dass line nur noch null sein kann, was mit 
einer Initialen Initialisierung möglicherweise nicht mehr erkannt wird.
#2154900
Lesenswert?
• ▲
▼
Dieses Spiel hat nicht allein mit dem Vorrang der Operatoren zu tun, 
sondern auch mit der Zerlegung des Quelltextes in die syntaktischen 
Sprachelemente (Tokens), die stets die längste mögliche Zeichenfolge 
bevorzugt. Deshalb wird +++++ zu ++ ++ + noch bevor der Parser das 
überhaupt zu Gesicht bekommt. ---++ wird jedoch zu -- - ++ weil es -+ 
als Token nicht gibt.

Da aber a++ keine lvalue ist (sowas darf links von "=" stehen), sondern 
eine rvalue (rechts), ist (a++)++ nicht zulässig.

Dieses Problem zeigt sich auch bei C++, wo streckenweise mit <xxx> 
geklammert wird und leerzeichenfreie Verschachtelungen wie <xxx<yyy>> am 
Verständnis der schliessenden Klammern als Shift-Operator scheitern.
#2154925
Lesenswert?
• ▲
▼
Samuel K. schrieb:
> Warum erkkent der compiler das dann nicht?
> a+++++b
> eigentlich müsste er das doch (a++)+(++b) erkennen?

Nein, denn Postfix bindet auch stärker als +, also wird daraus 
((a++)++)+b, und das funktioniert nicht.

> PS: es heißt Präfix (vom lat. prä = vor)

Ja, und im Englischen heißt es Prefix. Willst du mir jetzt etwa 
vorwerfen, zu viele englische Begriffe zu verwenden?
#2154926
Lesenswert?
• ▲
▼
mh schrieb:

> Ist das Verhalten des Parsers denn durch den Standard geregelt?

Ja. C99: "If the input stream has been parsed into preprocessing tokens 
up to a given character, the next preprocessing token is the longest 
sequence of characters that could constitute a preprocessing token."

Lass dich vom Begriff "preprocessing" nicht stören.

Der Fall wird dort sogar extra aufgeführt: "EXAMPLE 2 The program 
fragment x+++++y is parsed as x ++ ++ + y, which violates a constraint 
on increment operators, even though the parse x ++ + ++ y might yield a 
correct expression."

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren