تدعم Java ثلاثة عوامل تشغيل للقفز باستخدام المشغل
يتم استخدام عامل التشغيل استخدم
بالإضافة إلى استخدامه في عبارات التبديل والحلقات، باستخدام المشغل
في بعض الأحيان يكون من المفيد بدء التكرار التالي للحلقة مبكرًا. وهذا يعني أنك تحتاج إلى مواصلة تنفيذ الحلقة، لكن عليك التوقف عن معالجة بقية التعليمات البرمجية في نصها لهذا التكرار المحدد. في الواقع، يعد هذا المشغل أو العامل
بيان التحكم الأخير هو
break
- continue
و return
. ينقلون التحكم إلى جزء آخر من برنامجك. دعونا نفكر في كل عامل بالتفصيل.
باستخدام المشغلbreak
يتم استخدام عامل التشغيل break
في Java في ثلاث حالات. أولاً، كما رأيت بالفعل، فإنه ينهي تسلسل البيانات في فروع البيانات switch
. ثانيا، يمكن استخدامه للخروج من الحلقة. ثالثًا، يمكن استخدامه كشكل "متحضر" لمشغل القفز غير المشروط goto
. يشرح هذا القسم الحالتين الأخيرتين. استخدم break
للخروج من حلقة باستخدام break
، يمكنك إجبار الحلقة على الإنهاء فورًا، وتجاوز التعبير الشرطي وأي تعليمات برمجية متبقية في نص الحلقة. عند مواجهة عبارة break
داخل حلقة، تنتهي العبارة الثانية ويتم نقل التحكم في البرنامج إلى العبارة التي تليها. مثال بسيط:
// Использование break для выхода из цикла.
public class BreakLoop {
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
if (i == 4) {
break; // завершить цикл, если i = 4
}
System.out.println("i: " + i);
}
System.out.println("Цикл завершен.");
}
}
يقوم هذا البرنامج بإنشاء المخرجات التالية:
i: 0
i: 1
i: 2
i: 3
Цикл завершен.
على الرغم من أن الحلقة for
مصممة هنا لتنفيذ بياناتها من 0 إلى 99 مرة، إلا أن العامل break
يتسبب في إنهائها مبكرًا عندما يكون i هو 4. break
يمكن استخدام العامل مع أي من حلقات Java، بما في ذلك الحلقات اللانهائية عمدًا. على سبيل المثال، فيما يلي البرنامج السابق المشفر باستخدام حلقة while
. مخرجات هذا البرنامج هي نفس سابقتها.
// Использование break для выхода из while-цикла.
public class BreakLoop2 {
public static void main(String[] args) {
int i = 0;
while (i < 100) {
if (i == 4) {
break; // закончить цикл, если i = 4
}
System.out.println("i: " + i);
i++;
}
System.out.println("Цикл завершен.");
}
}
عند استخدامها ضمن مجموعة من الحلقات المتداخلة، فإن العبارة break
ستخرج فقط من الحلقة الأعمق. على سبيل المثال:
// Использование break во вложенных циклах.
public class BreakLoop3 {
public static void main(String[] args) {
for (int i = 0; i < 3; i++) {
System.out.print("Итерация " + i + ": ");
for (int j = 0; j < 10; j++) {
if (j == 4) {
break; // закончить цикл, если j = 4
}
System.out.print(j + " ");
}
System.out.println();
}
System.out.println("Цикл завершен.");
}
}
يقوم هذا البرنامج بإنشاء المخرجات التالية:
Итерация 0: 0 1 2 3
Итерация 1: 0 1 2 3
Итерация 2: 0 1 2 3
Цикл завершен.
كما ترون، فإن العبارة الموجودة break
في الحلقة الداخلية تؤدي إلى إنهاء تلك الحلقة فقط. لا تتأثر الحلقة الخارجية. دعونا نقدم تعليقين آخرين بخصوص break
. أولاً، قد تظهر عبارات متعددة في حلقة break
. ومع ذلك، كن حذرا. يميل الكثير منهم إلى تدمير التعليمات البرمجية الخاصة بك. ثانيًا، يؤثر العامل break
الذي ينهي عامل التشغيل - switch
فقط على switch
عامل التشغيل المعطى (وليس الحلقات التي تتضمنه). تعليق: Break
لم يتم تصميمه كوسيلة عادية لإنهاء الحلقة. يتم تقديم هذا الغرض من خلال التعبير الشرطي لرأس الحلقة. يجب استخدام المشغل break
فقط لكسر الحلقة عند ظهور مواقف خاصة معينة.
استخدم break
كنموذجgoto
بالإضافة إلى استخدامه في عبارات التبديل والحلقات، break
يمكن أيضًا استخدامه بمفرده كشكل "متحضر" من goto
. لا تحتوي Java على عامل التشغيل goto
لأنها تنفذ التفرع بطريقة عشوائية وغير منظمة. goto
عادة ما يكون من الصعب فهم التعليمات البرمجية التي تستخدم .بكثافة والمحافظة عليها. كما أنه يتجاوز بعض تحسينات المترجم. ومع ذلك، هناك العديد من الأماكن في البرنامج حيث goto
يكون التحكم في التدفق بناءًا قيمًا وشرعيًا. على سبيل المثال، goto
يمكن أن يكون مفيدًا عند الخروج من مجموعة من الحلقات المتداخلة بعمق. للتعامل مع مثل هذه المواقف، تحدد Java نموذجًا موسعًا للعامل break
. باستخدامه، يمكنك الخروج من كتلة واحدة أو أكثر من التعليمات البرمجية. لا تحتاج هذه الكتل إلى أن تكون جزءًا من حلقة أو عبارة switch
. هذا يمكن أن يكون أي كتلة. بعد ذلك، يمكنك تحديد المكان الذي سيستمر فيه التنفيذ بالضبط لأن هذا النموذج break
يعمل مع العلامة ويوفر مزايا goto
وتجاوز مشاكلها. يحتوي البيان break
المسمى على النموذج العام التالي: break label;
هذا label
هو اسم التسمية التي تحدد بعض أجزاء التعليمات البرمجية. عند تنفيذ هذا النموذج break
، يتم نقل التحكم من كتلة التعليمات البرمجية المسماة (التي تم تحديد تسميتها في البيان break
) إلى العبارة التالية لتلك الكتلة. يجب أن تتضمن كتلة التعليمات البرمجية المميزة هذا البيان break
، ولكن ليس من الضروري أن يكون هذا التضمين مباشرًا (أي أنه break
يمكن تضمينه ليس مباشرة في كتلة ذات تسمية خاصة بها، ولكن في كتلة متداخلة بداخلها، وربما يتم وضع علامة عليها أيضًا) . هذا يعني أنه يمكنك استخدام عامل محدد break
للهروب من مجموعة الكتل المتداخلة. ولكن لا يمكنك استخدام break
مجموعة من التعليمات البرمجية التي لا تتضمن ملف break
. لتسمية كتلة، ضع تسمية في بداية الكتلة (قبل قوس الفتح المتعرج). التسمية هي أي معرف Java صالح متبوعًا بنقطتين. بعد تسمية الكتلة، يمكن استخدام التسمية الخاصة بها كوسيطة للعامل break
. سيؤدي هذا إلى استمرار التنفيذ من نهاية الكتلة المحددة. على سبيل المثال، يحتوي البرنامج التالي على ثلاث كتل متداخلة، لكل منها تسمية خاصة بها. يتحرك المشغل break
للأمام، إلى ما بعد نهاية الكتلة المميزة بالملصق second
، متخطيًا عاملين اثنين println()
.
// Использование break How цивorзованной формы goto.
public class Break {
public static void main(String[] args) {
boolean t = true;
first:
{
second:
{
third:
{
System.out.println("Перед оператором break.");
if (t) {
break second; // выход из блока second
}
System.out.println("Данный оператор никогда не выполнится");
}
System.out.println("Данный оператор никогда не выполнится ");
}
System.out.println("Данный оператор размещен после блока second.");
}
}
}
يؤدي تشغيل هذا البرنامج إلى إنشاء المخرجات التالية:
Перед оператором break.
Данный оператор размещен после блока second.
أحد الاستخدامات الأكثر شيوعًا للمشغل المسمى break
هو الهروب من الحلقات المتداخلة. على سبيل المثال، في البرنامج التالي يتم تنفيذ الحلقة الخارجية مرة واحدة فقط:
// Использование break для выхода из вложенных циклов.
public class BreakLoop4 {
public static void main(String[] args) {
outer:
for (int i = 0; i < 3; i++) {
System.out.print("Итерация " + i + ": ");
for (int j = 0; j < 100; j++) {
if (j == 10) {
break outer; // выйти из обоих циклов
}
System.out.print(j + " ");
}
System.out.println("Эта строка никогда не будет выведена");
}
System.out.println("Цикл завершен.");
}
}
يقوم البرنامج بإنشاء المخرجات التالية:
Итерация 0: 0 1 2 3 4 5 6 7 8 9 Цикл завершен.
من السهل أن نرى أنه عندما تتم مقاطعة الحلقة الداخلية قبل نهاية الحلقة الخارجية، تنتهي كلتا الحلقتين. ضع في اعتبارك أنه لا يمكنك القيام break
بالانتقال إلى أي تسمية غير محددة للكتلة المرفقة. على سبيل المثال، البرنامج التالي غير صالح ولن يتم تجميعه:
// Эта программа содержит ошибку.
public class BreakErr {
public static void main(String[] args) {
one:
for (int i = 0; i < 3; i++) {
System.out.print("Итерация " + i + ": ");
}
for (int j = 0; j < 100; j++) {
if (j == 10) {
break one; //He верно!
}
System.out.print(j + " ");
}
}
}
نظرًا لأن الحلقة المميزة بواحدة لا تتضمن عبارة break
، فمن غير الممكن نقل التحكم إلى هذه الكتلة.
باستخدام المشغلcontinue
في بعض الأحيان يكون من المفيد بدء التكرار التالي للحلقة مبكرًا. وهذا يعني أنك تحتاج إلى مواصلة تنفيذ الحلقة، لكن عليك التوقف عن معالجة بقية التعليمات البرمجية في نصها لهذا التكرار المحدد. في الواقع، يعد هذا goto
انتقالًا بعد عمليات الجسم التالية إلى نهاية كتلة الحلقة. يتم تنفيذ هذا الإجراء من قبل المشغل continue
. في الحلقات، يتسبب العامل while
and في نقل التحكم مباشرة إلى التعبير الشرطي الذي يتحكم في الحلقة. في الحلقة، يمرر التحكم أولاً إلى الجزء التكراري من العبارة ثم إلى التعبير الشرطي. لجميع الحلقات الثلاث، يتم تجاوز أي رمز وسيط. فيما يلي مثال لبرنامج يستخدم لطباعة رقمين على كل سطر: do while
continue
for
for
continue
// Демонстрирует continue.
public class Continue {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
System.out.print(i + " ");
if (i % 2 == 0) {
continue;
}
System.out.println("");
}
}
}
يستخدم هذا الرمز العملية %
(modulo) للتحقق مما إذا كان هناك شيء i
متساوي. إذا كان الأمر كذلك، تستمر الحلقة دون طباعة حرف السطر الجديد. مخرجات البرنامج:
0 1
2 3
4 5
6 7
8 9
كما هو الحال مع عامل التشغيل break
، continue
يمكنك تحديد تسمية تشير إلى الحلقة المرفقة التي تريد الاستمرار فيها. مثال لبرنامج يستخدم continue
لطباعة جدول الضرب الثلاثي من 0 إلى 9.
// Использование continue с меткой.
public class ContinueLabel {
public static void main(String[] args) {
outer:
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
if (j > i) {
System.out.println();
continue outer;
}
System.out.print(" " + (i * j));
}
}
System.out.println();
}
}
العبارة continue
في هذا المثال تنهي تقييم الحلقة j
، وتستمر مع التكرار التالي للحلقة المدفوعة i
. الإخراج من هذا البرنامج:
0
0 1
0 2 4
0 3 6 9
0 4 8 12 16
0 5 10 15 20 25
0 6 12 18 24 30 36
0 7 14 21 28 35 42 49
0 8 16 24 32 40 48 56 64
0 9 18 27 36 45 54 63 72 81
ونادرا ما يكون مفيدا للغاية continue
. أحد أسباب ذلك هو أن Java توفر مجموعة غنية من عبارات التكرار التي تناسب معظم التطبيقات. ومع ذلك، بالنسبة لتلك المواقف الخاصة التي يكون من الضروري فيها إنهاء التكرار مبكرًا، يوفر البيان continue
طريقة منظمة لإنجاز هذه المهمة.
المشغل أو العاملreturn
بيان التحكم الأخير هو return
. يتم استخدامه للعودة بشكل صريح من إحدى الطرق، أي أنه ينقل التحكم في البرنامج مرة أخرى إلى البرنامج المستدعي. يتم تصنيف المشغل return
كمشغل انتقالي. على الرغم من أن مناقشتها الكاملة يجب أن تنتظر حتى تتم مناقشة الطرق، إلا أنه يتم تقديم نظرة عامة مختصرة هنا return
. يمكن استخدام عامل التشغيل return
في أي مكان بطريقة ما للانتقال مرة أخرى إلى البرنامج الذي يستدعي الطريقة. ينهي البيان return
على الفور تنفيذ الطريقة الموجودة فيه. يوضح المثال التالي هذا:
// Демонстрирует return.
public class Return {
public static void main(String[] args) {
boolean t = true;
System.out.println("Перед оператором return.");
if (t) {
return; // возврат в вызывающую программу
}
System.out.println("Этот оператор никогда не выполнится.");
}
}
يعود هذا return
إلى نظام Java في وقت التشغيل، نظرًا لأن النظام هو الذي يستدعي main()
. الإخراج من هذا البرنامج:
Перед оператором return.
قد تلاحظ أن البيان النهائي println()
لم يتم تنفيذه. في وقت التنفيذ، return
يتم نقل التحكم مرة أخرى إلى برنامج الاستدعاء. ملاحظة أخيرة. في البرنامج السابق، if
العامل (t) ضروري. وبدون ذلك، فإن مترجم Java سيلقي خطأ "تعليمات برمجية غير قابلة للوصول" لأنه سيعرف أن العبارة الأخيرة println()
لن يتم تنفيذها أبدًا. لمنع هذا الخطأ، يتم استخدام عامل التشغيل (t) if
، وهو يخدع المترجم من أجل هذا العرض التوضيحي. رابط إلى المصدر الأصلي: مشغلي النقل
GO TO FULL VERSION