ตามที่ระบุไว้แล้ว??!??!เป็นหลักสอง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();จะรวบรวมได้อย่างไร??!???!ที่ พิสูจน์จุดได้หรือไม่