1-4-3 الثوابت Constants :
الثوابت هى "قيم ثابتة" والتى قد لا يتم تعديلها أثناء تنفيذ البرنامج . فى كثير من الحالات تكون الثوابت جزء من البرنامج المترجم نفسه , موضوعة فى ذاكرة القراءة فقط ROM , بدلا من ذاكرة الوصول العشوائى RAM القابلة للتغيير .
فى التخصيص التالى :
x = 3 + y ;
العدد "3" هو "ثابت" وسوف يتم تشفيره مباشرة فى عملية "جمع" عن طريق المترجم .
يمكن أيضا أن تكون الثوابت فى شكل حروف أو سلسلة نصية كما يلى :
كود:
printf("hello world");
//The text hello world is placed in program memory and never changes.
x = 'B' ;
//The letter 'B' is permanently set in program memory.
يمكنك أيضا إعلان الثابت عن طريق "الكلمة المحجوزة"const ثم الإشارة إلى نوعه وحجمه . لكى يكون الإعلان تام مطلوب "معرف الهوية" أو الاسم و "القيمة" كما يلى :
تعريف متغير كثابت سوف يؤدى إلى أن هذا المتغير يخزن فى حيز ذاكرة البرنامج بدلا من حيز ذاكرة المعطيات RAM المتغيرة المحدودة . هذا يساعد على الحفاظ على حيز ذاكرة RAM المحدود .
الثوابت العددية Numeric Constants :
يمكن إعلان الثوابت العددية بعدة طرق عن طريق الإشارة إلى "الأساس العددى" وجعل البرنامج أكثر قدرة للقراءة .
يمكن كتابة ثوابت "الأعداد الصحيحة" integer و "الأعداد الصحيحة الطويلة" long integer بالأشكال التالية :
· الشكل "العشرى" decimal بدون "سابقة" (مثل (1234 .
· الشكل "الثنائى" binary مع السابقة "0b" (مثل 0b101001 ) .
· الشكل "السداسى عشر" hexadecimal مع السابقة "0x" (مثل 0xff ).
· الشكل "الثمانى" octal مع السابقة "0" ( مثل 0777 ) .
يوجد أيضا "معدلات" modifiers للتعريف بشكل أفضل للحجم المراد وتستخدم مع الثوابت كما يلى :
· ثوابت "الأعداد الصحيحة بدون إشارة" Unsigned integer يمكن أن تمتلك "اللاحقة" U ( مثل 10000U ) .
· ثوابت "الأعداد الصحيحة الطويلة" Long integer يمكن أن تمتلك اللاحقة L (مثل 99L ).
· ثوابت "الأعداد الصحيحة الطويلة بدون إشارة" Unsigned long integer يمكن أن تمتلك اللاحقة UL ( مثل 99UL ) .
· ثوابت "الأعداد الحقيقية" Floating point يمكن أن تمتلك اللاحقة F (مثل 1.234F ) .
· ثوابت "الحروف" Character يجب أن تحاط بعلامات "اقتباس مفردة" ( مثل 'a' و 'A' ).
ثوابت الحرف Character constants :
ثوابت الحرف يمكن أن تكون "قابلة للطباعة" ( مثل 0 – 9 و A – Z ) أو حروف "غير قابلة للطباعة" ( مثل "سطر جديد" new line أو "عودة العربة" carriage return أو "التبويب" tab ) . ثوابت الحرف القابلة للطباعة قد يتم إحاطتها بعلامتى اقتباس مفردة ( مثل 'a' ) . علامتى الاقتباس المفرد التى تحيط "الشرطة المائلة" backslash المتبوعة بقيمة ثمانية أو سداسية عشر يمكن أيضا أن تمثل ثوابت الحرف كما يلى :- 't' يمكن تمثيلها عن طريق '\164' (ثمانى) .
- 't' يمكن تمثيلها عن طريق 'x74' (سداسى عشر) .
الجدول التالى يبين الحروف الغير قابلة للطباعة والتى يمكن التعرف عليها من خلال لغة السى :
قوائم السرد Enumerations والتعريفات Definitions :
القدرة على قراءة برامج لغة السى هام للغاية . قوائم السرد والتعريفات تمكن المبرمج من استبدال الأعداد بأسماء أو عبارات أخرى تكون أكثر معنى .
"قوائم السرد" هى قائمة من الثوابت . تستخدم "الكلمة المحجوزة" enum لتخصيص قيم أعداد صحيحة ثابتة متتابعة لقائمة من المعرفات "المسميات" كما يلى :
كود:
int num_val ; //declare an integer variable
//declare an enumeration
enum { zero_val , one_val , two_val , three_val ) ;
num_val = two_val ; // the same as : num_val = 2 ;
الاسم zero_val مخصص له القيمة "0" والاسم one_val مخصص له القيمة "1" والاسم two_val مخصص له القيمة "2" وهكذا .
القيمة الابتدائية قد تجبر على التحديد كما فى :
كود:
enum { start=10 , next1 , next2 , end_val } ;
والتى تؤدى إلى أن تكون القيمة الابتدائية بالقيمة "10" وبعد ذلك بالتتابع سوف يتزايد الاسم بواحد . قيمة next1 تكون "11" وقيمة next2 تكون "12" والقيمة النهائية end_val تكون "13" .
تستخدم قوائم السرد لاستبدال الأعداد الصرفة , والتى سوف يبحث فيها المبرمج , بكلمات أو عبارات تساعد فى وصف استخدام الأعداد .
تستخدم التعريفات definitions بطريقة مشابه إلى حد ما بقوائم السرد , فى أنها سوف تسمح "باستبدال سلسلة نصية بأخرى" . لاحظ المثال التالى :
كود:
…
…
enum { red_led_on = 1 , green_led_on, both_leds_on } ;
#define leds PORTB
…
…
PORTB = 0x1 ; // means turn the red LED on
leds = red_led_on ; // means the same thing
السطر #define leds PORTB يتسبب فى قيام المترجم باستبدال (التعويض عن) المسمى PORTB أينما وجد بالكلمة led . لاحظ أن سطر #define لا ينتهى بالفاصلة المنقوطة وفقط قد يكون به تعليق محاط بالرموز /*….*/ .
قائمة السرد تحدد red_led_on بالقيمة "1" وتحدد green_led_on بالقيمة "2" وتحدد كلاهما both_leds_on بالقيمة "3" . هذه القيم قد تستخدم فى برنامج للتحكم فى ليد أحمر وليد أخضر , حيث إخراج القيمة "1" تضىء الليد الأحمر والقيمة "2" تضىء الليد الأخضر وهكذا . التقطة هى أن
" leds = red_led_on" أسهل بكثير فى فهم سياق البرنامج عن "PORTB=0x1" .
الموجة #define ليس جزء فعلى من بناء جمل لغة السى . التوجيه منفصل عن عملية ترجمة البرنامج حيث يحدث قبل بداية الترجمة الفعلية .
1-5 عمليات الدخل / الخرج I /O Operations :