سؤال

وفقًا لـ C ++ '03 Standard 2.3/1:

قبل حدوث أي معالجة أخرى ، يتم استبدال كل حدوث واحدة من التسلسلات التالية لثلاثة أحرف ("تسلسل Trigraph") بالحرف الواحد المشار إليه في الجدول 1.

----------------------------------------------------------------------------
| trigraph | replacement | trigraph | replacement | trigraph | replacement |
----------------------------------------------------------------------------
| ??=      | #           | ??(      | [           | ??<      | {           |
| ??/      | \           | ??)      | ]           | ??>      | }           |
| ??’      | ˆ           | ??!      | |           | ??-      | ˜           |
----------------------------------------------------------------------------

في الحياة الحقيقية هذا يعني هذا الرمز printf( "What??!\n" ); سوف يؤدي إلى الطباعة What| لان ??! هو تسلسل trigraph الذي يتم استبداله بـ | حرف.

سؤالي هو ما الغرض من استخدام trigraphs؟ هل هناك أي ميزة عملية لاستخدام trigraphs؟

UPD: في الإجابات ، تم ذكر أن بعض لوحات المفاتيح الأوروبية لا تحتوي على جميع شخصيات علامات الترقيم ، لذلك يتعين على المبرمجين من غير الولايات المتحدة استخدام Trigraphs في الحياة اليومية؟

UPD2: Visual Studio 2010 لديه دعم Trigraph إيقاف افتراضيًا.

هل كانت مفيدة؟

المحلول

هذا السؤال (حول digraphs ذات الصلة) لديه الجواب.

إنه يتلخص في حقيقة أن مجموعة أحرف ISO 646 لا تحتوي على جميع أحرف بناء جملة C ، لذلك هناك بعض الأنظمة التي تحتوي على لوحات مفاتيح وشاشات لا يمكنها التعامل مع الشخصيات (على الرغم من أنني أتخيل أن هذه نادرة جدًا الوقت الحاضر).

بشكل عام ، لا تحتاج إلى استخدامها ، ولكن عليك أن تعرفها عن المشكلة التي واجهتها بالضبط. Trigraphs هي السبب في ''?الشخصية لها تسلسل الهروب:

'\?'

لذا فإن طريقتين يمكنك تجنب مشكلة مثالك هي:

 printf( "What?\?!\n" ); 

 printf( "What?" "?!\n" ); 

لكن عليك أن تتذكر عندما تكتب الاثنين؟ " الشخصيات التي قد تبدأ بها trigraph (وبالتأكيد ليس شيئًا أفكر فيه أبدًا).

في الممارسة العملية ، فإن Trigraphs و Digraphs شيء لا أشعر بالقلق على الإطلاق على أساس يومي. ولكن يجب أن تكون على دراية بهم لأنه بمجرد كل عامين ، ستصادف خطأً يتعلق بهم (وسوف تقضي بقية اليوم في لعن وجودهم). سيكون من الرائع أن يتم تكوين المجمعين لتحذيرهم (أو خطأ) عندما يصادف ذلك عبر trigraph أو digraph ، لذلك يمكن أن أعرف أنني حصلت على شيء يجب أن أتعامل معه عن قصد.

وفقط من أجل الاكتمال ، تكون Digraphs أقل خطورة بكثير نظرًا لأنها تتم معالجتها كمواد رموز ، لذلك لن يتم تفسير الحفر داخل سلسلة حرفية على أنها digraph.

للحصول على تعليم لطيف حول متعة مختلفة مع علامات الترقيم في برامج C/C ++ (بما في ذلك حشرة ثلاثية من شأنها أن تجعلني أخرج شعري) ، ألق نظرة على مقالة Herb Sutter's Gotw #86.


إضافة:

يبدو أن مجلس التعاون الخليجي لن يعالج (وسوف يحذر من) trigraphs افتراضيًا. لدى بعض المترجمين الآخرين خيارات لإيقاف دعم Trigraph (IBM's على سبيل المثال). بدأت Microsoft في دعم تحذير (C4837) في VS2008 والتي يجب تمكينها بشكل صريح (باستخدام جدار أو شيء من هذا القبيل).

نصائح أخرى

من The C++ Programming Language طبعة خاصة ، صفحة 829

شخصيات ASCII الخاصة [, ], {, }, |, ، و \ احتل مواقع مجموعة الأحرف المعينة كأبجدية من قبل ISO. في معظم مجموعات شخصيات ISO-646 الوطنية الأوروبية ، يتم احتلال هذه المواقف بواسطة رسائل غير موجودة في الأبجدية الإنجليزية.

يتم توفير مجموعة من trigraphs للسماح بالتعبير عن الأحرف الوطنية بطريقة محمولة باستخدام مجموعة أحرف الحد الأدنى القياسية حقًا. قد يكون هذا مفيدًا لتبادل البرامج ، لكنه لا يسهل على الأشخاص قراءة البرامج. وبطبيعة الحال ، فإن الحل طويل الأجل لهذه المشكلة هو لمبرمجي C ++ الحصول على معدات تدعم كل من لغتهم الأم و C ++ بشكل جيد. لسوء الحظ ، يبدو أن هذا غير ممكن بالنسبة للبعض ، ويمكن أن يكون إدخال معدات جديدة عملية بطيئة بشكل محبط.

أطفال اليوم! :-)

