sizeof
hoạt động với các loại và biểu thức. Khi bạn áp dụng nó cho một loại, số ()
là một phần của cú pháp sizeof
: sizeof(type)
. Khi bạn áp dụng nó cho một biểu thức ()
không phải là một phần của cú pháp sizeof
: sizeof expression
.
Vì vậy, sizeof
thứ hai của bạn không thực sự "được áp dụng cho biến". Nó được áp dụng cho một biểu thức (f)
. Biểu thức đó bao gồm một biến đơn f
được đính kèm thành cặp dự phòng là ()
. Bạn cũng có thể thực hiện mà không cần cặp dự phòng ()
và chỉ sử dụng sizeof f
.
Khi sizeof
được áp dụng cho một biểu thức, nó trả về kích thước của kết quả biểu thức (nghĩa là kích thước của loại biểu thức có). Trong ví dụ của bạn, cả hai ứng dụng của sizeof
đều được đảm bảo để đánh giá cùng một giá trị.
Thực tế, thực hành lập trình tốt là tránh nhiều nhất có thể, ví dụ: thích sử dụng sizeof expression
. Điều này làm cho mã của bạn độc lập hơn, luôn là điều tốt. Loại tên thuộc về khai báo và không nơi nào khác.
Bạn đã thử Googling "sizeof áp dụng cho biến" chưa? Hai kết quả đầu tiên (một trong số đó là từ StackOverflow) sẽ có thể trả lời câu hỏi của bạn. –
Có, cả hai biểu thức 'sizeof' đều trả về cùng một giá trị. Lưu ý rằng thứ hai không yêu cầu dấu ngoặc đơn; 'sizeof' là toán tử, không phải là hàm. Nhưng '% u' yêu cầu một đối số kiểu' unsigned int', không phải 'size_t'. Viết này: 'printf ("% zu% zu \ n ", sizeof (struct foo), sizeof f);' hoặc this: 'printf ("% lu% lu \ n ", (unsigned long) sizeof (struct foo) , (unsigned long) sizeof f); '. '% zu' là một tính năng cụ thể của C99; di chuyển 'printf' của hệ thống không hỗ trợ nó. –