التعابير في لغة C++

لقد تحدثنا عن التعابير سابقا، وقد حان الوقت للعودة إليها لمناقشة مفاهيم أخرى عنها. والتعابير مكونة من: العوامل و المتغيرات والقيم الحرفية. والموضوع الأول الذي سنتناوله عنها هو تحويل النوع type conversion، بمعنى تحويل القيم من نوع بيانات إلى آخر. وسيساعدك هذا الموضوع على معرفة ما سيحدث عند خلط الأنواع مع بعضها ضمن التعابير، أو عند إسناد قيمة متغير إلى متنغير آخر مخالف له في النوع. أما الموضوع الثاني عن التعابير، وهو موضوع هام جدا كذلك، يتعلق بترتيب تنفيذ العوامل داخل التعابير، وهو ما يسمى بأسبقية العوامل. فمثلا، عندما يحتوى التعبير على أكثر من عامل، فأي منهم سوف يتم تنفيذه أولا ثم ثانيا وهكذا.

تحويل الأنواع

يحدث تحويل الأنواع في حالتين:

  1. عند إسناد قيمة متغير إلى آخر مخالف له في النوع.
  2. عند خلط أنواع مختلفة عن بعضها ضمن تعبير.

والتحويل يتم بطريقتين: التحويل الضمني، وهو التحويل الذي يقوم به المترجم بطريقة أوتوماتيكية بدون تدخل المبرمج، وهو ما يسمى بالتحويل الضمني أو الذاتي Implicit Type Conversion. أما الطريقة الثانية فهي التحويل الصريح، وفيها يتم إجبار التعبير إلى التحول إلى نوع آخر يحدده المبرمج (وليس المترجم) بعبارة تصريحيه تسمى بالتحويل الصريح Explicit Type Conversion.

التحويل في عبارات الإسناد

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

int i;

float f;

 i=f;

f=i;

العبارة  i=f، يأخذ المتغير i الجزء الصحيح فقط من المتغير f. فإذا كانت قيمة المتغير f هي 3.7، فإن المتغير i يأخذ القيمة 3. أما العبارة f=i فسيتم تحويل قيمة العدد الصحيح المخزن في i إلى نفس القيمة ولكن بتمثيل الأعداد الحقيقية ذات العلامة العائمة. فمثلا، إذا كانت قيمة المتغير i هي 3، فإنها تتحول إلى 3.0 ثم تخزن في المتغير f.

بالطبع، عند التحويل من نوع ذو حجم أكبر إلى نوع ذو حجم أصغر، مثل التحويل من float إلى int أو التحويل من int إلى char، فإنه قد يتسبب في تخزين قيم غير متوقعة أو ما يسمى بالقيم الفاسدة. وهذا لا يحدث إلا عندما يكون النوع المحوّل إلية غير قادر على استيعاب القيمة.

قاعدة التحويل الضمني، والمذكورة أعلاه، سهلة التطبيق عندما يكون الطرف الأيمن لعبارة الإسناد مكونا من قيمة واحدة أو متغير واحد. ولكن، ماذا لو كان الطرف الأيمن مكون من تعبير مختلط الأنواع، مثل العبارة التالية:

f= 3.7+i-2;

حيث أن i من النوع int و f من النوع float وهنا قد تتساءل ما هو نوع الطرف الأيمن في عبارة الإسناد والمكون من خليط من الأنواع؟ وهذا ما سنتناوله الآن.

التحويل الضمني في التعابير

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

أولاً: جميع char، signed char، unsigned char، short int، unsigned short int يتم ترقيتها إلى النوع int إن أمكن استيعابها بـ int، وإلاّ سوف يتم تحويلها إلى unsigned int. يسمى هذا التحويل بالترقية الصحيحة integral promotions.

ثانياً: بعد إجراء التحويل في أولاً، عملية التحويل تتم حسب مرتبة النوع. فالمتغيرات ذوات الرتب الدنيا يتم تحويلها إلى نوع المتغيرات ذوات الرتب العليا. حيث أن رتب المتغيرات موضحة كالتالي:

رتبة سفلى◄ unsigned int, long, unsigned long, float, double, long double ►رتبة عليا

فمثلا، إذا كان المتغير الأول unsigned int والثاني long int، فإن unsigned int يتم ترقيته إلى long int. كذلك، إذا كان الأول float والأخر double فإن المتغير float يتم ترقيته إلى النوع double، وهكذا. يسمى هذا التحويل بترقية النوع type promotions.

ثالثاً: عند استخدام قيم من النوع bool في تعبير صحيح integer expression، فإن القيمة false تتحول إلى 0، و القيمة true تتحول إلى 1. كذلك، عند تحويل int إلى bool، فإن 0 تتحول إلى false و أي قيمة غير الصفر nonzero تتحول إلى true.

التحويل الصريح في التعابير

 

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

(type) expression

حيث أن type هو النوع المستهدف للتحويل، أي النوع المراد تحويل التعبير expression إليه. فمثلا، في الشيفرة التالية:

int i;

float f;

 f=(float)i/2;

i=(int) 5*f-2;

قمنا بتحويل التعبير الصحيح i/2 إلى النوع float قبل إسناد قيمته إلى f، وكذلك قمنا بتحويل التعبير 5*f-2 إلى النوع int قبل إسناده إلى i.

ويعتبر هذا التحويل من العوامل المسموح بها في لغة++ C، ويسمى بعامل التحويل cast operator، وهو أحادي المُعامل، أي أنه يعمل على مُعامل واحد فقط وهو قيمة التعبير expression الذي يليه.

ومن الأفضل استخدام التحويل الصريح داخل التعابير المختلطة الأنواع بدلا من التحويل الضمني من أجل تقليل الخطأ. فكتابة تعبير مثل:

f+(float)i

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

محمد إبراهيم

محمد ابراهيم مهندس حاسوب سوداني 21 عام مهتم بمجال التكنولوجيا والعالم الرقمي

تدوينات ذات صلة

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

زر الذهاب إلى الأعلى
إغلاق