Chức năng này trả về một tài liệu tham khảo tới một mảng của int
kích thước 3
và [3]
phần sau khi chức năng thực sự là kích thước của mảng được trả về như tham khảo.
cú pháp che khuất này xuất phát từ cú pháp lạ của khai báo mảng, mà bạn làm như sau:
int arr[3]; //real but weird
Ngôn ngữ có thể đã được đơn giản hơn nhiều nếu nó có này để thay thế:
int[3] arr; //hypothetical but better and simpler
vì kích thước 3
là một phần của loại arr
, do đó, điều này có ý nghĩa hơn nếu tất cả các phần xuất hiện ở phía bên trái của tên biến, giống như cách bạn viết:
unsigned int a;
Bạn không ghi:
unsigned a int; //analogous to : int a [3];
Vì vậy, trong khi ngôn ngữ làm điều đúng với unsigned int
, nó là một điều rất lạ với int[3]
.
Bây giờ trở lại với phần khai báo hàm, chức năng sẽ tốt hơn nhiều nếu nó được khai báo là:
int[3]& f(int[3]& arr); //hypothetical
chỉ khi nó đã có tất cả các bộ phận trên bên trái của biến-name. Nhưng vì nó không làm điều đó (tức là ngôn ngữ đòi hỏi bạn để ghi các kích thước ở phía ngoài cùng bên phải sau tên biến), bạn kết thúc với chữ ký kỳ lạ này:
int (&f(int (&arr)[3])[3]; //real
Chú ý rằng ngay cả những cách tham số trở nên kỳ lạ.
Nhưng bạn có thể đơn giản hóa nó với một typedef như:
typedef int array_type[3];
array_type& f(array_type& arr);
Điều đó có vẻ tốt hơn nhiều. Bây giờ chỉ có typedef có vẻ lạ.
Với C++ 11, bạn có thể viết ngay cả một typedef tốt hơn:
using array_type = int[3];
array_type& f(array_type& arr);
đó là càng gần càng này (nếu bạn hình dung array_type
như int[3]
):
int[3]& f(int[3]& arr); //hypothetical
Hy vọng rằng sẽ giúp .
Bởi vì K & R là kẻ tàn ác . – orlp
http://cdecl.org/. Cú pháp khai báo C có thể là "vui". –
Một khi bạn nhận được nó, xin vui lòng không bao giờ bao giờ viết điều khủng khiếp như vậy trong một mã đời thực. – kebs