เหตุใด C ใช้เครื่องหมายดอกจันสำหรับพอยน์เตอร์
เพียงเพราะBทำ
เนื่องจากหน่วยความจำเป็นอาร์เรย์แบบเส้นตรงจึงเป็นไปได้ที่จะตีความค่าในเซลล์เป็นดัชนีในอาร์เรย์นี้และ BCPL จะส่งโอเปอเรเตอร์เพื่อจุดประสงค์นี้ ในภาษาต้นฉบับที่มันถูกสะกดrvและต่อมา!ในขณะที่ B *ใช้เอก ดังนั้นถ้าpเป็นเซลล์ที่มีดัชนีของ (หรือที่อยู่) หรือตัวชี้ไปยัง) เซลล์อื่น*pหมายถึงเนื้อหาของเซลล์ชี้ไปที่ไม่ว่าจะเป็นค่าในการแสดงออกหรือเป็นเป้าหมายของการมอบหมาย
จากการพัฒนาภาษา C
แค่นั้นแหละ. ณ จุดนี้คำถามนี้ไม่น่าสนใจเหมือน "ทำไมไพ ธ อน 3 ใช้.วิธีเรียกเมธอดทำไม->? อืม ... เพราะ Python 2 ใช้.เพื่อเรียกเมธอด
ภาษาไม่ได้มีอยู่จริงจากสิ่งใด มันมีอิทธิพลและอยู่บนพื้นฐานของสิ่งที่มาก่อน
ดังนั้นเหตุใด B จึงไม่ใช้!สำหรับการยกเลิกการอ้างอิงตัวชี้เหมือนกับรุ่นก่อนของ BCPL
BCPL เป็นคำที่พูดไม่ออก แทนที่จะ&&หรือ||BCPL ใช้และlogand logorนี่เป็นเพราะคีย์บอร์ดส่วนใหญ่ไม่มี∧หรือมี∨คีย์และไม่เท่ากันจริง ๆ แล้วคำว่าNEQV(ดูคู่มืออ้างอิง BCPL )
B ดูเหมือนจะได้รับแรงบันดาลใจบางส่วนเพื่อทำให้ไวยากรณ์แน่นขึ้นแทนที่จะมีคำยาวสำหรับตัวดำเนินการเชิงตรรกะเหล่านี้ทั้งหมดที่โปรแกรมเมอร์ทำค่อนข้างบ่อย และด้วยเหตุนี้จึง!กลายเป็น*สิ่งที่!สามารถนำมาใช้เพื่อการปฏิเสธแบบตรรกะ โปรดสังเกตว่ามีความแตกต่างระหว่างตัวดำเนิน*การเอกและตัวดำเนินการไบนารี*(การคูณ)
แล้วมีทางเลือกอื่นอีก->ไหม
->ถูกนำสำหรับน้ำตาลประโยครอบ derefrences ฟิลด์struct_pointer->fieldซึ่งเป็น(*struct_pointer).field
ตัวเลือกอื่น ๆ เช่น<-สามารถสร้างการแยกวิเคราะห์ที่ไม่ชัดเจน ตัวอย่างเช่น:
foo <- bar
คือการที่จะอ่านเป็น:
(foo) <- (bar)
หรือ
(foo) < (-bar)
การสร้างโอเปอเรเตอร์ยูนารีที่ประกอบด้วยโอเปอเรเตอร์ไบนารี่และโอเปอเรเตอร์ยูนารีอีกอันค่อนข้างมีปัญหาเนื่องจากตัวดำเนินการยูนารีที่สองอาจเป็นคำนำหน้าสำหรับนิพจน์อื่น
ยิ่งไปกว่านั้นมันเป็นสิ่งสำคัญอีกครั้งที่จะพยายามทำให้สิ่งต่าง ๆ ถูกพิมพ์บ่อยครั้งให้น้อยที่สุด ฉันเกลียดที่จะต้องเขียน:
int main(int argc, char->-> argv, char->-> envp)
สิ่งนี้จะยากต่อการอ่าน
อาจมีตัวละครอื่น ๆ ที่เป็นไปได้ ( @ไม่ได้ใช้จนกว่าObjective C จะจัดสรรให้ ) แม้ว่าจะเป็นเช่นนี้สิ่งนี้จะไปที่แกนกลางของ 'C ใช้*เพราะ B ทำ' ทำไมไม่ใช้ B @? เอาล่ะ B ไม่ได้ใช้ตัวละครทั้งหมด ไม่มีbppโปรแกรม (เปรียบเทียบcpp ) และอักขระอื่น ๆ พร้อมใช้งานใน B (เช่น#ซึ่งถูกใช้โดย cpp ในภายหลัง)
หากฉันอาจเป็นอันตรายต่อการเดาว่าทำไม - เพราะกุญแจอยู่ตรงไหน จากคู่มือใน B :
เพื่ออำนวยความสะดวกการจัดการของที่อยู่เมื่อมันดูเหมือนว่าแนะนำให้เลือก B มีสองผู้ประกอบการที่อยู่เอก, และ* เป็นผู้ดำเนินการที่อยู่ดังนั้นจึงเป็นที่อยู่ของสมมติว่ามันมีหนึ่ง เป็นผู้ดำเนินการทางอ้อม หมายถึง "ใช้เนื้อหาของ x เป็นที่อยู่"&&&xx**x
โปรดทราบว่า&shift-7 และ*shift-8 ความใกล้ชิดกันอาจเป็นคำใบ้ต่อโปรแกรมเมอร์ว่าพวกเขาทำอะไร ... แต่นั่นเป็นเพียงการเดา เราต้องถาม Ken Thompsonเกี่ยวกับสาเหตุที่เลือกมา
ดังนั้นคุณมีมัน C เป็นอย่างนั้นเพราะ B คือ B เป็นอย่างนั้นเพราะมันต้องการเปลี่ยนจากวิธี BCPL
->มีการใช้งานในภาษา C เป็นตัวดำเนินการอ้างอิง - เมื่อเข้าถึงฟิลด์ในโครงสร้าง:struct_pointer->fieldซึ่งย่อมา(*struct_pointer).fieldจาก