ในการเรียงตัวอักษรสตริงที่อยู่ติดกัน


17

C และ C ++ รวบรวมตัวอักษรสตริงที่อยู่ติดกันเป็นตัวอักษรสตริงเดียว ตัวอย่างเช่นนี้

"Some text..." "and more text"

เทียบเท่ากับ:

"Some text...and more text"

ในภาษาตระกูล C อื่น ๆ เช่น C # หรือ Java นี่เป็นข้อผิดพลาดทางไวยากรณ์ (ซึ่งก็ดีมาก BTW)

เหตุผล / เหตุผลทางประวัติศาสตร์สำหรับ C และ C ++ คืออะไร

คำตอบ:


24

ภาษา C ดั้งเดิมได้รับการออกแบบในปี 1969-1972 เมื่อการคำนวณยังคงถูกครอบงำโดยการ์ด punched 80 คอลัมน์ ผู้ออกแบบใช้อุปกรณ์ 80 คอลัมน์เช่น ASR-33 Teletype อุปกรณ์เหล่านี้ไม่ได้ห่อข้อความโดยอัตโนมัติดังนั้นจึงมีแรงจูงใจที่แท้จริงในการเก็บซอร์สโค้ดภายใน 80 คอลัมน์ Fortran และ Cobol มีกลไกความต่อเนื่องที่ชัดเจนที่จะทำก่อนที่พวกเขาจะย้ายไปอยู่ในรูปแบบอิสระ

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

เมื่อคุณสมบัติอยู่ในนั้นทำไมมันถึงถูกลบ? มันทำให้ไม่มีความเศร้าโศกและเป็นประโยชน์บ่อยครั้ง ฉันต้องการหนึ่งภาษามีมากกว่านี้ แนวโน้มที่ทันสมัยคือการมีสายอักขระที่เพิ่มขึ้นพร้อมเครื่องหมายคำพูดสามเท่าหรือสัญลักษณ์อื่น ๆ แต่ความเรียบง่ายของคุณลักษณะนี้ใน C ไม่เคยหมดไป


8
อีกเหตุผลหนึ่งคือช่วยให้สามารถเชื่อมต่อกันของมาโครตัวประมวลผลล่วงหน้าที่กำหนดเป็นตัวอักษรสตริงเช่น#define FOO "foo-value"ตามมาด้วย"FOO's value is " FOO "."
Blrfl

3
@Blrfl: เพียงแค่นั้น สิ่งสำคัญคือต้องตระหนักว่าการต่อสตริงเกิดขึ้นหลังจากการทดแทนแมโครเสร็จสมบูรณ์
david.pfx

7

C ไม่มีตัวดำเนินการเรียงสตริงที่เจาะจง ( +) เช่น C # และ Java ใน C # หรือ Java เมื่อคอมไพเลอร์เห็น

"a" + "b"

มันสามารถรวบรวมรหัสตรงตามที่

"ab"

ถูกเขียนในซอร์สโค้ด อย่างไรก็ตามใน C ไม่มีไวยากรณ์ที่ง่ายในทำนองเดียวกันสำหรับการอธิบายการเชื่อมโยงของสตริงที่คอมไพเลอร์สามารถรับรู้และคำนวณล่วงหน้าได้ ดังนั้นนักออกแบบของทศวรรษที่ผ่านมา C เลือกที่

"a" "b"

จะหมายถึงสิ่งเดียวกับ

"ab"

โดยธรรมชาติ C ++ สืบทอดการประชุมเดียวกัน ในขณะที่มาตรฐาน C ++ overloads ห้องสมุด+ในstd::stringการ concatenation สตริงเฉลี่ยคอมไพเลอร์ไม่พยายามที่จะรวมกัน"a" + "b"เพราะเห็นว่าเป็นจริงข้อผิดพลาด (คุณไม่สามารถเพิ่มสองconst char *ตัวชี้ร่วมกัน)


1
C ยังไม่มีประเภทสตริงที่เฉพาะเจาะจงเลือกใช้สำหรับพอยน์เตอร์ถึงอักขระในหน่วยความจำ คุณไม่สามารถเพิ่มพอยน์เตอร์ได้และแม้ว่าจะ+ถูกสร้างขึ้นมาเพื่อหมายถึงการต่อข้อมูลคุณยังต้องแก้ไขปัญหาที่ในหน่วยความจำที่สตริงที่ต่อกันจะหายไป
Blrfl
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.