" Geçersiz " teriminin nereden geldiğine ve buna neden geçersiz olarak adlandırıldığına dair temel bilgileri edinmek . Sorunun amacı C deneyimi olmayan ve aniden C tabanlı bir kod tabanına bakan birine yardımcı olmaktır.
" Geçersiz " teriminin nereden geldiğine ve buna neden geçersiz olarak adlandırıldığına dair temel bilgileri edinmek . Sorunun amacı C deneyimi olmayan ve aniden C tabanlı bir kod tabanına bakan birine yardımcı olmaktır.
Yanıtlar:
Temel olarak "hiçbir şey" veya "tür yok" anlamına gelir
Boşluğun kullanılmasının 3 temel yolu vardır:
İşlev argümanı: int myFunc(void)
- işlev hiçbir şey almaz.
İşlev dönüş değeri: void myFunc(int)
- işlev hiçbir şey döndürmez
Genel veri işaretçisi: void* data
- 'veri', bilinmeyen tipte verilere bir işarettir ve kayıttan çıkartılamaz
Not: void
bir işlev bağımsız değişkeninde C ++ 'da isteğe bağlıdır, bu yüzden int myFunc()
tam olarak aynıdır int myFunc(void)
ve C #' da tamamen dışarıda bırakılır. Bir dönüş değeri için her zaman gereklidir.
Her zaman yok demek için aldım . İşte C dilinde bu yokluğun kullanımıyla eşleşen dört durum
R f(void)
- Fonksiyon parametreleri mevcut değilvoid f(P)
- Dönüş değeri yokvoid *p
- İşaret edilenin türü yok(void) p
- Değerin kullanımı yokturDiğer C torunları bunu başka şeyler için kullanırlar. D
Bir başlatıcı olduğu programlama dili durumlar için kullanır devamsızlık
T t = void;
- başlangıç değeri yok(void)p
? Ne demek istediğini anlamadım "değer kullanımı yok".
(void) var;
, stackoverflow.com/q/21045615 adresinde ayrıntılı yanıtlar buldum .
Boşluğu kullanmanın iki yolu vardır:
void foo(void);
veya
void *bar(void*);
Birincisi hiçbir argümanın geçilmediğini veya hiçbir argümanın döndürülmediğini gösterir.
İkincisi, derleyiciye, verilerle ilişkili bir türün bulunmadığını söyler; bu da, bilinen bir türe yayınlanana kadar işaret edilen verileri kullanamayacağınız anlamına gelir.
Örneğin void*
, parametreleri önceden bilinemeyen bir işlevi çağıran bir arabiriminiz olduğunda çok kullanıldığını göreceksiniz .
Örneğin, Linux Çekirdeğinde çalışmayı ertelerken, çalıştırılacak işleve bir işaretçi ve işleve iletilecek verilere bir işaretçi vererek, daha sonra çalıştırılacak bir işlevi ayarlayacaksınız:
struct _deferred_work {
sruct list_head mylist;
.worker_func = bar;
.data = somedata;
} deferred_work;
Daha sonra bir çekirdek iş parçacığı ertelenmiş işlerin bir listesi üzerinden geçer ve bu düğüme ulaştığında etkili bir şekilde yürütür:
bar(somedata);
Sonra barda var:
void bar(void* mydata) {
int *data = mydata;
/* do something with data */;
}
"Değersiz" anlamına gelir. Sen kullanmak void
bir işlev bir değer döndürmüyor olduğunu belirtmek için veya parametreleri veya her ikisi hiç olmadığını. İngilizce void kelimesinin tipik kullanımlarıyla hemen hemen tutarlı .
Bir işlevde bir dönüş değerinin olmadığını gösterir.
Bazı diller iki tür alt rutine sahiptir: prosedürler ve fonksiyonlar. Prosedürler sadece bir işlem dizisidir, bir fonksiyon ise sonuç döndüren bir işlem dizisidir.
C ve türevlerinde, ikisi arasındaki fark açık değildir. Her şey temelde bir işlevdir. void
Anahtar kelime bir değer döndürülmesine olmaması sebebiyle, bir "gerçek" fonksiyonu olmadığını gösterir.
Boşluğu "boş yapı" olarak düşünün. Açıklamama izin ver.
Her işlev, her parametrenin bir türünün bulunduğu bir dizi parametre alır. Aslında, parametreleri bir yapıya paketleyebiliriz, yapı yuvaları parametrelere karşılık gelir. Bu, her işlevin tam olarak bir argüman olmasını sağlar. Benzer şekilde, fonksiyonlar bir türe sahip bir sonuç üretir. Bir boolean olabilir veya şamandıra olabilir veya keyfi olarak başka türden değerler içeren bir yapı olabilir. Birden fazla dönüş değerine sahip bir dilek istiyorsak, bir yapıya paketlenmelerinde ısrar etmek kolaydır. Aslında, her zaman bir fonksiyonun bir yapı döndürdüğü konusunda ısrar edebiliriz. Şimdi her fonksiyon tam olarak bir argüman alıyor ve tam olarak bir değer üretiyor.
Şimdi, "hayır" değeri üreten bir fonksiyona ihtiyacım olduğunda ne olur? 3 yuvalı bir yapı oluşturduğumda ne alacağımı düşünün: 3 değeri var. 2 yuvam olduğunda, iki değer tutar. Bir yuvası, bir değeri olduğunda. Ve sıfır yuva olduğunda, o ... uh, sıfır değerleri, ya da "no" değeri "tutar. Bu nedenle, void döndüren bir fonksiyonun değer içermeyen bir yapı döndürmesi olarak düşünebilirim. dilde bir anahtar kelime yerine, yalnızca boş yapı tarafından temsil edilen türle eşanlamlıdır (belki de önceden tanımlanmış bir türdür :)
Benzer şekilde, değer gerektirmeyen bir işlevi boş bir yapıyı kabul etmek gibi düşünebilirim, örneğin, "boşluk".
Hatta programlama dilimi bu şekilde uygulayabilirim. Bir boşluk değerinin iletilmesi sıfır bayt alır, bu nedenle boşluk değerlerinin iletilmesi, rastgele boyuttaki diğer değerlerin iletilmesi için özel bir durumdur. Bu, derleyicinin "geçersiz" sonucu veya bağımsız değişkeni ele almasını kolaylaştırır. Muhtemelen bir işlev sonucunu atabilecek bir dil özelliği istiyorsunuz; C'de, aşağıdaki ifadede geçersiz olmayan sonuç işlevini foo olarak adlandırırsanız: foo (...); derleyici foo'nun bir sonuç ürettiğini bilir ve basitçe yok sayar. Eğer boşluk bir değer ise, bu mükemmel bir şekilde çalışır ve şimdi "prosedürler" (geçersiz sonuç içeren bir fonksiyon için sadece bir sıfattır) genel fonksiyonların önemsiz özel durumlarıdır.
Void * biraz daha komik. C tasarımcılarının yukarıdaki şekilde boş düşündüklerini düşünmüyorum; sadece bir anahtar kelime oluşturdular. Bu anahtar kelime, birinin rasgele bir türe işaret etmesi gerektiğinde kullanılıyordu, bu nedenle C'deki deyim olarak * geçersizdi. Geçersiz * işaretçi, boş yapının yerleştirildiği bir yerin adresidir.
Diğer T tipleri için void * 'den T *' a yayınlar da bu bakış açısıyla çalışır. İşaretçi dökümleri, çoğu yaygın mimaride çalışan, bileşik T tipinin S alt tipinde bir depolama elemanına fiziksel olarak T'nin başına yerleştirilmiş olması durumunda S * ila T * ve Aynı fiziksel makine adresini kullanmak tersi de işe yarar, çünkü çoğu makine işaretçisi tek bir temsile sahiptir. S türünün void türüyle değiştirilmesi tam olarak aynı etkiyi verir ve böylece void * 'e / void *' den döküm işe yarar.
PARLANSE programlama dili yukarıdaki fikirleri oldukça yakından uygulamaktadır. Biz tasarım goofed ve bir dönüş türü olarak "geçersiz" yakın dikkat etmedi ve böylece prosedür için dil anahtar kelimeler var. Onun çoğunlukla sadece basit bir sözdizimi değişikliği ama bir dilde büyük bir vücut çalışma kodu aldıktan sonra almak için bir şey değil.
C # 'de void anahtar sözcüğünü bir yöntemin bir değer döndürmediğini belirtmek için kullanırsınız:
public void DoSomeWork()
{
//some work
}
Boşluk için üç kullanım durumu:
İşlev imzaları. void foo(int bar)
bir değer döndürmez. int bar(void)
herhangi bir parametre almaz ancak bu genellikle boş argüman listesi ile ifade edilir: int bar()
. Burada void anahtar kelimesinin kullanımı, İngilizce'deki anlamına karşılık gelir.
void *
Belirtilmemiş verilere işaret eden ve silinemeyen genel üst tip işaretçi . Burada, boşluğun anlamı diğer boşluğun anlamlarından farklıdır: evrensel tip ve tipsiz.
(void) new Foo(this)
Dönüş değerinin kasıtlı olarak atıldığı anlamına gelen dökümlerde . Burada anahtar kelime kullanımı İngilizce anlamıyla da eşleşir.
Vaka 1 ve 2 zaten @Gerald tarafından kapsanmıştır, ancak vaka 3 henüz ele alınmamıştır.
Kavramı yeni başlayanlara açıklıyorsanız, bir benzetme kullanmak yardımcı olabilir. Tüm bu durumlarda geçersizlik kullanımı, bir kitaptaki "Bu sayfa kasıtlı olarak boş bırakılmıştır" kelimesine sahip bir sayfaya benzer. Derleyiciye, hata olarak işaretlenmesi gereken bir şey ile kasıtlı olarak boş bırakılacak bir tür arasında istediğiniz davranışı ayırt etmek içindir.
Her zaman normalde bir dönüş türü veya işaretçi türü gibi bir tür görmeyi beklediğiniz kodda görünür. Bu nedenle C # 'da, geçersiz bir gerçek CLR türü olan System.Void ile eşleşir çünkü kendi içinde bir türdür.
Bazı programlama dilleri hiçbir zaman boşluk kavramını geliştirmedi, tıpkı bazı insan kültürleri sıfır sayısı kavramını hiç icat etmediği gibi. Hiçlik, sıfır kavramının insan dilini temsil ettiği gibi bir programlama dilinde de aynı ilerlemeyi temsil eder.
"Değersiz" anlamına gelir. Bir fonksiyonun bir değer döndürmediğini veya herhangi bir parametresinin veya her ikisinin birden olmadığını belirtmek için void kullanırsınız. İngilizce void kelimesinin tipik kullanımlarıyla çok tutarlıdır.
Hiçlik null ile karıştırılmamalıdır. Null adresi yığını üzerinde olan değişken için boş, o adresin öbeğindeki değer boştur.
Void yalnızca yöntem imzalarında kullanılır. Dönüş türleri için, yöntem çağrı koduna hiçbir şey döndürmeyecektir. Parametreler için, yönteme hiçbir parametre iletilmez
Örneğin
void MethodThatReturnsAndTakesVoid(void)
{
// Method body
}
C # 'da parametreler için boşluğu atlayabilir ve yukarıdaki kodu şu şekilde yazabiliriz:
void MethodThatReturnsAndTakesVoid()
{
// Method body
}
Hiçlik null ile karıştırılmamalıdır. Null adresi yığını üzerinde olan değişken için boş, o adresin öbeğindeki değer boştur.
void işlev veya yöntemden herhangi bir değer döndürmeyeceğiniz anlamına gelir
Void, üç dilde de bir işlevden gelen dönüş türünde hiçbir değere gerek olmadığı anlamına gelir.