عامل الفاصلة

في لغتي البرمجة C و C++ ، يُعدّ عامل الفاصلة (المُمثَّل بالرمز ), عاملاً ثنائياً يُقيّم مُعامله الأول ويتجاهل النتيجة، ثم يُقيّم مُعامله الثاني ويُعيد هذه القيمة (ونوعها). توجد نقطة تسلسل بين هذين التقييمين.

إن استخدام رمز الفاصلة كعامل يختلف عن استخدامه في استدعاءات الدوال وتعريفاتها، وتصريحات المتغيرات ، وتصريحات التعداد ، والتركيبات المماثلة، حيث يعمل كفاصل .

بناء الجملة

يفصل عامل الفاصلة التعبيرات (التي لها قيمة) بطريقة مشابهة لكيفية إنهاء الفاصلة المنقوطة للعبارات، وتُحاط سلاسل التعبيرات بأقواس مشابهة لكيفية إحاطة سلاسل العبارات بأقواس معقوفة: [ 1 ](a, b, c) هي سلسلة من التعبيرات، مفصولة بفواصل، تُقيّم إلى التعبير الأخير c، بينما {a; b; c;}هي سلسلة من العبارات، ولا تُقيّم إلى أي قيمة. لا يمكن أن تأتي الفاصلة إلا بين تعبيرين - تفصل الفواصل بين التعبيرات - على عكس الفاصلة المنقوطة، التي تأتي في نهاية عبارة (غير كتلة) - تُنهي الفاصلة المنقوطة العبارات.

تتمتع الفاصلة بأقل أولوية بين جميع عوامل لغة C، وتعمل كنقطة تسلسل . عند استخدام الفواصل والفاصلات المنقوطة معًا، تكون أولوية الفاصلة المنقوطة أقل من أولوية الفواصل، لأن الفاصلة المنقوطة تفصل بين العبارات بينما تقع الفواصل داخل العبارات، وهو ما يتوافق مع استخدامها كعلامة ترقيم عادية: a, b; c, dيتم تجميعها على هذا النحو (a, b); (c, d)لأنها عبارتان منفصلتان.

ابتداءً من C++20 ، تم إيقاف استخدام عامل الفاصلة في تعابير الفهرسة، وذلك للحد من الالتباس، ولإتاحة إمكانية إعادة استخدام الصيغة مستقبلاً لفهرسة المصفوفات متعددة الأبعاد. [ 2 ] في C++23operator[] ، أُضيفت إمكانية التحميل الزائد باستخدام وسائط متعددة، مما جعل تعابير الفاصلة غير المحاطة بأقواس غير قابلة للاستخدام في الفهرسة. [ 3 ] لا يزال عامل الفاصلة قابلاً للاستخدام وغير مُهمل في هذا السياق إذا كان تعبير الفاصلة محاطًا بأقواس (كما في a[(b,c)]).

أمثلة

مثال
القيمة المُعادة
سلوك
int a = 1 , b = 2 ; int r = ( a , b ); return r ;
2أثناء التهيئة، تعمل الفاصلة كفاصل، لكنها في السطر الثاني تُعدّ عاملًا. الأقواس ضرورية. بدونها، سيكون السطر الثاني مكافئًا لـ ، مما يؤدي إلى تعريف b مرتين، وهو أمر غير مسموح به.intr=a;intb
int a = 1 , b = 2 ; int r = ( a += 2 , a + b ); return r ;
5بما أن يتم تقييمها قبل تقييمها وتعيينها إلى r .a+=2a+b
return ( 1 , 2 );
2الفاصلة هي عامل تشغيل، وليست فاصلة، لأنها returnكلمة مفتاحية ولا تعمل كدالة.

الاستخدامات

يُستخدم عامل الفاصلة في حالات محدودة نسبيًا. ولأنه يتجاهل المعامل الأول، فإنه يُستخدم عادةً فقط عندما يكون للمعامل الأول آثار جانبية مرغوبة يجب ترتيبها قبل المعامل الثاني. علاوة على ذلك، ولأنه نادرًا ما يُستخدم خارج نطاق مصطلحات محددة، ويُخلط بسهولة مع الفواصل الأخرى أو الفاصلة المنقوطة، فإنه قد يُسبب التباسًا وخطأً. مع ذلك، توجد ظروف معينة يُستخدم فيها بشكل شائع، لا سيما في حلقات التكرار (for loops) وفي SFINAE . [ 4 ] بالنسبة للأنظمة المدمجة التي قد تكون لديها إمكانيات محدودة لتصحيح الأخطاء ، يمكن استخدام عامل الفاصلة مع ماكرو لتجاوز استدعاء دالة بسلاسة، لإدراج التعليمات البرمجية قبل استدعاء الدالة مباشرةً.

حلقات التكرار

تسمح الفاصلة بتنفيذ عدة عبارات إسناد دون استخدام عبارة كتلة، كما هو الحال في تهيئة وتعبيرات الزيادة في حلقة for . في المثال التالي، يُعد ترتيب مُهيئات الحلقة مهمًا:

void rev ( char * s , size_t len ​​) { char * first ; for ( first = s , s += len ; s >= first ; -- s ) { putchar ( * s ); } }

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

وحدات الماكرو

يمكن استخدام الفاصلة في وحدات المعالجة المسبقة لتنفيذ عمليات متعددة في مساحة تعبير نحوي واحد.

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

