Boş düğümleri temsil etmek için NIL kullanmanın amacı nedir?


17

Benim içinde Algoritmalar ve Veri Yapıları Tabii, profesörler, slaytlar ve kitap ( Algoritmalar, 3 baskısına giriş ) kelimesini kullanıyoruz NILörneğin mevcut değil (ağaçta) bir düğümün bir çocuk göstermek için.

Bir keresinde, bir ders sırasında, söylemek yerine, NILsınıf arkadaşım dedi nullve profesör onu düzeltti ve profesörlerin bu kelimeyi neden vurguladığını anlamıyorum.

İnsanlar kelime kullanmak bir nedeni var mı NILyerine null, ya none, ya da başka bir kelime? Does NILdiğerleri yok bazı belirli anlamı var? Tarihsel bir sebep var mı?

Ayrıca, web'de, örneğin kelimenin nullyerine kullanıldığı NIL, ancak genellikle bu sonuncunun kullanıldığı birkaç yer gördüğümü unutmayın .

Yanıtlar:


25

Bildiğim kadarıyla endişeleniyorum olarak, null, nil, noneve nothingaynı kavram için ortak isimler vardır: Birçok farklı türde mevcuttur “Bir değerin yokluğunu” temsil eden bir değeri ve (denilen null türleri ). Bu değer tipik olarak normalde bir değerin olduğu yerlerde kullanılır, ancak örneğin isteğe bağlı bir parametre atlanabilir. Farklı programlama dilleri bunu farklı uygular ve bazı dillerin böyle bir kavramı olmayabilir. İşaretçileri olan dillerde boş bir işaretçi . Birçok nesne yönelimli dilde null bir nesne değildir: üzerinde herhangi bir yöntemin çağrılması bir hatadır. Birkaç örnek vermek gerekirse:

  • Lisp'te, nil genellikle bir değerin yokluğunu göstermek için kullanılır. Diğer birçok dilden farklı olarak nil, yapısı vardır - adı olan bir semboldür "NIL". Aynı zamanda boş listedir (çünkü bir liste eksilerini içermelidir, ancak bazen liste boş olduğu için eksilerini içermez). İster kaputun altındaki bir boş gösterici tarafından ya da diğer herhangi bir simge olarak uygulanıp uygulanmadığına bağlıdır.
  • Pascal'da, nilkaydı kaldırılamayabilecek bir işaretçi değeridir (herhangi bir işaretçi türünde geçerlidir).
  • C ve C ++ 'da, herhangi bir işaretçi türü bir NULL herhangi bir işaretçiden geçerli bir nesneye farklı değer .
  • Smalltalk dilinde, nil tanımlı yöntemi olmayan bir nesnedir.
  • Java ve C # 'da, null herhangi bir nesne türünün değeridir. Herhangi bir alana veya yönteme erişim girişimi nullbir istisnayı tetikler.
  • Perl'de, undef diğer skaler değerlerden farklıdır ve “gerçek” bir değerin yokluğunu göstermek için dil ve kütüphane boyunca kullanılır.
  • Python'da, None diğer herhangi bir değerden farklıdır ve “gerçek” bir değerin yokluğunu göstermek için dil ve kütüphane genelinde kullanılır.
  • ML (SML, OCaml) 'de, Nonetip şemasında herhangi bir tür bir değer 'a optioniçerir Noneve Some xherhangi xÇeşidi'a .
  • Haskell'de benzer bir kavram adları kullanır Nothingve Just xdeğerleri için ve Maybe atürü için.

Kullanılan algoritma sunumlarında, sunucunun arka planından veya kod örneklerinde kullanılan dilden kaynaklanma eğilimi vardır.

NULLnbenl

