Tại sao thích sizeof (phần tử) hơn sizeof (TYPE) để tính số lượng phần tử trong một mảng?


15

Tôi đang đọc "lập trình C của King KN" và tìm thấy tuyên bố sau:

Chúng tôi đã thảo luận bằng cách sử dụng biểu thức sizeof(a)/sizeof(a[0])để tính số lượng phần tử trong một mảng. Biểu thức sizeof(a)/sizeof(t), trong đó t là loại phần tử của a, cũng sẽ hoạt động, nhưng nó được coi là một kỹ thuật kém hơn.

Tại sao nó được coi là một kỹ thuật kém hơn?


8
Bạn đã xem xét những gì sẽ xảy ra nếu lập trình viên thay đổi loại yếu tố trong một? đến một loại có kích thước khác với t. Biểu thức đầu tiên vẫn sẽ ổn, trong khi biểu thức thứ hai sẽ phá vỡ
gnat

1
@gnat: Bạn nên làm cho câu trả lời.
Martin York

Câu trả lời:


26

sizeof(a)/sizeof(t)mã rõ ràng các loại vào biểu thức. Bây giờ bạn có loại được chỉ định ở nhiều vị trí, không có hỗ trợ trình biên dịch để đảm bảo rằng bạn đang sử dụng cùng loại. Vì vậy, nếu bạn thay đổi loại cơ sở của mảng, nhưng không phải trong biểu thức đếm (hoàn toàn riêng biệt), bingo: mã của bạn sẽ biên dịch tốt, nhưng số phần tử của bạn sẽ sai. Nếu bạn may mắn, chương trình của bạn sẽ bị sập, nhưng nếu không, nó sẽ hoạt động gần như hoàn toàn chính xác, nhưng thỉnh thoảng sẽ hoạt động hoàn toàn kỳ quái.

sizeof(a)/sizeof(a[0])được đảm bảo là chính xác, chỉ yêu cầu tên của mảng. Thay đổi loại và bạn ổn; thay đổi tên mảng và trình biên dịch sẽ khiếu nại. Không cần suy nghĩ: chúng tôi thích kiểu lập trình đó.


Chà, tôi thực sự thích sizeof a/sizeof*a, mặc dù nó không thực sự là một sự khác biệt đáng kể.
Ded repeatator
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.