for ( int i = 0 ; i <= 9 ; i ++ ) { assert (( "i is too big!" , i <= 4 )); printf ( "i = %i \n " , i ); }

حالة

يمكن استخدام الفاصلة داخل شرط (في جملة if أو while أو do while أو for) للسماح بإجراء عمليات حسابية مساعدة، وخاصة استدعاء دالة واستخدام النتيجة، مع نطاق الكتلة :

إذا ( y = f ( x ), y > x ) { // عبارات تتضمن x و y }

يوجد أسلوب مشابه في لغة البرمجة Go ، حيث يسمح تركيب جملة if صراحةً بوجود جملة اختيارية. [ 6 ]

إرجاع معقد

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

إذا حدث خطأ ، فسيتم إرجاع ( errno = EINVAL , -1 ) .

تجنب الازدحام

للاختصار، يمكن استخدام الفاصلة لتجنب استخدام كتلة من الأقواس وما يرتبط بها، كما في المثال التالي:

إذا كان ( x == 1 ) فإن y = 2 ، z = 3 ؛

التحميل الزائد

تسمح لغة C++ بإعادة تعريف عامل الفاصلة، سواءً كعامل ثنائي أو كعامل غير عضو. [ 7 ] توقيعاته هي:

  • U&T::operator,(U&rhs);(تعريف الفئة الداخلية)
  • U&operator,(constT&lhs,U&rhs);(خارج تعريف الفئة)

وهذا يسمح باستخدام واجهات برمجة تطبيقات على نمط لغة المجال المحددة (DSL) ، مثل ما يلي:

مسجل مسجل ؛ مسجل ، "مرحباً، " ، "العالم!" ؛

لغات أخرى

في لغتي البرمجة OCaml و Ruby ، يتم استخدام الفاصلة المنقوطة (";") لهذا الغرض.

تستخدم لغات JavaScript [ 8 ] و Perl [ 9 ] و D [ 10 ] عامل الفاصلة بنفس الطريقة التي تستخدمها لغات C/C++.

بعض اللغات الأخرى ذات بناء الجملة الشبيه بلغة C، مثل Java [ 11 ] و C# ، لا تحتوي على هذه الميزة، على الرغم من أن C# تدعم قائمة مفصولة بفواصل من التعبيرات في المُهيئ والمُكرر للعبارة for، [ 12 ] مما يتيح ما يعادل هذا في هذا السياق المحدد.

انظر أيضاً

مراجع

  1. "عامل الفاصلة" . وثائق مطوري مايكروسوفت . مؤرشف من الأصل في 2 أغسطس 2019. تم الاطلاع عليه في 1 أغسطس 2019. يتم تقييم تعبيرين مفصولين بفاصلة من اليسار إلى اليمين . يتم دائمًا تقييم المعامل الأيسر، وتكتمل جميع التأثيرات الجانبية قبل تقييم المعامل الأيمن.
  2. "P1161R2: إيقاف استخدام عامل الفاصلة في تعابير الفهرسة" . www.open-std.org . تم الاطلاع عليه بتاريخ 2022-09-05 .
  3. ^ مارك هومين. ديزي هولمان؛ كورنتين جابوت؛ إيزابيلا مويرتي؛ كريستيان تروت (2021-09-14). "مشغل منخفض متعدد الأبعاد" (PDF) .
  4. "SFINAE" . en.cppreference.com . تم الاطلاع عليه بتاريخ 30-08-2022 .
  5. لغة Go الفعالة : بالنسبة لـ "أخيرًا، لا تحتوي لغة Go على عامل الفاصلة، و++ و-- عبارة عن عبارات وليست تعبيرات. لذا، إذا كنت ترغب في تشغيل متغيرات متعددة في حلقة for، فيجب عليك استخدام التعيين المتوازي (على الرغم من أن ذلك يستبعد ++ و--)."
  6. مواصفات لغة البرمجة Go: عبارات if
  7. cppreference.com. "عوامل أخرى" . cppreference.com . cppreference.com . تم الاطلاع عليه بتاريخ 2 مايو 2026 .
  8. "عامل الفاصلة" . وثائق MDN على الويب . ١٧ يناير ٢٠٢٠. مؤرشف من الأصل في ١٢ يوليو ٢٠١٤. تم الاطلاع عليه في ٢٥ يناير ٢٠٢٠. يمكنك استخدام عامل الفاصلة عندما تريد تضمين عدة تعبيرات في مكان يتطلب تعبيرًا واحدًا.
  9. "Perlop - عوامل التشغيل والأسبقية في لغة بيرل - متصفح بيرلدوك" .
  10. "التعبيرات - لغة البرمجة D § تعبير الفاصلة" .
  11. "هل الفاصلة (,) عامل تشغيل أم فاصل في لغة جافا؟ "
  12. "العبارات - مواصفات لغة C# | Microsoft Learn § عبارة for" .

فهرس

  • راماجاران، ف. (1994)، برمجة الحاسوب بلغة سي ، نيودلهي: برنتيس هول الهند
  • ديكسيت، جيه بي (2005)، أساسيات الحواسيب والبرمجة بلغة سي ، نيودلهي: منشورات لاكشمي
  • كيرنيغان، برايان دبليو؛ ريتشي، دينيس إم (1988)، لغة البرمجة سي (  الطبعة الثانية)، إنجلوود كليفس، نيوجيرسي: برنتيس هول