عامل الشرط الثلاثي

في برمجة الحاسوب ، يُعدّ عامل الشرط الثلاثي تعبيرًا شرطيًا يتكون من ثلاثة أجزاء: الشرط المنطقي ، وتعبير " ثم" ، وتعبير " وإلا" . إذا كان الشرط صحيحًا، يُقيّم تعبير " ثم" ؛ وإلا، يُقيّم تعبير " وإلا" ؛ وتُعاد القيمة. لذا فهو عامل غير صارم ، كغيره من التعبيرات الشرطية. ويُسمى أيضًا عامل الشرط ، أو الشرط الثلاثي ، أو الشرط الفوري ، أو الشرط المضمن ( iif ).

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

أدخلت لغة C الصيغة التالية ، والتي تُقرأ "إذا كان a فإن b وإلا c"، وهي صيغة شائعة الاستخدام في لغات أخرى ذات صيغة مشابهة للغة C. تستخدم بعض اللغات الصيغة الوظيفية: في لغة Visual Basic ، تُكتب على النحو التالي .a ? b : cIf(a, b, c)

تدعم العديد من اللغات التعبيرات الشرطية التي تتكون من شرطين أو ثلاثة أو أكثر. وتدعمها اللغات التي تتبع بنية مشابهة للغة ALGOL غالبًا بنفس بنية العبارات الشرطية .if a then b else c

ظهر هذا التركيب لأول مرة في CPL عام 1963، على النحو التالي : [ 1 ] [ 2 ]a b, c

أنماط

تكليف

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

يشبه هذا العامل طريقة عمل التعبيرات الشرطية (if-then-else) في لغات البرمجة الوظيفية ، مثل Scheme و ML و Haskell و XQuery ، حيث يشكل if-then-else تعبيرًا بدلاً من عبارة في تلك اللغات.

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

على سبيل المثال، في لغة بايثون:

x : str = 'foo' إذا كان b وإلا 'bar'

بدلاً من:

x : str إذا كان b : x = 'foo' وإلا : x = 'bar'

في لغة ذات نطاق كتلة ، يجب تعريف المتغير قبل عبارة if-else. على سبيل المثال:

std :: string s ; if ( b ) { s = "foo" ; } else { s = "bar" ; }

استخدام عامل الشرط يبسط هذا الأمر:

std :: string s = b ? "foo" : "bar" ;

علاوة على ذلك، بما أن التهيئة أصبحت الآن جزءًا من التصريح، وليست عبارة منفصلة، ​​فيمكن أن يكون المعرّف ثابتًا. على سبيل المثال:

const std :: string s = b ? "foo" : "bar" ;

محدد الحالة

يمكن استخدام عامل الشرط لتحديد الحالات. على سبيل المثال:

المركبة = الوسيط == 'B' ؟ حافلة : الوسيط == 'A' ؟ طائرة : الوسيط == 'T' ؟ قطار : الوسيط == 'C' ؟ سيارة : الوسيط == 'H' ؟ حصان : أقدام ؛

الاختلافات

تختلف بنية ودلالات العامل باختلاف اللغة.

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

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

إذا كانت اللغة لا تسمح بالآثار الجانبية في التعبيرات (وهو أمر شائع في اللغات الوظيفية)، فإن ترتيب التقييم ليس له دلالات قيمة - على الرغم من أنه قد يؤثر على ما إذا كان التكرار اللانهائي سينتهي، أو يكون له آثار أخرى على الأداء (في لغة وظيفية مع تعبيرات مطابقة، يكون التقييم المختصر متأصلًا، والاستخدامات الطبيعية للعامل الثلاثي أقل شيوعًا، لذا فإن هذه النقطة ذات أهمية محدودة).

لهذه الأسباب، في بعض اللغات، يمكن أن يكون لشكل العبارة دلالات مختلفة بشكل طفيف عن شكل الشرط الكتلي .r = condition ? expr1 : expr2if(condition){r=expr1;}else{r=expr2;}

