Về nối các chuỗi ký tự liền kề


17

C và C ++ biên dịch chuỗi ký tự chuỗi liền kề thành một chuỗi ký tự đơn. Ví dụ này:

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

tương đương với:

"Some text...and more text"

Trong các ngôn ngữ gia đình C khác như C # hoặc Java, đây là lỗi cú pháp (BTW hoàn toàn tốt).

Lý do hợp lý / lịch sử để C và C ++ làm điều này là gì?

Câu trả lời:


24

Ngôn ngữ C ban đầu được thiết kế vào năm 1969-1972 khi điện toán vẫn bị chi phối bởi thẻ đục lỗ 80 cột. Các nhà thiết kế của nó đã sử dụng 80 thiết bị cột như ASR-33 Teletype. Các thiết bị này không tự động ngắt văn bản, vì vậy có một động cơ thực sự để giữ mã nguồn trong vòng 80 cột. Fortran và Cobol đã có cơ chế tiếp tục rõ ràng để làm như vậy, trước khi cuối cùng họ chuyển sang định dạng miễn phí.

Đó là một nét chấm phá cho Dennis Ritchie (tôi giả sử) để nhận ra rằng không có sự mơ hồ trong ngữ pháp và các chuỗi ASCII dài có thể được tạo ra để phù hợp với 80 cột bằng cách đơn giản là có được trình biên dịch để nối các chuỗi ký tự liền kề. Vô số lập trình viên C rất biết ơn về tính năng nhỏ đó.

Khi tính năng được bật, tại sao nó sẽ bị xóa? Nó không gây đau buồn và thường xuyên tiện dụng. Tôi muốn một ngôn ngữ có nhiều ngôn ngữ hơn. Xu hướng hiện đại là có các chuỗi mở rộng với ba dấu ngoặc kép hoặc các ký hiệu khác, nhưng tính đơn giản của tính năng này trong C chưa bao giờ bị lỗi thời.


8
Một lý do khác là nó cho phép ghép các macro tiền xử lý được xác định là chuỗi ký tự, ví dụ, #define FOO "foo-value"theo sau là"FOO's value is " FOO "."
Blrfl

3
@Blrfl: Chỉ vậy thôi. Điều quan trọng là phải nhận ra rằng việc nối chuỗi diễn ra sau khi thay thế macro hoàn tất.
david.pfx

7

C không có toán tử nối chuỗi cụ thể ( +) như C # và Java. Trong C # hoặc Java, khi trình biên dịch nhìn thấy

"a" + "b"

nó có thể biên dịch mã chính xác như thể

"ab"

đã được viết trong mã nguồn. Tuy nhiên, trong C, không có cú pháp dễ dàng tương tự để mô tả nối chuỗi mà trình biên dịch có thể nhận ra và tính toán trước. Vì vậy, các nhà thiết kế của C nhiều thập kỷ trước đã chọn điều đó

"a" "b"

có nghĩa chính xác giống như

"ab"

Đương nhiên C ++ được thừa hưởng quy ước tương tự. Trong khi chuẩn C ++ quá tải thư viện +trên std::stringđể nối chuỗi trung bình, trình biên dịch không cố gắng liên hiệp"a" + "b" bởi vì đó thực sự là một lỗi (bạn không thể thêm hai const char *con trỏ với nhau).


1
C cũng không có loại chuỗi cụ thể, thay vào đó chọn tham gia con trỏ tới các ký tự trong bộ nhớ. Bạn không thể thêm con trỏ và ngay cả khi +được tạo ra bằng cách nào đó có nghĩa là nối, bạn vẫn phải giải quyết vấn đề về vị trí của chuỗi trong bộ nhớ.
Blrfl
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.