C'nin boş tipi neden boş / alt tipe benzemiyor?


28

Vikipedi ile birlikte bulduğum diğer kaynaklar voidgibi boş bir türe karşılık C tipi tipini birim tipi olarak buldum . Bu kafa karıştırıcı buluyorum ki voidboş / alt tip tanımına daha iyi uyuyor.

  • voidSöyleyebileceğim kadarıyla hiçbir değer yok .
  • Geri dönüş tipi boşluğu olan bir işlev, işlevin hiçbir şey döndürmediğini ve bu nedenle yalnızca bir miktar yan etki yapabileceğini belirtir.
  • Bir işaretçi, void*diğer tüm işaretçi tiplerinin bir alt tipidir. Ayrıca, void*C'ye yapılan ve C'deki dönüşümler de örtüktür.

Son noktanın voidboş bir tip olduğu için bir argüman olarak herhangi bir değeri olup olmadığından emin değilim , void*az çok ilişkisiz özel bir durum olduğu gibi void.

Öte yandan, voiddiğer tüm türlerin bir alt türü değildir; söyleyebileceğim kadarıyla bir türün alt tür olması şarttır.


10
"Hiçbir şey döndürmez" ifadesiyle "aslında" ilgilenilen hiçbir şey döndürmezsiniz "derken, boş çıktı veren bir işlev hiç geri dönmez (yani, sonsuz şekilde çöker veya döngüler).
Turion

2
Bir dönüş türü olarak, boşluk bir birim türüdür.
user253751 7:16

Yanıtlar:


38

C'de, voidilgisiz çoklu şeyler için kullanılır. Ne için kullanıldığına bağlı olarak, anlamı bir birim tipi, boş bir tip veya başka bir şey olabilir.

Tek voidbaşına kullanıldığında ( void*geçersiz olan bir işaretçi yerine), birim türdür, yani tek değerli bir tür. Dönen işlevlerin void“hiçbir şey döndürme” olduğu söylenir, ancak bunun gerçek anlamı, hiçbir bilgi döndürmedikleridir. Bunlar geri bunlar içeren tipte bir değeri döndürmek araçlarının bilgi bit, 2 0 = 1 farklı değerleri, yani, bir birim türü.020=1

