Khi xem qua ngữ pháp BNF của C, tôi nghĩ thật kỳ lạ khi quy tắc sản xuất cho một tuyên bố trông như thế này (theo https://cs.wmich.edu/~gupta/teaching/cs4850/sumII06/The%20syntax%20of% 20C% 20in% 20Backus-Naur% 20form.htm ):
<declaration> ::= {<declaration-specifier>}+ {<init-declarator>}* ;
Tại sao sử dụng một bộ *
định lượng (có nghĩa là không hoặc nhiều lần xuất hiện) cho init-declarator
? Điều này cho phép các câu lệnh như int;
hoặc void;
có giá trị cú pháp, mặc dù chúng không hợp lệ về mặt ngữ nghĩa. Họ không thể chỉ sử dụng một bộ +
định lượng (một hoặc nhiều lần xuất hiện) thay vì *
trong quy tắc sản xuất?
Tôi đã thử biên dịch một chương trình đơn giản để xem trình biên dịch xuất ra cái gì và tất cả những gì nó làm là đưa ra cảnh báo.
Đầu vào:
int main(void) {
int;
}
Đầu ra:
test.c: In function ‘main’:
test.c:2:5: warning: useless type name in empty declaration
int;
^~~
int
làm kiểu trả về main
và không sử dụng ()
làm danh sách loại tham số trong các hàm mà (void)
thay vào đó.