البرمجة الشرطية (برمجة الحاسوب)

مخطط تدفق الشرط-ثم-وإلا
مخطط تدفق متداخل من نوع if-then-else

في برمجة الحاسوب ، يوجه الشرط تدفق التحكم في البرنامج بناءً على قيمة شرط معين ؛ وهو تعبير منطقي . ويُقيّم التعبير الشرطي إلى قيمة دون التأثير على تدفق التحكم.

تتميز العديد من لغات البرمجة (مثل لغة C ) بعبارات وتعبيرات شرطية مميزة. في البرمجة الوظيفية البحتة ، لا ينتج عن التعبير الشرطي أي آثار جانبية، بينما تدعم العديد من لغات البرمجة الوظيفية التي تحتوي على تعبيرات شرطية (مثل لغة Lisp) الآثار الجانبية.

العبارة الشرطية

عبارة إذا-ثم-وإلا

على الرغم من اختلاف صيغة جملة if-then-else باختلاف لغات البرمجة، إلا أن الصيغة العامة موضحة أدناه كشفرة زائفة . الجزء المُمثَّل بشرط الشرط هو تعبير يُقيَّم إما إلى صحيح أو خطأ. إذا كان صحيحًا، ينتقل التحكم إلى الخطوة اللاحقة ، وعند اكتمالها إلى الخطوة التالية end if. إذا كان خطأً، ينتقل التحكم إلى الخطوة البديلة ، وعند اكتمالها إلى الخطوة التالية end if. بما أن جملة else اختيارية، يمكن حذفها. عادةً، يمكن أن تكون كل من الخطوة اللاحقة والبديلة جملة واحدة أو مجموعة من الجمل.else alternative

إذا تحقق الشرط، فسيتم تنفيذ النتيجة، وإلا فسيتم تنفيذ البديل. انتهى الشرط.

يستبدل المثال التالي، المكتوب أيضاً بلغة شبه رمزية، العناصر النائبة بمنطق المثال.

إذا كان المخزون = فإن الرسالة = 'اطلب مخزونًا جديدًا'، وإلا فإن الرسالة = ' يوجد مخزون' .

التاريخ والتطور

في لغات البرمجة المبكرة، وخاصةً لهجات لغة BASIC ، كان شرط if-then-else يقتصر على عبارات goto ، مما كان يؤدي غالبًا إلى شيفرة معقدة يصعب قراءتها . ونتيجةً لذلك، اكتسبت البرمجة الهيكلية ، التي تدعم التحكم في تدفق الشيفرة عبر كتل برمجية، شعبيةً واسعة، حتى أصبحت المعيار في معظم متغيرات BASIC وجميع اللغات. استندت هذه الآليات والمبادئ إلى عائلة لغات ALGOL ، بما في ذلك Pascal و Modula-2 . مع أنه من الممكن استخدام goto بطريقة هيكلية، إلا أن البرمجة الهيكلية تُسهّل ذلك. يُعد شرط if-then-else الهيكلي أحد العناصر الأساسية للبرمجة الهيكلية، وهو موجود في معظم اللغات الشائعة مثل C و Java و JavaScript و Visual Basic .

شيء آخر معلق

جرت العادة على أن تستجيب جملة elseشرطية، مثل الجملة thenالشرطية، لأقرب ifجملة شرطية تسبقها. مع ذلك، لم تكن دلالات الجمل الشرطية المتداخلة واضحة تمامًا في بعض اللغات القديمة مثل ALGOL 60 ؛ إذ لم يكن بناء الجملة كافيًا لتحديد نفس ifالجملة الشرطية دائمًا. وبالتالي، قد يقرن المحلل اللغوي الجملة الشرطية عشوائيًا elseبأي جملة من ifالجمل الشرطية المتعددة المحتملة في التسلسل الهرمي المتداخل المقصود.

