Mengapa sizeof
dianggap sebagai operator dan bukan fungsi?
Properti apa yang diperlukan untuk memenuhi syarat sebagai operator?
Karena standar C mengatakan demikian, dan itu mendapat satu-satunya suara.
Konsekuensinya:
sizeof (int)
, bukan ekspresi objek.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 + b
tidak sama dengan sizeof (a+b)
. Tapi mereka bukan bagian dari seruan sizeof, mereka adalah bagian dari operan.sizeof a++
tidak mengubah a).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.
sizeof
untuk memiliki efek samping jika ada VLA dalam ekspresi tersebut.(int)
tidak ada yang mewah - hanya nama tipe di dalam tanda kurung. Tanda kurung di sini adalah bagian dari sintakssizeof
- diperlukan saat mengambil ukuran suatu tipe, tetapi tidak diperlukan saat mengambil ukuran ekspresi. Lihat misalnya di sinisizeof
:sizeof unary-expression
dansizeof ( 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!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
sizeof
dapat menggunakan tipe dan variabel sebagai argumen.sumber
Dan standarnya mungkin benar karena
sizeof
mengambil tipe dan(Wikipedia)
sumber
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.
sumber
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.
sumber
Karena:
sizeof
"fungsi" tidak memiliki cara untuk menentukan ukurannyasumber
Ada perbedaan kecil dari fungsi - nilai sizeof diselesaikan pada waktu kompilasi, tetapi tidak pada waktu proses!
sumber
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 ++.
sumber
sizeof()
Operator adalah waktu kompilasi akan terjadinya. Ini dapat digunakan untuk menentukan parameter atau argumen.sumber
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.
sumber