في معظم لغات البرمجة، يكون عامل الشرط الثلاثي تجميعيًا من اليمين ، بحيث يُقيّم بشكل بديهي على أنه . وهذا يعني أنه يمكن ربطه بسلسلة مشابهة لسلسلة . الاستثناء الرئيسي هو لغة PHP ، حيث كان تجميعيًا من اليسار (بحيث يُقيّم التعبير نفسه على أنه ، وهو ما نادرًا ما يتوقعه المبرمج) [ 3 ] قبل الإصدار 8، وأصبح غير تجميعي بعد ذلك. [ 4 ]a == 1 ? "one" : a == 2 ? "two" : "many"a == 1 ? "one" : (a == 2 ? "two" : "many")if ... else if ... else if ... else(a == 1 ? "one" : a == 2) ? "two" : "many"

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

أمثلة

آدا

قدّمت نسخة 2012 من لغة آدا التعبيرات الشرطية (باستخدام " ifو case")، كجزء من مجموعة موسعة من التعبيرات تشمل التعبيرات الكمية ودوال التعبير. ويوضح الأساس المنطقي لإصدار آدا 2012 [ 5 ] دوافع عدم وجودها سابقًا في لغة آدا، بالإضافة إلى دوافع إضافتها الآن، مثل دعم "العقود" (وهي ميزة جديدة أيضًا).

Pay_per_Hour := ( if Day = Sunday then 12.50 else 10.00 );

عندما تكون قيمة تعبير الشرط من النوع المنطقي (Boolean)، elseيمكن حذف الجزء المحدد، وتكون القيمة صحيحة (True). يمكن ربط عدة شروط باستخدام elsif.

ALGOL 60

أدخلت لغة ALGOL 60 التعبيرات الشرطية (الشروط الثلاثية) إلى لغات البرمجة الإجرائية .

هذه العبارة الشرطية:

integer opening_time ; if day = Sunday then opening_time := 12 ; else opening_time := 9 ;

يمكن إعادة كتابتها باستخدام عامل الشرط:

integer opening_time ; opening_time := if day = Sunday then 12 else 9 ;

ALGOL 68

تدعم كلتا عبارات الاختيار في لغة ALGOL 68 (عبارات if و case) ما يلي:

جملة اختيارية واحدة إذا
if condition then statements [ else statements ] fiأو بصيغة مختصرة:( condition | statements | statements )
شرط الاختيار المتسلسل
if condition1 then statements elif condition2 then statements [ else statements ] fiأو بصيغة مختصرة: ( condition1 | statements |: condition2 | statements | statements ).

سحق

يوجد عامل ثلاثي حقيقي للتعبيرات الحسابية:

(( النتيجة = الشرط ؟ القيمة إذا كانت صحيحة : القيمة إذا كانت خاطئة ))

توجد حلول بديلة للسلاسل النصية، مثل:

result = $(if condition ; then echo "value_if_true" ; else echo "value_if_false" ; fi)

يمكن أن conditionيكون أي أمر bash. عند الخروج بنجاح، يتم تنفيذ أمر echo الأول، وإلا يتم تنفيذ الأمر الثاني.

عائلة C

يُسند الكود التالي في لغة Cresult قيمة المتغير `t` xإذا كان `t` a > bصحيحًا، وإلا يُسند قيمة المتغير `t` y. وهذا هو نفس التركيب النحوي المستخدم في العديد من اللغات ذات الصلة، بما في ذلك C++ و Java و JavaScript و Dart .

النتيجة = أ > ب ؟ س : ص ؛

يتم تقييم التعبير المحدد فقط. في هذا المثال، لا xيتطلب yالتعبيران تقييمًا، ولكنهما قد يكونان تعبيرين ذوي آثار جانبية . سيحدث الأثر الجانبي لقيمة التعبير المحدد فقط. [ 6 ] [ 7 ]