Öğretim elemanınızın nullkursta kullanılan programlama dilinde boş bir işaretçi sabiti için kelimeyi (Java veya C #?) NILKullanmak ve uygulanabilecek veya uygulanamayan bazı veri yapılarında bir düğüm bulunmadığını belirtmesi mümkündür. bir boş işaretçi sabiti olarak (örneğin, yukarıda görüldüğü gibi Lisp,NIL genellikle boş bir işaretçi olarak uygulanmaz). Bu ayrım, veri yapıları için uygulama teknikleri tartışılırken geçerli olacaktır. Veri yapılarının kendileri tartışılırken, boş-işaretçi-sabit kavramı önemsizdir, sadece diğer değerlere eşit olmayan bir kavram önemlidir.

Standart bir adlandırma şeması yoktur. Başka bir öğretim üyesi veya ders kitabı farklı isimler kullanabilir.


İki örnek daha. Hedef C hem NULL(C uyumluluğu için) hem de nil; yöntemleri çağırmak nilbir işlemdir. JavaScript hem null(hiçbir şeyi temsil eden bir değer) hem de (değer undefinedayarlanmamıştır) vardır.
200_success

1
"Nesneye yönelik dillerde null bir nesne değildir: üzerinde herhangi bir yöntemi çağırmak bir hatadır." - Bu, listelediğiniz diller de dahil olmak üzere tüm diller için geçerli değildir. Ruby ve Smalltalk'ta, nildiğerleri gibi bir nesnedir, bunun bir örneği, NilClassbaşka bir "sıfırlık" kavramı yoktur ve özellikle de boş gösterici yoktur. Scala'da Nilçok farklıdır null, nullboş gösterici gibi bir tür sortadır, ancak aslında bir type ( Null) vardır, Nilnormal eski bir nesnedir, EmptyListeğer varsa sınıfın tekil örneğidir ve ayrıca…
Jörg W Mittag

1
NothingAlt türü olan ve hiçbir örneği olmayan ve Unitbir değer döndürmeyen ve singleton örneği olan alt yordamların türü (). nullbir şekilde onunla "null pointer" veya "null reference" kavramını taşır, çünkü bu terimin bir şekilde içsel olması değil, sadece C, C ++, D, Java, C # gibi dillerin her yerde bulunması nedeniyle tavır. NILaslında Pascal, Modula-2 ve Oberon'da bu şekilde kullanılmasına rağmen bu çağrışımı taşımaz. Ruby, nilbirçok yararlı yöntemleri vardır: nil.to_i # => 0, nil.to_s # => '', ...
Jörg W Mittag

1
... nil.to_a # => [], nil.to_h # => {}, nil.to_f # => 0.0, nil.inspect # => 'nil', vb. Listenin tamamını burada görebilirsiniz .
Jörg W Mittag

3

Ben hem kullanılma nedeni inanıyoruz nil ve boş eski öncelikle bir isimdir ve ikincisi öncelikle bir sıfat (ben kontrol olmasıdır web'de : Amerikan Heritage 1992 ile benim kağıt dictionnary olarak).

Anlam ve tarih ile ilgili olarak, NIL Latince "nihil" den gelen ve "hiçbir şey" anlamına gelen bir daralmadır.

Bildiğim nilkadarıyla, boş bir işaretçiyi belirtmek için adın kullanımı Lisp (1958) programlama dili ile tanıtıldı .

Bir boş gösterici hiçbir şey işaret etmek gerekiyordu bir işaretçi değeridir ve bu nedenle indirgenmedikleri edilmemelidir. Çoğu durumda, işaretçiler basitçe bellek adresleridir. Böyle bir işaretçi içermesi amaçlanan herhangi bir değişken (yani herhangi bir konum) her zaman bir miktar bit yapılandırması içerecektir ve bu tür bir yapılandırma bir bellek adresi olarak okunabilir. Bu nedenle, değerin nilprogram için yasaklanmış bir bellek alanının adresi olması, bu nedenle programın nilsadece bir hata olabilmesi için programın ayrıştırılması girişiminde bulunması durumunda bir tür başarısızlığa (muhtemelen kesintiye) neden olması durumudur .

Bu rolü oynamak için önceden tanımlanmış benzersiz bir standart değere sahip olmak, işaretçileri açıkça kullanan dillerde önemlidir, çünkü bir işaretçinin bir bellek konumuna işaret edip etmediğini test edebilmek önemlidir. Tipik olarak, Lisp'te, bir liste elemanına bir "araba" işaretçisi ve bir sonraki çifte bir "cdr" işaretçisi içeren bir "eksilerini" çiftleri olarak bir liste oluşturulmuştur. Listenin son çiftinde ikinci işaretçi vardı nil.

Bu, listenin boş bir liste veya bir listeye birleştirilmiş bir liste öğesi olarak özyinelemeli tanımına karşılık gelir. Bu nedenle öğesi olmayan bir liste ile temsil edildi nil. Bu boş liste, monoid listesinin kimliği olur.

Listeler kümeleri temsil etmek için kullanılabileceğinden, boş küme bu durumda da ile temsil edilebilir nil.

Bu nedenle niltarihsel olarak özel bir işaretçi değeriydi, ancak listeler veya kümeler gibi daha soyut alanlar için özel bir kimlik değeri olarak anlaşılmaya başlandı.

Eş değerine sahip bir işaretçi nilbir boş göstericiydi, boş, bir temelden ziyade bir sıfat (yani bir ad) idi.

Her iki kelimenin sıfat ve isim olarak koordineli kullanımı diğer uygulamalarla oldukça tutarlıdır. Niteleyici null genellikle bir monoidin kimliği gibi bir cebirsel yapının sıfırında kullanılır: null eleman . Listeler , nil değerinin kimlik olduğu bir monoid oluşturur . Aynı şey kümeler için de geçerlidir (daha birçok özelliğe sahip bir cebir oluştursalar da). Benzer şekilde, bir tamsayı sıfır olduğunda boştur .

Programlama dillerinin yazarlarına ve kendine özgü ifadelerine bağlı olarak, bu kelimelerin başkaları gibi kullanımı gibi birçok varyasyonu vardır.

İki büyük çağrışım yukarıda açıklandığı gibidir

  • standart olarak "tanımlanmamış değer" olarak, gerçekte kullanılabilir herhangi bir değerin yokluğunu temsil eder.

  • bazı alan adlarının kimlik değeri olarak

Bu, NIL'in kabul edilen cevapta Gilles tarafından yapıldığı gibi " bir değerin yokluğunu temsil eden bir değer " olduğunu iddia etmenin doğru olmadığını göstermektedir . Dile ve kullanımlarına bağlıdır. Programlama dili LISP muhtemelen 55 yıl önce programlama terminolojisinde NIL tanıtıldı. LISP'de boş listedir ve eşdeğer olarak not edilebilir Bir değerin yokluğunu temsil etmez. Bazen eksik değerler için yer tutucu olarak kullanılır, ancak boş liste bir değer olduğu için genellikle bundan kaçınılmalıdır. Programcı tarafından seçilen ve kabul edilebilir değerlerle karıştırılamayan herhangi bir keyfi nesnede bir yapıda eksik bir değeri ifade eden şey.NIL() doğal temsili olan .

Her ne kadar yukarıda ilişkili olabileceğini göstermiş olsak da, iki kavram oldukça farklıdır. Gilles'answer tarafından numaralandırılan terminolojinin kullanımıyla ilgili mod ayrıntılı bir sınıflandırmaya sahip olmak, bu kelimelerin her birinin kullanımının bir çağrışım ya da diğerine yönelik olup olmadığını görmek ilginç olabilir.

İsimler, söylemi tanımlayan kişi tarafından belirli bir bağlamda kastetmek için atandıkları şeyden başka bir şey değildir. Bazı kullanımlar daha yaygın, daha doğal veya daha tutarlıdır, ancak kişi her zaman tanımları kontrol etmeli ve her bağlamda hangi anlamın amaçlandığından emin olmalıdır. Ve her zaman terminolojinin tat veya tutarlılıkla seçilmesini beklememelisiniz.


0

NIL, programcıya nesnenin geçerli olmadığını söyleyen değeri olan bir nesnedir. NULL değerinin 0 olarak tanımlandığı C ++ 'da özellikle yararlıdır. C ++' da NULL referansını kaldırırsanız, tanımsız davranış elde edersiniz. NIL'den (tanımladığınız boş bir nesneye işaretçi) atıfta bulunursanız, söyleyebileceğiniz bir nesnenin veri yapınızın sonunun ötesinde olduğunu görürsünüz. Yıkıcı program hatalarını önlemek ve hataları tespit etmek için harikadır.

NIL'i, iki başlı liste gibi durumlarda, baş ve kuyruğu takip etmek için listenin başlangıcı ve sonu olması ve -> sonraki ve -> önceki işaretçilerin NULL'den hiçbir zaman referans almadığından emin olun.


Görebildiğim kadarıyla, bu sadece yanlış. C ++ 'da "NIL" yoktur .
David Richerby

1
Sanırım cevabımı yanlış yorumladın. Verdiğiniz bağlantının cevabımla bir ilişkisi yok. Nil'in bu sınıfın boş (ancak geçerli) bir nesnesine işaret etmek için sınıf başına tanımlanan kullanıcı tanımlı bir nesne olduğunu önerdim.
kürtaj

"NIL , bir nesne olarak tanımlanabilir" demek yerine, "NIL bir nesnedir" (vurgum) yazmanız, onu bir programlama tarzı yerine bir dil özelliğini tanımladığınız gibi gösterir. Ancak, cevabınız tamamen bir programlama stiliyle ilgiliyse, burada gerçekten bir konu değil.
David Richerby
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.