Có thể tôi không đến từ hành tinh này, nhưng dường như sau đây tôi sẽ bị lỗi cú pháp:
int a[] = {1,2,}; //extra comma in the end
Nhưng nó không phải là. Tôi đã rất ngạc nhiên khi mã này được biên dịch trên Visual Studio, nhưng tôi đã học được cách không tin tưởng trình biên dịch MSVC khi có liên quan đến các quy tắc C ++, vì vậy tôi đã kiểm tra tiêu chuẩn và nó cũng được cho phép theo tiêu chuẩn. Bạn có thể xem 8.5.1 cho các quy tắc ngữ pháp nếu bạn không tin tôi.
Tại sao điều này được cho phép? Đây có thể là một câu hỏi vô dụng ngu ngốc nhưng tôi muốn bạn hiểu lý do tại sao tôi hỏi. Nếu đó là một trường hợp phụ của quy tắc ngữ pháp chung, tôi sẽ hiểu - họ quyết định không làm cho ngữ pháp chung trở nên khó khăn hơn chỉ để không cho phép một dấu phẩy thừa ở cuối danh sách khởi tạo. Nhưng không, dấu phẩy bổ sung được cho phép rõ ràng . Ví dụ: không được phép có dấu phẩy thừa ở cuối danh sách đối số gọi hàm (khi hàm thực hiện ...
), điều này là bình thường .
Vì vậy, một lần nữa, có bất kỳ lý do cụ thể nào dấu phẩy thừa này được cho phép rõ ràng ?
for()
ví dụ), việc thêm nó sẽ đưa ra một cảnh báo trình biên dịch.
if (x = 1)
không mơ hồ trong ngữ pháp, nhưng nó rất mơ hồ đối với con người, và do đó đưa ra một cảnh báo.
if
Ví dụ của bạn cũng không mơ hồ. Tôi không nghĩ "mơ hồ" có nghĩa là những gì bạn nghĩ nó có nghĩa!
;
khi mã thông báo rõ ràng tiếp theo thực sự là một tuyên bố tiếp theo.