Inkrementierung / Dekrementierung
-
Hilfeeeeeeeeeeeeeeeeeeeeeeeeeee !!!!
Ich schreibe morgen eine KLausur und hänge grad an einer Übungsaufgabe. Ich komm einfach nicht auf die Lösung.
Hier die Aufgabe:#include <stdio.h>
main()
{
short a = 12a+=++a+a++
a = a+a
printf("%d\n", a);
}Frage ist welcher Wert ausgegeben wird. Lösung ist 80. Ich weiß einfach nicht wie man darauf kommt. Bin blutiger Anfänger, ich muss aber diese Klausur packen.
Danke für eure Hilfe !!!
-
Morgen Damiroquai, eigendlich ganz einfach.
a = 12; // Zuerst wird ++a ausgeführt damit ist a überall: 13 // Dann wird ((++)a + a) zusammengerechnet: 26 // Dann wird das letzte ++ ausgeführt a += ++a + a++; // Ergibt 13 += 13 +13 +1 == 40 // Und dann 40 + 40 = 80 a = a+a
Besser kann ich das im Moment nicht beschreiben.
-
Guck dir mal folgendes an:
http://pronix.de/pronix-675.html
http://pronix.de/pronix-673.html
http://pronix.de/pronix-674.html
http://pronix.de/pronix-639.htmlIn a += ++a + a++; hat der Postfix-Inkrement-Operator die höchste Priorität.
Er inkreminiert a um 1, also zählt 1 dazu, übergibt aber noch den alten Wert.
a ist nun 13, 12 wurde aber noch übergeben. Danach wird ++a aufgeführt. Dabei wird a wieder um 1 inkremeniert, a ist nun also 14, und der neue Wert also 14 wird über geben. Wir haben nun also a += 14 + 12;. Daraus wird a += 26 dh. a = a + 24; . Da a immer noch 14 ist erhalten wir 40. a = a + a; ergibt dann 80.
-
Die Aufgabe brauchst du nicht nachzuvollziehen, denn das Ergebnis ist undefiniert (zumindest in C++).
-
nicht verzweifeln das ganze ist ganz einfach.
aufgabe:#include <stdio.h> main() { short a = 12 a+=++a+a++ a = a+a printf("%d\n", a); }
richtigstellung:
#include <stdio.h> main(){ short a = 12;//hier strichpunkt a+=++a+a++;//hier strichpunkt a = a+a;//hier strichpunkt printf("%d\n", a); }//end main
Vereinfachung:
main(){ short a = 12; a = a + ++a + a++; a = a + a; printf("%d\n", a); }//end main
Schrittweise verfeinerung:
main(){ short a = 12; a = a + ++a + a++; // a = 12 + 14 + 14 // a = 40 a = a + a; // a = 40 +40 // a = 80 // ------ printf("%d\n", a); }//end main
ich hoffe ich habe dir helfen koennen...
-
Super ich habs kapiert. Danke für euere schnelle Hilfe. Jetzt bin ich schonmal einen Stück weiter.
-
Ich frage mich, wieso man so eine Übungsaufgabe stellt. Denn wer würde es so programmieren?
-
glok schrieb:
Guck dir mal folgendes an:
nicht den pronix quatsch, besser das hier: http://www.langer.camelot.de/Articles/VSJ/SequencePoints/SequencePoints.html
-
Ohne nets Link durchgelesen zu haben: Kann mir mal einer sagen, wieso der Code vom OP legal sein sollte? Es gilt doch beliebige Auswertungsreihenfolge innerhalb eines Sequence Points.
-
@Michael E. wir sind hier im C Forum und nicht in C++, wenn C++ das nicht kann schade.
In mathematischen Ausdrücken, als solcher ist dieser Mist (
deshalb wer in Übungsaufgaben solchen logischen Blödsinn rechnen läßt ist auch verantwortlich dafür wenn später solcher Scheiß geschrieben wird. Nicht alles was technisch machbar ist, ist auchsinnvoll) zu werten gibt es klare Regeln die oben aufgeführt sind.
Es ist simpel
Was nicht einfach lesbar ist, ist Per Definitionem Schlechter Code
-
PAD: Sollte das nicht in C und C++ gleich ablaufen? Bei allen Links, die ich mir angeguckt hab, wurden C und C++ im Bereich sequence points gemainsam behandelt.
-
PAD schrieb:
@Michael E. wir sind hier im C Forum und nicht in C++, wenn C++ das nicht kann schade.
c kann das auch nicht. bei ausdrücken wie 'a += ++a + a++' kommt je nach compiler was anderes raus.