اذهب إلى المحتوى

الثوابت وسلاسل الهروب في لغة سي C


Naser Dakhel

يشرح المقال الأعداد الحقيقية والصحيحة الثابتة وسلاسل الهروب في لغة C.

الأعداد الصحيحة الثابتة

مبدأ الأعداد الصحيحة الثابتة بسيط، فهي تمثل أي عدد صحيح مثل 1 أو 1034 وغيرها، ويمكنك إضافة الحرف l أو L في نهاية عدد صحيح ثابت لتحويله قسريًّا إلى نوع long، وإضافة u أو U لتحويلها إلى unsigned، ويمكن كتابة الأعداد الصحيحة الثابتة بالنظام الست عشري عن طريق استخدام 0x أو 0X قبل كتابة الثابت، والأحرف a و b و c و d و e و f.

وتُكتب الأعداد الصحيحة الثابتة بالنظام الثماني أيضًا باستخدام 0 في بداية الرقم، وتستخدم الأرقام 0، 1، 2، 3، 4، 5، 6، 7 فقط. عليك الحذر هنا بهذا الشأن، إذ من السهل النظر إلى 015 ومعاملته على أنه رقم صحيح بالنظام العشري، يقع المبتدئون في هذا الخطأ أغلب الأحيان، ولكنك ستبدأ بالاعتياد على الأمر بعد اقتراف بعض الأخطاء.

قدّم معيار سي طريقًة جديدة لمعرفة نوع العدد الصحيح الثابت، إذ تحدث ترقية promoted للثابت في لغة سي القديمة إلى النوع long في حال كان كبيرًا ولا يتسع في النوع int دون أي تحذيرات، وتنص القاعدة على أن التحويل يجري بهذا الترتيب إلى أن تتسع قيمة الثابت بالنظام العشري:

int   long   unsigned long

بينما تستخدم الأعداد الست عشرية والثمانية الصحيحة هذه القائمة:

int   unsigned int   long   unsigned long

إذا كان الثابت مسبوقًا بالحرف "u" أو "U":

unsigned int   unsigned long

إذا كان مسبوقًا بالحرف "l" أو "L":

long   unsigned long

وأحيرًا، إذا كان مسبوقًا بكلٍّ من u أو U و l أو L فالنوع هو unsigned long حصرًا.

تُجرى جميع هذه التحويلات لإعطائك النوع "الذي قصدته"، وهذا يعني أن معرفة نوع الثابت ضمن تعبير أمرٌ صعب بعض الشيء إن لم تكن تعرف أي شيء بخصوص عتاد الجهاز. لحسن الحظ هناك بعض المصرّفات التي تحذّرك عند ترقية ثابت ما إلى طول آخر ولم يُحدَّد النوع باستخدام U أو L أو غيرها.

تحوي هذه التعليمة على خطأ مُخبأ:

printf("value of 32768 is %d\n", 32768);

سيكون العدد 32768 طويلًا بالنسبة لآلة تعمل بنظام المتمم الثنائي ذي 16 بتًا وفقًا للقواعد المذكورة أعلاه، ولكن تتوقع الدالة printf عددًا صحيحًا فقط على أنه وسيط، ويشيرd% إلى ذلك، إلا أن نوع هذا الوسيط خاطئ وينبغي عليك توخي الحذر وتحويل مثل هذه الحالات إلى النوع الصحيح:

printf("value of 32768 is %d\n", (int)32768);

من الجدير بالذكر أنه لا وجود للثوابت السالبة، فكتابة 23- هو تعبيرٌ مكون من ثابت موجب وعامل.

تمتلك ثوابت المحارف نوع int لأسباب تاريخية، وتُكتب عن طريق وضعها بين علامتي تنصيص أحادية على النحو التالي:

'a'
'b'
'like this'

تُكتب المحارف الموسعة الثابتة بالطريقة ذاتها ولكن يسبقها وجود L:

L'a'
L'b'
L'like this'

للأسف، يمكن أن تحتوي المحارف الثابتة على أكثر من محرف واحد، ولكن تنفيذها يعطي نتيجةً مرتبطةً بالجهاز الذي تعمل عليه. تُعد المحارف الوحيدة من أفضل الحلول للبرامج المحمولة Portable، إذ تعطي قيمة عدد صحيح ثابت اعتيادي حسب تمثيل الجهاز لهذا الحرف. صادفت في تعريفنا عن المحارف الموسعة هذا المحرف <a> الذي يمثّل محرفًا متعدّد البايتات (مُرمّزًا لعمليات الإدخال بالإزاحة والإخراج بالإزاحة)، ويُعد <a> هنا محرفًا ثابتًا، مثل المحرف abcde. سيتسبب هذا النوع من المحارف بالعديد من المشاكل في المستقبل، نأمل أن يحذّرك المصرّف بشأنهم.

هناك ما يُدعى باسم سلسلة الهروب Escape sequence، والتي تهدف إلى تسهيل عملية تمثيل بعض المحارف الخاصة التي سيكون من الصعب استخدامها ضمن محرف ثابت (هل المحرف ' ' هو محرف مسافة space أم مسافة جدولة tab؟). يوضح الجدول 10.2 سلاسل الهروب المُعرفة في المعيار.

السلسلة الغرض منها
a\ تحذير صوتي
b\ فراغ للخلف Backspace
f\ فاصل صفحة
n\ سطر جديد
r\ إرجاع المؤشر
t\ مسافة جدولة
v\ مسافة جدولة شاقولية
\\ شرطة مائلة للخلف
'\ علامة تنصيص فردية
"\ علامة تنصيص مزدوجة
?\ إشارة استفهام

