จุดประสงค์ของการใช้ NIL คืออะไรเพื่อแสดงโหนดว่าง


17

ในหลักสูตรอัลกอริทึมและโครงสร้างข้อมูลของฉันอาจารย์สไลเดอร์และหนังสือ ( Introduction to Algorithms รุ่นที่ 3 ) ใช้คำNILที่แสดงถึงตัวอย่างเช่นลูกของโหนด (ในต้นไม้) ที่ไม่มีอยู่

ครั้งหนึ่งระหว่างการบรรยายแทนที่จะพูดNILเพื่อนร่วมชั้นของฉันพูดnullและอาจารย์แก้ไขเขาและฉันก็ไม่เข้าใจว่าทำไมอาจารย์เน้นคำนี้

มีเหตุผลที่คนใช้คำNILแทนnullหรือnoneหรือคำอื่น ๆ ? ไม่NILได้มีความหมายบางอย่างโดยเฉพาะอย่างยิ่งที่คนอื่นไม่ได้? มีเหตุผลทางประวัติศาสตร์บ้างไหม?

โปรดทราบว่าฉันได้เห็นบางสถานที่รอบ ๆ เว็บเช่นคำที่nullใช้แทนNILแต่โดยปกติจะใช้คำสุดท้าย

คำตอบ:


25

เท่าที่ฉันกังวลnull, nil, noneและnothingเป็นชื่อทั่วไปสำหรับแนวคิดเดียวกัน: ค่าซึ่งหมายถึง“การขาดของค่า” และที่มีอยู่ในประเภทที่แตกต่างกัน (เรียกว่าประเภท nullable ) โดยทั่วไปจะใช้ค่านี้ในที่ที่มีค่าตามปกติ แต่อาจถูกละเว้นเช่นพารามิเตอร์ทางเลือก ภาษาการเขียนโปรแกรมที่แตกต่างกันใช้สิ่งนี้แตกต่างกันและบางภาษาอาจไม่มีแนวคิดดังกล่าว ในภาษาที่มีตัวชี้ว่ามันเป็นตัวชี้โมฆะ ในภาษาเชิงวัตถุจำนวนมาก null ไม่ใช่วัตถุ: การเรียกใช้เมธอดใด ๆ บนมันเป็นข้อผิดพลาด เพื่อให้ตัวอย่างบางส่วน:

  • ใน Lisp nilมักใช้เพื่อทนต่อการขาดค่า แตกต่างจากภาษาอื่น ๆ ส่วนใหญ่nilมีโครงสร้าง - "NIL"เป็นสัญลักษณ์ที่มีชื่อเป็น นอกจากนี้ยังเป็นรายการที่ว่างเปล่า (เพราะรายการควรเป็นเซลล์ข้อเสีย แต่บางครั้งไม่มีเซลล์ข้อเสียเพราะรายการว่างเปล่า) ไม่ว่าจะเป็นการนำไปใช้โดยตัวชี้โมฆะภายใต้ประทุนหรือเป็นสัญลักษณ์ที่เหมือนกันจะขึ้นอยู่กับการใช้งาน
  • ใน Pascal nilเป็นค่าตัวชี้ (ใช้ได้ในประเภทตัวชี้ใด ๆ ) ที่อาจไม่ถูกอ้างถึง
  • ใน C และ C ++ ประเภทของตัวชี้ใด ๆ จะมีNULLค่าที่แตกต่างจากตัวชี้ไปยังวัตถุที่ถูกต้อง
  • ใน Smalltalk nilเป็นวัตถุที่ไม่มีวิธีการที่กำหนดไว้
  • ใน Java และ C # nullเป็นค่าของชนิดวัตถุใด ๆ ความพยายามใด ๆ ในการเข้าถึงเขตข้อมูลหรือวิธีการnullทริกเกอร์ข้อยกเว้น
  • ใน Perl undefนั้นแตกต่างจากค่าสเกลาร์อื่น ๆ และใช้ตลอดทั้งภาษาและไลบรารีเพื่อระบุว่าไม่มีค่า "ของจริง"
  • ใน Python Noneนั้นแตกต่างจากค่าอื่น ๆ และใช้ทั่วทั้งภาษาและไลบรารีเพื่อระบุว่าไม่มีค่า“ ของจริง”
  • ใน ML (SML, OCaml) Noneเป็นค่าของชนิดใด ๆ ในโครงการประเภท'a optionที่มีNoneและSome xสำหรับการใด ๆประเภทx'a
  • ใน Haskell แนวคิดที่คล้ายกันใช้ชื่อNothingและJust xค่าและMaybe aประเภท

