ตามที่ระบุไว้แล้ว??!??!
เป็นหลักสองtrigraphs ( ??!
และ??!
อีกครั้ง) ข้าวต้มด้วยกันที่ได้รับการแปล||
แทนคือตรรกะหรือโดย preprocessor
ตารางต่อไปนี้ที่มี trigraph ทุกอันควรช่วยลดความซับซ้อนของชุด trigraph สำรอง:
Trigraph Replaces
??( [
??) ]
??< {
??> }
??/ \
??' ^
??= #
??! |
??- ~
แหล่งที่มา: C: คู่มืออ้างอิงรุ่นที่ 5
ดังนั้น trigraph ที่ดูเหมือนว่า??(??)
ในที่สุดจะแมปไป[]
, ??(??)??(??)
จะได้รับการแทนที่ด้วย[][]
และเพื่อที่คุณจะได้รับความคิด
เนื่องจาก Trigraphs ถูกทดแทนในระหว่างการประมวลผลล่วงหน้าคุณสามารถใช้cpp
เพื่อรับมุมมองของผลลัพธ์ด้วยตัวคุณเองโดยใช้trigr.c
โปรแกรมโง่ ๆ:
void main(){ const char *s = "??!??!"; }
และประมวลผลด้วย:
cpp -trigraphs trigr.c
คุณจะได้รับเอาต์พุตคอนโซลของ
void main(){ const char *s = "||"; }
ในขณะที่คุณสามารถสังเกตเห็นตัวเลือก-trigraphs
จะต้องระบุมิฉะนั้นcpp
จะออกคำเตือน; นี้แสดงว่าtrigraphs เป็นสิ่งที่ผ่านมาและไม่มีค่าที่ทันสมัยอื่น ๆ กว่าสับสนคนที่อาจชนเข้ากับพวกเขา
สำหรับเหตุผลเบื้องหลังการแนะนำของตรีโกณมิตินั้นเป็นที่เข้าใจกันดีกว่าเมื่อดูที่ส่วนประวัติของ ISO / IEC 646 :
ISO / IEC 646 และ ASCII รุ่นก่อนหน้า (ANSI X3.4) ส่วนใหญ่รับรองการปฏิบัติที่มีอยู่เกี่ยวกับการเข้ารหัสอักขระในอุตสาหกรรมโทรคมนาคม
ในฐานะที่เป็น ASCII ไม่ได้ให้จำนวนตัวอักษรที่จำเป็นสำหรับภาษาอื่นที่ไม่ใช่ภาษาอังกฤษจำนวนของสายพันธุ์ของชาติที่ถูกสร้างขึ้นที่ทดแทนบางตัวอักษรน้อยกว่าที่ใช้กับคนที่จำเป็น
(เน้นที่เหมือง)
ดังนั้นในสาระสำคัญอักขระบางตัวที่ต้องการ (ที่มีอยู่ใน trigraph) จึงถูกแทนที่ด้วยตัวแปรระดับชาติบางอย่าง สิ่งนี้นำไปสู่การเป็นตัวแทนสำรองโดยใช้ trigraph ซึ่งประกอบด้วยอักขระที่ตัวแปรอื่นยังมีอยู่
!ErrorHasOccurred() ??!???! HandleError();
จะรวบรวมได้อย่างไร??!
???
!
ที่ พิสูจน์จุดได้หรือไม่