C immer kopiert ein Element, wenn mit A[i]
aus einem Array zu lesen, das heißt, wenn der Ausdruck A[i]
ist ein „R-Wert“. Wenn man jedoch schreibt, C eine Vorstellung von „L-Wert“ Ausdrücke hat, die im Wesentlichen eine eingeschränkte Teilmenge der Ausdruckssyntax ist, die zulässig sind als Ziel einer Zuweisung erscheinen:
X = Y
*X = Y
X[i] = Y
X.n = Y
In diesen Fällen die „Ausdrücke“ *X
, X[i]
und X.n
nicht auswerten tatsächlich auf Werte sie die gleiche Syntax als Ausdrücke, für die Bequemlichkeit, aber nicht die gleiche Semantik. Sie können als so etwas wie diese denken mehr wie folgt aus:
memcpy(&X, &Y, sizeof(Y));
memcpy(&*X, &Y, sizeof(Y));
memcpy(&X[i], &Y, sizeof(Y));
memcpy(&X.n, &Y, sizeof(Y));
Oder alternativ, denken Sie an C als mehrere verschiedene Zuweisungsoperatoren mit:
_ = _ // direct assignment
*_ = _ // indirect assignment
_[_] = _ // special case of indirect assignment
_._ = _ // special case of indirect assignment
So oder so, eine Zuordnung wie A[5] += 1
wird den Wert des sechsten Elements von A
an Ort und Stelle erhöhen, wie Sie es erwarten würden, was Sie so bestätigen können:
int A[1] = { 1 };
A[0] += 5;
printf("%d\n", A[0]); // 6
'A [5]' dereferenziert das Array-Element direkt, keine temporären beteiligt Kopien. – user0042
'A [5] + = 1 'erhöht das Fitth-Null-basierte Element des Arrays' A '. Wenn es das nicht tut, hat der Compiler einen Fehler. Unklar, was du verlangst. – EJP
'A [5] + = 1' ist genau das gleiche wie' A [5] = A [5] + 1', ein optimierender Compiler würde, wenn überhaupt, so wenige Kopien wie möglich machen Maschinensprache. – nos