Neden sizeof
bir işlev değil de operatör olarak kabul edilir?
Operatör olarak nitelendirilmek için hangi özellik gereklidir?
Yanıtlar:
Çünkü C standardı öyle diyor ve tek oyu alıyor.
Sonuç olarak:
sizeof (int)
bir nesne ifadesi yerine parantez içine alınmış bir tür olabilir .int a; printf("%d\n", sizeof a);
tamamen iyidir. Sıklıkla görülürler, ilk olarak bir tür döküm ifadesinin bir parçası olarak ihtiyaç duyuldukları için ve ikinci olarak sizeof çok yüksek önceliğe sahip olduğundan sizeof a + b
, aynı şey değildir sizeof (a+b)
. Ama sizeof çağrısının parçası değiller, işlenenin parçası.sizeof a++
değiştirmez).Bir işlev tüm bu noktalarda farklılık gösterir. Bir fonksiyon ile bir tekli operatör arasında muhtemelen başka farklılıklar vardır, ancak bence bu, olmasını istemenin bir nedeni olsa bile sizeof'un neden bir fonksiyon olamayacağını göstermek için yeterli.
sizeof
, ifadede bir VLA varsa yan etkilere bile izin verecektir .
sizeof
: sizeof unary-expression
ve sizeof ( type-name )
- bu nedenle C11 standardında bir 'döküm' olarak değil parantezli bir tür adı olarak kabul edilir. Net sonuç hemen hemen aynıdır. (Karşılaştırma için, bir atma ifadesi ( type-name ) cast-expression
.) Markdown'un Soru-Cevap Markdown'dan farklı çalışmasından nefret ediyorum !
Derleme zamanı sabiti olarak kullanılabilir, bu yalnızca bir işlevden ziyade bir işleçse mümkündür. Örneğin:
union foo {
int i;
char c[sizeof(int)];
};
Sözdizimsel olarak bir operatör olmasaydı, işlevler türleri bağımsız değişken olarak alamayacağından bir önişlemci makrosu olması gerekirdi. sizeof
Hem türleri hem de değişkenleri bağımsız değişken olarak alabildiğinden , uygulanması zor bir makro olurdu .
Çünkü C standardı öyle diyor ve tek oyu alıyor.
Ve standart muhtemelen doğrudur çünkü sizeof
bir tür alır ve
Genel olarak, bir işlevin etki alanı veya ortak etki alanı (veya her ikisi), gerçek sayılardan önemli ölçüde daha karmaşık öğeler içeriyorsa, bu işlev bir operatör olarak adlandırılır. Tersine, bir fonksiyonun ne alanı ne de ortak alanı gerçek sayılardan daha karmaşık öğeler içermiyorsa, bu fonksiyon muhtemelen basitçe bir fonksiyon olarak adlandırılır. Kosinüs gibi trigonometrik fonksiyonlar, ikinci durumun örnekleridir.
Ek olarak, işlevler genel F (x, y, z, ...) biçiminden daha hızlı veya daha kolay gösterimler geliştirecek kadar sık kullanıldığında, ortaya çıkan özel biçimler de operatörler olarak adlandırılır. Örnekler arasında toplama "+" ve bölme "/" gibi ek operatörleri ve faktöriyel "!" Gibi sonek operatörleri bulunur. Bu kullanım, ilgili varlıkların karmaşıklığıyla ilgisizdir.
Çünkü bu bir işlev değil. Bunu şu şekilde kullanabilirsiniz:
int a;
printf("%d\n", sizeof a);
Fonksiyonun giriş noktası, kodu, vb. Vardır. Fonksiyon çalışma zamanında çalıştırılmalıdır (veya satır içi), sizeof derleme zamanında belirlenmelidir.
sizeof operatörü, çalışma zamanı değil derleme zamanı varlığıdır ve bir fonksiyon gibi paranteze ihtiyaç duymaz. Kod derlendiğinde, derleme zamanında değeri bu değişkenin boyutuyla değiştirir, ancak işlev çalıştırıldıktan sonra işlevde, geri dönen değeri bileceğiz.
Çünkü:
sizeof
"işlevin" boyutu belirleme yolu yokturİşlevden küçük bir fark vardır - sizeof değeri derleme zamanında çözülür, ancak çalışma zamanında çözülmez!
Bir nesnenin boyutunu hesaplamak için yalnızca derleme zamanında kullanılabilen tür bilgisine ihtiyaç duyan bir derleme zamanı operatörü olduğundan. Bu C ++ için geçerli değildir.
Sizeof (), açıkçası bunun hem bir fonksiyon hem de bir operatör olduğunu düşünüyorum. Neden? Çünkü bir fonksiyon, giriş aşamasında giriş için parantezler tutar. Ancak esas olarak bir operatör neden operatörler eylem karakteridir, bu nedenle sizeof, parantez içindeki işlenene etki eden bir eylem ifadesidir.