حلقة (بيان)
في برمجة الحاسوب ، تُعدّ الحلقة بنيةً للتحكم في تدفق البرنامج تسمح بتنفيذ التعليمات البرمجية بشكل متكرر، عادةً مع تعديلات طفيفة بين كل تكرار. يمكن استخدام الحلقات لتنفيذ إجراء متكرر على جميع عناصر مجموعة ، أو لتنفيذ برنامج طويل الأمد.
ملخص
تُعدّ الحلقات التكرارية سمةً من سمات لغات البرمجة عالية المستوى . أما في لغات البرمجة منخفضة المستوى، فيتم تحقيق الوظيفة نفسها باستخدام القفزات . عند ترجمة البرنامج إلى لغة الآلة ، يمكن تحقيق الحلقات التكرارية باستخدام القفزات؛ ولكن يمكن تحسين بعض الحلقات التكرارية لتشغيلها دون استخدام القفزات. [ 1 ]
عادةً، يُتوقع أن تستمر الحلقات لعدد محدود من التكرارات. ولكن بدون عناية مناسبة، قد تُنشأ حلقات لا يمكن إنهاؤها. تُسمى هذه الحلقات بالحلقات اللانهائية . وتُعرف مشكلة تحديد ما إذا كان البرنامج يحتوي على حلقة لانهائية بمشكلة التوقف .
حلقة شرطية
الحلقة الشرطية (المعروفة أيضًا بالحلقة غير المحددة [ 2 ] ) هي حلقة تحدد ما إذا كان يجب إنهاؤها بناءً على شرط منطقي. [ 3 ] تتميز هذه الحلقات بالمرونة، ولكن قد يصعب فهم سلوكها الدقيق. [ 4 ] : 368
تتكون الحلقة الشرطية عادةً من جزأين: الشرط والجسم . الشرط عبارة عن عبارة منطقية تعتمد على حالة البرنامج، أما الجسم فهو كتلة من التعليمات البرمجية التي تُنفذ طالما أن الشرط صحيح. [ 3 ]
من المفاهيم الخاطئة الشائعة أن تنفيذ جسم البرنامج ينتهي بمجرد زوال الشرط ؛ ولكن هذا ليس هو الحال عادةً. [ 4 ] : 368 في معظم لغات البرمجة، يُفحص الشرط مرة واحدة لكل تنفيذ لجسم البرنامج . ولا يوجد معيار موحد لتوقيت فحص الشرط ، إذ تحتوي بعض لغات البرمجة على هياكل تكرار شرطية متعددة بقواعد مختلفة لتحديد وقت فحص الشرط .
حلقة الاختبار المسبق
حلقة الاختبار المسبق هي حلقة شرطية يتم فيها التحقق من الشرط قبل تنفيذ الجزء الرئيسي من الحلقة. بتعبير أدق، يتم التحقق من الشرط ، وإذا تحقق، يتم تنفيذ الجزء الرئيسي . بعد ذلك، يتم التحقق من الشرط مرة أخرى، وإذا تحقق، يتم تنفيذ الجزء الرئيسي مرة أخرى. تتكرر هذه العملية حتى يصبح الشرط غير متحقق. تُطلق العديد من لغات البرمجة على هذه الحلقة اسم حلقة while ، ويتم الإشارة إليها باستخدام الكلمة المفتاحية while . وعادةً ما يتم تنسيقها بطريقة مشابهة لـ
بينما يتكرر الشرط ، يكرر الجسم
بدلاً من الكلمات المفتاحية do و repeat ، تُستخدم أحيانًا طرق أخرى للإشارة إلى بداية ونهاية النص ، مثل الأقواس المعقوفة [ 5 ] أو المسافات البيضاء . [ 6 ]
على سبيل المثال، يتحقق جزء الكود التالي أولاً مما إذا كانت قيمة x أقل من خمسة، وهي كذلك، لذا يتم الانتقال إلى الجزء المخصص لذلك. هناك، يتم عرض قيمة x ثم زيادتها بمقدار واحد. بعد تنفيذ التعليمات في الجزء المخصص ، يتم التحقق من الشرط مرة أخرى، وتُعاد تنفيذ الحلقة. تتكرر هذه العملية حتى تصبح قيمة x خمسة.
x ← 0 بينما x < 5 نفّذ عرض( x ) x ← x + 1 كرر
حلقة ما بعد الاختبار

