2012-06-24 67 views
7

Xin chào, tôi đã xem qua câu hỏi trong "Kiểm tra kỹ năng của bạn trong c + +".Điều này có nghĩa là char (* (* a [4])()) [5]?

Vui lòng cho tôi biết ý nghĩa của ví dụ là gì?

Edited Mục: Xin lỗi vì sự ngoặc thêm, thay đổi nội dung & gỡ bỏ.

char (*(*a[4])())[5] 
+7

[Quy tắc xoắn ốc] (http://c-faq.com/decl/spiral.anderson.html) sẽ giành lại. – chris

+4

Đó là lỗi cú pháp do các dấu ngoặc đơn không cân bằng. – Blastfurnace

+0

Trang web đó đã dịch các khai báo _C sai ngữ pháp_ thành dạng có thể đọc được của con người là gì? –

Trả lời

16

Tôi đã lừa dối bằng cách xóa nội dung tôi nghĩ là dấu ngoặc đơn thừa và dán kết quả vào cdecl.

declare a as array 4 of pointer to function returning pointer to array 5 of char

+0

Bạn có thể cho tôi xem một ví dụ hay không .. Cảm ơn câu trả lời quý giá của bạn. – Abhineet

+6

@ Abhineet, tôi biết những mảng, con trỏ hàm, giá trị trả về hàm và con trỏ tới mảng ký tự là gì nhưng tôi không thể nghĩ ra một ví dụ thực tế sử dụng sự kết hợp đặc biệt các tính năng ngôn ngữ này. – Blastfurnace

25

Sau khi quy tắc xoắn ốc (như liên quan đến bởi chris), và bắt đầu với nhận dạng:

a 

... là ...

a[4] 

.. .an mảng của 4 ...

*a[4] 

... con trỏ để ...

(*a[4])() 

... một hàm dùng không có thông số ...

*(*a[4])() 

... trở về con trỏ đến ...

(*(*a[4])())[5] 

... một mảng năm ...

char (*(*a[4])())[5] 

... ch ars.

Sidenote: Go cung cấp cho kiến ​​trúc sư đã đưa ra một thay đồ tốt, sau đó tìm lập trình viên đã viết mã này mà không có bình luận giải thích nó và cung cấp cho thay đồ tốt. Trong trường hợp điều này được trao cho bạn như một bài tập về nhà, hãy nói với giáo viên của bạn rằng anh ta nên hướng dẫn bạn cách sử dụng cdecl thay vào đó, hoặc cách thiết kế mã theo cách nó không giống như scrawlings điên, thay vì lãng phí thời gian của bạn Với cái này.

8

Và đây là một ví dụ ...

#include <stdio.h> 

char a[5] = "abcd"; 
char b[5] = "bcde"; 
char c[5] = "cdef"; 
char d[5] = "defg"; 

char (*f1())[5] { return &a; } 
char (*f2())[5] { return &b; } 
char (*f3())[5] { return &c; } 
char (*f4())[5] { return &d; } 

int main() 
{ 
     char (*(*a[4])())[5] = { &f1, &f2, &f3, &f4 }; 
     for (int i = 0; i < 4; i++) 
       printf("%s\n", *a[i]()); 
     return 0; 
} 
+0

Cảm ơn câu trả lời có giá trị của bạn. – Abhineet

13

Và một ví dụ khác ... những gì để không bao giờ làm bất cứ điều gì khác hơn là một ví dụ.

#include <iostream> 

typedef char stuff[5]; 
stuff stuffarray[4] = { "This", "Is", "Bad", "Code" }; 

stuff* funcThis() { return &(stuffarray[0]); } 
stuff* funcIs()  { return &(stuffarray[1]); } 
stuff* funcBad() { return &(stuffarray[2]); } 
stuff* funcCode() { return &(stuffarray[3]); } 

int main() 
{ 
    char (*(*a[4])())[5] = { funcThis, funcIs, funcBad, funcCode }; 
    for(int i = 0; i < 4; ++i) 
    { 
     std::cout << *a[i]() << std::endl; 
    } 
    return 0; 
} 
+1

+1 cho 'typedef': làm cho mã xấu của bạn tốt hơn mã xấu! :) – acraig5075

+4

Tôi hoàn toàn C++ ified nó với cout quá! :) typedef là bởi vì tôi không thể tìm ra cách khai báo các hàm mà không có nó. –

+0

@RetiredNinja: Cảm ơn câu trả lời có giá trị của bạn. – Abhineet

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