على سبيل المثال، خذ العبارة التالية:
إذا كان فإذا كان B ، فإن وإلا فإن S2
أو نفس العبارة ولكن مع مسافة بادئة للتوضيح:
إذا كان فإذا كان B ، فإن وإلا فإن S2
يمكن تفسيرها على النحو التالي:
إذا كان فإن ( إذا كان فإن S وإلا فإن S2. انتهى.
إذا كان فإن ( إذا كان فإن S وإلا فإن S2. انتهى.
أو بمعنى:
إذا كان فإن ( إذا كان فإن وإلا فإن S2 )
إذا كان فإن ( إذا كان B ، فإن وإلا S2 ) انتهى

يُعرف هذا باسم مشكلة else المعلقة . ويتم حلها بطرق مختلفة، اعتمادًا على اللغة (في بعضها، عن طريق بناء جملة صريح لإنهاء الكتلة (مثل end if) أو إحاطة الكتلة، مثل الأقواس المعقوفة ( {}).

التسلسل

غالبًا ما يتم توفير تسلسل الشروط في لغة البرمجة عبر بنية else-if. يتم تنفيذ العبارات التي تلي الشرط الأول الصحيح فقط، بينما يتم تخطي العبارات الأخرى. (في الكود الزائف الموضح):

إذا تحقق الشرط 1 ، فقم بإنشاء الكتلة 1، وإذا تحقق الشرط 2، فقم بإنشاء الكتلة 2، وإذا تحقق الشرط 3 ، فقم بإنشاء الكتلة 3 ، ... وإلا فقم بإنشاء الكتلة 4 .

في الشفرة الزائفة التالية، يقدم متجر خصمًا يصل إلى 30% على سلعة ما. إذا كان الخصم 10%، فإن عبارة "if" الأولى تكون صحيحة و"عليك أن تدفع 30 دولارًاتُطبع عبارة ". يتم تخطي جميع العبارات الأخرى التي تلي عبارة if الأولى.

إذا كان الخصم أقل من 11 % ، فاطبع " عليك دفع 30 دولارًا". وإذا كان الخصم أقل من 21 % ، فاطبع " عليك دفع 20 دولارًا". وإذا كان الخصم أقل من 31 % ، فاطبع " عليك دفع 10 دولارات" .

end ifيكفي استخدام واحد فقط إذا تم استخدام else ifبدلاً من elseمتبوعًا بـ if.

في لغة ALGOL 68 ، كان "التقرير الأولي" لعام 1968 (الذي تم تعميمه كمُلحق لنشرة ALGOL رقم 26) لا يزال يستخدم الكلمة المفتاحية elif المكتوبة بخط غامق في الجمل الشرطية المختصرة. [ 1 ] ثم تم توحيد التهجئة elif في "التقرير المنقح عن لغة الخوارزميات ALGOL 68" (1973)، والذي يسرد كلاً من الكلمات المكتوبة بخط غامق ورموزها المختصرة، حيث يقابل elif في الشكل المختصر . [ 2 ]if ~ then ~ elif ~ else ~ fi|:( ~ | ~ |: ~ | ~ | ~ )

في لغة آدا ، تُعدّ الكلمة المفتاحية `elseif` اختصارًا برمجيًا للكلمتين `and` . تدعم لغة PHP أيضًا كلمة مفتاحية `elif` [ 3 ] لكلٍّ من صيغتي الأقواس المعقوفة والنقطتين. توفر لغتا بيرل وروبي الكلمة المفتاحية `elif` لتجنب العدد الكبير من الأقواس المعقوفة التي تتطلبها عبارات `and` المتعددة . تستخدم لغة بايثون الكلمة المفتاحية `elif` لأن البنية تُحدد بالمسافة البادئة بدلًا من الأقواس المعقوفة، لذا فإن الاستخدام المتكرر لـ `and` سيتطلب زيادة المسافة البادئة بعد كل شرط. تدعم لغة فيجوال بيسك الكلمة المفتاحية `elif` [ 4 ] . وبالمثل، تستخدم أنظمة يونكس القديمة (التي جُمعت لاحقًا في صيغة نظام بوزيكس [ 5 ] ) الكلمة المفتاحية `elif` أيضًا، مع إتاحة خيار الفصل بالمسافات أو فواصل الأسطر أو كليهما.elseifelseifelsififelseelifelseifElseIf

مع ذلك، في العديد من اللغات المنحدرة مباشرةً من لغة Algol، مثل Simula و Pascal وBCPL و C ، لا توجد هذه الصيغة الخاصة للبنية else if، ولا في العديد من المشتقات النحوية للغة C، مثل Java و ECMAScript وغيرها. ويعود ذلك إلى أن أي عبارة مفردة (في هذه الحالة if cond...) يمكن أن تتبع شرطًا دون أن تكون محاطة بكتلة.

إذا كانت جميع الشروط في سلسلة العبارات الشرطية تختبر قيمة تعبير واحد (مثلاً if x = 0،  else if x = 1... else if x = 2 )، فإن البديل هو عبارة switch . في لغة برمجة لا تحتوي على عبارة switch، يمكن ترميز هذه العبارات كسلسلة من عبارات if-then-else.

عبارة التبديل

تدعم عبارة switch التفرع متعدد الاتجاهات، حيث تقارن قيمة تعبير ما بقيم ثابتة، ثم تنقل التحكم إلى الكود الذي يُطابق أول قيمة. عادةً ما يُتيح ذلك إجراءً افتراضيًا في حال عدم العثور على تطابق. قد يستخدم مُصرّف مُحسِّن جدول تحكم لتنفيذ منطق عبارة switch. في لغة ديناميكية، قد لا تقتصر الحالات على التعبيرات الثابتة، بل قد تمتد لتشمل مطابقة الأنماط ، كما في مثال سكريبت shell على اليمين، حيث تُنفِّذ علامة '*)' الحالة الافتراضية كتعبير نمطي يُطابق أي سلسلة نصية.

مشروط محمي

تدعم لغة الأوامر المحمية ( GCL) لإدسكار ديكسترا التنفيذ المشروط كقائمة أوامر تتكون من شرط منطقي ( يمثل شرطًا ) وعبارة مقابلة له. في GCL، يتم تقييم عبارة واحدة فقط من العبارات التي يكون شرطها صحيحًا، ولكن اختيار هذه العبارة أمرٌ اختياري. في هذا الكود

إذا G0 → S0 □ G1 → S1 ... □ Gn → Sn fi

تمثل G i الشروط، وتمثل S i العبارات. إذا لم يكن أي من الشروط صحيحًا، فإن سلوك البرنامج غير محدد.

تم تصميم GCL في المقام الأول للاستدلال حول البرامج، ولكن تم تطبيق رموز مماثلة في Concurrent Pascal و occam .

الحساب إذا

كانت أول عبارة شرطية في لغة فورتران، حتى فورتران 77 ، هي عبارة if الحسابية التي تنتقل إلى واحدة من ثلاث علامات اعتمادًا على ما إذا كانت القيمة (من النوع integer أو real أو double precision) <0 أو 0 أو >0. [ 6 ]

في الكود التالي، ينتقل التحكم إلى أحد العناصر بناءً على قيمة e.

إذا ( هـ ) label1 ، label2 ، label3

وهذا يعادل التسلسل التالي.

e_temp = e IF ( e_temp . LT . 0 ) GOTO label1 IF ( e_temp . EQ . 0 ) GOTO label2 GOTO label3

بما أن هذه العبارة تعمل كأمر goto ، فإن العمليات الحسابية إذا كانت غير منظمة، أو غير منظمة، أو غير منظمة ، في البرمجة. كانت هذه العبارة الشرطية الوحيدة في التطبيق الأصلي للغة فورتران على حاسوب IBM 704. في ذلك الحاسوب، كان رمز عملية الاختبار والتفرع يحتوي على ثلاثة عناوين لتلك الحالات الثلاث. أما الحواسيب الأخرى، فكانت تحتوي على سجلات "علامات" مثل موجب، صفر، سالب، زوجي، تجاوز، وحمل، مرتبطة بالعمليات الحسابية الأخيرة، وكانت تستخدم تعليمات مثل "تفرع إذا كان المُراكم سالبًا" ثم "تفرع إذا كان المُراكم صفرًا" أو ما شابه. تجدر الإشارة إلى أن التعبير يُقيّم مرة واحدة فقط ، وفي حالات مثل العمليات الحسابية الصحيحة حيث قد يحدث تجاوز، تُؤخذ علامات التجاوز أو الحمل في الاعتبار أيضًا.

أُدرجت عبارة IF الحسابية ضمن العبارات القديمة بدءًا من معيار فورتران 90، ثم حُذفت من معيار فورتران 2018. ومع ذلك، لا تزال معظم المترجمات تدعمها لضمان التوافق مع البرامج القديمة.

في لغة سمول توك

على عكس اللغات الأخرى، في لغة سمول توك، لا تُعتبر العبارة الشرطية بنية لغوية ، بل تُعرَّف في الصنف Booleanكدالة مجردة تأخذ وسيطين، كلاهما دالة مغلقة . Booleanتحتوي سمول توك على صنفين فرعيين، Trueو False، يُعرّفان الدالة، حيث Trueتُنفِّذ الدالة المغلقة الأولى فقط، Falseبينما تُنفِّذ الدالة المغلقة الثانية فقط. [ 7 ]

var = الشرط ifTrue: [ 'foo' ] ifFalse: [ 'bar' ] 

في جافا سكريبت

يدعم جافا سكريبت عبارات if-else المشابهة لبنية لغة C. يحتوي المثال التالي على شرط يكون صحيحًا إذا كانت قيمة عددية عشوائية (بين 0 و1) أكبر من 0.5. تستخدم العبارة هذا الشرط لاختيار قيمة عشوائية من بين القيمتين 0 و1.Math.random()<0.5لقد حصلت على رؤوس!أولقد حصلت على ذيل!.

إذا كانت نتيجة استدعاء الدالة العشوائية أقل من 0.5 ، فسيتم طباعة رسالة " لقد حصلت على صورة!" في وحدة التحكم . وإلا ، فسيتم طباعة رسالة " لقد حصلت على كتابة! " في وحدة التحكم .

يمكن ربط العبارات الشرطية كما هو موضح أدناه:

var x = Math.random (); if ( x < 1/3 ) { console.log ( " فاز شخص واحد!" ) ; } else if ( x < 2/3 ) { console.log ( " فاز شخصان ! " ) ; } else { console.log ( " تعادل ثلاثي ! " ) ; }

حساب التفاضل والتكامل لامدا

في حساب التفاضل والتكامل اللامدا ، يمكن التعبير عن مفهوم الشرط if-then-else باستخدام التعبيرات التالية:

صحيح = λx. λy. x خطأ = λx. λy. y ifThenElse = (λc. λx. λy. (cxy))
  1. تأخذ الدالة true وسيطين كحد أقصى، وبمجرد توفير كليهما (انظر إلى currying )، فإنها تُرجع الوسيط الأول المُعطى.
  2. تأخذ الدالة false وسيطين كحد أقصى، وبمجرد توفير كليهما (انظر إلى currying )، فإنها تُرجع الوسيط الثاني المُعطى.
  3. تأخذ الدالة ifThenElse ثلاثة وسائط كحد أقصى، وبمجرد توفيرها جميعًا، تُمرر الوسيطين الثاني والثالث إلى الوسيط الأول (وهو دالة تأخذ وسيطين وتُنتج نتيجة). نتوقع أن تأخذ ifThenElse إما القيمة true أو false كوسيط، حيث تُحوّل كلتاهما الوسيطين المُعطيين إلى الوسيط المُختار، والذي يتم إرجاعه بعد ذلك.

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

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

(( λtrue. λfalse. λifThenElse. ( ifThenElse true 2 3 ) )( λx. λy. x )( λx. λy. y )( λc. λl. λr. c l r ))

هنا، يتم ربط true و false و ifThenElse بتعريفاتها الخاصة التي يتم تمريرها إلى نطاقها في نهاية كتلتها.

يُمكن تطبيق تشبيه عملي باستخدام لغة جافا سكريبت (باستخدام دوال ذات متغير واحد فقط لضمان الدقة) على النحو التالي:

var computationResult = (( _true => _false => _ifThenElse => _ifThenElse ( _true )( 2 )( 3 ) )( x => y => x )( x => y => y )( c => x => y => c ( x )( y )));

الكود أعلاه مع الدوال متعددة المتغيرات يبدو كالتالي:

var computationResult = (( _true , _false , _ifThenElse ) => _ifThenElse ( _true , 2 , 3 ) )(( x , y ) => x , ( x , y ) => y , ( c , x , y ) => c ( x , y ));

يوجد أدناه إصدار آخر من المثال السابق بدون نظام حيث يتم افتراض الأرقام.

يوضح المثال الأول اختيار الفرع الأول، بينما يوضح المثال الثاني اختيار الفرع الثاني.

(( λtrue. λfalse. λifThenElse. ( ifThenElse true ( λFirstBranch. FirstBranch ) ( λSecondBranch. SecondBranch )) )( λx. λy. x )( λx. λy. y )( λc. λl. λr. c l r ))(( λtrue. λfalse. λifThenElse. ( ifThenElse false ( λFirstBranch. FirstBranch ) ( λSecondBranch. SecondBranch )) )( λx. λy. x )( λx. λy. y )( λc. λl. λr. c l r ))

يستخدم Smalltalk فكرة مماثلة لتمثيلاته الصحيحة والخاطئة، حيث Trueتكون Falseكائنات أحادية تستجيب للرسائل ifTrue/ifFalse بشكل مختلف.

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

التعبير الشرطي

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

أمثلة

الغول

تسمح لغة ALGOL 60 وبعض اللغات الأخرى من عائلة ALGOLif–then–else باستخدام التعبير الشرطي. وقد اقترح جون مكارثي فكرة تضمين التعبيرات الشرطية، إلا أن لجنة ALGOL قررت استخدام الكلمات الإنجليزية بدلاً من الصيغة الرياضية التي وضعها مكارثي.

myvariable := إذا كانت x > 20 فإن 1 وإلا 2

تُنهى جميع العبارات المركبة (تُحاط بأقواس إغلاق مميزة):

  • بنود الاختيار الشرطية :
عبارات IF الشرطية THEN [ عبارات ELSE ] FI "المختصرة": (الشرط | العبارات | العبارات)
إذا تحقق الشرط 1 ، فإن العبارات صحيحة. وإذا تحقق الشرط 2، فإن العبارات صحيحة. [ وإلا ، فإن العبارات صحيحة ]. صيغة مختصرة: (الشرط 1 | العبارات |: الشرط 2 | العبارات | العبارات)

لا يقتصر هذا المخطط على تجنب مشكلة else المعلقة فحسب ، بل يتجنب أيضًا الاضطرار إلى استخدام BEGINand ENDفي تسلسلات العبارات المضمنة .

  • عبارات الاختيار في حالة CASE :
CASE switch IN statements, statements,... [ OUT statements ] ESAC “brief form: ( switch | statements,statements,... | statements )
CASE switch1 IN statements, statements,... OUSE switch2 IN statements, statements,... [ OUT statements ] ESAC "صيغة مختصرة" لعبارة CASE : ( switch1 | statements, statements,... |: switch2 | statements, statements,... | statements )

مثال على جملة الاختيار باستخدام الرموز المختصرة :

PROC أيام الشهر = ( عدد صحيح السنة، الشهر) عدد صحيح : (شهر| 31، (year÷×4=0 ∧ year÷×100≠0 ∨ year÷×400=0 | 29 | 28 ), 31، 30، 31، 30، 31، 31، 30، 31، 30، 31 );

التلعثم

لطالما كانت التعبيرات الشرطية جزءًا أساسيًا من لغة ليسب  . في لغة ليسب النقية، CONDتُستخدم الدالة. أما في لهجات مثل سكيم ، وراكيت، وكومون ليسب  :

;; Scheme ( define ( myvariable x ) ( if ( > x 12 ) 1 2 ) ; يُسند قيمة 'myvariable' إلى 1 أو 2، اعتمادًا على قيمة 'x'
;; Common Lisp ( let (( x 10 )) ( setq myvariable ( if ( > x 12 ) 2 4 ))) ; يُسند قيمة 'myvariable' إلى 2

هاسكل

في لغة هاسكل 98، يوجد تعبير شرطي واحد فقط ، ولا توجد عبارة شرطية ، وهذا elseالجزء إلزامي، إذ يجب أن يكون لكل تعبير قيمة ما. [ 8 ] المنطق الذي يُعبَّر عنه بالشروط في لغات أخرى يُعبَّر عنه عادةً بمطابقة الأنماط في الدوال التكرارية.

لأن لغة هاسكل كسولة ، فمن الممكن كتابة هياكل التحكم، مثل عبارة if ، كتعابير عادية؛ ويعني التقييم الكسول أن دالة if لا يمكنها تقييم سوى الشرط والفرع المناسب (بينما تقوم لغة صارمة بتقييم العناصر الثلاثة جميعها). ويمكن كتابتها على النحو التالي: [ 9 ]

إذا كان ' :: منطقي -> أ -> أ -> أ إذا كان ' صحيحًا x _ = x إذا كان ' خطأ _ y = y

لغات شبيهة بلغة C

تدعم لغة C واللغات ذات الصلة عاملًا ثلاثيًا يوفر تعبيرات شرطية مثل:

الشرط ؟ القيمة الصحيحة : القيمة الخاطئة

إذا كان الشرط صحيحًا، فإن التعبير يُقيّم إلى القيمة الصحيحة ؛ وإلا فإنه يُقيّم إلى القيمة الخاطئة . في الكود التالي، تُسند قيمة r إلى "foo" إذا كانت x > 10، وإلى "bar" إذا لم تكن كذلك.

r = x > 10 ؟ "foo" : "bar" ;

لتحقيق نفس النتيجة باستخدام عبارة شرطية، سيتطلب ذلك أكثر من عبارة واحدة، وسيتطلب ذكرها rمرتين:

إذا كان ( x > 10 ) r = "foo" ؛ وإلا r = "bar" ؛

يجادل البعض بأن عبارة if-then الصريحة أسهل في القراءة وأنها قد تُترجم إلى رمز أكثر كفاءة من عامل التشغيل الثلاثي، [ 10 ] بينما يجادل آخرون بأن التعبيرات الموجزة أسهل في القراءة وأفضل لأنها تحتوي على عدد أقل من العبارات المتكررة.

فيجوال بيسك

في لغة فيجوال بيسك وبعض اللغات الأخرى، توجد دالة تُسمى IIf IIf، يمكن استخدامها كتعبير شرطي. مع ذلك، فهي لا تعمل كتعبير شرطي حقيقي، لأن كلا الفرعين، الصحيح والخاطئ، يُقيّمان دائمًا؛ الفرق الوحيد هو أن نتيجة أحدهما تُهمل، بينما تُعيد دالة IIf نتيجة الآخر.

تي سي إل

في لغة Tcl،if لا تُعتبر كلمة مفتاحية، بل دالة (تُعرف في Tcl باسم الأمر أو proc). على سبيل المثال

إذا كان { $x > 10 } { اطبع "Foo!" }

يستدعي هذا الأمر دالةً باسم معين، ifويمرر إليها وسيطين: الأول هو الشرط، والثاني هو الفرع الصحيح. ويتم تمرير كلا الوسيطين كسلاسل نصية (في لغة Tcl، كل ما بين قوسين معقوفين يُعتبر سلسلة نصية).

في المثال أعلاه، لا يتم تقييم الشرط قبل استدعاء الدالة. بدلاً من ذلك، يستقبل تنفيذ الدالة ifالشرط كقيمة نصية، وهو المسؤول عن تقييم هذه السلسلة كتعبير في نطاق المُستدعي. [ 11 ]

يُمكن تحقيق هذا السلوك باستخدام uplevelالأوامر expr. يُتيح Uplevel إمكانية تنفيذ بنيات تحكم جديدة كإجراءات Tcl (على سبيل المثال، يُمكن استخدام Uplevel لتنفيذ بنية while كإجراء Tcl). [ 12 ]

لأنها ifفي الواقع دالة، فإنها تُرجع قيمة أيضًا. القيمة المُرجعة من الأمر هي نتيجة نص البرنامج النصي الذي تم تنفيذه، أو سلسلة نصية فارغة إذا لم يكن أي من التعبيرات غير صفري ولم يكن هناك bodyN. [ 13 ]

الصدأ

في لغة Rust ، ifيكون التعبير دائمًا تعبيرًا. يُقيّم إلى قيمة الفرع الذي يتم تنفيذه، أو إلى نوع الوحدة ()إذا لم يتم تنفيذ أي فرع. إذا لم يُرجع الفرع قيمة، فإنه يُقيّم إلى ()صفر افتراضيًا. لضمان ifمعرفة نوع التعبير وقت الترجمة ، يجب أن يُقيّم كل فرع إلى قيمة من نفس النوع. لهذا السبب، elseيُعد الفرع إلزاميًا فعليًا ما لم تُقيّم الفروع الأخرى إلى صفر ()، لأن التعبير ifبدون تعبير elseيمكن أن يُقيّم دائمًا إلى ()صفر افتراضيًا. [ 14 ]

يُعيّن ما يلي rالقيمة 1 أو 2 اعتمادًا على قيمة x.

let r = if x > 20 { 1 } else { 2 };

يمكن حذف القيم عند عدم الحاجة إليها.

إذا كانت قيمة x أكبر من 20 ، فسيتم طباعة رسالة تفيد بأن قيمة x أكبر من 20 .

مطابقة الأنماط

تُعدّ مطابقة الأنماط بديلاً للعبارات الشرطية (مثل if-then-else و switch). وهي متوفرة في العديد من لغات البرمجة الوظيفية، مثل Wolfram Language و ML وغيرها. إليك مثال بسيط مكتوب بلغة OCaml :

قم بمطابقة الفاكهة مع | "تفاح" -> اطبخ فطيرة | "جوز الهند" -> اطبخ دانغو موتشي | "موز" -> اخلط ;;

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

map_ [ ] = [ ] map f ( h : t ) = fh : map ft

يُعرّف هذا الكود دالة map ، التي تُطبّق الوسيط الأول (دالة) على كل عنصر من عناصر الوسيط الثاني (قائمة)، وتُعيد القائمة الناتجة. السطران هما تعريفان للدالة لنوعي الوسائط الممكنين في هذه الحالة: أحدهما عندما تكون القائمة فارغة (تُعيد الدالة قائمة فارغة)، والآخر عندما تكون القائمة غير فارغة.

لا يُعدّ مطابقة الأنماط، بالمعنى الدقيق للكلمة، دائمًا خيارًا، إذ يُمكن في لغة هاسكل كتابة بديل واحد فقط، وهو مضمون التطابق دائمًا - في هذه الحالة، لا يُستخدم كخيار، بل كوسيلة لربط الأسماء بالقيم. مع ذلك، يُستخدم غالبًا كخيار في اللغات التي تدعمه.

الشروط المستندة إلى الخرائط

في لغات البرمجة التي تحتوي على مصفوفات ترابطية أو هياكل بيانات مماثلة، مثل بايثون ، بيرل ، بي إتش بي أو أوبجكتيف-سي ، من الشائع استخدامها لتنفيذ التعيين الشرطي. [ 15 ]

pet = input ( "أدخل نوع الحيوان الأليف الذي تريد تسميته: " ) known_pets = { "Dog" : "Fido" , "Cat" : "Meowsles" , "Bird" : "Tweety" , } my_name = known_pets [ pet ]

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

التنبؤ بالتفرع

يُعدّ التنبؤ بالتفرع بديلاً عن تعليمات التفرع الشرطية . التنبؤ بالتفرع ميزة معمارية تُمكّن من تنفيذ التعليمات بشكل مشروط بدلاً من تعديل مسار التحكم .

نظام الاختيار المرجعي المتبادل

يشير هذا الجدول إلى أحدث مواصفات لغوية لكل لغة. أما بالنسبة للغات التي لا تملك مواصفات، فيُشار إلى أحدث إصدار رسمي لها.

لغة البرمجةمنظم إذاswitch –select–caseالتعبيرات الشرطيةالحساب إذامطابقة الأنماط [أ]
ثمآخروإلا إذا
آدانعمنعمنعمنعمنعملالا
ALGOL-60نعمنعمغير ضروري [ج]لانعملالا
ALGOL 68نعمنعمنعمنعمنعمنعم - بند الحالةنعم - بند المطابقة
APLلانعمنعمنعمنعملالا
باش شيلنعمنعمنعمنعمنعملانعم
لغة C ، لغة C++لانعمغير ضروري [ب] [ج]الفشلنعملالا
سي شاربلانعمغير ضروري [ب] [ج]نعمنعملالا
كوبولغير ضرورينعمغير ضروري [ج]نعملالالا
إيفلنعمنعمنعمنعمنعملالا
فا#نعمنعمنعمنعم [د]نعملانعم
فورتراننعمنعمنعمنعمنعم [G]نعم [أنا]نعم - حدد النوع
يذهبلانعمغير ضروري [ج]نعملالالا
هاسكلنعمضروريغير ضروري [ج]نعم [د]نعملانعم
جافالانعمغير ضروري [ج]الفشل [ 16 ]نعملالا
ECMAScript ( جافا سكريبت )لانعمغير ضروري [ج]الفشل [ 17 ]نعملالا
ماثيماتيكالانعمنعمنعمنعملانعم
أوبروننعمنعمنعمنعملالالا
بيرللانعمنعمنعمنعملالا
PHPلانعمنعمالفشلنعملانعم
باسكال ، أوبجكت باسكال ( دلفي )نعمنعمغير ضرورينعملالالا
بايثونلانعمنعمنعمنعملانعم
كويك بيسكنعمنعمنعمنعملالالا
روبينعمنعمنعمنعمنعملانعم [H]
الصدألانعمنعمنعم [د]نعملانعم
سكالالانعمغير ضروري [ج]الفشلنعملانعم
SQLنعم [F]نعمنعمنعم [F]نعملالا
سويفتلانعمنعمنعمنعملانعم
تي سي إللانعمنعمنعمنعملانعم
فيجوال بيسك ، كلاسيكينعمنعمنعمنعمنعملالا
فيجوال بيسك دوت نتنعمنعمنعمنعمنعملالا
ويندوز باور شيللانعمنعمالفشلنعملالا
  1. ^ يشير هذا إلى مطابقة الأنماط كبنية شرطية مميزة في لغة البرمجة - على عكس مجرد دعم مطابقة أنماط السلاسل النصية، مثلدعمالتعبيرات النمطية
  2. 1 2 يتم استخدام توجيه #ELIF فيالمعالجة المسبقةالفرعية التي تستخدم لتعديل الكود قبل التجميع؛ ولتضمينملفاتأخرى.
  3. إنّ ما يُصادف بكثرةفي عائلة لغات C، وفي لغتي COBOL و Haskell، ليس سمةً لغويةً بحد ذاته، بل هو مجموعة من عبارات if then else المتداخلة والمستقلة، مُدمجة مع بنية مُحددة لشفرة المصدر . ومع ذلك، فهذا يعني أيضاً أن بنية else-if المُستقلة ليست ضروريةً في هذه اللغات.else if
  4. 1 2 3 تسمح تعبيرات الحالة في Haskell وتعبيرات المطابقة في F# و Haskell باستخدام كل من switch-case ومطابقة الأنماط.
  5. في بنية لغة روبي ،case يُعدّالتعبيرات النمطيةأحد بدائل التحكم الشرطي المتاحة. للاطلاع على مثال، انظر إلىهذاالسؤال على موقع Stack Overflow.
  6. يحتوي SQL على بنيتين متشابهتين تؤديان كلا الدورين، وقد تم تقديمهما فيSQL-92يعمل"المُبحث عنه"، بينماالتعبير "البسيط"مثل عبارة switch. لمزيد من التفاصيل والأمثلة، راجعCase (SQL).CASECASEWHENcond1THENexpr1WHENcond2THENexpr2[...]ELSEexprDfltENDif ... else if ... elseCASECASEexprWHENval1THENexpr1[...]ELSEexprDfltEND
  7. أضافت لغة فورتران 90 الدالةMERGEالمضمنة. وأضافت لغة فورتران 2023 المعامل الثلاثي الشبيه بلغة سي.
  8. ^ تمت إضافة مطابقة الأنماط في Ruby 3.0. [ 18 ] لا تزال بعض بنيات مطابقة الأنماط تجريبية.
  9. ^ تم تصنيف الحسابifعلى أنه قديم في Fortran 90. وتم حذفه اعتبارًا من معيار Fortran 2018.

انظر أيضاً

مراجع

  1. ^ مسودة تقرير عن اللغة الخوارزمية ALGOL 68 (PDF) (أبلغ عن). مركز الرياضيات (ملحق لنشرة الغول 26). 1968. ص.  55.
  2. «تقرير منقح عن لغة الخوارزميات ALGOL 68» (ملف PDF) . نشرة Algol (الملحق 47) / الرياضيات العددية : 118-121 . 1973. جداول الرموز: «غامق else if » → « elif »؛ «مختصر else if » → « | : »)
  3. صيغة شرط elseif في PHP
  4. صيغة جملة ElseIf في Visual Basic
  5. صيغة سطر الأوامر القياسية POSIX
  6. "لغة البرمجة القياسية الوطنية الأمريكية فورتران" . 3 أبريل 1978. مؤرشف من الأصل في 11 أكتوبر 2007. تم الاطلاع عليه في 9 سبتمبر 2007 .
  7. "VisualWorks: المعالجة الشرطية" . 16-12-2006. مؤرشف من الأصل في 22-10-2007 . تم الاطلاع عليه في 9-9-2007 .
  8. هاسكل 98 اللغة والمكتبات: التقرير المنقح
  9. " اقتراح If-then-else على HaskellWiki "
  10. "نصائح فعّالة في لغة C رقم 6 - لا تستخدم عامل التشغيل الثلاثي « Stack Overflow" . Embeddedgurus.com. 18-02-2009 . تم الاطلاع عليه بتاريخ 07-09-2012 . 
  11. "هياكل التحكم الجديدة" . ويكي تكلير . تم الاطلاع عليه بتاريخ 21 أغسطس 2020 .
  12. "صفحة دليل الترقية" . www.tcl.tk. تم الاطلاع عليه بتاريخ 21 أغسطس 2020 .
  13. "صفحة الدليل" . www.tcl.tk . تم الاطلاع عليه بتاريخ 21 أغسطس 2020 .
  14. "تعبيرات If و if let" . تم الاطلاع عليه في 1 نوفمبر 2020 .
  15. "طريقة بايثونية لتنفيذ عبارات switch/case" . مؤرشف من الأصل بتاريخ 20 يناير 2015. تم الاطلاع عليه بتاريخ 19 يناير 2015 .
  16. Java.sun.com ، مواصفات لغة جافا، الإصدار الثالث.
  17. Ecma-international.org مؤرشف بتاريخ 2015-04-12 في Wayback Machine مواصفات لغة ECMAScript، الإصدار الخامس.
  18. "مطابقة الأنماط" . وثائق روبي 3.0 .
  • شعار ويكيميديا ​​كومنزالوسائط المتعلقة بالبرمجة الشرطية (برمجة الحاسوب) على ويكيميديا ​​كومنز
  • فيديو IF NOT (ActionScript 3.0)