Kita tahu itu sizeof
adalah operator yang digunakan untuk menghitung ukuran tipe data dan ekspresi apa pun, dan ketika operan adalah ekspresi, tanda kurung dapat dihilangkan.
int main()
{
int a;
sizeof int;
sizeof( int );
sizeof a;
sizeof( a );
return 0;
}
penggunaan pertama sizeof
salah, sementara yang lain benar.
Ketika dikompilasi menggunakan gcc, pesan kesalahan berikut akan diberikan:
main.c:5:9: error: expected expression before ‘int’
Pertanyaan saya adalah mengapa standar C tidak mengizinkan operasi semacam ini. Akan sizeof int
menyebabkan ambiguitas?
sizeof (int)a
.sizeof +(int)a
memiliki keunggulan dibandingkan*&
benar-benar menyusun ;-)+
. Misalnya,sizeof +(char)a == sizeof(int)
karena promosi integer, kemungkinan kesalahan tidak terlalu besar hanya dengan memasukkan tanda kurung jika ada kekhawatiran sama sekali tentang ekspresi yang Anda coba ukur. Jadi saya tidak yakin saya akan menyebutnya "penggunaan", meskipun saya akui saya memang menggunakannya ...Jawaban:
Berikut ini bisa jadi ambigu:
Apakah itu
(sizeof (int*)) + 1
, atau(sizeof(int)) * (+1)
?Jelas bahasa C bisa memperkenalkan aturan untuk menyelesaikan ambiguitas, tapi saya bisa membayangkan mengapa itu tidak mengganggu. Dengan bahasa yang ada, penentu tipe tidak pernah muncul "telanjang" dalam ekspresi, sehingga tidak perlu aturan untuk menentukan apakah detik
*
itu bagian dari tipe atau operator aritmatika.Tata bahasa yang ada sudah menyelesaikan potensi ambiguitas
sizeof (int *) + 1
. Hal ini(sizeof(int*))+1
, tidaksizeof((int*)(+1))
.C ++ memiliki masalah yang agak mirip untuk diselesaikan dengan sintaks cor gaya fungsi. Anda bisa menulis
int(0)
dan Anda bisa menulistypedef int *intptr; intptr(0);
, tetapi Anda tidak bisa menulisint*(0)
. Dalam kasus tersebut, resolusinya adalah bahwa jenis "polos" harus berupa nama jenis yang sederhana, tidak boleh sembarang jenis id lama yang mungkin memiliki spasi di dalamnya, atau tanda baca di belakangnya. Mungkinsizeof
bisa saja didefinisikan dengan batasan yang sama, saya tidak yakin.sumber
new int*(X)
yang akan menjadi ambigu jika C ++ tidak menentukan bahwa operator baru mengambil string terpanjang yang mungkin bisa menjadi tipe. Jadi di C ++ mereka bisa membuat yang sama dengan sizeof, saya rasa. Tetapi di C ++ Anda dapat mengatakansizeof int()
yang kemudian akan menjadi ambigu (tipe atau nilai diinisialisasi int?).sizeof int()
akan berbentuk buruk ("tidakoperator()
untuksize_t
"), yang saya perkirakan tidak akan disukai!Dari C99 Standard
Dalam kasus Anda,
int
ada ekspresi atau nama dalam tanda kurung.sumber
Ada dua cara untuk menggunakan operator sizeof di C. Sintaksnya adalah ini:
Setiap kali Anda menggunakan tipe sebagai operand, Anda harus memiliki tanda kurung, dengan definisi sintaks bahasa. Jika Anda menggunakan sizeof pada ekspresi, Anda tidak memerlukan tanda kurung.
Standar C memberikan satu contoh di mana Anda mungkin ingin menggunakannya pada ekspresi:
Namun, demi konsistensi, dan untuk menghindari bug yang terkait dengan prioritas operator, saya secara pribadi menyarankan untuk selalu menggunakan () apa pun situasinya.
sumber
sizeof expression
dansizeof(type)
, yang dijelaskan dalam jawaban ini.