2009-09-08 35 views

Trả lời

152

Bởi vì tiêu chuẩn C cho biết như vậy và sẽ nhận được phiếu bầu duy nhất.

Như hậu quả:

  • Các toán hạng của sizeof có thể là một kiểu mở ngoặc, sizeof (int), thay vì một biểu tượng.
  • Dấu ngoặc đơn là không cần thiết: int a; printf("%d\n", sizeof a); hoàn toàn ổn. Chúng thường được nhìn thấy, trước tiên bởi vì chúng cần thiết như là một phần của biểu thức loại, và thứ hai vì sizeof có độ ưu tiên rất cao, vì vậy sizeof a + b không giống như sizeof (a+b). Nhưng chúng không phải là một phần của lời gọi sizeof, chúng là một phần của toán hạng.
  • Bạn không thể lấy địa chỉ của sizeof.
  • Biểu thức là toán hạng của sizeof không được đánh giá khi chạy (sizeof a++ không sửa đổi a).
  • Biểu thức là toán hạng của sizeof có thể có bất kỳ loại nào ngoại trừ khoảng trống hoặc các loại chức năng. Thật vậy, đó là loại điểm của sizeof.

Chức năng sẽ khác trên tất cả các điểm đó. Có lẽ có sự khác biệt khác giữa một hàm và toán tử đơn nhất, nhưng tôi nghĩ điều đó đủ để cho thấy lý do tại sao sizeof không thể là một hàm ngay cả khi có lý do muốn nó.

+2

Chà, chỉ là những gì tôi đang nghĩ! – crashmstr

+6

Không thể nói tốt hơn. –

+0

giải thích tuyệt vời! –

3

Vì đó không phải là chức năng. Bạn có thể sử dụng nó như thế:

int a; 
printf("%d\n", sizeof a); 

Chức năng được chạy tại thời điểm chạy (hoặc được in), sizeof phải được xác định lúc biên dịch.

20

Nó có thể được sử dụng như một hằng số biên dịch-thời gian, mà chỉ có thể nếu nó là một nhà điều hành chứ không phải là một chức năng. Ví dụ:

union foo { 
    int i; 
    char c[sizeof(int)]; 
}; 

Cú pháp nếu nó không phải là toán tử thì đó sẽ là macro tiền xử lý vì hàm không thể lấy kiểu làm đối số. Đó sẽ là một macro khó thực hiện vì sizeof có thể lấy cả hai loại và biến làm đối số.

+2

+1 nhưng lưu ý rằng nó không phải là một hằng số biên dịch thời gian khi đối số là một mảng chiều dài biến VLA. –

1

Bởi vì:

  • khi bạn vượt qua một giá trị cho một hàm, kích thước của các đối tượng không được truyền cho hàm, do đó, một "chức năng" sizeof sẽ không có cách nào để xác định kích thước
  • trong C, các hàm chỉ có thể chấp nhận một kiểu đối số; sizeof() cần chấp nhận tất cả các loại điều khác nhau (các biến cũng như các loại! Bạn không thể chuyển loại cho hàm trong C)
  • gọi một hàm liên quan đến việc sao chép đối số và các chi phí không cần thiết khác
0

Có sự khác biệt nhỏ so với hàm - giá trị của sizeof được giải quyết trên thời gian biên dịch, nhưng không phải lúc chạy!

+5

Ngoại trừ VLA - mảng độ dài biến - đối số. –

5

Vì tiêu chuẩn C cho biết như vậy và sẽ nhận được phiếu bầu duy nhất.

Và tiêu chuẩn có lẽ là đúng bởi vì sizeof mất một loại và

Nói chung, nếu một trong hai lĩnh vực hoặc codomain (hoặc cả hai) của một hàm chứa các yếu tố đáng kể phức tạp hơn số thực, rằng chức năng được gọi là một toán tử. Ngược lại, nếu cả tên miền lẫn tên miền của hàm đều không chứa các phần tử phức tạp hơn số thực, hàm đó có thể được gọi đơn giản là hàm. Các hàm lượng giác như cosin là các ví dụ về trường hợp sau. Ngoài ra, khi các hàm được sử dụng thường xuyên, chúng đã phát triển các ký hiệu nhanh hơn hoặc dễ hơn so với dạng F (x, y, z, ...) chung chung, các dạng đặc biệt kết quả cũng được gọi là toán tử. Ví dụ bao gồm các toán tử infix như bổ sung "+" và phép chia "/" và các toán tử postfix như giai thừa "!". Cách sử dụng này không liên quan đến sự phức tạp của các thực thể có liên quan.

(Wikipedia)

+0

Điều này có thể giải thích động cơ của tiêu chuẩn C (và các ngôn ngữ lập trình khác) bằng cách sử dụng thuật ngữ "toán tử" và "chức năng" như chúng thực hiện. –

0

Bởi vì nó là một nhà điều hành thời gian biên dịch rằng, để tính toán kích thước của một đối tượng, đòi hỏi phải gõ thông tin mà chỉ có sẵn tại thời gian biên dịch. Điều này không giữ cho C++.

1

toán tử sizeof là đối tượng thời gian biên dịch không chạy và không cần dấu ngoặc đơn như hàm. Khi mã được biên dịch thì nó thay thế giá trị bằng kích thước của biến đó tại thời gian biên dịch nhưng trong hàm sau khi hàm được thực thi thì chúng ta sẽ biết giá trị trả về.

0

sizeof() toán tử là thời gian biên dịch sẽ xảy ra. Nó có thể được sử dụng để xác định các tham số hoặc đối số.

+0

Tại sao lại là downvote? –

Các vấn đề liên quan