Chương trình sau in cùng một số hai lần trên gcc 4.8.2:Dấu ngoặc đơn có tạo sự khác biệt khi xác định kích thước của mảng không?
#include <stdio.h>
int main()
{
char a[13];
printf("sizeof a is %zu\n", sizeof a);
printf("sizeof(a) is %zu\n", sizeof(a));
}
Theo this reddit post, gcc không phải là tiêu chuẩn tuân thủ QTI trong lĩnh vực này, bởi vì một biểu thức trong ngoặc đơn không nằm trong danh sách các trường hợp ngoại lệ khi sự phân rã mảng-con trỏ không xảy ra.
Anh chàng này có đúng không? Dưới đây là các tiêu chuẩn có liên quan quote:
Trừ khi nó là toán hạng của
sizeof
điều hành hoặc&
toán tử đơn hạng, hoặc là một chuỗi ký tự chữ sử dụng để khởi tạo một mảng của kiểu nhân vật, hoặc là một chuỗi rộng đen được sử dụng để khởi tạo một mảng với kiểu phần tử tương thích vớiwchar_t
, một giá trị có loại 'mảng kiểu' được chuyển đổi thành một biểu thức có loại 'con trỏ để nhập' trỏ đến thành viên ban đầu của đối tượng mảng và không phải là một lvalue .
Chỉ cần được rõ ràng, ông lập luận rằng (a)
nên kích hoạt mảng-to-con trỏ sâu, bởi vì dấu ngoặc đơn được không nằm trong danh sách trên (sizeof
điều hành, unary &
điều hành, chuỗi chữ như initializer).
Không, anh chàng đó bị nhầm lẫn nghiêm trọng –
Nói cách riêng của mình, tôi đồng ý với * bị nhầm lẫn * – chqrlie
Tôi chưa xử lý công cụ này trong khoảng 15 năm, nhưng tôi chắc chắn đang nhớ lại một kịch bản, tôi nghĩ , 'sizeof' trong đó sự hiện diện hoặc vắng mặt của dấu ngoặc đơn là đáng kể - được xác định nếu bạn đang lấy kích thước của con trỏ hoặc kích thước của phần tử, hoặc một cái gì đó tương tự. –