في الباسكال, ما الفرق بين and و and then؟


التعليقات

بحسب ما أفهمه أنهما لنفس الغرض، الفرق هو لتحسين الأداء حيث أن الأخير يتجاهل فحص الطرف التالي في حال وجد أن الأول هو False و بالتالي فالنتيجة هي False أيا كانت نتيجة الطرف الآخر، بمعنى أنه لن يفحص الطرف الأيمن إلا عند الحاجة

أما ال And سيقوم بفحص الطرفين مهما كانت النتائج وفي كل الحالات.

هذا التحسين موجود بشكل افتراضي في اللغات المتقدمة والأحدث ولهذا في لغة #C مثلا لا يوجد سوى & أو && وسيتم تجاهل فحص الطرف الأيمن إذا حسمت النتيجة من حساب الطرف الأيسر.

يتضح لك ذلك في حال كان الحد الآخر يحوي استثناء فلن يظهر في حال عولج الاستثناء في الطرف الأول كمثال:

if((list != null) && (list.Count > 0))
{
}

سنلاحظ أنه لن يحصل استثناء المؤشر null في الحد الأيمن حتى لو كان list هو null فعلا لأنه لو كان كذلك سيكتشف أن الحد الأيسر نتيجته false و بالتالي لا داعي لفحص الحد الأيمن ومنه لن يحصل استثناء.

هذا التحسين موجود ايضا في مترجمات باسكال الحديثة مثل Free Pascal

ليس على العموم وإنما تبعا للحالة التي تعالجها،

فالعكس سيكون صحيحا في حال وجود حلقات كبيرة وفيها فحص حدود منطقية لأن and then يكون أسرع أداءً، حيث سيختزل فحص الأطراف اليمنى في حال عدم الحاجة وبالتالي توفير زمن تنفيذ الفحص ومع التكرار الكبير سيكون التوفير ملحوظاً، ولهذا الغرض أنشيء.

أما إن لم يكن هناك تكرار كبير فلن تفرق في حال استخدام أيا منهما، بل حينها استخدام and سيفي بالغرض ويختصر الكود ويزيد المقروئية.

في الحقيقة لم اسمع بها من قبل and then هذه، قمت بتجربتها في مترجم Free Pascal فأعطى خطأ.

and تعمل بنفس الطريقة المفترض أن تعمل بها and then، حيث يتم اختبار الشروط من اليسار إلى اليمين، فإذا كان الشرط في اليسار يعطي false فلا يتم فحص الشرط على اليمين


برمجة

مجتمع للمبرمجين من جميع المستويات لتبادل المعرفة والخبرات. ناقش لغات البرمجة المختلفة، الحلول البرمجية، والمشاريع.

24.9 ألف متابع