Bu boş bir tür değil: boş bir tür döndüren işlev, bu tür bir değer olmadığından bir değer döndüremez. Dönüş tipi boş olan bir işlev yalnızca sonsuza kadar döngü yapabilir veya programı iptal edebilir veya bir istisna ( longjmp) (veya örneğin standart C'nin ötesindeki işlevselliği kullanarak kontrolü başka bir iş parçacığına ya da işlemi aktararak) geri döndürmemeyi ayarlayabilir. İşleri kafa karıştırıcı tutmak için, voidboş bir tür yerine kullanmak gelenekseldir (C boş bir tür içermez).

voidTipi gerektiren depolama bit. C, her nesnede sıfırdan fazla sayıda baytlık bir depolama alanı işgal ettiğinde ısrar ettiğinden, bir tür nesnesi oluşturmak yasaktır ve değeri döndürmek için özel bir sözdizimi vardır ( değeri ihmal edilen bir ifade). Türün değerini veren sözdizimi yoktur , ancak bu değer, dönüş türü döndürülen bir işlev olduğunda oradadır .0voidvoidreturnvoidvoid

C, olası herhangi bir türe izin verme anlamında bir alt türe sahip değildir. Eksik tipler bile değerlerinin genel niteliğini belirtir; örneğin, işaretçiler veya yapılar veya sendikalar veya işlevler. Ancak void*, herhangi bir işlev dışı tür için bir işaretçidir: nesne işaretçi türlerinin cebirindeki en küçük öğedir, yani en alttaki nesne işaretçi türüdür. Genel durumda aksine T*nerede Tolmayan bazı boşluk türüdür void*türünde bir değere işaretçiler türü değil void, ama belirtilmemiş türde bir değere işaretçiler türü.


Biri C ++ ve C89'da boşa dönebilir. stackoverflow.com/questions/35987493/…
BartekChom

2
Dördüncü fıkra resmen yanlıştır. C de, depolama alanı voidtanımlanmamıştır, sıfır değildir. Bu, türdeki nesnelere voidizin verilmemesi nedeni değildir . Biçimsel nedeni olduğunu voidbir olduğunu tamamlanmamış tipi ve nesneler tamamlanmamış bir türüne sahip olamaz.
MSalters

4
@ MSalters Hayır, yazdıklarım resmen doğru. “Çünkü”, dil belirtimi içindeki mantıksal çıkarımlara değil, dil tasarımı için motivasyona işaret eder. voidTipi gerektiren depolama 0 bit. Bu nedenle, C tasarımcılarının, void0 byte'lık (dil tasarımı üzerinde çok fazla etkiye sahip olacak) veya 1 byte'lık (alan boşa harcayacak) depolama alanını tanımlamak yerine, eksik bir tip seçmeye karar vermelerinin nedeni budur. .
Gilles 'SO- kötülük' dur

1
@Gilles: Üzgünüm ama bu da mantıklı değil. İzin verilirse, kullanılan alan geçersiz türdeki nesne başına 1 bayt olur ve açıkçası birçok tür nesneye ihtiyacınız yoktur void. Bu nesnelerin diğer tüm nesnelere isim verebileceğinden bahsetmiyorum bile, gerçek kullanım yine de sıfır olacaktır.
MSalters

4
@CodesInChaos: Evet, C ++ aslında boş yapılara izin veriyor struct E { };. Temel sınıf olarak kullanıldığında, bu sıfır boyutta olabilir. (Gerçekten C / C ++ diye bir şey yoktur, iki dil kendi seçimlerini yaparlar ve bu alanlarda farklılık gösterebilirler. C, başlangıçta
OO'su

11

“Boş tip” ismi belki de kafa karıştırıcıdır. Bunun anlamı, kendin dediğin gibi , tip hiçbir değer içermiyor . “Boş”, türün herhangi bir bireysel değerini değil, bir tür olarak, olası değerlerin bir kümesi olarak kabul edilir. Bu mu Yani değil “bir işlev döndürme gibi bir şey söylemek voiddöndürür hiçbir bilgi” değil, “Orada var olan türde hiçbir değeri ”.

Bu sonucun, türüdür bir işlevi anlamına yapabilirsiniz asla sona erer. Sonlandırılmış olsaydı, bir değer döndürmek zorunda kalırsa , ancak, böyle bir değer yoktur.

Aynı zamanda, boş bir değerin ne kadar bilgiyi içereceğini tartışmanın bile mümkün olmadığı anlamına gelir, çünkü böyle bir değer yoktur. (İsterseniz, “boş türün herhangi bir değeri tam olarak 35093658 bit bilgi içerir” gibi saçma bir ifade doğru bir şekilde doğrudur.) Değerleri sonsuz miktarda bilgi içerdiğini düşünmek biraz yararlıdır (gerçekten doğru olmasa da) .

“Return type” ile bir C işlevi voidaçıkça dönebilse de , dönüş değerinde size herhangi bir bilgi vermez. Bir ünite tipini karakterize eden şey tam olarak budur: değerleri hiçbir bilgi içermez, çünkü böyle bir değer vardır (bu nedenle işlevi çağırmak için zahmet etmeden bile her zaman dönüş değerinin ne olacağını her zaman söyleyebilirsiniz).

Conor McBride'dan (C'ye çevrilmiş) alıntı yapmak için :

void"Sıkıcı" anlamına gelir. Bir şeyi içeren sıkıcı tip, aynı zamanda sıkıcı demektir. Sondaj tipinin bir elemanını diğeriyle karşılaştırarak kazanılacak ilginç bir şey yoktur, çünkü dikkatinizi çekerek sondaj tipinin bir elemanı hakkında öğrenilecek bir şey yoktur.

Boş tipten çok farklı [...]. Boş tür çok heyecan vericidir, çünkü eğer biri size ait bir değer verirse, zaten ölü olduğunuzu ve cennette olduğunuzu ve istediğiniz her şeyin sizin olduğunu bilirsiniz.


İlginç; definition tanımı, dönüş tipi ⊥ olan fonksiyonun hiçbir zaman sonlanamaması durumunda, C'nin böyle bir tipi vardır. Biz buna geçici boşluk diyoruz.
Joshua,

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.