2016-01-12 17 views
7

Tôi gặp phải vẻ đẹp này, nhưng tôi thực sự không thể hiểu nổi!Biểu thức -2 [mảng] hoạt động như thế nào?

#include <iostream> 

using namespace std; 

int main() { 
    int array[] = {10, 20, 30}; 
    cout << -2[array]; 

    return 0; 
} 

Nó in -30. Cảm ơn bạn trước

Chỉnh sửa: Không trùng lặp với this question vì dấu "-".

+1

mảng [2] giống với 2 [mảng] – doctorlove

+0

Tôi nhớ có một bản sao mà tôi đã xem cho câu hỏi này. Thật không may nó không có trong danh sách yêu thích của tôi. –

+3

Điều này phải có hàng ngàn bản sao! – dasblinkenlight

Trả lời

12

Điều này thật thú vị và đơn giản. -array[2] giống với -*(array + 2), giống như -*(2 + array) giống với -2[array], tức là -30.

Hiện đã là một bản sao cho trường hợp tổng quát của việc sử dụng dấu ngoặc vuông với mảng (With arrays, why is it the case that a[5] == 5[a]?), nhưng những đứa đây là unary - hành ở phía trước.

Có vẻ như trực quan để cho rằng chỉ mục mảng thực tế sẽ là -2, như array[-2].

Nhưng điều này không xảy ra do nguyên tắc ưu tiên điều hành:

  • operator [] có độ ưu tiên cao hơn unary -, và như vậy được áp dụng đầu tiên.

tôi đã thể hiện sự tranformation với thuê bao mảng 'truyền thống' để làm điều này trực quan hơn

  • như chúng ta không phủ nhận mảng trước khi subscripting nó, chúng tôi không phủ nhận 2 cùng một cách.
+0

Điều thú vị là, tôi hiểu tất cả các phiên bản tương đương mà bạn đã đề cập. Tôi chỉ không "nhìn thấy" tại sao điều này hoạt động. Cảm ơn cả hai người! – Aerozeek

+0

Oh .. và nhân tiện, cảm ơn bạn đã liên kết đến câu hỏi liên quan. – Aerozeek

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