C luôn sao chép phần tử khi đọc từ mảng có A[i]
, tức là khi biểu thức A[i]
là “giá trị”. Tuy nhiên, khi xem xét viết, C có một khái niệm về thuật ngữ “giá trị trái”, mà thực chất là một tập hợp con hạn chế của cú pháp biểu thức được phép xuất hiện là điểm đến của một bài tập:
X = Y
*X = Y
X[i] = Y
X.n = Y
Trong những trường hợp này, "biểu thức" *X
, X[i]
và X.n
không thực sự đánh giá giá trị — chúng có cùng cú pháp làm biểu thức, để thuận tiện, nhưng không giống nhau ngữ nghĩa. Bạn có thể nghĩ rằng trong số này là một cái gì đó giống như sau:
memcpy(&X, &Y, sizeof(Y));
memcpy(&*X, &Y, sizeof(Y));
memcpy(&X[i], &Y, sizeof(Y));
memcpy(&X.n, &Y, sizeof(Y));
Hoặc cách khác, suy nghĩ của C là có nhiều toán tử gán khác nhau:
_ = _ // direct assignment
*_ = _ // indirect assignment
_[_] = _ // special case of indirect assignment
_._ = _ // special case of indirect assignment
Dù bằng cách nào, một bài tập như A[5] += 1
sẽ tăng giá trị của phần tử thứ sáu là A
tại chỗ, giống như bạn mong đợi, mà bạn có thể xác minh như sau:
int A[1] = { 1 };
A[0] += 5;
printf("%d\n", A[0]); // 6
Nguồn
2017-07-23 10:36:27
'A [5] 'dereferences phần tử mảng trực tiếp, không có bản sao tạm thời có liên quan. – user0042
'A [5] + = 1' tăng phần tử dựa trên không phù hợp của mảng' A'. Nếu nó không làm điều đó, trình biên dịch có lỗi. Không rõ bạn đang hỏi gì. – EJP
'A [5] + = 1' chỉ giống với' A [5] = A [5] + 1', trình biên dịch tối ưu hóa sẽ tạo thành ít bản sao, nếu có, có thể được biểu thị bằng ngôn ngữ máy. – nos