JavaRush /مدونة جافا /Random-AR /مشغلي القفز
articles
مستوى

مشغلي القفز

نشرت في المجموعة
تدعم Java ثلاثة عوامل تشغيل للقفز break- continueو return. ينقلون التحكم إلى جزء آخر من برنامجك. دعونا نفكر في كل عامل بالتفصيل. مشغلي الانتقال - 1

باستخدام المشغل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. في الحلقات، يتسبب العامل whileand في نقل التحكم مباشرة إلى التعبير الشرطي الذي يتحكم في الحلقة. في الحلقة، يمرر التحكم أولاً إلى الجزء التكراري من العبارة ثم إلى التعبير الشرطي. لجميع الحلقات الثلاث، يتم تجاوز أي رمز وسيط. فيما يلي مثال لبرنامج يستخدم لطباعة رقمين على كل سطر: do whilecontinueforforcontinue
// Демонстрирует 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، وهو يخدع المترجم من أجل هذا العرض التوضيحي. رابط إلى المصدر الأصلي: مشغلي النقل
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION