جاوا از سه عملگر پرش با استفاده از اپراتور
عملگر
علاوه بر استفاده در دستورات سوئیچ و حلقهها، با استفاده از اپراتور
گاهی اوقات شروع سریع تکرار بعدی یک حلقه مفید است. یعنی باید اجرای حلقه را ادامه دهید، اما پردازش بقیه کدهای موجود در بدنه آن را برای این تکرار خاص متوقف کنید. در واقع، این یک اپراتور
آخرین دستور کنترل است
break
- continue
و return
. آنها کنترل را به قسمت دیگری از برنامه شما منتقل می کنند. بیایید هر یک از اپراتورها را با جزئیات در نظر بگیریم.
با استفاده از اپراتور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
. در حلقه ها، عملگر 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
. یکی از دلایل این امر این است که جاوا مجموعه ای غنی از عبارات حلقه ای را ارائه می دهد که برای اکثر برنامه ها مناسب است. با این حال، برای آن دسته از موقعیتهای خاص که در آنها لازم است تکرار را زودتر خاتمه دهیم، بیانیه 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
که کامپایلر را به خاطر این نمایش فریب میدهد. پیوند به منبع اصلی: عملگرهای انتقال
GO TO FULL VERSION