Bestimmung von Programmausschnitte
-
@Bushmaster
Das weiß ich nicht
Ich bin noch eine Anfägerin
-
@Bushmaster sagte in Bestimmung von Programmausschnitte:
b=a+++++a;
das wäre b = a++ + ++a;
Da es aber undefiniert ist, wann a verändert wird (direkt vor/nach dem Zugriff oder erst wenn die Anweisung zu Ende ist (beim ; ) ist es vom Compiler/Version/System abhängig, was genau passiert.
-
@DirkB sagte in Bestimmung von Programmausschnitte:
Da es aber undefiniert ist, wann a verändert wird (direkt vor/nach dem Zugriff oder erst wenn die Anweisung zu Ende ist (beim ; )
das ist mies.
-
auch witzig (C++14 -Wall):
++a++; // compiler fehler, lvalue required as increment operand
aber das
(++a)++; // compiliert!
aber das nicht
(a++)++; // lvalue required as increment operand
und das auch nicht
++(a++); // lvalue required as increment operand
schon seltsam
-
Wieso ist das seltsam? Und
++a++
ist dasselbe wie++(a++)
.
-
@Bashar sagte in Bestimmung von Programmausschnitte:
Wieso ist das seltsam? Und
++a++
ist dasselbe wie++(a++)
.aber warum funktioniert '(++a)++'?
die klammern machen erst einen lvalue aus ++a, aber nicht aus a++.
(++(++a))++ funktioniert auch.
wenn a zuvor 1 war, ist es danach 4.
http://cpp.sh/
-
@Bushmaster
++a
ist ein lvalue, fertig. Wie kommst du darauf, dass die Klammern etwas damit zu tun haben? Das ist ja fast schon magisches Denken.Edit: Das ganze "funktioniert" damit noch lange nicht, es ist immer noch undefiniertes Verhalten.
-
@Bashar sagte in Bestimmung von Programmausschnitte:
++a ist ein lvalue, fertig. Wie kommst du darauf, dass die Klammern etwas damit zu tun haben?
also ist es ein fehler des compilers, dass er ++a++ ablehnt. oder was könnte das noch sein?
-
Wieso, "also"?
++a
kommt in++a++
nicht vor. Hatte ich schon gesagt, siehe oben.
-
@Bashar sagte in Bestimmung von Programmausschnitte:
Wieso, "also"?
++a
kommt in++a++
nicht vor. Hatte ich schon gesagt, siehe oben.dann sind die klammern doch wichtig, um den lvalue '++a' von '++a++' abzutrennen. irgendwie reden wir aneinander vorbei, so scheint es mir.
-
++a++
bedeutet in der C++-Syntax dasselbe wie++(a++)
. Wenn man also(++a)++
haben möchte, muss man das auch so schreiben. Vielleicht hast du einfach noch nie über Operatorenrangfolge und ähnliches nachgedachtMit lvalues hat das an sich nichts zu tun, außer dass natürlich
++a
ein lvalue ist unda++
nicht.
-
@Bashar sagte in Bestimmung von Programmausschnitte:
Vielleicht hast du einfach noch nie über Operatorenrangfolge und ähnliches nachgedacht Mit lvalues hat das an sich nichts zu tun, außer dass natürlich ++a ein lvalue ist und a++ nicht.
ich finde das ein bisschen undurchsichtig. gibt es einen grund dafür, wieso a++ kein lvalue ist?
++a = 2; // erst hochzählen, dann neu setzen ist okay a++ = 2; // erst neu setzen dann hochzählen aber nicht ???
-
Was verstehst du denn unter einem lvalue?
-
@Bashar sagte in Bestimmung von Programmausschnitte:
Was verstehst du denn unter einem lvalue?
eine variable, ein register, irgendein objekt dem man etwas zuweisen kann, das veränderlich ist.
-
-
@Bushmaster
'++i' gibt eine Referenz auf i zurück und 'i++' eine Kopie. Daher kannst du auf '++i' weiter arbeiten, der Kopie musst du aber erst einen Namen geben, über den du die ansprechen kannst.
-
@Schlangenmensch sagte in Bestimmung von Programmausschnitte:
++i' gibt eine Referenz auf i zurück und 'i++' eine Kopie.
das kenne ich von operatorüberladung bei c++.
um das ganze konsistent zu machen, sollen sich primitive variablen wie integers wohl auch so verhalten, oder?
-
@Bushmaster Ist zumindest so dokumentiert: https://en.cppreference.com/w/cpp/language/operator_incdec
-
Das stimmt nicht und steht da auch nicht, aber als Eselsbrücke ist es ganz gut zu gebrauchen.