حلقة for
حلقة for
تُعدّ حلقة for أدقّ أدوات التكرار في Java. حين تعرف — أو تستطيع حساب — عدد التكرارات بالضبط، تمنحك for كامل التحكّم في سطر واحد مدمج: من أين تبدأ، ومتى تتوقّف، وكيف تتقدّم.
تشريح حلقة for
يضمّ التركيب النحوي ثلاثة أجزاء مستقلة في رأس الحلقة، مفصولة بفاصلة منقوطة:
- المُهيّئ (Initializer) — يُنفَّذ مرّة واحدة قبل بدء الحلقة. يُعرَّف فيه عادةً متغيّر عدّاد ويُهيَّأ.
- الشرط (Condition) — يُقيَّم قبل كل تكرار. إن كان
falseتوقّفت الحلقة فورًا. - التحديث (Update) — يُنفَّذ بعد كل تكرار لجسم الحلقة. يزيد العدّاد أو ينقصه عادةً.
العدّ تصاعديًا
النمط الأكثر شيوعًا هو العدّ من قيمة ابتدائية حتى حدٍّ معيّن (غير مشمول):
استخدام < بدلًا من <= هو الأسلوب المعتاد عند التعامل مع الفهارس التي تبدأ من الصفر (المصفوفات والقوائم)، لأنّ الفهارس الصالحة لمصفوفة طولها 5 هي بالضبط من 0 حتى 4.
العدّ تنازليًا
عكس الاتجاه يعني فقط البدء من قيمة عالية، والفحص بـ >، وتناقص العدّاد:
< (حدّ علوي غير مشمول)، بينما يستخدم العدّ التنازلي عادةً >= (حدّ سفلي مشمول). الالتزام بهذه الاصطلاحات يمنع أخطاء الإزاحة بمقدار واحد.
خطوات مخصّصة
تعبير التحديث لا يقتصر على i++ أو i--. يمكنك استخدام أي تعبير صالح، بما في ذلك الجمع أو الطرح بخطوة أكبر:
يمكنك أيضًا الضرب أو القسمة للتقدّم بشكل أسّي:
نطاق متغيّر الحلقة
حين تُعرِّف متغيّرًا داخل المُهيّئ (مثل int i = 0)، يوجد هذا المتغيّر داخل الحلقة فحسب. محاولة استخدامه بعد القوس الختامي تُسبّب خطأ في وقت التصريف:
هذا مقصود ومفيد: تضييق نطاق العدّاد داخل الحلقة يمنع إعادة استخدامه عن طريق الخطأ وتعارض الأسماء. إن كنت تحتاج القيمة النهائية بعد الحلقة فعلًا، أعلن المتغيّر قبل الحلقة:
false قطّ، تعمل الحلقة إلى الأبد. خطأ شائع هو تعبير تحديث يبتعد عن الحدّ:
for (int i = 0; i < 5; i--) { ... } — يصبح i سالبًا ولا يصل أبدًا إلى 5. تحقّق دائمًا من أن التحديث يحرّك العدّاد نحو شرط الخروج.
متغيّرات متعدّدة في رأس الحلقة
تسمح Java بتعديدات متعدّدة وتعبيرات تحديث متعدّدة، مفصولة بفواصل. يُفيد هذا أحيانًا حين يحتاج فهرسان للتحرّك معًا:
for الواحدة يصبح صعب الفهم بسرعة. إن وجدت نفسك تحتاج ثلاثة عدّادات أو أكثر، فحلقة while مع توزيع المنطق داخل جسمها تكون عادةً أوضح.
الخلاصة
تجمع حلقة for التهيئة والشرط والتحديث في رأس واحد مقروء. استخدمها للعدّ تصاعديًا أو تنازليًا بأي خطوة. تذكّر أن المتغيّر المُعلَن في المُهيّئ نطاقه مقتصر على الحلقة — استخدمه بحرية بداخلها، وأعلنه خارجها إن احتجت القيمة النهائية بعد انتهاء الحلقة. في الدرس التالي نستكشف حلقة for-each المحسّنة، التي تتخلّى عن هذا التحكّم الدقيق مقابل تركيب أنظف عند التكرار على المجموعات.