เหตุใด 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 เป็นที่อยู่"&
&
&x
x
*
*x
โปรดทราบว่า&
shift-7 และ*
shift-8 ความใกล้ชิดกันอาจเป็นคำใบ้ต่อโปรแกรมเมอร์ว่าพวกเขาทำอะไร ... แต่นั่นเป็นเพียงการเดา เราต้องถาม Ken Thompsonเกี่ยวกับสาเหตุที่เลือกมา
ดังนั้นคุณมีมัน C เป็นอย่างนั้นเพราะ B คือ B เป็นอย่างนั้นเพราะมันต้องการเปลี่ยนจากวิธี BCPL
->
มีการใช้งานในภาษา C เป็นตัวดำเนินการอ้างอิง - เมื่อเข้าถึงฟิลด์ในโครงสร้าง:struct_pointer->field
ซึ่งย่อมา(*struct_pointer).field
จาก