tôi giả sử phần này là rõ ràng: sizeof(array)/sizeof(array[0])
này phần (sizeof(array) != sizeof(void*) || sizeof(array[0]) <= sizeof(void*))
là một biểu thức logic, vì vậy năng suất đúng hay sai. Khi tính toán toàn bộ biểu thức, do đó nhânvới biểu thức logic, trình biên dịch chuyển đổi biểu thức logic thành 0 hoặc 1. Vì vậy, bạn kết thúc với
sizeof(array)/(sizeof(array[0]) * 1)
hoặc
sizeof(array)/(sizeof(array[0]) * 0)
.
Trường hợp đầu tiên là trường hợp bình thường và mong muốn. Trường hợp thứ hai sẽ cung cấp cho bạn một lỗi trình biên dịch vì chia cho số không. Vì vậy, các mã sẽ không biên dịch nếu bạn gọi ví dụ:
long *p; // assuming a platform with sizeof(long)==sizeof(void*)
array_size(p);
Nhưng nó sẽ không bắt lỗi như:
char *p;
array_size(p);
Và nó sẽ không biên dịch cho một trường hợp I'ld muốn nó biên dịch cho:
long x[1]; // assuming a platform with sizeof(long)==sizeof(void*)
array_size(x);
BTW, nếu bạn đang khai báo hàm này như một macro (và trong C++ I'ld thực sự thích các giải pháp mẫu phong cách), bạn nên thay đổi tất cả array
trong macro để (array)
.
Nguồn
2013-04-25 13:22:17
Tôi đoán đây là để ngăn chặn tình cờ lạm dụng với phần tử con trỏ đầu tiên bị phân rã. - phụ thuộc, điều này sẽ có giá trị '0' ... –
sizeof không bao giờ có thể trở lại ze ro. – john
"là để tránh toàn bộ điều chia cho số không" Ngược lại, nó là để buộc một chia-by-zero tại thời gian biên dịch khi 'sizeof array == sizeof (void *)' và 'sizeof array [0]> sizeof (void *) '. –