ในงานนำเสนออัลกอริทึมชื่อที่ใช้มีแนวโน้มที่จะเกิดจากพื้นหลังของผู้นำเสนอหรือภาษาที่ใช้ในตัวอย่างโค้ด

ในการนำเสนอความหมายชื่อที่แตกต่างกันอาจถูกใช้เพื่ออ้างถึงเช่นNULLตัวระบุซึ่งหมายถึงค่าคงที่ตัวชี้ในภาษาและค่าในความหมาย ฉันไม่คิดว่าจะมีรูปแบบการตั้งชื่อแบบมาตรฐานและงานนำเสนอบางอย่างทำให้มันแตกต่างจากแบบอักษรหรือไม่เข้ากับรูปแบบที่เป็นรูปธรรมเลยnผมล.

เป็นไปได้ว่าอาจารย์ของคุณต้องการใช้คำnullสำหรับค่าคงที่ตัวชี้โมฆะในภาษาการเขียนโปรแกรมที่ใช้ในหลักสูตร (Java หรือ C #?) และNILเพื่อแสดงว่าไม่มีโหนดในโครงสร้างข้อมูลบางอย่างซึ่งอาจหรืออาจไม่ได้นำไปใช้ เป็นค่าคงที่ตัวชี้โมฆะ (ตัวอย่างเช่นตามที่เห็นด้านบนใน Lisp NILมักจะไม่ถูกใช้เป็นตัวชี้โมฆะ) ความแตกต่างนี้จะเกี่ยวข้องเมื่อพูดถึงเทคนิคการใช้งานสำหรับโครงสร้างข้อมูล เมื่อพูดถึงโครงสร้างข้อมูลด้วยตนเองแนวคิดโมฆะตัวชี้คงที่ไม่มีความเกี่ยวข้องเฉพาะแนวคิดที่ไม่เท่ากันกับค่าอื่น ๆ เท่านั้น

ไม่มีรูปแบบการตั้งชื่อมาตรฐาน อาจารย์หรือตำราคนอื่นอาจใช้ชื่อต่างกัน


อีกสองตัวอย่าง วัตถุประสงค์ Cมีทั้งNULL(สำหรับความเข้ากันได้ C) และnil; วิธีการโทรnilเป็น no-op JavaScriptมีทั้งnull(ค่าที่แทนค่าอะไรเลย) และundefined(ยังไม่ได้ตั้งค่า)
200_success

1
"ในภาษาเชิงวัตถุ null ไม่ใช่วัตถุ: การเรียกใช้เมธอดใด ๆ บนข้อผิดพลาด" - สิ่งนี้ไม่เป็นความจริงสำหรับทุกภาษารวมถึงบางภาษาที่คุณระบุไว้ ใน Ruby และ Smalltalk nilเป็นวัตถุที่เหมือนกันมันเป็นตัวอย่างของNilClassไม่มีแนวคิดอื่น ๆ ของ "null-ness" และโดยเฉพาะอย่างยิ่งไม่มีตัวชี้โมฆะ ในกาลาNilแตกต่างอย่างมากจากnull, nullเป็นครับ-sorta เช่นโมฆะตัวชี้ แต่มันจริงมีประเภท ( Null) Nilเป็นวัตถุเก่าปกติเช่นเดี่ยวของEmptyListระดับถ้าคุณจะและยังมี ...
Jörg W Mittag

1
... Nothingซึ่งเป็นชนิดที่ด้านล่างและมีอินสแตนซ์และซึ่งเป็นประเภทของซับรูทีนที่ไม่คืนค่าและมีอินสแตนซ์เดี่ยวUnit อย่างใดดำเนินการกับมันความคิดของ "ตัวชี้โมฆะ" หรือ "การอ้างอิงโมฆะ" ไม่ได้เพราะอย่างใดที่มีอยู่ในระยะ แต่เพียงเพราะความแพร่หลายของภาษาเช่น C, C ++, D, Java, C # ที่ใช้ในนี้ ลักษณะ. ไม่ได้มีความหมายแฝงแม้ว่ามันจะใช้วิธีนั้นจริง ๆ เช่นใน Pascal, Modula-2 และ Oberon ในทับทิมมีวิธีการที่มีประโยชน์มากมาย: , ...()nullNILnilnil.to_i # => 0nil.to_s # => ''
Jörg W Mittag

1
... nil.to_a # => [], nil.to_h # => {}, nil.to_f # => 0.0, nil.inspect # => 'nil'และอื่น ๆ คุณสามารถดูรายการเต็มรูปแบบที่นี่
Jörg W Mittag

3

ฉันเชื่อว่าเหตุผลในการใช้ทั้งศูนย์และโมฆะก็คืออดีตเป็นคำนามเป็นหลักและคำต่อท้ายเป็นคำคุณศัพท์ (ฉันตรวจสอบในเว็บและในพจนานุกรมของฉัน: American Heritage 1992)

เกี่ยวกับความหมายและประวัติศาสตร์NILเป็นคำย่อมาจาก "nihil" ละตินซึ่งแปลว่า "ไม่มีอะไร"

สำหรับความรู้ของฉันการใช้ชื่อnilเพื่อแสดงตัวชี้โมฆะถูกนำมาใช้กับภาษาการเขียนโปรแกรม Lisp (1958)

ชี้โมฆะคือค่าตัวชี้ที่ควรจะชี้ไปที่อะไรและควรจึงไม่ได้รับการ dereferenced ในกรณีส่วนใหญ่พอยน์เตอร์เป็นเพียงที่อยู่หน่วยความจำ ตัวแปรใด ๆ (เช่นที่ตั้งใด ๆ ) ที่มีวัตถุประสงค์เพื่อให้ตัวชี้ดังกล่าวมักจะมีการกำหนดค่าบิตบางส่วนและการกำหนดค่าใด ๆ ดังกล่าวสามารถอ่านได้เป็นที่อยู่หน่วยความจำ ดังนั้นจึงมักจะเป็นกรณีที่ค่าnilจะเป็นที่อยู่ของพื้นที่หน่วยความจำที่ถูกห้ามไม่ให้โปรแกรมดังนั้นก่อให้เกิดความล้มเหลวในรูปแบบบางอย่าง (อาจขัดจังหวะ) หากโปรแกรมพยายาม dereference nilซึ่งสามารถเป็นข้อผิดพลาดเท่านั้น

การมีค่ามาตรฐานที่กำหนดไว้ล่วงหน้าเพื่อเล่นบทบาทนี้เป็นสิ่งจำเป็นในภาษาที่ใช้ตัวชี้อย่างชัดเจนเนื่องจากเป็นสิ่งสำคัญที่จะต้องทดสอบว่าตัวชี้กำลังชี้ไปยังตำแหน่งหน่วยความจำบางตำแหน่งหรือไม่ โดยทั่วไปใน Lisp รายการจะถูกสร้างขึ้นเป็นคู่ของ "cons" ที่มีตัวชี้ "รถยนต์" ต่อองค์ประกอบรายการและตัวชี้ "cdr" เป็นคู่ต่อไป nilในคู่สุดท้ายของรายการตัวชี้ที่สองคือ

สิ่งนี้สอดคล้องกับนิยามแบบเรียกซ้ำของรายการว่าเป็นรายการที่ว่างเปล่าหรือองค์ประกอบของรายการที่ต่อกับรายการ nilดังนั้นรายการที่มีองค์ประกอบไม่ถูกแทนด้วย รายการที่ว่างเปล่านี้เกิดขึ้นเป็นข้อมูลประจำตัวของรายการ monoid

nilตั้งแต่รายการที่สามารถนำมาใช้เพื่อเป็นตัวแทนของชุดคือชุดที่ว่างเปล่าสามารถในกรณีที่ยังจะแสดงโดย

ดังนั้นในnilอดีตจึงเป็นค่าตัวชี้พิเศษ แต่ต้องเข้าใจว่าเป็นค่าตัวตนพิเศษสำหรับโดเมนนามธรรมอื่น ๆ เช่นรายการหรือชุด

ตัวชี้เท่ากับnilเป็นตัวชี้โมฆะ null เป็นคำคุณศัพท์มากกว่าคำนาม (เช่นคำนาม)

การใช้การประสานงานของทั้งสองคำเป็นคำคุณศัพท์และคำนามค่อนข้างสอดคล้องกับการปฏิบัติอื่น ๆ รอบคัดเลือกnullมักจะใช้สำหรับเป็นศูนย์ของโครงสร้างพีชคณิตเช่นตัวตนของหนังสือที่คือองค์ประกอบ null รายการในรูปแบบmonoidโดยที่ค่าศูนย์คือตัวตน เช่นเดียวกับเซต (แม้ว่าพวกเขาจะสร้างพีชคณิตพร้อมคุณสมบัติอื่น ๆ อีกมากมาย) หนึ่งบอกว่าคล้ายกันว่าจำนวนเต็มเป็นโมฆะเมื่อมันเป็นศูนย์

มีความหลากหลายในการใช้คำเหล่านี้ที่คนอื่น ๆ เช่นไม่มีขึ้นอยู่กับผู้แต่งและนิสัยแปลก ๆ ของภาษาการเขียนโปรแกรม

ความหมายที่สำคัญสองประการดังที่อธิบายไว้ข้างต้น

  • เป็นค่ามาตรฐาน "ไม่ได้กำหนด" ซึ่งแสดงถึงการไม่มีค่าที่ใช้ได้

  • เป็นค่าประจำตัวของบางโดเมน

นี้แสดงให้เห็นว่ามันไม่ถูกต้องค่อนข้างที่จะยืนยันว่า NIL คือ " ค่าซึ่งหมายถึง“การขาดของค่า " ในขณะที่ทำโดยกิลส์ในคำตอบที่ได้รับการยอมรับ ขึ้นอยู่กับภาษาและการใช้งาน LISP ภาษาการเขียนโปรแกรมอาจแนะนำศูนย์ในการเขียนโปรแกรมคำศัพท์ 55 ปีที่ผ่านมา ใน LISP NILเป็นรายการที่ว่างเปล่าและสามารถบันทึกได้เท่ากัน()ซึ่งเป็นการแสดงตามธรรมชาติของรายการที่ว่างเปล่ามันไม่ได้เป็นตัวแทนของค่า บางครั้งมันถูกใช้เป็นตัวยึดตำแหน่งสำหรับค่าที่หายไปแม้ว่าจะหลีกเลี่ยงได้อย่างแม่นยำเพราะรายการที่ว่างเปล่าเป็นค่า สิ่งที่หมายถึงค่าที่หายไปในโครงสร้างในวัตถุใด ๆ ที่เลือกโดยโปรแกรมเมอร์ที่ไม่สามารถสับสนกับค่าที่ยอมรับได้

แนวคิดทั้งสองนั้นแตกต่างกันมากถึงแม้ว่าเราจะแสดงให้เห็นข้างต้นว่าพวกเขาสามารถเกี่ยวข้อง มันอาจน่าสนใจที่จะมีโหมด taxonomie แบบละเอียดเกี่ยวกับการใช้คำศัพท์ที่แจกแจงโดย Gilles'answer เพื่อดูว่าการใช้คำแต่ละคำเหล่านี้เน้นไปที่ความหมายแฝงหรืออีกนัยหนึ่งหรือไม่

ชื่อไม่ได้มากกว่าสิ่งที่พวกเขาได้รับมอบหมายให้หมายถึงในบริบทที่กำหนดโดยใครก็ตามที่กำหนดวาทกรรม การใช้งานบางอย่างเป็นเรื่องธรรมดามากขึ้นเป็นธรรมชาติหรือสอดคล้องกันมากกว่า แต่ก็ควรตรวจสอบคำจำกัดความทุกครั้งและตรวจสอบให้แน่ใจว่ามีความหมายอะไรที่ตั้งใจไว้ในแต่ละบริบท และหนึ่งไม่ควรคาดหวังคำศัพท์ที่ได้รับเลือกด้วยรสชาติหรือความสม่ำเสมอ


0

NIL เป็นวัตถุที่มีค่าที่บอกโปรแกรมเมอร์ว่าวัตถุนั้นไม่ถูกต้อง มันมีประโยชน์อย่างยิ่งใน C ++ โดยที่ NULL ถูกกำหนดเป็น 0 หากคุณยกเลิกการอ้างอิง NULL ใน C ++ คุณจะได้รับพฤติกรรมที่ไม่ได้กำหนด หากคุณยกเลิกการอ้างอิง NIL (ตัวชี้ไปยังวัตถุว่างเปล่าที่คุณกำหนดไว้) คุณจะได้รับวัตถุที่คุณสามารถบอกได้ว่าอยู่นอกเหนือส่วนท้ายของโครงสร้างข้อมูลของคุณ เหมาะอย่างยิ่งสำหรับการป้องกันความล้มเหลวของโปรแกรมที่ร้ายแรง

คุณสามารถใช้ NIL ในกรณีเช่นรายการที่มีการเชื่อมโยงเป็นทวีคูณเพราะเป็นจุดเริ่มต้นและจุดสิ้นสุดของรายการเพื่อติดตามทั้งส่วนหัวและส่วนท้ายและตรวจสอบให้แน่ใจว่า -> ตัวชี้ถัดไปและ -> prev ไม่เคยยกเลิกการอ้างอิง NULL


เท่าที่ฉันเห็นนี่มันไม่ถูกต้อง ไม่มี "NIL" ใน C
David Richerby

1
ฉันคิดว่าคุณตีความคำตอบของฉันผิด ลิงค์ที่คุณระบุไม่มีความสัมพันธ์กับคำตอบของฉัน ฉันเสนอว่า nil เป็นวัตถุที่ผู้ใช้กำหนดซึ่งกำหนดไว้ในแต่ละคลาสเพื่อชี้ไปยังวัตถุที่ว่างเปล่า (แต่ถูกต้อง) ของคลาสนั้น
abastion

วิธีที่คุณเขียน "NIL เป็นวัตถุ" (เน้นของฉัน) แทนที่จะพูดว่า "NIL สามารถกำหนดเป็นวัตถุ" ทำให้ดูเหมือนว่าคุณกำลังอธิบายคุณลักษณะภาษามากกว่ารูปแบบการเขียนโปรแกรม อย่างไรก็ตามหากคำตอบของคุณเกี่ยวกับรูปแบบการเขียนโปรแกรมจริงๆมันไม่ได้อยู่ในหัวข้อที่นี่
David Richerby
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.