2016-03-17 16 views
8

Tham chiếu C của Harbison/Steele nói rằng phần cuối của một khai báo đầy đủ đầy đủ là là một điểm chuỗi. Nhưng một người khai báo đầy đủ là gì?Người khai báo đầy đủ trong C là gì?

"Một declarator đầy đủ là một declarator đó không phải là một phần của một declarator"

... gì?

Ví dụ: nó có được đảm bảo bằng tiêu chuẩn C int i = 0, *j = &i lưu trữ địa chỉ bộ nhớ với giá trị của biến i trong con trỏ j?

Nói cách khác, là một phần khai báo đầy đủ của int i = 0?

Trả lời

7

Không, bạn đang trộn tờ khaingười khai báo.

Hãy để tôi trích dẫn phần của ngữ pháp C so với tiêu chuẩn:

declaration: 
    declaration-specifiers init-declarator-list[opt] ; 

init-declarator-list: 
    init-declarator-list , init-declarator 

init-declarator: 
    declarator 
    declarator = initializer 

Và sau đó:

declarator: 
    pointer[opt] direct-declarator 

direct-declarator: 
    identifier 
    (declarator) 
    .... 

TL; DR: int i = 0; là một tuyên bố . Phần i là một tuyên bố .

Phần về người khai báo đầy đủ là rõ ràng nếu bạn có, ví dụ, con trỏ. Dòng này:

int *p[3] = { 0 }; 

là một tuyên bố. Phần *p[3] là người khai báo đầy đủ , nhưng p[3]p cũng (không đầy đủ) người khai báo.

Và đặt câu hỏi đầu tiên của bạn, có, int i = 0, *j = &i; hoàn toàn ổn, vì có hai người khai báo đầy đủ: i*j. Có một điểm chuỗi ở cuối mỗi khai báo đầy đủ cộng với một điểm chuỗi khác ở cuối mỗi bộ khởi tạo. Bạn thậm chí có thể viết void *p = &p; và nó sẽ là tốt.

+0

Trong 'int i = 0, * j = & i;' Có thực sự là một điểm chuỗi ở giữa '0,'? Phụ lục C cho biết: * Sau đây là các biểu thức đầy đủ: một bộ khởi tạo không phải là một phần của một ký tự hợp chất (6.7.9); Nhưng tôi không thể tìm thấy bất cứ điều gì có liên quan trong 6.7.9, và Phụ lục C chỉ là thông tin. Bạn có thể chỉ ra quy tắc được không? – 2501

+0

@ 2501. Phụ lục C từ tiêu chuẩn C liệt kê tất cả các điểm chuỗi, ở đây bạn có thể đọc _ "Giữa việc đánh giá biểu thức đầy đủ và biểu thức đầy đủ tiếp theo được đánh giá. Sau đây là các biểu thức đầy đủ: một bộ khởi tạo không phải là một phần của hợp chất theo nghĩa đen; [...] "_. Cá nhân tôi tìm thấy những từ ngữ một chút khó hiểu, bởi vì nếu giữa biểu thức đầy đủ này và các biểu thức đầy đủ tiếp theo được đánh giá có mã bổ sung? SP sẽ đi đâu? Tôi chỉ đơn giản sẽ nói "_at kết thúc của một biểu thức đầy đủ_". – rodrigo

+0

Tôi biết, vui lòng xem nhận xét đã chỉnh sửa. – 2501

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