Салом! Имрӯз мо дар бораи операторҳои ҷаҳиш дар Java сӯҳбат хоҳем кард:
return
break
continue
goto
if
) ва ҳалқаҳо ( for
, while
ва ғ.). Ба ѓайр аз конструксияњои идоракунї, иљрои хаттии барномаро тавассути баёнияњои гузариш таѓйир додан мумкин аст. Онҳо барои бозгардонидани иҷрои барнома ба макони мушаххас масъуланд, ки аз контекст ва изҳороти мушаххас вобаста аст. Биёед ба ҳар як чор оператор бодиққат назар кунем.
бозгашт
Маҳз ҳамин оператор аст, ки навомадагон бештар бо аввал шинос мешаванд. Изҳоротreturn
усули даъватшударо қатъ мекунад ва иҷрои барнома ба маконе бармегардад, ки метод аз он даъват шуда буд. Он return
ду шакл дорад:
- Дарҳол иҷрои усулро хотима медиҳад.
- Иҷрои усулро фавран ба итмом мерасонад ва дар натиҷаи усул баъзе арзишҳоро бармегардонад.
return;
return value; // где value — некоторое возвращаемое meaning
Усулҳое, ки арзишро бармегардонанд, бояд ҳадди аққал як оператори return
дорои арзиши баргардонидашуда, ки кафолат дода мешавад, даъват карда шаванд ва набояд оператори return
бе арзиши бозгашт дошта бошанд. Биёед мисолҳои зеринро дида бароем:
public int sum(int a, int b) {
return a + b;
}
public String getGreetings(String name) {
return "Hello " + name;
}
public int max(int x, int y) {
if (x > y) {
return x;
} else {
return y;
}
}
Дар усулҳое, ки арзишро барнамегардонанд (методҳо void
), қобor қабул аст, аммо талаб карда намешавад, ки ҳадди аққал як изҳорот return
бе арзиши бозгашт дошта бошад, на як изҳорот return
бо арзиши бозгашт. Биёед инро бо мисолҳои зерин дида бароем:
public void print(String s) {
// наличие return в void методах не обязательно
System.out.println(s);
}
//Метод выведет в консоль число, если оно нечетное
public void printIfOdd(int number) {
if (number % 2 == 0) {
// Если число четное, метод завершит свою работу
// Наличие return в void методах опционально
return;
}
System.out.println(number);
}
// Метод выведет в консоль наибольшее meaning из массива
private void printMaxInArray(int[] array) {
if (array == null || array.length == 0) {
/*
Если массив пуст, метод завершит свою работу.
Иногда полезно проверять подобным образом аргументы метода вначале и прерывать выполнение метода, если аргументы не подходят для дальнейшей корректной работы
*/
System.out.println("Empty array");
return;
}
int max = array[1];
for (int i = 1; i < array.length; i++) {
if (array[i] > max) {
max = array[i];
}
}
System.out.println(max);
}
тамғакоғазҳо
Пеш аз он ки ба операторҳо нигоҳ кунемbreak
, continue
ман мехоҳам дар бораи тамғакоғазҳо дар Java сӯҳбат кунам. Ин муҳим аст, зеро дар баъзе ҳолатҳо break
ва операторҳо continue
дар якҷоягӣ бо тамғакоғазҳо истифода мешаванд. Аммо аввал, кӯшиш кунед, ки ба савол ҷавоб диҳед, ки оё ин code тартиб медиҳад:
public static void main(String[] args) {
https://www.google.com/
System.out.println("Interesting...");
}
Нишон як порчаи codeи номдор аст. Худи нишона ягон функсияро таъмин намекунад. Ин чизе монанди хатчӯб дар code аст, ки барномасоз ният дорад баъдтар истифода кунад. Нишон дар code хеле содда муайян карда мешавад - ба воситаи ном ва ду нуқта. Барои намуна:
labelName:
outerLoop:
printing:
anyWordYouLike:
public static void main(String[] args) {
definePrintName:
System.out.println("Таблица Умножения");
loop1:
for (int i = 1; i <= 10; i++) {
loop2:
for (int j = 1; j <= 10; j++) {
System.out.printf("%4d", i * j);
}
System.out.println();
}
}
Натиҷаи усул main
чунин хоҳад буд:
Таблица Умножения
1 2 3 4 5 6 7 8 9 10
2 4 6 8 10 12 14 16 18 20
3 6 9 12 15 18 21 24 27 30
4 8 12 16 20 24 28 32 36 40
5 10 15 20 25 30 35 40 45 50
6 12 18 24 30 36 42 48 54 60
7 14 21 28 35 42 49 56 63 70
8 16 24 32 40 48 56 64 72 80
9 18 27 36 45 54 63 72 81 90
10 20 30 40 50 60 70 80 90 100
Process finished with exit code 0
Дар мисоли боло definePrintName
, loop1:
ва loop2:
тамғакоғазҳо мебошанд. loop1:
ва loop2:
ду давра - берунӣ ва дохилӣ - "нишона" кунед. Мо истифодаи тамғакоғазҳоро дар фасли зер дида мебароем. Дар айни замон, агар шумо ба саволе, ки оё ин code тартиб дода мешавад, "не" ҷавоб додед:
public static void main(String[] args) {
https://www.google.com/
System.out.println("Interesting...");
}
Кӯшиш кунед, ки бо истифода аз IDE ба он ҷавоб диҳед.
танаффус
Операторbreak
дар ду ҳолат истифода мешавад:
- Барои анҷом додани ҳама гуна шохаи иҷро дар блоки коммутатсионӣ.
- Барои боздоштани иҷрои як ҳалқа.
break labelName; // Синтаксис оператора с меткой
break; // Синтаксис оператора без метки
Дар блокҳои коммутаторӣ, оператор break
бе нишонаҳо истифода мешавад:
public static void main(String[] args) {
int dayOfWeekInt = 4;
String dayOfWeek;
switch (dayOfWeekInt) {
case 1:
dayOfWeek = "Monday";
break;
case 2:
dayOfWeek = "Tuesday";
break;
case 3:
dayOfWeek = "Wednesday";
break;
case 4:
dayOfWeek = "Thursday";
break;
case 5:
dayOfWeek = "Friday";
break;
case 6:
dayOfWeek = "Saturday";
break;
case 7:
dayOfWeek = "Sunday";
break;
default:
dayOfWeek = "Неизвестный день";
break;
}
System.out.println("Сегодня " + dayOfWeek);
}
Дар давраҳо, изҳорот break
барои қатъ кардани такрори минбаъда пас аз риояи шартҳои муайян истифода мешавад. Инро аксар вақт ёфтан мумкин аст, вақте ки ба шумо лозим меояд, ки тавассути массив ё коллексияи элементҳо такрор кунед ва дар он ягон элементеро пайдо кунед, ки ба шартҳои зарурӣ ҷавобгӯ бошад. Биёед ин мисолро дида бароем. Мо массив дорем ва мо бояд муайян кунем, ки оё массив унсурҳои манфӣ дорад:
int a[] = {1,2,234,-123,12,-2,312,0,412,433};
boolean arrayHasNegativeElements = false;
for (int i = 0; i < a.length; i++) {
if (a[i] < 0) {
/*
Как только найдется
хотя бы один отрицательный элемент,
мы прервем цикл с помощью
оператора break, потому что
мы выяснor то, что нас интересовало,
и дальнейший перебор элементов не имеет смысла.
*/
arrayHasNegativeElements = true;
break;
}
}
Биёед як мисолро бо ҳалқаҳои гуногун дида бароем. Сикл for-each
:
public static void main(String[] args) {
int a[] = {1,2,234,-123,12,-2,312,0,412,433};
boolean arrayHasNegativeElements = false;
for (int number : a) {
if (number < 0) {
arrayHasNegativeElements = true;
break;
}
}
}
Сикл while
:
public static void main(String[] args) {
int a[] = {1,2,234,-123,12,-2,312,0,412,433};
boolean arrayHasNegativeElements = false;
int counter = 0;
while (counter < a.length) {
if (a[counter] < 0) {
arrayHasNegativeElements = true;
break;
}
counter ++;
}
}
Сикл do-while
:
public static void main(String[] args) {
int a[] = {1,2,234,-123,12,-2,312,0,412,433};
boolean arrayHasNegativeElements = false;
int counter = 0;
do {
if (a[counter] < 0) {
arrayHasNegativeElements = true;
break;
}
counter ++;
} while (counter < a.length);
}
Намунаи дигари изҳорот break
дар ҳалқаҳо ин қатъ кардани ҳалқаи беохир ҳангоми расидан ба шартҳои муайян мебошад. Ин аст як мисоли барномае, ки хати воридкардаи корбарро то ворид шудани калимаи "стоп" нишон медиҳад:
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String line;
while (true) {
line = scanner.nextLine();
if ("stop".equals(line)){
/*
Прерываем бесконечный цикл,
при достижении
определенного условия
*/
break;
}
System.out.println("Пользователь ввел: " + line);
}
}
Биёед истифодабарии операторро break
якҷоя бо нишона баррасӣ кунем. Танаффус бо тамғакоғаз дар ҳолатҳое истифода мешавад, ки якчанд давра доранд, илова бар ин, дар байни дигар лона гузошта шудаанд. Дар ин ҳолат, яке аз давраҳо (ё ҳама давраҳо) бо тамғагузорӣ қайд карда мешавад. Баъдан, оператор break
дар якҷоягӣ бо нишон додани тамға, давраи дилхоҳро қатъ мекунад. Биёед мисолеро дида бароем, ки дар он мо бояд фаҳмем, ки оё элементи манфӣ вуҷуд дорад, аммо на дар массив, балки дар матритса:
public static void main(String[] args) {
int[][] a = {
{1, 2, 3},
{-412, 12, 0},
{1223, 474, -54}
};
boolean hasNegative = false;
searchNegative:
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < a[i].length; j++) {
if (a[i][j] < 0) {
/*
Если использовать break без метки,
тогда прервется вложенный цикл for,
но внешний продолжит выполнять свои итерации
и поиск продолжится.
Поэтому мы "помечаем" внешний цикл меткой `searchNegative`
и прерываем внешний цикл оператором break совместно с нужной меткой.
*/
hasNegative = true;
break searchNegative;
}
}
}
}
давомнокй
Операторcontinue
инчунин ду шакл дорад - бо ва бидуни нишона:
continue; // форма оператора без метки
continue labelName; // форма оператора с меткой
Баръакси оператор break
, ки ҳамаи такрорҳои боқимондаи давраро қатъ мекунад, оператор continue
такрори ҷорӣро қатъ мекунад ва боиси оғоз шудани навбатии мегардад. Ин метавонад муфид бошад, агар ба шумо лозим ояд, ки баъзе амалиётҳоро дар элементҳое, ки шартҳои муайянро қонеъ мекунанд, иҷро кунед. Фарз мекунем, ки мо сатр дорем ва мо мехоҳем шумори калимаҳоеро, ки бо ҳарфи "м" сар мешаванд, ҳисоб кунем:
public static void main(String[] args) {
String sentence = "Мама мыла раму";
String[] words = sentence.split(" ");
int mWordsCount = 0;
for (int i = 0; i < words.length; i++) {
if ( ! words[i].toLowerCase().startsWith("м")) {
/*
Если слово не начинается с буквы м,
то текущая итерация прервется и цикл
ПРОДОЛЖИТ выполнение со следующей итерации
*/
continue;
}
mWordsCount ++;
}
System.out.println("Кол-во слов, начинающихся с буквы М в предложении: " + "[" + sentence + "] = " + mWordsCount);
}
Пас аз иҷрои ин code дар консол баромади зерин пайдо мешавад:
Кол-во слов, начинающихся с буквы М в предложении: [Мама мыла раму] = 2
Оператор continue
дар якҷоягӣ бо нишона инчунин ҳангоми такрори элементҳо истифода мешавад. Биёед матритсаеро тасаввур кунем, ки дар он мо бояд шумораи сатрҳоро бо унсурҳои манфӣ ҳисоб кунем:
public static void main(String[] args) {
int[][] a = {
{1, 23, -1, 23, -12},
{21, 21, 0, 23, 123, 45},
{123, 3},
{123, -5, 4, -3},
{-1, -2, -3}
};
int rowsWithNegativeElementsCount = 0;
rowsLoop:
// Проходим по каждой строке
for (int[] arr : a) {
for (int number : arr) {
if (number < 0) {
/*
Если в текущей строке найдется
хотя бы 1 отрицательный элемент,
тогда мы увеличим переменную счетчик,
и с помощью оператора continue rowsLoop
прервем текущую итерацию внешнего цикла и
принудительно начнем следующую
*/
rowsWithNegativeElementsCount ++;
continue rowsLoop;
}
}
}
System.out.println("Rows With Negative Elements Count = " + rowsWithNegativeElementsCount);
}
Натиҷаи ин code чунин хоҳад буд:
Rows With Negative Elements Count = 3
Қобor зикр аст, ки операторҳои break
, continue
ва return
мумкин аст бо роҳҳои гуногун барои ноил шудан ба як функсия истифода бурда мешавад. Ҳамин тавр, шумо метавонед мисоли охиринро аз нав нависед ва continue
истифода баред break
:
public static void main(String[] args) {
int[][] a = {
{1, 23, -1, 23, -12},
{21, 21, 0, 23, 123, 45},
{123, 3},
{123, -5, 4, -3},
{-1, -2, -3}
};
int rowsWithNegativeElementsCount = 0;
for (int[] arr : a) {
for (int number : arr) {
if (number < 0) {
rowsWithNegativeElementsCount ++;
break;
}
}
}
System.out.println("Rows With Negative Elements Count = " + rowsWithNegativeElementsCount);
}
Фарқи байни break
ва continue
бо нишона он чизест, ки break
такрори ҳалқае, ки дар он навишта шудааст, анҷом медиҳад. Ва continue
бо тамғакоғаз, итератсияи ҷории давраеро, ки бо тамға нишон дода шудааст, гузаред. Дар баъзе ҳолатҳо, шумо метавонед якеро бо дигаре иваз кунед ва ҳама чиз дар функсияҳои барнома ҳамон тавр боқӣ мемонад. Мо дар бораи он чизе ки беҳтарин интихоб кардан мумкин аст (спойлер: хониши code) дар зер сӯҳбат хоҳем кард. Операторро break
на танҳо бо continue
нишона, балки бо return
. Танҳо пеш аз ин ба шумо лозим аст, ки ҳалқаи лонаро ба усули алоҳида интиқол диҳед:
public static void main(String[] args) {
int[][] a = {
{1, 23, -1, 23, -12},
{21, 21, 0, 23, 123, 45},
{123, 3},
{123, -5, 4, -3},
{-1, -2, -3}
};
int rowsWithNegativeElementsCount = 0;
for (int[] arr : a) {
if (arrayHasNegativeElements(arr)) {
rowsWithNegativeElementsCount ++;
}
}
System.out.println("Rows With Negative Elements Count = " + rowsWithNegativeElementsCount);
}
static boolean arrayHasNegativeElements(int[] array) {
for (int number : array) {
if (number < 0) {
return true;
}
}
return false;
}
Роҳҳои зиёде барои навиштани як чиз. Кадомашро интихоб кардан лозим аст? Дар барномасозии саноатӣ, ин масъала бо осонии фаҳмидани code ҳал карда мешавад. Чӣ қадаре ки соддатар навишта шавад, ҳамон қадар беҳтар аст. Чӣ қадаре ки ҳалқаҳои лона ҷойгир бошанд, дарк кардани code ҳамон қадар мушкилтар мешавад. Хусусан, агар ҳалқаҳо бо тамғакоғазҳои гуногун ишора шуда бошанд, ки онҳо дар танаффусҳо ва идома ( break
ва continue
) истифода мешаванд. Агар имконпазир бошад, ки тегҳоро истифода набаред, ин корро кардан беҳтар аст. Дар акси ҳол, кӯшиш кунед, ки ҳарчи равшан ва зебо нависед.
рафтан
Дар баъзе забонҳои барномасозӣ оператор мавҷуд астgoto
. Одатан, он иҷрои codeро ба як қисми барномае, ки бо тамғагузорӣ ишора шудааст, равона мекунад. Аммо дар Java goto
метавон гуфт, ки ин аст ва нест. Биёед инро фаҳмем. Рӯйхати калимаҳои калидӣ дар Java калимаи goto
. Аммо, ин изҳорот ҳамчун истифоданашуда қайд карда мешавад. Гап дар он аст, ки Ҷеймс Гослинг, созандаи забони Java, дар аввал дастгирии операторро дар JVM дохил карда буд goto
. Аммо, ин хусусият баъдтар қатъ карда шуд. Яке аз сабабҳо дар он аст, ки блокҳои codeи дорои оператор goto
на ҳамчун блокҳои codeе, ки як вазифаро иҷро мекарданд, вале бидуни goto
, балки бо равишҳои алтернативӣ ( break
, continue
, ҷойгиркунии блоки code дар усулҳо) қобor хондан набуданд. Дар асл, дигарон буданд, ба монанди:
- душвории хондан ва фаҳмидани codeе, ки дорои операторҳо мебошад
goto
; - мураккаб кардани оптимизатсияи code барои компилятор (ва баъзан ҳатто имконнопазир аст);
- зиёд кардани эҳтимолияти эҷоди хатогиҳои нозук дар code.
goto
хеле бомуваффақият кор мекунад. Аммо, барномасозон аз истифодаи он худдорӣ мекунанд. Шумо метавонед дар бораи сабабҳои ин дар як мақолаи Habré хонед . goto
Аммо чаро онро дар рӯйхати калимаҳои ҳифзшуда тарк кунед ? Ин оддӣ аст: барои оянда. Агар, масалан, тағирёбандаҳо, усулҳо ё синфҳо дар codeи Java-и таҳиягарон дар тамоми ҷаҳон номида шаванд goto
, агар ин изҳорот дар versionи ояндаи Java баргардонида шавад, ҳама рамзи кӯҳна мешиканад. Барои пешгирӣ кардани чунин сенария, goto
он дар рӯйхати калимаҳои калидии Java боқӣ мемонад, аммо ягон функсия надорад. Шояд рӯзе goto
ба сафи мо баргардад, аммо эҳтимоли ин кам аст.
Натиҷаҳо
Мо операторҳои гуногуни ҷаҳишро дар Java дида баромадем:return
— анҷом додани усул, баргардонидани арзиш аз усул.- бо арзиши бозгашт: усулҳое, ки арзишҳоро бармегардонанд;
- арзиши бозгашт нест:
void
усулҳои.
break
— боздоштани циклхо, блокхои коммутаторй.- бо барчаспҳо: давраҳои лонаҳои гуногун;
- бе тамғакоғазҳо: шохаҳои коммутаторӣ аз блок; халалдор кардани ҳалқае, ки дар он даъват карда шудааст.
continue
.- бо барчаспҳо: давраҳои лонаҳои гуногун;
- бе тамғакоғазҳо: идомаи ҳалқае, ки дар он даъват шуда буд.
goto
.- дар рӯйхати калимаҳои калидӣ мавҷуд аст, аммо истифода намешавад.
GO TO FULL VERSION