حلقة ما بعد الاختبار هي حلقة شرطية يتم فيها التحقق من الشرط بعد تنفيذ جسم الحلقة . بتعبير أدق، يتم تنفيذ جسم الحلقة ثم التحقق من الشرط . إذا كان الشرط صحيحًا، يُعاد تنفيذ جسم الحلقة ثم يُعاد التحقق من الشرط . تتكرر هذه العملية حتى يصبح الشرط غير صحيح. تُسمى هذه الحلقة أحيانًا بحلقة "do-while" نظرًا لاستخدامها في لغات برمجة مختلفة، [ 7 ] على الرغم من أن هذا قد يكون مُربكًا لأن لغتي Fortran و PL/I تستخدمان صيغة "DO WHILE" لحلقات ما قبل الاختبار. [ 8 ] [ 9 ] عادةً ما تُنسق حلقات ما بعد الاختبار بطريقة مشابهة لـ
كرر ما يلي أثناء الحالة
بدلاً من الكلمات المفتاحية do و repeat، تُستخدم أحيانًا طرق أخرى للإشارة إلى بداية ونهاية النص ، مثل الأقواس المعقوفة. [ 10 ]
قد تستخدم بعض اللغات اصطلاح تسمية مختلفًا لهذا النوع من الحلقات. على سبيل المثال، تحتوي لغتا باسكال ولوا على حلقة " كرر حتى "، والتي تستمر في العمل حتى يصبح تعبير التحكم صحيحًا ثم تتوقف. [ 11 ] [ 12 ]
حلقة تكرار ثلاثية الأجزاء

تتكون حلقة التكرار الثلاثية ، التي شاع استخدامها في لغة C، من جزأين إضافيين: التهيئة ( وهي نوع من أنواع حلقات التكرار )، والزيادة ، وكلاهما عبارة عن كتل برمجية. تُستخدم التهيئة لإعداد الحلقة وتُنفذ مرة واحدة في البداية، بينما تُستخدم الزيادة لتحديث حالة البرنامج بعد كل تكرار للحلقة. بخلاف ذلك، تُعتبر حلقة التكرار الثلاثية حلقة اختبار مسبق. وعادةً ما تُنسق بطريقة مشابهة لـ
للتهيئة ، والشرط ، والزيادة، كرر ما يلي :
هذه الصيغة مستمدة من لغة B ، وقد ابتكرها في الأصل ستيفن سي. جونسون . [ 13 ] يُعد كود C التالي مثالاً على حلقة تكرارية ثلاثية الأجزاء تطبع الأرقام من 0 إلى 4.
for ( int i = 0 ; i < 5 ; i ++ ) { printf ( "%d \n " , i ); }البنى المتكافئة
بافتراض وجود دالة أو طريقة معلنة بشكل صحيح تسمى do_work()، فإن ما يلي متكافئ في لغات البرمجة التي تدعم حلقات ما بعد الاختبار. [ 14 ]
يفعل do_work() كرر الشرط بينما | نفّذ_العمل() بينما الشرط نفّذ do_work() يكرر |
علاوة على ذلك، ونظرًا continueلعدم استخدام عبارة، فإن ما سبق يُعادل تقنيًا ما يلي، على الرغم من أن هذه الأمثلة ليست نموذجية أو حديثة الاستخدام في أجهزة الكمبيوتر اليومية. [ 15 ] [ 16 ]
صحيح ، لكن do_work() إذا لم يكن الشرط صحيحًا، فاخرج من الحلقة. انتهى الشرط. كرر
أو بدلاً من ذلك،
بداية الحلقة: do_work() إذا تحقق الشرط ، فانتقل إلى بداية الحلقة. انتهى الشرط.
تعداد

