Forum: PC-Programmierung Warum ist der Rückgabewert von y + 1 und y++ unterschiedlich


von Sam .. (sam1994)


Lesenswert?

Hi

In c# funktioniert diese Zeile:

sy = y = y + 1;

Diese aber nicht:

sy = y++;

sy bleibt 0. Hat y++ kein Rückgabewert?

von mar IO (Gast)


Lesenswert?

Samuel K. schrieb:
> sy = y++;

was ergibt "sy = ++y"?

von JensM (Gast)


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

von R. M. (rmax)


Lesenswert?

y++ liefert den Wert zurück, den y vor der Inkrementierung hatte.

von Dr. Pseudorra (Gast)


Lesenswert?

Damals in Normal-C würde das so gegangen sein denke ich

sy = ++y;

y++ gibt erst y zurück und inkrementiert sich anschliessend ...

von mar IO (Gast)


Lesenswert?


von ... (Gast)


Lesenswert?

mar IO schrieb:
> siehe auch
>
> http://openbook.galileocomputing.de/c_von_a_bis_z/...

Der Link ist allerdings für C und nicht für C#, richtiger wäre z.B.:
http://msdn.microsoft.com/en-us/library/36x43w8w.aspx

von rüdiger (Gast)


Lesenswert?

Tja, ja, die unfassbar unerträglichen Leiden der "C"-Jünger.

"Mit einer richtigen Programmiersprache wäre das nicht passiert!" ;-)

Gruß,
Rüdiger

von horst (Gast)


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.

von Vlad T. (vlad_tepesch)


Lesenswert?

Samuel K. schrieb:
> sy = y = y + 1;
>
>
> sy = y++;

Beides sollte man meiner Meinung nach unterlassen, wenn man lesbare, 
wartbare Programme schreiben will.
Eine Zuweisung pro zeile ist völlig ausreichend.
Eine Zuweisung mit einem Rückgabewert auszustatten ist meiner Meinung 
nach ein Designfehler, der sich leider durch alle c-oiden 
Programmiersprachen zieht.

von Sam .. (sam1994)


Lesenswert?

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

Ich dachte, dass das bei einer Zuweisung keine Rolle spielt, also y auf 
jedem Fall vor dem = erhöht wird. Wieder was dazugelernt.

Danke für die Antworten!

von Anheizer (Gast)


Lesenswert?

So, da der TO befriedigt ist:

Dann nennt doch mal bitte eure ganzen tollen supersprachen, die solche 
"Fehler" nicht erlaube und ähnliche Praxistauglichkeit und Verbreitung 
besitzen!

von joachim lenz (Gast)


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

von Sam .. (sam1994)


Lesenswert?

Anheizer schrieb:
> Dann nennt doch mal bitte eure ganzen tollen supersprachen, die solche
> "Fehler" nicht erlaube und ähnliche Praxistauglichkeit und Verbreitung
> besitzen!

das sind meiner Meinung nach keine Fehler. Ich finde es gut Sachen wir 
array[i++]++ schreiben zu können.

von Vlad T. (vlad_tepesch)


Lesenswert?

Samuel K. schrieb:
> as sind meiner Meinung nach keine Fehler. Ich finde es gut Sachen wir
> array[i++]++ schreiben zu können.

und warum?
weil das Programm 4 (windows-Zeilenende) Byte weniger auf der Festplatte 
belegt als

1
array[i]++;
2
++i

edit: oder kommst du dir da professioneller vor, wenn du jedes 
Syntax-Zuckerkrümelchen kennst und benutzt?

von asd (Gast)


Lesenswert?

ich sag nur: b=a+++1;

von Vlad T. (vlad_tepesch)


Lesenswert?

asd schrieb:
> ich sag nur: b=a+++1;

ach du scheiße, der compiler frisst das tatsächlich.

von U.R. Schmitt (Gast)


Lesenswert?

asd schrieb:
> ich sag nur: b=a+++1;

ROFL

von Läubi .. (laeubi) Benutzerseite


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.

von Loonix (Gast)


Lesenswert?

joachim lenz schrieb:
> breit angelegte Akzeptanz macht Sch...e jedoch noch
> lange nicht zu einer Delikatesse...

Doch, für Fliegen offensichtlich schon. Du lieferst ein schönes Beispiel 
für einen fehlgeschlagenen Versuch, etwas schlecht zu reden.

von Sam .. (sam1994)


Lesenswert?

Vlad Tepesch schrieb:
> und warum?
> weil das Programm 4 (windows-Zeilenende) Byte weniger auf der Festplatte
> belegt als

Es geht um die Zeilen. Bei Seitemlangem Code können weniger Zeilen den 
Code schon lesbarer machen.

c = a---++b
Wer bietet mehr?

von Vlad T. (vlad_tepesch)


Lesenswert?

Samuel K. schrieb:
> c = a---++b

hier ist ja aber sofort klar, was passiert

a-- - ++b

bei

b= a+++c

könnte es
a + ++c
oder
a++ + c heißen
hier muss man definiv länger überlegen

von Sam .. (sam1994)


Lesenswert?

Vlad Tepesch schrieb:
> könnte es
> a + ++c
> oder
> a++ + c heißen
> hier muss man definiv länger überlegen

Der Compiler nimmt natürlich die erste Variante, da er von links nach 
rechts auswertet. Deswegen blickt er das auch nicht a+++++c, obwohl es 
eindeutig ist. a+++(++c) frisst er.

von Vlad T. (vlad_tepesch)


Lesenswert?

Samuel K. schrieb:
> Der Compiler nimmt natürlich die erste Variante, da er von links nach
> rechts auswertet.

es gibt sowas wie operator präzedenz.
da ++ höherrangig ist als +, nimmt er das auch zuerst

von Sam .. (sam1994)


Lesenswert?

Vlad Tepesch schrieb:
> es gibt sowas wie operator präzedenz.
> da ++ höherrangig ist als +, nimmt er das auch zuerst

Ich weiß, aber a++ und ++a ist gleichwertig. Und a+++++b versteht er 
trotzdem nicht.

von Martin (Gast)


Lesenswert?

Samuel K. schrieb:
> Ich finde es gut Sachen wir
> array[i++]++ schreiben zu können.

Du kannst auch "array{i plus plus> + 1" schreiben, das ist auch kein 
C...

von Martin (Gast)


Lesenswert?

Da habe ich mich verguckt, es ist wohl doch legal. Trotzdem völliger 
Bananencode. :-)

von Stefan E. (sternst)


Lesenswert?

Samuel K. schrieb:
> Ich weiß, aber a++ und ++a ist gleichwertig.

Nein, ist es nicht. Postfix bindet stärker als Prefix.

von Sam .. (sam1994)


Lesenswert?

Stefan Ernst schrieb:
> Nein, ist es nicht. Postfix bindet stärker als Prefix.

Warum erkkent der compiler das dann nicht?
a+++++b
eigentlich müsste er das doch (a++)+(++b) erkennen?

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

von (prx) A. K. (prx)


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.

von mh (Gast)


Lesenswert?

Ist das Verhalten des Parsers denn durch den Standard geregelt?

von Stefan E. (sternst)


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?

von (prx) A. K. (prx)


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."

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.