[جدول 10.2. سلاسل الهروب في لغة C]

من الممكن أيضًا استخدام سلاسل هروب عددية لتحديد محرف باستخدام القيمة الداخلية التي تمثّله، مثل السلسلة 000\ أو xhhh\، إذ أن 000 هي ثلاث خانات ثمانية و hhh هو أي عدد ممثل بالنظام الست عشري. أكثر السلاسل شيوعًا هي 033\، التي تُستخدم لتمثل زرّ ESC (الهروب Escape) على لوحة المفاتيح في الحواسيب التي تعمل بترميز ASCII. انتبه إلى أن المحارف الثابتة الممثلة بالقيمة الست عشرية تشمل جميع المحارف الموجودة ضمنها، فعلى سبيل المثال إذا أردت سلسلةً نصيةً تحتوي على القيمة الست عشرية ff متبوعةً بالحرف f، فالطريقة الآمنة لكتابة ذلك هو استخدام خاصية ضمّ السلاسل النصية:

"\xff" "f"

إذ تمثّل السلسلة النصية:

"\xfff"

محرفًا واحدًا، مكوّنًا من ثلاثة حروف f تمثل قيمة السلسلة الست عشرية.

تتطلب بعض محارف الهروب تفسيرًا إذ أن بعضها غير واضح الوظيفة. للحصول على علامة تنصيص فردية على أنها محرف ثابت نستخدم '\، وللحصول على علامة استفهام نستخدم ?\، للحصول على علامتي استفهام لا يمكنك استخدام ??، لأن السلسلة ?? تعد ثلاثية محارف Trigraph، وبالتالي، عليك استخدام ?\?\. محرف الهروب "\ مهمٌ فقط في حالة السلاسل النصية، وسنتكلم عن ذلك لاحقًا.

هناك هدفان مختلفان وراء سلاسل الهروب، إذ من المهم طبعًا تمثيل بعض المحارف مثل علامة التنصيص الفردية والشرطة المائلة للخلف بوضوح، وهذا الهدف الأول، أما الهدف الثاني فهو مرتبطٌ بسلاسل الهروب التالية التي تتحكم في حركة أجهزة الطباعة، على النحو التالي:

\a

اقرع الجرس في حال وجود شيء ما للطباعة، ولا تتحرك.

\b

فراغ للخلف.

\f

اِذهب إلى أول موضع في "الصفحة التالية"، وقد يعني هذا أشياءً مختلفة لأجهزة الخرج المختلفة.

\n

اِذهب إلى بداية السطر التالي.

\r

عُد إلى بداية السطر الحالي.

\t

اِذهب إلى مسافة الجدولة الأفقية التالية.

\v

اذهب إلى بداية السطر الواقع في موضع مسافة الجدولة الأفقية التالية.

بالنسبة للمحارف b\ و t\ و v\ إن لم يكن هناك موضع موافق فسيكون التصرف غير محدد. يتجنب المعيار ذكر الوجهات الفيزيائية للحركة بالنسبة لأجهزة الخرج، لأنها لا تعمل من الأعلى إلى الأسفل ومن اليسار إلى اليمين بالضرورة كما في بيئات العمل الموجودة في الثقافة الغربية في جميع الحالات.

من المضمون أن لكل محرف هروب قيمة عدد صحيح فريدة، وتُخزَّن في النوع char.

الأعداد الحقيقية الثابتة

تتبع هذه الأعداد التنسيق الاعتيادي للأعداد الحقيقية:

1.0
2.
.1
2.634
.125
2.e5
2.e+5
.125e-3
2.5e5
3.1E-6

وإلى آخره. حتى لو كان هناك جزء من الرقم الحقيقي ذو قيمة صفرية يجب إظهاره بهدف تسهيل القراءة:

1.0
0.1

يدل الجزء الأسي exponent على مرتبة قوة العدد، مثلًا:

 
3.0e3

يكافئ قيمة العدد الصحيح الثابت:

3000

وكما ترى، يمكن استبدال e بالحرف E أيضًا لنفس الغرض، وهذه الثوابت من نوع double إلا في حال سبق القيمة المحرف f أو F وفي هذه الحالة هي من نوع float؛ وإذا سبقها l أو L فهي في هذه الحالة من نوع long double.

بهدف الوصف الكامل، إليك وصف رسمي يصف طبيعة الأعداد الحقيقية الثابتة:

العدد الحقيقي الثابت يحقق واحدةً من الحالات التالية:

  • عدد كسري ثابت متبوعٌ بأُس اختياري.
  • سلسلة أرقام متبوعة بأُس.

في الحالتين السابقتين، يمكن أن يُتبع العدد الحقيقي بالأحرف الاختيارية f و l و F و L، بحيث يتحقق:

  • الثابت الكسري واحدٌ من الحالات التالية:
    • سلسلة اختيارية من الخانات متبوعةٌ بفاصلة عشرية متبوعةٌ بسلسلة من الخانات.
    • سلسلةٌ من الخانات متبوعةٌ بفاصلةٍ عشرية.
  • الأس واحدٌ من الحالات التالية:
    • الحرف e أو E متبوعٌ برمز + أو - اختياري متبوعٌ بسلسلة من الخانات.
    • سلسلة من الخانات هي تركيب اعتباطي من خانةٍ واحدة أو أكثر.

ترجمة -وبتصرف- لقسم من الفصل Variables and Arithmetic من كتاب The C Book.

اقرأ أيضًا


تفاعل الأعضاء

أفضل التعليقات

لا توجد أية تعليقات بعد



انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أضف تعليق

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • أضف...