التعداد (المعروف أيضًا بالحلقة المحددة [ 2 ] ) هو حلقة مصممة للتكرار على جميع عناصر مجموعة. [ 17 ] وهو ليس بمرونة الحلقة الشرطية، ولكنه أكثر قابلية للتنبؤ. على سبيل المثال، من الأسهل ضمان انتهاء التعدادات وتجنب أخطاء الإزاحة بمقدار واحد . يمكن تنفيذ التعدادات باستخدام مُكرِّر ، سواءً ضمنيًا أو صراحةً.
تختلف الكلمات المفتاحية المستخدمة لاستدعاء التعدادات باختلاف لغة البرمجة. على سبيل المثال، تستخدم اللغات المشتقة من ALGOL الكلمة المفتاحية [ 18 ]،for بينما تستخدم اللغات المشتقة من Fortran الكلمة المفتاحية [ 19 ] ، وتستخدم COBOL الكلمة المفتاحية [ 20 ] .doPERFORM VARYING
تُسمى التعدادات أحيانًا "حلقات for"، كما هو الحال في لغتي Zig و Rust . [ 21 ] [ 22 ] قد يُسبب هذا التوصيف التباسًا، إذ أن العديد من لغات البرمجة الأكثر شيوعًا [ 23 ] ، مثل C و C++ و Java ، تستخدم هذا المصطلح لحلقة for المكونة من ثلاثة أجزاء، [ 24 ] [ 25 ] [ 26 ] والتي لا تُعد تعدادًا. تتجنب لغات برمجة أخرى، مثل Perl و C# ، هذا الالتباس باستخدام مصطلح "حلقة foreach". [ 27 ] [ 28 ]
يختلف ترتيب تكرار عناصر المجموعة باختلاف لغة البرمجة. في لغة فورتران 95، توجد حلقة تكرارية، تُستدعى باستخدام الكلمة المفتاحية FORALL، مستقلة عن هذا الترتيب، حيث تُنفذ جميع تكرارات الحلقة في الوقت نفسه. وقد أُلغيت هذه الميزة في فورتران 2018. [ 29 ]
الحلقات في البرمجة الوظيفية
في معظم لغات البرمجة الوظيفية ، يُستخدم الاستدعاء الذاتي بدلاً من الحلقات التقليدية. ويعود ذلك إلى أن المتغيرات غير قابلة للتغيير ، وبالتالي لا يمكن أن تحدث خطوة الزيادة في الحلقة. [ 30 ]
لتجنب الوقوع في أخطاء تجاوز سعة المكدس في الحلقات الطويلة، تُطبّق لغات البرمجة الوظيفية تحسين استدعاء الذيل ، مما يسمح باستخدام نفس إطار المكدس لكل تكرار للحلقة، مما يؤدي فعليًا إلى نفس الكود كما في حلقة while أو for . [ 31 ]
بعض اللغات، مثل Haskell ، لديها بنية نحوية تُعرف باسم فهم القوائم ، وهي تشبه التعداد، حيث يتم تكرار محتويات القائمة وتحويلها إلى قائمة جديدة.
عداد الحلقات
عداد الحلقة هو متغير تحكم يُستخدم لتحديد عدد مرات تكرار الحلقة. يتغير عداد الحلقة مع كل تكرار، مما يوفر قيمة فريدة لكل تكرار. يُستخدم عداد الحلقة لتحديد وقت انتهاء الحلقة. سُمي بهذا الاسم لأن معظم استخدامات هذا التركيب تؤدي إلى أن يأخذ المتغير نطاقًا من القيم الصحيحة.
من الاصطلاحات الشائعة لتسمية عدادات الحلقات استخدام أسماء المتغيرات i و j و k (وهكذا عند الحاجة)، [ 32 ] حيث يمثل i الحلقة الخارجية، و j الحلقة الداخلية التالية، وهكذا. يُجمع على أن هذا الأسلوب نشأ من بدايات برمجة لغة فورتران ، حيث كانت أسماء المتغيرات التي تبدأ بهذه الأحرف تُعلن ضمنيًا على أنها من نوع عدد صحيح، ولذا كانت خيارات بديهية لعدادات الحلقات التي تُستخدم مؤقتًا فقط. يعود هذا الأسلوب إلى أصول الترميز الرياضي، حيث تُستخدم i و j و k غالبًا كمؤشرات للجمع والضرب .
يُنصح البعض بعدم استخدام أسماء مختصرة لعدادات الحلقات، مثل i و j ، لأن الغرض من المتغيرات لا يكون واضحًا كما لو تم إعطاؤها اسمًا أطول وأكثر وصفًا. [ 4 ] : 383-382
تُحدد لغات البرمجة المختلفة قواعد متباينة لقيمة عداد الحلقة عند انتهاء الحلقة، بل إن بعضها يعتبره غير مُعرّف. يسمح هذا للمُصرّف بتوليد شيفرة تُبقي أي قيمة في عداد الحلقة، أو ربما تُبقيه دون تغيير لأن قيمة الحلقة كانت مُخزّنة في مُسجّل ولم تُخزّن في الذاكرة. وقد يختلف السلوك الفعلي تبعًا لإعدادات تحسين المُصرّف.
قد يؤدي تعديل عداد الحلقة داخل جسم الحلقة إلى عواقب غير متوقعة. ولمنع هذه المشاكل، تجعل بعض لغات البرمجة عداد الحلقة غير قابل للتغيير . مع ذلك، من المرجح أن يكتشف المترجم التغييرات الظاهرة فقط. أما في الحالات التي يُمرر فيها عنوان عداد الحلقة كوسيط إلى روتين فرعي ، فيصعب التحقق منه لأن سلوك الروتين غير معروف عمومًا للمترجم ما لم تدعم اللغة توقيعات الإجراءات ونوايا الوسائط.
الخروج المبكر والاستمرار
قد توفر بعض لغات البرمجة عبارات مساعدة لتغيير كيفية سير تكرار الحلقة. ومن بين هذه العبارات الشائعة عبارة break ، التي تُنهي الحلقة الحالية، وعبارة continue ، التي تنتقل إلى التكرار التالي للحلقة الحالية. [ 4 ] : 379 قد تحمل هذه العبارات أسماءً أخرى؛ ففي لغة فورتران 90 ، على سبيل المثال ، تُسمى exit و cycle .
يمكن أيضًا إنهاء الحلقة عن طريق العودة من الدالة التي يتم تنفيذها داخلها.
في حالة الحلقات المتداخلة، تُطبَّق عبارتا break و continue على الحلقة الداخلية. تسمح بعض لغات البرمجة بتسمية الحلقات، ما يسمح بتطبيق هاتين العبارتين على أي حلقة من الحلقات المتداخلة في البرنامج.
الحلقة_الخارجية: (هذا مُعرِّف للحلقة الخارجية) من أجل 1 ≤ i ≤ 2 نفِّذ من أجل 1 ≤ j ≤ 2 نفِّذ عرض(i، j) إذا كان i = 2، فتابع الحلقة الخارجية. نهاية الشرط. كرر. كرر. (تعرض هذه الحلقة المتداخلة الأزواج (1، 1)، (1، 2)، و(2، 1)).
حلقة لا نهائية
الحلقة اللانهائية هي حلقة لا تنتهي أبداً. قد يكون هذا مقصوداً، أو نتيجة خطأ منطقي .
يُعرف الكشف المنهجي عن الحلقات اللانهائية باسم مشكلة التوقف .
تُعد الحلقات اللانهائية مفيدة في التطبيقات التي تحتاج إلى إجراء عملية حسابية متكررة حتى ينتهي البرنامج، مثل خوادم الويب . [ 33 ]
انظر أيضاً
- دالة تكرارية بدائية
- دالة تكرارية عامة
- تكرار الحلقة (توضيح)
- لغة البرمجة LOOP – هي لغة برمجة تتميز بأن الدوال التي يمكنها حسابها هي بالضبط الدوال التكرارية الأولية.
مراجع
- ↑ أنجيلو، ألكسندروس؛ دادالياريس، أنطونيوس؛ دوسيس، مايكل؛ ديميتريو، جورجيوس (26-11-2021). "توليد التعليمات البرمجية بدون تفرعات لبنى المعالجات الحديثة" . المؤتمر اليوناني الخامس والعشرون للمعلوماتية . نيويورك، نيويورك، الولايات المتحدة الأمريكية: ACM. الصفحات 300-305 . doi : 10.1145/3503823.3503879 . ISBN 978-1-4503-9555-7.
- 1 2 سامانتا، ديباسيس؛ سارما، موناليزا (15 يونيو 2023). متعة جافا: أساسيات البرمجة الكائنية التوجه . مطبعة جامعة كامبريدج. ص 124. ISBN 978-1-009-21190-1.
- ١ ٢ "الحلقات الشرطية - البنى الحسابية - مراجعة علوم الحاسوب للمستوى الوطني الرابع" . بي بي سي بايت سايز . مؤرشف من الأصل في ١٩ أكتوبر ٢٠٢١. تم الاطلاع عليه في ٨ يناير ٢٠٢٦ .
- 1 2 3 4 ماكونيل، ستيف (9 يونيو 2004). كود كومبليت . بيرسون إديوكيشن. ISBN 978-0-7356-3697-2.
- ↑ "عبارة while (دليل لغة GNU C)" . www.gnu.org . مؤرشف من الأصل بتاريخ 12 يوليو 2024. تم الاطلاع عليه بتاريخ 8 يناير 2026 .
- ↑ "3. مقدمة غير رسمية إلى لغة بايثون" . وثائق بايثون . مؤرشف من الأصل في 31 ديسمبر 2025. تم الاطلاع عليه في 8 يناير 2026 .
- ↑ "do...while - JavaScript | MDN" . وثائق MDN على الويب . 2025-07-08 . تم الاطلاع عليه بتاريخ 2026-01-22 .
- ↑ "DO WHILE (مرجع لغة FORTRAN 77)" . docs.oracle.com . مؤرشف من الأصل بتاريخ 14 مارس 2023. تم الاطلاع عليه بتاريخ 8 يناير 2026 .
- ↑ "أمر DO (PL/I)" . www.ibm.com . مؤرشف من الأصل في 2 مارس 2025. تم الاطلاع عليه في 22 يناير 2026 .
- ↑ "عبارة do-while (دليل لغة GNU C)" . www.gnu.org . مؤرشف من الأصل في 13 يوليو 2024. تم الاطلاع عليه في 8 يناير 2026 .
- ↑ "عبارة التكرار حتى" . www.freepascal.org . مؤرشف من الأصل في 9 نوفمبر 2025. تم الاطلاع عليه في 22 يناير 2026 .
- ↑ "البرمجة بلغة لوا : 4.3.3" . www.lua.org . مؤرشف من الأصل في 2 يناير 2026. تم الاطلاع عليه في 22 يناير 2026 .
- ↑ تومسون، كين . مؤتمر VCF East 2019 - مقابلة برايان كيرنيغان مع كين تومسون . يوتيوب . مؤرشف من الأصل بتاريخ 12 ديسمبر 2021. تم الاطلاع عليه بتاريخ 16 نوفمبر 2020.
لقد رأيت نسخة جونسون من حلقة for باستخدام الفاصلة المنقوطة، ووضعتها في [B]، لقد سرقتها.
- ↑ "عبارات while و do-while (دروس Java™ > تعلم لغة Java > أساسيات اللغة)" . docs.oracle.com . تم الاطلاع عليه بتاريخ 16-05-2026 .
- ↑ بارلانتي، نيك. "حلقة بيضاء" . جامعة ستانفورد. تم الاسترجاع في 26-05-16.
- ↑ "3.12. الاستخدامات المشروعة لـ goto" . icarus.cs.weber.edu . تم الاطلاع عليه بتاريخ 16-05-2026 .
- ↑ ماكونيل، ستيف (9 يونيو 2004). كود كومبليت . بيرسون إديوكيشن. ص 367. ISBN 978-0-7356-3697-2.
- ↑ ويرث، نيكلاوس (1973). "مقدمة". البرمجة المنهجية: مدخل . برنتيس هول. ص. 13. ISBN 0138803692.
- ↑ "DO / END DO" . www.ibm.com . 24 أبريل 2018. مؤرشف من الأصل في 8 يناير 2026. تم الاطلاع عليه في 8 يناير 2026 .
- ↑ "أداء مع عبارة متغيرة" . www.ibm.com . يونيو 2012. مؤرشف من الأصل في 8 يناير 2026. تم الاسترجاع في 8 يناير 2026 .
- ↑ "وثائق Zig" . ziglang.org . مؤرشف من الأصل في 4 يناير 2026. تم الاطلاع عليه في 8 يناير 2026 .
- ↑ "التكرار عبر مجموعة باستخدام for" . rust-lang.org . مؤرشف من الأصل في 19 ديسمبر 2025. تم الاطلاع عليه في 8 يناير 2026 .
- ↑ "مؤشر TIOBE لشهر سبتمبر 2024" . مؤرشف من الأصل في 4 يناير 2026. تم الاطلاع عليه بتاريخ 16 ديسمبر 2025 .
- ↑ "لبيان (دليل لغة سي من جنو)" . www.gnu.org . مؤرشف من الأصل في 13 يوليو 2024. تم الاطلاع عليه في 8 يناير 2026 .
- ↑ "عبارة for (C++)" . learn.microsoft.com . مؤرشف من الأصل بتاريخ 28 سبتمبر 2025. تم الاطلاع عليه بتاريخ 8 يناير 2026 .
- ↑ "عبارة for (دروس Java™ > تعلم لغة Java > أساسيات اللغة)" . docs.oracle.com . مؤرشف من الأصل بتاريخ 28 ديسمبر 2025. تم الاطلاع عليه بتاريخ 8 يناير 2026 .
- ↑ "عبارات التكرار - for، foreach، do، و while - مرجع C#" . learn.microsoft.com . مؤرشف من الأصل في 28 ديسمبر 2025. تم الاطلاع عليه في 8 يناير 2026 .
- ↑ "حلقة التكرار في بيرل" . دروس بيرل . مؤرشف من الأصل في 7 يونيو 2025. تم الاطلاع عليه في 8 يناير 2026 .
- ↑ "للجميع" . إنتل . مؤرشف من الأصل في 1 يناير 2026. تم الاطلاع عليه في 8 يناير 2026 .
- ↑ هينسن، كونراد (2009). "وعود البرمجة الوظيفية" . الحوسبة في العلوم والهندسة . 11 (4): 86-90 . Bibcode : 2009CSE....11d..86H . doi : 10.1109/mcse.2009.129 . ISSN 1521-9615 .
- ↑ كلينجر، ويليام د. (1998). "الاستدعاء الذاتي الأمثل وكفاءة استخدام المساحة". وقائع مؤتمر ACM SIGPLAN 1998 حول تصميم لغات البرمجة وتنفيذها . نيويورك، نيويورك، الولايات المتحدة الأمريكية: ACM. الصفحات 174-185 . doi : 10.1145/277650.277719 . ISBN 0-89791-987-4.
- ↑ http://www.knosof.co.uk/vulnerabilities/loopcntrl.pdf تحليل متغيرات التحكم في الحلقة في لغة C
- ↑ "ما هي الحلقة اللانهائية (الحلقة التي لا نهاية لها)؟" . WhatIs . تم الاسترجاع في 22-01-2026 .
- تدفق التحكم
