C zawsze skopiowanie element przy odczytu z tablicy z A[i]
, to znaczy, gdy ekspresja A[i]
jest „RValue”. Jednakże biorąc pod uwagę pisze, C ma pojęcia „lwartości” wyrażeń, które są zasadniczo ograniczony podzbiór składni wyrażeń, które mogą pojawić się jako cel cesji:
X = Y
*X = Y
X[i] = Y
X.n = Y
W tych przypadkach, "wyrażenia" nie są w rzeczywistości wartościowane - mają tę samą składową, co dla wygody, ale nie są takie same, ale nie są takie same. Można myśleć o nich jako coś więcej jak poniżej:
memcpy(&X, &Y, sizeof(Y));
memcpy(&*X, &Y, sizeof(Y));
memcpy(&X[i], &Y, sizeof(Y));
memcpy(&X.n, &Y, sizeof(Y));
Lub alternatywnie myśleć C jako mający wielu różnych operatorów przypisania:
_ = _ // direct assignment
*_ = _ // indirect assignment
_[_] = _ // special case of indirect assignment
_._ = _ // special case of indirect assignment
czy inaczej, zadanie takie jak A[5] += 1
zwiększy wartość szóstego elementu A
w miejscu, dokładnie tak, jak można się spodziewać, co można zweryfikować tak:
int A[1] = { 1 };
A[0] += 5;
printf("%d\n", A[0]); // 6
'a [5] 'dereferences elementu tablicy, bezpośrednio, bez tymczasowych kopie zaangażowane. – user0042
'A [5] + = 1' zwiększa element z tablicy" A "o współczynnik zero. Jeśli tego nie zrobi, kompilator ma błąd. Niejasne, o co pytasz. – EJP
'A [5] + = 1' jest takie samo jak' A [5] = A [5] + 1', kompilator optymalizacyjny wykonałby jak najmniej kopii, jeśli w ogóle, może być wyrażony przez język maszyny. – nos