Bestimmung von Programmausschnitte
-
@dooni sagte in Bestimmung von Programmausschnitte:
@Bushmaster
a=1
c=++a => c=2
c=a++ =>c=1
habe ich es so richtig verstanden?ja, so passt das.
-
@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 nachgedacht Mit 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.