إذا كان نوع البيانات لكل من xو yهو نفسه، فإن التعبير الشرطي يكون عادةً من هذا النوع. وإلا، فإن القواعد التي تحكم نوع البيانات الناتج تختلف قليلاً بين اللغات.

  • في لغة C++، تُجرى عمليات تحويل الأنواع الحسابية المعتادة لتحويل نوعي البيانات xإلى yنوع مشترك. إذا كان كلا النوعين مؤشرًا أو مرجعًا، أو إذا كان أحدهما مؤشرًا والآخر تعبيرًا ثابتًا قيمته صفر، تُجرى عمليات تحويل المؤشرات أو المراجع لتحويلهما إلى نوع مشترك. [ 8 ]
  • في لغة C#، إذا كان أحد التعبيرين قابلاً للتحويل ضمنيًا إلى نوع الآخر، فسيتم استخدام ذلك النوع. وإلا، فسيحدث خطأ أثناء الترجمة. [ 9 ]
  • في اللغات ذات الكتابة الديناميكية، يكون للتعبير الذي تم تقييمه نوع التعبير المحدد.

علاوة على ذلك، في لغة C++، يمكن استخدام التعبير الشرطي كقيمة lvalue ، إذا كانت كلتا القيمتين lvalue xو ylvalue، على الرغم من أن هذا نادرًا ما يستخدم في الممارسة العملية: [ 10 ]

( foo ? bar : baz ) = frink ;

لغة الشفرة الشائعة

التعيين باستخدام تعبير شرطي في لغة Common Lisp :

( setq result ( if ( > a b ) x y ))

صيغة بديلة:

( إذا كان ( أكبر من أ ب ) ( ضبط النتيجة س ) ( ضبط النتيجة ص ))

قاعدة البيانات dBASE

في dBaseiif(<expL>, <expT>, <expF>) ، تسمى الدالة الشرطية "Immediate IF". وهي تستخدم تقييمًا مختصرًا (فهي تقيّم واحدًا فقط من <expT> أو <expF> ).

على سبيل المثال، لفرز قائمة حسب اسم الشارع ثم (في معظم الحالات) رقم المنزل، يمكن للمرء أن يكتب

index on iif(instr(addr," ") , substr(addr,instr(addr," ")+1,10) + left(addr,instr(addr," ")-1) , addr)إلى ملف الفهرس

في موجه أوامر dBASE III، ثم انسخ الجدول أو قم بتصديره.

فورتران

كجزء من معيار Fortran-90، تمت إضافة عامل التشغيل الثلاثي إلى Fortran كدالة جوهريةmerge :

المتغير = دمج ( س ، ص ، أ > ب )

لاحظ أنه يتم تقييم كل من x و y قبل إرجاع نتيجة أحدهما من الدالة. هنا، يتم إرجاع x إذا كان الشرط صحيحًا، و y في غير ذلك.

أضافت لغة فورتران 2023 تعابير شرطية تقوم بتقييم أحد التعبيرين أو كليهما بناءً على التعبير الشرطي:

المتغير = ( أ > ب ؟ س : ص )

كوتلين

لا تتضمن لغة Kotlin ?:عامل التشغيل الثلاثي التقليدي، ومع ذلك، ifيمكن استخدام an كتعبير يمكن تعيينه، [ 11 ] تحقيق نفس النتائج.

القيمة القصوى = إذا كان ( أ > ب ) أ وإلا ب

لغة لوا

لا تحتوي لغة Lua على عامل شرطي تقليدي. ومع ذلك، فإن سلوك الاختصار في عواملها andيسمح orبمحاكاة هذا السلوك. ما يلي يكافئ: .var = cond ? a : b

المتغير = الشرط و أ أو ب

سينجح هذا ما لم aيكن خاطئًا منطقيًا؛ في هذه الحالة، ستكون النتيجة دائمًا b. قد يؤدي تجاهل هذا إلى سلوك غير متوقع.

توجد أيضًا صيغ أخرى يمكن استخدامها، لكنها عادةً ما تكون أكثر تفصيلاً:

