الشبكة العربية لمطوري الألعاب

مبتدئ  تمتوم مشاركة 1

بفرض أنه كان لدينا كود مكتوب بلغة ++c بحيث يحوي المعاملات || && ! معاً في عبارة واحدة فأيها ينفذ أولا ً مع شرح بسيط لو سمحتم ومشكورين سلفاً

life is binary
you are either ZERO or ONE

خبير مدير وسام البهنسي مشاركة 2

بتاريخ Nov 16, 2007 22:54، قطب تمتوم حاجبيه بشدة وهو يقول:

بفرض أنه كان لدينا كود مكتوب بلغة ++c بحيث يحوي المعاملات || && ! معاً في عبارة واحدة فأيها ينفذ أولا ً مع شرح بسيط لو سمحتم ومشكورين سلفاً


المعاملات يتم عموماً تنفيذها من اليسار إلى اليمين. كما أن لكل معامل في ++C ترتيب أولوية ضمن بقية المعاملات لحل بعض المواقف التي قد تكون غامضة. في حالتك التي ذكرتها، فإن معامل النفي (!) له أولوية أعلى من معامل وَ (&&)، والذي بدوره أعلى أولوية من المعامل أو (||).
كمثال، هذا شخص يريد أن يرتدي بنطالاً، لكن له شرط قبل أن يفعل ذلك:
if (!tooSmall || big && !needsBelt)
   wearTheTrousers();

هنا أولاً سيتم التحقق من كون البنطال ليس صغيراً جداً. إن كان كذلك فسيكون البنطال مناسباً ويتحقق الشرط. إن لم يتحقق يتم الانتقال للقسم الثاني من الشرط.
سيتم التحقق من كون البنطال كبيراً بما يكفي، مع ضرورة عدم حاجته إلى حزام.
النقطة المهمة هنا أن المتغير big تم الكشف عنه مع المتغير needsBelt وليس tooSmall، وهذا بسبب كون المعامل && له أولوية أعلى من ||.

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

الجدول التالي يظهر ترتيب الأولويات في C:
http://www.difranco.net/cop2220/op-prec.htm

وسام البهنسي
مبرمج في إنفيديا وإنفريمز

مبتدئ  محمد علاء الدين عبد العزيز مشاركة 3

المعامل Not (!)  هو معامل احادى لذا يتم تطبيقه اولا ثم يليه المعامل And (&&) يليه المعامل Or (||)
 
لذا فالكود يمكن قرائته كالتالى
 



if (NOT tooSmall) OR (big AND (NOT needsBelt))
  wearTheTrousers();
 
سيتم اولا تطبيق المعامل NOT على المتغيرين tooSmall و needsBelt ثم يتم تطبيق المعامل AND على Big و ناتج عملية عكس المتغير needsBelt و فى النهاية يتم تطبيق المعامل OR على ناتج عكس المتغير tooSmall مع ناتج عملية المعامل AND
 
فى النهايه اذا كان ناتج العمليه true فسيتم تنفيذ الدالة wearTheTrousers

محترف مشرف عبد اللطيف حاجي علي مشاركة 4

وفي 04 نيسان 2008 02:54 ص، ظهر شبح ابتسامة على وجه محمد علاء الدين عبد العزيز وهو يقول:

سيتم اولا تطبيق المعامل NOT على المتغيرين tooSmall و needsBelt ثم يتم تطبيق المعامل AND على Big و ناتج عملية عكس المتغير needsBelt و فى النهاية يتم تطبيق المعامل OR على ناتج عكس المتغير tooSmall مع ناتج عملية المعامل AND
هذا ليس صحيحاً في جميع الحالات. التالي يصف العمليات بدقة:
1. تحديد قيمة المتغير tooSmall و نفيها
        a. إذا كان ناتج العملية السابقة true فاعتبر الشرط صحيحاً و قم بتنفيذ wearTheTrousers(). انتهى
        b. إذا كان ناتج العملية السابقة false انتقل إلى 2
2. قم بتحديد قيمة المتغير big فإذا كانت false فاعتبر الشرط لاغياً وانتقل إلى ما بعد الـ if وإلا انتقل إلى 3
3. قم بتحديد قيمة needsBelt ثم انفها. فإذا كان نتيجة العملية true فاعتبر الشرط صحيحاً و قم بتنفيذ wearTheTrousers(). وإلا فاعتبره لاغياً و انتقل إلى ما بعد الـ if.
 
السبب في ذلك أن عملية أو (||) لا تختبر الحد الثاني إذا كان الأول true وذلك لأن قيمة الحد الثاني لن تؤثر على القيمة النهائية للتعبير (true) مهما كانت قيمتها.
لنفس السبب فأن عملية و (&&) لا تختبر الحد الثاني إذا كان الأول false وذلك لأن قيمة الحد الثاني لن تؤثر على القيمة النهائية للتعبير (false) مهما كانت قيمتها.
 
طبعاً أؤكد ما قاله محمد علاء و وسام بأن النفي له أولوية على عملية && الذي بدوره له أولوية على عملية ||
 
تدريب: كيف يمكننا كتابة شرط داخل if تنادى فيه جميع الإجراءات بغض النظر عن قيمها؟ بمعنى في الكود التالي مهما كانت قيم tooSmall و big و needsBelt سيتم نداء جميع الإجراءات.

التالي كود لتجريب الحالات السابقة. قم بتغيير القيم التي ترجعها الإجراءات وانظر كيف يتغير نداء الإجراءات...
#include 
 
bool tooSmall()
{
 std::cout << "tooSmall" << std::endl;
 return true;
}
bool big()
{
 std::cout << "big" << std::endl;
 return true;
}
bool needsBelt()
{
 std::cout << "needsBelt" << std::endl;
 return true;
}
int main()
{
 if (!tooSmall() || big() && !needsBelt())
  std::cout << "True" << std::endl;
}
 
ملاحظة: يبدو أنني لا أستطيع إضافة كود إضافة الملف: iostream ربما لأنه يحوي على إشارة أكبر و أصغر

عبد اللطيف حاجي علي
مبرمج
In|Framez

خبير مدير وسام البهنسي مشاركة 5

أما في 04 ابريل 2008 07:02 ص، فقد تنهد عبد اللطيف حاجي علي بارتياح وهو يرد:

ملاحظة: يبدو أنني لا أستطيع إضافة كود إضافة الملف: iostream ربما لأنه يحوي على إشارة أكبر و أصغر

غريب. لقد قمت بإضافته للتو إلى مشاركتك بنجاح ودون أي مشاكل :|

وسام البهنسي
مبرمج في إنفيديا وإنفريمز