Như đã nêu ??!??!
thực chất là hai trigraphs ( ??!
và ??!
một lần nữa) mushed cùng mà được thay thế phiên dịch sang ||
, tức là logic OR , bằng vi xử lý.
Bảng sau đây chứa mỗi bộ ba sẽ giúp phân biệt các kết hợp bộ ba thay thế:
Trigraph Replaces
??( [
??) ]
??< {
??> }
??/ \
??' ^
??= #
??! |
??- ~
Nguồn: C: Sách hướng dẫn tham khảo Phiên bản thứ 5
Vì vậy, một bộ ba trông giống như ??(??)
cuối cùng sẽ ánh xạ tới []
, ??(??)??(??)
sẽ được thay thế [][]
và như vậy, bạn có ý tưởng.
Vì các bộ ba được thay thế trong quá trình tiền xử lý, bạn có thể sử dụng cpp
để có được chế độ xem đầu ra, sử dụng trigr.c
chương trình ngớ ngẩn :
void main(){ const char *s = "??!??!"; }
và xử lý nó với:
cpp -trigraphs trigr.c
Bạn sẽ nhận được một đầu ra giao diện điều khiển của
void main(){ const char *s = "||"; }
Như bạn có thể nhận thấy, tùy chọn -trigraphs
phải được chỉ định nếu không cpp
sẽ đưa ra cảnh báo; điều này chỉ ra làm thế nào các bức tượng là một điều của quá khứ và không có giá trị hiện đại nào ngoài những người khó hiểu có thể va vào chúng .
Đối với lý do đằng sau việc giới thiệu các bộ ba, được hiểu rõ hơn khi xem phần lịch sử của ISO / IEC 646 :
ISO / IEC 646 và tiền thân ASCII (ANSI X3.4) phần lớn tán thành thực tiễn hiện có liên quan đến mã hóa ký tự trong ngành viễn thông.
Vì ASCII không cung cấp một số ký tự cần thiết cho các ngôn ngữ khác ngoài tiếng Anh, một số biến thể quốc gia đã được tạo ra để thay thế một số ký tự ít được sử dụng bằng các ký tự cần thiết .
(nhấn mạnh của tôi)
Vì vậy, về bản chất, một số ký tự cần thiết (những ký tự tồn tại) đã được thay thế trong một số biến thể quốc gia nhất định. Điều này dẫn đến việc đại diện thay thế bằng cách sử dụng các biểu tượng bao gồm các ký tự mà các biến thể khác vẫn có xung quanh.
!ErrorHasOccurred() ??!???! HandleError();
muốn biên dịch như thế nào? Đó là??!
???
!
. Chứng minh quan điểm?