Mengapa sizeof dianggap sebagai operator?

95

Mengapa sizeofdianggap sebagai operator dan bukan fungsi?

Properti apa yang diperlukan untuk memenuhi syarat sebagai operator?

Arpit
sumber

Jawaban:

183

Karena standar C mengatakan demikian, dan itu mendapat satu-satunya suara.

Konsekuensinya:

  • Operand sizeof bisa berupa tipe dalam tanda kurung sizeof (int), bukan ekspresi objek.
  • Tidak perlu tanda kurung: int a; printf("%d\n", sizeof a);baik-baik saja. Mereka sering terlihat, pertama karena dibutuhkan sebagai bagian dari ekspresi tipe cast, dan kedua karena sizeof memiliki prioritas yang sangat tinggi, jadi sizeof a + btidak sama dengan sizeof (a+b). Tapi mereka bukan bagian dari seruan sizeof, mereka adalah bagian dari operan.
  • Anda tidak dapat mengambil alamat sizeof.
  • Ekspresi yang merupakan operan sizeof tidak dievaluasi saat runtime ( sizeof a++tidak mengubah a).
  • Ekspresi yang merupakan operan sizeof dapat memiliki tipe apa pun kecuali void, atau tipe fungsi. Memang, itulah inti dari ukuran.

Suatu fungsi akan berbeda pada semua poin tersebut. Mungkin ada perbedaan lain antara fungsi dan operator unary, tapi saya pikir itu cukup untuk menunjukkan mengapa sizeof tidak bisa menjadi fungsi bahkan jika ada alasan untuk menginginkannya.

Steve Jessop
sumber
3
Wow, seperti yang saya pikirkan!
crashmstr
7
Tidak bisa mengatakannya lebih baik.
Clement Herreman
Saya percaya banyak hal yang lebih kompleks saat ini karena variabel-length array (VLA). IIRC, standar bahkan akan memungkinkan sizeofuntuk memiliki efek samping jika ada VLA dalam ekspresi tersebut.
Aaron McDaid
@glglgl Tidak, itu tidak masuk akal. Dalam konteks itu, (int)tidak ada yang mewah - hanya nama tipe di dalam tanda kurung. Tanda kurung di sini adalah bagian dari sintaks sizeof- diperlukan saat mengambil ukuran suatu tipe, tetapi tidak diperlukan saat mengambil ukuran ekspresi. Lihat misalnya di sini
anatolyg
1
Standar menggunakan dua notasi untuk sizeof: sizeof unary-expressiondan sizeof ( type-name )- jadi dalam standar C11 tidak dianggap sebagai 'cast' tetapi nama tipe dalam tanda kurung. Hasil akhirnya hampir sama. (Sebagai perbandingan, ekspresi pemerannya adalah ( type-name ) cast-expression.) Dan saya benci cara komentar penurunan harga bekerja secara berbeda dari penurunan harga Q&A!
Jonathan Leffler
24

Ini dapat digunakan sebagai konstanta waktu kompilasi, yang hanya mungkin jika itu adalah operator, bukan fungsi. Contohnya:

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

Secara sintaksis jika bukan operator maka itu harus menjadi makro preprocessor karena fungsi tidak dapat mengambil tipe sebagai argumen. Itu akan menjadi makro yang sulit untuk diterapkan karena sizeofdapat menggunakan tipe dan variabel sebagai argumen.

John Kugelman
sumber
4
+1 tetapi perhatikan bahwa ini bukan konstanta waktu kompilasi ketika argumennya adalah VLA - variabel panjang array.
Jonathan Leffler
6

Karena standar C mengatakan demikian, dan itu mendapat satu-satunya suara.

Dan standarnya mungkin benar karena sizeofmengambil tipe dan

Secara umum, jika domain atau codomain (atau keduanya) dari suatu fungsi berisi elemen yang jauh lebih kompleks daripada bilangan real, fungsi itu disebut sebagai operator. Sebaliknya, jika baik domain maupun codomain dari suatu fungsi tidak mengandung elemen yang lebih rumit daripada bilangan real, fungsi tersebut kemungkinan besar akan dirujuk hanya sebagai fungsi. Fungsi trigonometri seperti kosinus adalah contoh kasus terakhir.

Selain itu, ketika fungsi digunakan begitu sering sehingga mereka berevolusi lebih cepat atau notasi yang lebih mudah daripada bentuk umum F (x, y, z, ...), bentuk khusus yang dihasilkan juga disebut operator. Contohnya termasuk operator infiks seperti penjumlahan "+" dan pembagian "/", dan operator postfix seperti faktorial "!". Penggunaan ini tidak terkait dengan kompleksitas entitas yang terlibat.

(Wikipedia)

Daniel Brückner
sumber
Ini mungkin menjelaskan motivasi standar C (dan bahasa pemrograman lain) dalam menggunakan istilah "operator" dan "fungsi" sebagaimana yang mereka lakukan.
Steve Jessop
5

Karena itu bukan fungsi. Anda bisa menggunakannya seperti itu:

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

Fungsi memang memiliki titik masuk, kode, dll. Fungsi akan dijalankan pada waktu proses (atau sebaris), ukurannya harus ditentukan pada waktu kompilasi.

Michał Górny
sumber
2

Operator sizeof adalah waktu kompilasi entitas bukan runtime dan tidak perlu tanda kurung seperti fungsi. Ketika kode dikompilasi maka ia mengganti nilainya dengan ukuran variabel itu pada waktu kompilasi tetapi pada fungsi setelah fungsi dieksekusi maka kita akan mengetahui nilai yang dikembalikan.

Deepak Kumar 'DISORTIR'
sumber
1

Karena:

  • ketika Anda meneruskan nilai ke suatu fungsi, ukuran objek tidak diteruskan ke fungsi tersebut, sehingga sizeof"fungsi" tidak memiliki cara untuk menentukan ukurannya
  • di C, fungsi hanya bisa menerima satu tipe argumen; sizeof () perlu menerima segala macam hal yang berbeda (variabel dan juga tipe! Anda tidak dapat meneruskan tipe ke fungsi di C)
  • memanggil suatu fungsi melibatkan pembuatan salinan argumen dan overhead lain yang tidak perlu
Artelius
sumber
1

Ada perbedaan kecil dari fungsi - nilai sizeof diselesaikan pada waktu kompilasi, tetapi tidak pada waktu proses!

Dewfy
sumber
7
Kecuali untuk VLA - array panjang variabel - argumen.
Jonathan Leffler
1

Karena ini adalah operator waktu kompilasi yang, untuk menghitung ukuran suatu objek, memerlukan informasi tipe yang hanya tersedia pada waktu kompilasi. Ini tidak berlaku untuk C ++.

João Silva
sumber
0

sizeof()Operator adalah waktu kompilasi akan terjadinya. Ini dapat digunakan untuk menentukan parameter atau argumen.

ganesh
sumber
-1

Sizeof (), menurut saya jelas itu adalah fungsi dan operator. Mengapa? Karena suatu fungsi menyimpan tanda kurung untuk masuk pada tahap masuk. Tetapi terutama juga operator karena operator adalah karakter tindakan, oleh karena itu sizeof adalah pernyataan tindakan yang bertindak pada operan di dalam tanda kurung.

Balai Enoch Asanda
sumber