var = ( { [ true ] = a , [ false ] = b } )[ not not cond ]

لغة Luau، وهي لهجة من لغة Lua، تحتوي على تعابير ثلاثية تشبه عبارات if، ولكن على عكسها، لا تحتوي على endكلمة مفتاحية، والشرط elseفيها إلزامي. يمكن إضافة elseifشروط اختيارية. صُممت هذه اللغة لتحل محل التعبير الاصطلاحي، ومن المتوقع أن تعمل بشكل صحيح في جميع الحالات. [ 12 ]condandaorb

في لغة لواو، المتغير = إذا كان الشرط صحيحًا ، فإن أ، وإلا ب-- باستخدام عبارة elseif، تكون الإشارة = إذا كانت قيمة المتغير < فإن القيمة -1، وإذا كانت قيمة المتغير تساوي فإن القيمة 0، وإلا فإن القيمة 1

امتدادات لغة باسكال الكائنية

كانت لغة باسكال بمثابة تبسيط وتوسيع للغة ALGOL 60، لكنها أزالت التعبيرات الشرطية.

أضافت لغة RemObjects Oxygene عاملًا ثلاثيًا إلى لغة Object Pascal في عام 2011 تقريبًا، [ 13 ] وفي عام 2025 حذت لغة Delphi حذوها. [ 14 ] تدعم Oxygene عبارات case/switch ، وهي في الأساس عبارة if متكررة، كتعبيرات تُقيّم إلى قيمة أيضًا. [ 15 ]

بايثون

يدعم بايثون التعبير الشرطي الثلاثي منذ الإصدار 2.5 (سبتمبر 2006). [ 16 ] يختلف عامل الشرط في بايثون عن ?:عامل الشرط في لغة C في ترتيب معاملاته. الصيغة العامة هي: [ 17 ]

النتيجة = س إذا كان أ > ب وإلا ص

يُتيح هذا الشكل إمكانية اعتباره xالقيمة الطبيعية yوحالة استثنائية. على عكس عبارات بايثون الشرطية، elifلا يدعم هذا الشكل الشرط، ولكنه يسمح بالتعبيرات الشرطية المتداخلة.

الصدأ

باعتبارها لغة برمجة موجهة نحو التعبيرات ، فإن جميع الشروط في Rust هي تعبيرات وليست عبارات، لذا فإن تركيبها النحوي يشبه عامل الشرط الثلاثي في ​​لغة C. كانت الإصدارات السابقة من اللغة تحتوي على عامل شرطي، ولكن تم حذفه [ 18 ] بسبب التكرار مع عامل الشرط الثلاثي [ 19 ] .if expr1 else expr2?:?:if

لاحظ عدم وجود فواصل منقوطة في الكود أدناه مقارنةً بكتلة if... elseالإجرائية، والفاصلة المنقوطة في نهاية عملية الإسناد إلى y.

ليكن x = 5 ؛let y = if x == 5 { 10 } else { 15 };

ويمكن كتابة ذلك أيضاً على النحو التالي:

let y = if x == 5 { 10 } else { 15 };

تُعد الأقواس المعقوفة إلزامية في التعبيرات الشرطية في لغة Rust.

يمكنك أيضًا استخدام matchتعبير:

let y = match x { 5 => 10 , _ => 15 , };

أحاديث قصيرة

لكل تعبير (إرسال رسالة) قيمة. وبالتالي ifTrue:ifFalse:يمكن استخدامه:

|x y|x := 5.y : = ( x == 5 ) ifTrue: [ 10 ] ifFalse: [ 15 ] .

SQL

يُعد تعبير SQL CASEتعميمًا للمعامل الثلاثي. فبدلاً من شرط واحد ونتيجتين، يمكن تحديد n شرطًا و n+1 نتيجة.

مع شرط واحد، يكون مكافئاً (وإن كان أكثر إسهاباً) للمعامل الثلاثي:

