2015-12-14 20 views
10

Tôi bắt gặp trực tuyến này và tự hỏi liệu có ai đó có thể giải thích điều này hoặc ít nhất là cho tôi biết tên của nó có thể để ít nhất tôi biết tôi đang googling cho.Chỉ số đảo ngược C++ và tên mảng

int main() 
{ 
    int myarray[4] = {0, 100, 200, 300}; 
    2[myarray] = -999; //why does this work? what is this called? 

    for (int i = 0; i < 4; i++) 
     cout << myarray[i] << endl; 
} 

Đầu ra là 0, 100, -999, 300

Tôi đã chạy nó. Tôi biết nó hoạt động nhưng tại sao? Cái này gọi là gì?

+0

Nó được gọi là tương thích retro ngu ngốc với K & R C. – YSC

Trả lời

8

Lý do là vì arr[n] == *(arr + n).

Tuy nhiên, vì bổ sung là giao hoán, *(arr + n) == *(n + arr). Do đó, *(n + arr) == n[arr] == *(arr + n) == arr[n].

Có thể đáng nói đến là *(arr + n) vẫn còn một chút gây hiểu nhầm. Trong hội đồng, nó thực sự có nghĩa là *(arr + (n * s)) trong đó ssizeof arr[0], nhưng điều này là dưới sự bảo hiểm, do đó bạn không cần phải lo lắng về nó.

+0

trở lại trong ngày, khi tôi học C của bản thân mình, hiếm khi có đề cập rằng * 's' là' sizeof arr [0] '*, tốt bạn đã thêm nó trong :) – nonsensation

3

Tôi không nghĩ rằng việc sử dụng quy tắc cho số học con trỏ cụ thể này có bất kỳ tên cụ thể nào. Nó đơn giản rơi ra khỏi con trỏ số học được định nghĩa trong C và C++. Cả hai tiêu chuẩn ngôn ngữ này đều không có bất kỳ nỗ lực đặc biệt nào để ngăn sự đảo ngược của chỉ số và con trỏ. Ví dụ: quy tắc C++ có liên quan nằm trong 5.2.1 [expr.sub] đoạn 1:

Biểu thức hậu tố được theo sau bởi biểu thức trong dấu ngoặc vuông là biểu thức hậu tố. Một trong các biểu thức sẽ có kiểu “mảng T” hoặc “con trỏ đến T” và cái kia phải có kiểu liệt kê hoặc kiểu không tách rời. Kết quả là kiểu “T.” Kiểu “T” phải là kiểu đối tượng được xác định hoàn toàn. Biểu thức E1 [E2] giống hệt nhau (theo định nghĩa) với * ((E1) + (E2)) [Lưu ý: xem 5.3 và 5.7 để biết chi tiết về * và + và 8.3.4 để biết chi tiết về mảng. —thêm ghi chú], ngoại trừ trường hợp của toán hạng mảng, kết quả là một giá trị nếu toán hạng đó là một lvalue và một giá trị xvalue khác.

thể làm việc để tìm kiếm "C++ 5.2.1" hoặc "C++ [expr.sub]" nhưng việc sử dụng đảo ngược mà không phải là lớn hơn người khó hiểu, những người đã không nhìn đủ lâu tại C hoặc C++.

Các vấn đề liên quan