Sizeof neden bir operatör olarak kabul edilir?


96

Neden sizeofbir işlev değil de operatör olarak kabul edilir?

Operatör olarak nitelendirilmek için hangi özellik gereklidir?

Yanıtlar:


183

Çünkü C standardı öyle diyor ve tek oyu alıyor.

Sonuç olarak:

  • Sizeof işleneni sizeof (int)bir nesne ifadesi yerine parantez içine alınmış bir tür olabilir .
  • Parantezler gereksizdir: 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 adresini alamazsınız.
  • Sizeof işleneni olan ifade çalışma zamanında değerlendirilmez (a'yı sizeof a++değiştirmez).
  • Sizeof'un işleneni olan ifade, void veya işlev türleri dışında herhangi bir türe sahip olabilir. Doğrusu, bu bir tür boyutsal nokta.

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.


3
Vay be, tam da düşündüğüm gibi!
crashmstr

7
Daha iyi söyleyemem.
Clement Herreman

Değişken uzunluklu diziler (VLA) nedeniyle günümüzde işlerin daha karmaşık olduğuna inanıyorum. IIRC'ye göre, standart sizeof, ifadede bir VLA varsa yan etkilere bile izin verecektir .
Aaron McDaid

@glglgl Hayır, bu hiç mantıklı değil. Bu bağlamda, (int)süslü bir şey değil - sadece parantez içindeki bir tür adı. Buradaki parantezler, sözdiziminin bir parçasıdır sizeof- bir türün boyutunu alırken gereklidir, ancak bir ifadenin boyutunu alırken gerekli değildir. Örneğin buraya
anatolyg

1
Standart, aşağıdakiler için iki gösterim kullanır sizeof: sizeof unary-expressionve 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 !
Jonathan Leffler

24

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. sizeofHem türleri hem de değişkenleri bağımsız değişken olarak alabildiğinden , uygulanması zor bir makro olurdu .


4
+1, ancak argüman bir VLA - değişken uzunluk dizisi olduğunda bunun bir derleme zamanı sabiti olmadığını unutmayın.
Jonathan Leffler

6

Çünkü C standardı öyle diyor ve tek oyu alıyor.

Ve standart muhtemelen doğrudur çünkü sizeofbir 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.

(Wikipedia)


Bu muhtemelen C standardının (ve diğer programlama dillerinin) "operatör" ve "işlev" terimlerini yaptıkları gibi kullanmadaki motivasyonunu açıklamaktadır.
Steve Jessop

5

Çü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.


2

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.


1

Çünkü:

  • Bir işleve bir değer ilettiğinizde, nesnenin boyutu işleve aktarılmaz, bu nedenle bir sizeof"işlevin" boyutu belirleme yolu yoktur
  • C'de işlevler yalnızca bir tür bağımsız değişken kabul edebilir; sizeof () her türden farklı şeyleri (değişkenler ve türler! C'deki bir işleve geçiremezsiniz)
  • Bir işlevi çağırmak, argümanların ve diğer gereksiz ek yüklerin bir kopyasını oluşturmayı içerir

1

İşlevden küçük bir fark vardır - sizeof değeri derleme zamanında çözülür, ancak çalışma zamanında çözülmez!


7
VLA hariç - değişken uzunluk dizisi - bağımsız değişkenler.
Jonathan Leffler

1

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.


0

sizeof()operatörü derleme zamanının oluşmasıdır. Parametreleri veya argümanları belirlemek için kullanılabilir.


-1

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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.