نعم ، المعدات الأجنبية ، مثل محطة IBM 3270. 3270 لديه ، إذا كنت أتذكر ، لا أقواس مجعد! إذا كنت ترغب في كتابة C على IBM Mini / Mainframe ، فأنت أنت كان يجب ان استخدم trigraphs البائسة لكل حدود كتلة. لحسن الحظ ، اضطررت فقط إلى كتابة البرامج في ج إلى محاكاة بعض مرافق الحواسيب الصغيرة IBM ، وليس في الواقع كتابة برنامج C. على النظام/36.

انظر بجانب مفتاح "P":

keyboard

أمم. من الصعب القول. يوجد زر إضافي بجوار "عودة النقل" ، وقد أتخطى ذلك إلى الوراء: ربما كان الزوج [" / "] المفقود. على أي حال ، فإن لوحة المفاتيح هذه قد تسبب لك حزنًا إذا اضطررت إلى كتابة C.

أيضًا ، تعرض هذه المحطات EBCDIC ، مجموعة الأحرف المركزية "الأصلية" من IBM ، وليس ASCII (شكرًا ، بافيل مينيف ، للتذكير).

من ناحية أخرى ، كما يقول دليل GNU C: "لا تحتاج إلى تلف في الدماغ". يترك برنامج التحويل البرمجي العالمي هذا "الميزة" المعطلة بشكل افتراضي.

فهي للاستخدام على الأنظمة التي تفتقر إلى بعض الأحرف في مجموعة الأحرف الأساسية من C ++. وغني عن القول ، مثل هذه الأنظمة نادرة للغاية.

تم اقتراح trigraphs للإزالة في C ++ 0x. ومع ذلك ، لا يزال هناك حجة قوية لدعمهم - انظر ورقة لجنة C ++ N2910 الذي يناقش هذا. على ما يبدو ، Ebcdic هو معقل رئيسي حيث هناك حاجة إليها.

لقد رأيت trigraphs المستخدمة في أوائل التسعينيات للمساعدة في تحويل برامج PL/1 من جهاز حاسوب رئيسي ليتم تشغيله/تجميعه/تصحيحه على جهاز كمبيوتر.

لقد كانوا يتجولون في تحرير PL/I على جهاز الكمبيوتر باستخدام برنامج التحويل البرمجي PL/I إلى C وأرادوا أن يعمل الكود عند العودة إلى الحاسبات المركزية التي لم تدعم الأقواس المجعد. اقترحت أنه يمكنهم استخدام وحدات الماكرو مثل

#def BEGIN {    
#def END }  

أو كبديل ودود/أنا بديل

#def BEGIN ??<
#def END ??>

وإذا أرادوا حقًا أن يتوهموا ، فيمكنهم المحاولة

#ifdef MAINFRAME
    #def BEGIN ??<
    #def END ??>
#else
    #def BEGIN {    
    #def END }  
#endif

وبعد ذلك سيبدو البرنامج كما كان مكتوبًا في باسكال. لقد نظروا إليّ فقط مضحكين ولن يتحدثوا معي لبقية اليوم. لا أعتقد أنني ألومهم. قون

ما الذي قتل الجهد الذي لم يكن الرسم البياني ، كان الاختلافات في نظام IO بين المنصات. كان فتح الملفات على الكمبيوتر مختلفًا كثيرًا عن الحاسبات المركزية التي كان من الممكن أن تقدم الكثير من Kludges للحفاظ على نفس الرمز يعمل على كليهما.

بعض لوحات المفاتيح الأوروبية لا تحتوي على جميع شخصيات علامات الترقيم التي كانت عليها لوحات المفاتيح الأمريكية ، لأنها تحتاج إلى مفاتيح شخصياتها الأبجدية غير العادية. على سبيل المثال (صنع هذا الأمر) ، سيكون للوحة المفاتيح السويدية حلقة A حيث كانت الدعامة المجعد.

لاستيعاب هؤلاء المستخدمين ، تعد Trigraphs وسيلة لدخول علامات الترقيم باستخدام أحرف ASCII الأكثر شيوعًا فقط.

في المقام الأول لأن معيار C قدمها في عام 1989 ، عندما كانت هناك مشاكل مع وجود الشخصيات التي تعرض لها Trigraphs على بعض الآلات. بحلول الوقت الذي تم فيه نشر معيار C ++ في عام 1998 ، لم تكن الحاجة إلى Trigraphs رائعة. هم ثؤلول على ج. هم مجرد ثؤلول على C ++. كانت هناك حاجة لهم - خاصة خارج العالم الناطق باللغة الإنجليزية - ولهذا السبب تمت إضافتهم إلى C.

هم في الغالب لأسباب تاريخية. في الوقت الحاضر ، تتيح معظم لوحات المفاتيح الحديثة لمعظم اللغات الوصول إلى جميع تلك الأحرف ، ولكن هذا كان يمثل مشكلة مرة واحدة مع بعض لوحات المفاتيح الأوروبية. هذا هو السبب في اختراع trigraphs.

إذا كنت لا تعرف ما الذي يجب عليهم ، يجب ألا تستخدمهم.

لا يزال من الجيد أن تكون على دراية بهم ، نظرًا لأنك قد تستخدم عن غير قصد وبدون قصد واحد في الكود الخاص بك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top