Mengapa sizeof
dianggap sebagai operator dan bukan fungsi?
Properti apa yang diperlukan untuk memenuhi syarat sebagai operator?
Jawaban:
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 sintaks sizeof
- diperlukan saat mengambil ukuran suatu tipe, tetapi tidak diperlukan saat mengambil ukuran ekspresi. Lihat misalnya di sini
sizeof
: sizeof unary-expression
dan 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!
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.
Karena standar C mengatakan demikian, dan itu mendapat satu-satunya suara.
Dan standarnya mungkin benar karena sizeof
mengambil 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.
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.
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.
Karena:
sizeof
"fungsi" tidak memiliki cara untuk menentukan ukurannyaAda perbedaan kecil dari fungsi - nilai sizeof diselesaikan pada waktu kompilasi, tetapi tidak pada waktu proses!
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 ++.
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.