JavaRush /وبلاگ جاوا /Random-FA /اپراتورهای پرش
articles
مرحله

اپراتورهای پرش

در گروه منتشر شد
جاوا از سه عملگر پرش break- continueو return. آنها کنترل را به قسمت دیگری از برنامه شما منتقل می کنند. بیایید هر یک از اپراتورها را با جزئیات در نظر بگیریم. اپراتورهای انتقال - 1

با استفاده از اپراتورbreak

عملگر breakدر جاوا در سه حالت استفاده می شود. ابتدا، همانطور که قبلاً دیدید، توالی عبارات را در شاخه های دستور پایان می دهد 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. به عنوان مثال، در زیر برنامه قبلی با استفاده از یک حلقه کدگذاری شده است 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. جاوا شامل عملگر نیست gotoزیرا شاخه را به صورت دلخواه و بدون ساختار انجام می دهد. کدی که به شدت از . استفاده می کند gotoمعمولا درک و نگهداری آن دشوار است. همچنین برخی از بهینه سازی های کامپایلر را لغو می کند. با این حال، چندین مکان در یک برنامه وجود دارد که در آن gotoجریان کنترل یک ساختار ارزشمند و قانونی است. به عنوان مثال، gotoزمانی که از یک مجموعه حلقه‌های عمیق تودرتو خارج می‌شوید، می‌تواند مفید باشد. برای رسیدگی به چنین شرایطی، جاوا فرم توسعه یافته ای از عملگر را تعریف می کند break. با استفاده از آن می توانید از یک یا چند بلوک کد خارج شوید. لازم نیست این بلوک ها بخشی از یک حلقه یا عبارت باشند switch. این می تواند هر بلوکی باشد. در مرحله بعد، می‌توانید دقیقاً تعیین کنید که اجرا کجا ادامه خواهد یافت زیرا این فرم breakبا علامت کار می‌کند و مزایای آن را فراهم می‌کند gotoو مشکلات آن را دور می‌زند. یک breakدستور برچسب دار شکل کلی زیر را دارد: break label; در اینجا labelنام برچسبی است که تعدادی بلوک از کد را مشخص می کند. هنگامی که این فرم breakاجرا می شود، کنترل از بلوک کد نامگذاری شده (که برچسب آن در عبارت مشخص شده است break) به دستور بعدی آن بلوک منتقل می شود. یک بلوک کد علامت‌گذاری شده باید شامل این عبارت باشد break، اما الزامی نیست که این شامل مستقیم باشد (یعنی breakمی‌توان آن را نه مستقیماً در یک بلوک با برچسب خاص خود، بلکه در یک بلوک تودرتو در داخل آن گنجاند، که احتمالاً علامت‌گذاری شده است) . این بدان معناست که شما می توانید از یک عملگر علامت گذاری شده breakبرای فرار از مجموعه ای از بلوک های تودرتو استفاده کنید. اما شما نمی توانید breakاز بلوک کدی استفاده کنید که شامل یک break. برای نامگذاری یک بلوک، یک برچسب را در ابتدای بلوک (قبل از بریس مجعد باز) قرار دهید. برچسب هر شناسه معتبر جاوا است که با یک دونقطه همراه باشد. پس از برچسب گذاری یک بلوک، برچسب آن می تواند به عنوان آرگومان برای عملگر استفاده شود 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. یکی از دلایل این امر این است که جاوا مجموعه ای غنی از عبارات حلقه ای را ارائه می دهد که برای اکثر برنامه ها مناسب است. با این حال، برای آن دسته از موقعیت‌های خاص که در آن‌ها لازم است تکرار را زودتر خاتمه دهیم، بیانیه 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در زمان اجرا به سیستم جاوا برمی گردد، زیرا این سیستم است که main(). خروجی این برنامه:
Перед оператором return.
ممکن است متوجه شوید که دستور نهایی println()اجرا نمی شود. در زمان اجرا، returnکنترل دوباره به برنامه فراخوانی منتقل می شود. یک نکته پایانی در برنامه قبلی ifعملگر (t) ضروری است. بدون آن، کامپایلر جاوا یک خطای «کد غیرقابل دسترسی» ایجاد می‌کند، زیرا می‌داند که آخرین دستور println()هرگز اجرا نمی‌شود. برای جلوگیری از این خطا از عملگر (t) استفاده می‌شود ifکه کامپایلر را به خاطر این نمایش فریب می‌دهد. پیوند به منبع اصلی: عملگرهای انتقال
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION