2012-12-05 9 views
11

Mögliche Duplizieren:
Could anyone explain these undefined behaviors (i = i++ + ++i , i = i++, etc…)
increment values in printfin C/C++ ist x [i] * Y [i ++] immer gleich x [i] * y [i]

Ich habe eine zwei Doppel-Arrays x und y und Integer i. Meine Frage ist, ob die Aussage:

double res = x[i] * y[i++]; 

die Aussage immer gleich ist:

double res = x[i] * y[i]; 
i++; 

Ist es möglich, dass einige Compiler x[i] * y[i++] in y[i++] * x[i] ändern würden, was natürlich anderes Ergebnis hervorbringt?

+0

Warum ist es wichtig? Wenn Sie eine bestimmte Bestellung wünschen, schreiben Sie sie einfach in dieser Reihenfolge. –

+0

@ BoPersson. Ich dachte, ich sollte eine Erklärung schreiben, warum ich es brauche, aber ich wollte die Frage nicht verderben. Kurz, ich muss 'double vectors_dot_product (double * x, double * y, intn);' function beschleunigen und habe festgestellt, dass 'x [i] * y [i ++] + x [i] * y [i ++] +. ..; 'ist schneller als' x [i] * y [i] + x [i + 1] * y [i + 1] + ...; ' – Serg

Antwort

13

Nein - x[i] + y[i++] hat undefiniertes Verhalten. Sie ändern den Wert i und verwenden auch den Wert i ohne einen dazwischenliegenden Sequenzpunkt, der undefiniertes Verhalten gibt.


  1. In C++ 11 der Standard hat die „Sequenzpunkt“ Terminologie eliminiert, aber der Effekt gleich bleibt - die beide sind ungeordnet in Bezug zueinander.
+1

+1 erste Antwort mit korrekter Sprache. – slebetman

+3

Das hat nichts mit der Kommutativität des Multiplikationsoperators zu tun. Wenn die Operation "x [i] - y [i ++]" wäre (was nicht rückgängig gemacht werden kann), wäre das Verhalten von "i" in dieser Situation immer noch undefiniert. –

8

Nein, es ist nicht definiert, wann das Inkrement auftritt. Kein

+8

Nicht nur, wenn das Inkrement auftritt. Das Verhalten ist ** völlig ** undefiniert: Es ändert "i" und liest seinen Wert ohne einen dazwischenliegenden Sequenzpunkt. –

+1

@Pete: Großartig, wann wird der Pizzabote vor meiner Haustür erscheinen? ;) – fredoverflow

+2

@FredOverflow - fragen Sie Ihren Compiler-Anbieter. –

1

,

Wert von i ++ + i ++ sind undefined in C und C++.

Wenn Sie eine Variable zweimal in einem Ausdruck lesen, in dem Sie sie auch schreiben, ist das Ergebnis nicht definiert. Tu das nicht. Ein anderes Beispiel ist:

v[i] = i++; 

Undefiniert bedeutet seine COMPILER ABHÄNGIG.
Einige Compiler könnten Sie auch als undefined wegen der Reihenfolge der Auswertung warnen. Ein sehr gute reference für C++

1http://www.stroustrup.com/bs_faq2.html#evaluation-order

+0

Benötigt noch ein bisschen Arbeit - 'v [i] = i ++;' ist undefiniert, obwohl es keine Funktion oder Argumente enthalten darf. –

+0

@GrijeshChauhan, danke für den Link. – Serg

+0

@Serg: Willkommen serg! Ich freue mich, wenn ich helfen kann :) –

6

Der Code ändert i und verwendet seinen Wert ohne einen dazwischenliegenden Sequenzpunkt, so dass das Verhalten ist nicht definiert. Die Sprachdefinition stellt hier keine Anforderungen.

+0

Interessant, dass Sie ausgerechnet die Tatsache nicht erwähnen, dass C++ 11 nicht mehr "Sequenzpunkt" verwendet. :-) –

+0

@JerryCoffin - manchmal ist es besser, die Dinge einfach zu halten. –

+0

+1. Es gibt etwas zu sagen für die Einfachheit des "Glaubens verlassen, alle, die hier eintreten". –

Verwandte Themen