SELECT ( CASE WHEN a > b THEN x ELSE y END ) AS CONDITIONAL_EXAMPLE FROM tab ;

يمكن توسيع هذا ليشمل عدة شروط:

SELECT ( CASE WHEN a > b THEN x WHEN a < b THEN y ELSE z END ) AS CONDITIONAL_EXAMPLE FROM tab ;

فيجوال بيسك

توفر لغة Visual Basic دالة شرطية ثلاثية، IIfكما هو موضح في الكود التالي:

Dim opening_time As Integer = IIf (( day = SUNDAY ), 12 , 9 )

كدالة، تُقيّم قيم الوسائط الثلاثة قبل استدعاء الدالة. ولتجنب تقييم التعبير غير المُحدد، Ifأُضيفت الكلمة المفتاحية (في Visual Basic .Net 9.0) كعامل شرطي ثلاثي حقيقي. وهذا يسمح للكود التالي بتجنب حدوث استثناء إذا تم تنفيذه باستخدام IIf:

Dim name As String = If ( person Is Nothing , "" , person . Name )

انظر أيضاً

مراجع

  1. ستراشي، كريستوفر (2000). " المفاهيم الأساسية في لغات البرمجة ". الحوسبة الرمزية والحسابات من الرتبة العليا . 13 ( 1-2 ): 11-49 . doi : 10.1023/A:1010000313106 . S2CID 14124601 . 
  2. "5.5 التعبيرات الشرطية". دليل مرجع BCPL (ملف PDF) . 1967. الصفحات 16-17 . مؤرشف من الأصل (ملف PDF) بتاريخ 16-03-2016 . تم الاطلاع عليه بتاريخ 15-03-2017 . 
  3. واسل، إريك. "الترابط الثلاثي للمعامل" . phpsadness.com . حزن PHP . تم الاسترجاع في 20 سبتمبر 2017 .
  4. https://www.php.net/manual/en/language.operators.comparison.php#language.operators.comparison.ternary
  5. ^ "الأساس المنطقي لـ Ada 2012" . ACAA . تم الاسترجاع 10 ديسمبر 2015 .
  6. ^ ISO.IEC 9899:1999 (هـ) 6.5.15.4
  7. مواصفات جافا 7: 15.25 عامل التشغيل الشرطي  ؟  :
  8. مايك بلوم. "عامل الشرط:؟ " . docs.microsoft.com . تم الاسترجاع في 29 أبريل 2019 . 
  9. بيل واغنر. "؟: عامل التشغيل - مرجع لغة سي شارب" . docs.microsoft.com . تم الاطلاع عليه بتاريخ 29-04-2019 .
  10. "المُعامل الشرطي" . wiki.c2.com . تم الاطلاع عليه بتاريخ 29-04-2019 .
  11. "تعبير الشرط في لغة كوتلين" . kotlinlang.org . تم الاطلاع عليه بتاريخ 25-04-2021 .
  12. "صياغة § تعابير If-then-else" . لواو . تم الاسترجاع في 2023-02-07 .
  13. "عبارات if then (else)" . DelphiTools . تم الاطلاع عليه بتاريخ 11 سبتمبر 2025 .
  14. "متوفر في RAD Studio 13: عامل شرطي ثلاثي للغة دلفي" . مدونات إمباركاديرو . 30 يوليو 2025. تم الاطلاع عليه بتاريخ 11 سبتمبر 2025 .
  15. "تكساس، ابدأوا بتصنيع آلات التصوير" . مدونة RemObjects . تم الاطلاع عليه بتاريخ 11 سبتمبر 2025 .
  16. اقتراح تحسين بايثون رقم 308
  17. "مرجع لغة بايثون" .
  18. "إزالة عامل التشغيل الثلاثي بواسطة pwoolcoc · طلب سحب رقم 1705 · rust-lang/Rust" . GitHub .
  19. "إزالة عامل التشغيل الثلاثي · المشكلة رقم 1698 · rust-lang/Rust" . GitHub .