2012-08-30 6 views
6

Ich hatte eine Person, die behauptet, dass diese Linie nicht durch den Standard C++ abgedeckt ist:Ist Array [i] = i ++ vom C++ - Standard abgedeckt?

int i(1); 
array_of_int[i] = i++; 

Die Person sagte, dass es 1 vergeben wird, aber wir können nicht wissen, ob es in array_of_int[1] oder array_of_int[2] obwohl Visual Studio sein und die meisten Compiler werden in array_of_int[1] sein.

Ist er richtig?

+0

Wie ich es verstehe, wird dieses Verhalten durch den Compiler bestimmt und nicht explizit in der C++ - Standard – CatShoes

+4

Mögliche dup: http://StackOverflow.com/questions/949433/could-anyone-explain-these-undefined-behaviors -iiiii-etc - dies ist in einer der Antworten abgedeckt. – Mat

+0

Bitte schließen oder entfernen Sie meine Frage, wenn es sich um einen Betrogenen handelt, ich habe versucht, es zu finden, wurde aber nicht meine Suche mit den richtigen Schlüsselwörtern formuliert. – BlueTrin

Antwort

6

Dies ist ein undefiniertes Verhalten. Wörtlich ist jedes Verhalten legal.

Der Durchgang, der diese Zeile Code verbietet, ist dies:

zwischen dem vorherigen und nächsten Sequenz Punkt ein Objekt hat seinen gespeicherten Wert höchstens einmal durch die Auswertung eines Ausdrucks geändert hat. Darüber hinaus wird der vorherige Wert nur gelesen werden, um den Wert zu bestimmen, zu

gespeichert wird

Es gibt keinen Sequenzpunkt zwischen a[i] und i++ und dem Lese zu i in a[i] nicht zum Zweck der Bestimmung das, was Wert ist gespeichert in i von i++.

+0

Dank für die Erklärung, fügte ich einen Link zu der Wiki-Seite der Sequenzpunkte – BlueTrin

+1

Sequenzpunkte wurden aus C++ entfernt und durch Sequenzierung ersetzt Beziehungen zwischen Anweisungen/Unterausdrücken. [siehe hier] (http://stackoverflow.com/a/10655884/365496). Dies ändert einige Instanzen von undefiniertem Verhalten in wohldefiniertes Verhalten, aber nicht in diesem speziellen Fall. – bames53

Verwandte Themen