So ist C nun einmal - die vollständige Erklärung steht in der Spezifikation, Abschnitt 6.5.6 Additive Operatoren , Absatz 8:
Wenn ein Ausdruck vom Typ Ganzzahl zu einem Zeiger addiert oder davon subtrahiert wird, hat das Ergebnis den Typ des Zeigeroperanden. Wenn der Zeigeroperand auf ein Element eines Array-Objekts zeigt und das Array groß genug ist, zeigt das Ergebnis auf ein Element, das gegenüber dem ursprünglichen Element so versetzt ist, dass die Differenz der Indizes des resultierenden und des ursprünglichen Array-Elements gleich dem ganzzahligen Ausdruck ist. Mit anderen Worten: Wenn der Ausdruck P
zeigt auf den i -Element eines Array-Objekts, die Ausdrücke (P)+N
(äquivalent, N+(P)
) und (P)-N
(wobei N
hat den Wert n ) zeigen jeweils auf den i + n -th und i n -ten Elemente des Array-Objekts, sofern sie existieren. Außerdem, wenn der Ausdruck P
auf das letzte Element eines Array-Objekts zeigt, wird der Ausdruck (P)+1
um eins über das letzte Element des Array-Objekts hinausgeht, und wenn der Ausdruck Q
über das letzte Element eines Array-Objekts hinausgeht, wird der Ausdruck (Q)-1
zeigt auf das letzte Element des Array-Objekts. Wenn sowohl der Zeigeroperand als auch das Ergebnis auf Elemente desselben Array-Objekts oder auf ein Element nach dem letzten Element des Array-Objekts zeigen, darf die Auswertung keinen Überlauf erzeugen; andernfalls ist das Verhalten undefiniert. Wenn das Ergebnis auf ein Element hinter dem letzten Element des Array-Objekts zeigt, darf es nicht als Operand eines unären *``** Operator, der ausgewertet wird.
Um das mit Ihrer Verwendung des Präfixes zu verbinden ++
Betreiber, müssen Sie auch lesen Abschnitt 6.5.3.1 Präfix-Inkrement- und Dekrement-Operatoren Absatz 2:
Der Wert des Operanden des Präfixes ++
Operator inkrementiert wird. Das Ergebnis ist der neue Wert des Operanden nach der Inkrementierung. Der Ausdruck ++E
ist gleichbedeutend mit (E+=1)
.
Und auch Abschnitt 6.5.16.2 Zusammengesetzte Zuordnung Absatz 3:
A Komponentenzuordnung der Form E1
op = E2
unterscheidet sich von dem einfachen Zuweisungsausdruck E1 = E1
op (E2)
nur dadurch, dass der l-Wert E1
wird nur einmal ausgewertet.
4 Stimmen
Das ist keine unäre Addition, das ist eine Vorinkrementierung. Die unäre Addition ist ein einzelnes +.
1 Stimmen
Beachten Sie, dass das, was Sie getan haben, ein Speicherleck verursacht hat, weil Sie nicht mehr
free(a);
da er nicht mehr auf den Anfang des zugewiesenen Speichers zeigt. Der Versuch, ihn zu diesem Zeitpunkt freizugeben, wäre ein undefiniertes Verhalten und kann zu einem Segmentierungsfehler führen (wenn Sie Glück haben).0 Stimmen
@Bunnit "Unäre Addition ist ein einzelnes +" -- Nein, genauso wenig wie -x eine unäre Subtraktion ist. Addition und Subtraktion sind binäre Operationen. Ein einzelnes - ist eine Negation; ein einzelnes + ist ein No-op.
0 Stimmen
@Jim Balter. Ok, vielleicht wird "+x" eher als unäres Plus bezeichnet, aber es ist ein Operator, der überladen werden kann, daher ist es nicht immer ein No-Op. Es ist ziemlich klar, dass dies nicht das war, was der OP meinte, denn Pre-Increment wird nie als unäre Addition bezeichnet.
0 Stimmen
Ups C nicht C++ ignorieren den Teil über das Überladen...
1 Stimmen
@Bunnit Eigentlich ist es ganz vernünftig, ++x als "unäre Addition" zu bezeichnen; es ist ein unärer Operator, der eine Addition durchführt. In einer funktionalen Sprache mit Currying kann man etwas wie fn add1 = add(1) oder fn add1 = +(1) schreiben, um eine unäre Funktion zu definieren, die 1 zu ihrem Argument addiert. OTOH, unary "+" macht keine Addition und ist keine unary Addition und wird nie unary Addition genannt -- außer gelegentlich auf SO, wo es bizarrerweise gelingt, 4 Uprates zu erhalten.