Allg. Frage zur while-Schleife - bitte beantworten!!!
-
Kosake schrieb:
Der Prefix-Operator wird in der aktuellen Zeile ausgeführt
Der Postfix-Operator wird erst in der nächsten Zeile ausgeführt
quatsch!
:xmas2:
-
Da muß ich ten sogar recht geben - beide Operatoren werden in der aktuellen Zeile ausgeführt und unterscheiden sich nur im Rückgabewert:
- der Präfix-Operator inkrementiert vor der Rückgabe
- der Postfix-Operator inkrementiert nach der Rückgabe
(allerdings ist nicht definiert, wo und in welcher Reihenfolge sich die Nebeneffekte der Operatoren auswirken - wichtig ist nur, daß am nächsten "Sequenzpunkt" der Operand seinen neuen Wert hat)
-
CStoll schrieb:
Da muß ich ten sogar recht geben - beide Operatoren werden in der aktuellen Zeile ausgeführt und unterscheiden sich nur im Rückgabewert:
- der Präfix-Operator inkrementiert vor der Rückgabe
- der Postfix-Operator inkrementiert nach der Rückgabe
(allerdings ist nicht definiert, wo und in welcher Reihenfolge sich die Nebeneffekte der Operatoren auswirken - wichtig ist nur, daß am nächsten "Sequenzpunkt" der Operand seinen neuen Wert hat)
Ihr habt ja alle recht. Genau das wollte ich damit sagen, wobei ich mich etwas schwammig ausgedrückt habe.
Mit in der "in der aktuellen Zeile" meinte ich vor dem nächsten Semikolon und "in der nächsten Zeile" eben nach dem Semikolon. (Hoffe das ist nicht auch wieder falsch ^^)
-
Kosake schrieb:
Mit in der "in der aktuellen Zeile" meinte ich vor dem nächsten Semikolon und "in der nächsten Zeile" eben nach dem Semikolon. (Hoffe das ist nicht auch wieder falsch ^^)
Und das ist wirklich sehr schwammig formuliert
Der ANSI-Standard gibt lediglich einen Bereich (Sequenzpunkte) vor, in dem die Nebenwirkung von (Teil)Ausdrücken eingetreten sein muß - dazu gehört neben dem ; als Anweisungsende auch die Operatoren , (Komma-Operator), ?:, &&, || und ein Funktionsaufruf. Aber diese Regeln gelten für alle Ausdrücke mit Nebeneffekte gleichermaßen* - Post- und Präfix-Inkrement (und Dekrement), Zuweisung und kombinierte Zuweisungen.
(*was zu großen Verwirrungen führen kann, wenn die selbe Variable mehrfach verwendet und dabei als Nebeneffekt geändert wird - z.B. ist der Wert des Ausdrucks
++x + x
undefiniert, da du nicht vorhersagen kannst, welchen Wert "das zweite" x haben wird)
-
int i=0; printf("%d %d %d ", i++, i, i++);
Ausgabe:
1 2 0
Ich liebe undefiniertes Verhalten
Ein Grund, wieso ich diese Operatoren nur sehr selten benutze...
-
Jay schrieb:
Ich liebe undefiniertes Verhalten
Ein Grund, wieso ich diese Operatoren nur sehr selten benutze...nachdem ein mieser compiler noch nichtmal sowas konnte:
array[index++] = x;
mach ich in 'richtigen' programmen nur noch:
array[index] = x; index++;
btw: das war der 'ICC12'. schlimm daran war, das er's manchmal hinbekam und manchmal nicht (je nachdem wo im code das auftauchte)
-
CStoll schrieb:
(*was zu großen Verwirrungen führen kann, wenn die selbe Variable mehrfach verwendet und dabei als Nebeneffekt geändert wird - z.B. ist der Wert des Ausdrucks
++x + x
undefiniert, da du nicht vorhersagen kannst, welchen Wert "das zweite" x haben wird)Entschuldige mich bitte, dass ich darauf rumreite, aber warum soll der Ausdruck ++x+x den undefiniert sein
zum Beispiel für x=2:
1. Das Präfix-Inkrement erhöht x um 1, weil es eine höhere Bindungskraft hat als die Addition (steht in der Operatoren-Reihenfolge höher) d.h. sowohl das erste ich als auch das zweite haben den Wert 3 (warum sollte das zweite x einen anderen Wert haben?)
2. Das zwete x wird addiert. Somit ist das Ergebniss 6Also wird ++x + x wie (++x) + x ausgewertet.
Zumindest klappt das mit meinem Compiler und zwar immer und mit allen Operatoren.
Wie der Compiler jetzt genau heißt weiß ich nicht. Er ist jedenfalls von MS.
Ich dachte bisher immer das, dass von der Bindungstärke der Operatoren abhängt.
-
ten schrieb:
nachdem ein mieser compiler noch nichtmal sowas konnte:
array[index++] = x;
mach ich in 'richtigen' programmen nur noch:
array[index] = x; index++;
das gleiche problem hatte ich die tage auch, sehr merkwürdig...passiert aber merkwürdigerweise nur bei arrays...
-
KC schrieb:
das gleiche problem hatte ich die tage auch, sehr merkwürdig...passiert aber merkwürdigerweise nur bei arrays...
welcher compiler?
-
@Kosake: Das Problem bei dem obigen Ausdruck ist, daß Nebeneffekte von Ausdrücken nicht sofort auftreten müssen (und daß auch nicht garantiert ist, in welcher Reihenfolge die einzelnen Operanden ausgewertet werden müssen) - also könnte ein anderer Compiler beschließen, zuerst den zweiten Summanden zu berechnen (oder x erst am Ende des Ausdrucks auf seinen neuen Wert zu setzen) - mit dem Rückgabewert 5. Der ANSI-Standard definiert nicht, welcher dieser Ansätze "richtig" ist (und die Prioritätenregelung besagt nur, wie der Ausdruck implizit geklammert werden soll).