2017-01-31 2 views
1

Nach dem Standard sind die folgenden beiden Ausdrücke undefined Verhalten?Addition und Inkrement Ausdruck in [] - Operator

int a = 1, b = 1; 
int c[] = { 1, 2, 3, 4, 5 }; 

// Do the following expressions lead to Undefined Behavior ? 
c[a++]; // (1) 
c[a+b]; // (2) 
+3

'a' ist kein Array .... –

+0

' a [a ++]; 'ist ein Compilerfehler – NathanOliver

+0

Meintest du' int c [] = {1, 2, 3, 4, 5}; '? –

Antwort

5

Nein, in ihrer gegenwärtigen Form führen sie nicht zu undefiniertem Verhalten. Es gibt keine Verletzung des Sequenzpunktes, da Sie befürchten könnten, zu haben.

  • Bei c[a++]; dem bestehenden Wert in a Indexierungs verwendet wird, und a wird als Nebeneffekt (der Post-Inkrement-Operator) inkrementiert.
  • c[a+b]; keiner der Variablenwerte ist geändert und a+b ist ein gültiger Index des Arrays.
+0

Es gibt ein Beispiel in der C++ 14 ISO-Standard-Abschnitt '1.9.15', die zu der Verwirrung führen: http://www.open-std.org/jtc1/sc22/ wg21/docs/papers/2014/n4296.pdf Aber darf ich nur den Abschnitt falsch verstehen. – SebNag

+0

@SebNag In diesem Beispiel wird das Ergebnis von 'v [i ++]' benutzt, um 'i' zu ändern, was zu zwei unse- quenzierten Modifikationen von' i' führt. Btw, der C++ 14 Standard wäre N4141 (+ - einige Tippfehler/Layout-Korrekturen vielleicht). N4296 ist ein Zwischenentwurf. –

+0

@SebNag Das ist ein anderer Fall, da verwenden Sie das Post-Inkrement auf 'i' __und geben den RHS-Wert zurück an' i'. Jetzt gibt es keinen Sequenzpunkt zwischen der Ausführung des Nebeneffekts und der Zuweisung, wo das Problem liegt. –

1

Sie können ein undefiniertes Verhalten, wenn die a oder b oder die Summe von a und b größer als die Größe des Arrays ist:

int a = 1, b = 1; 
int c[] = { 1, 2, 3, 4, 5 }; 

c[a++]; // (1) a = 2 
c[a+b]; // (2) a + b = 3 

cout << c[a] << endl; // 3 
cout << c[a+b] << endl; // 4 
cout << a << ", " << b << endl; 

Wie man dort sehen kann, ist nicht UB weil c[a + b] = c[3] die ist ein Element des Arrays.

Verwandte Themen