JavaRush /Блоги Java /Random-TG /Операторҳои ҷаҳиш дар Java

Операторҳои ҷаҳиш дар Java

Дар гурӯҳ нашр шудааст
Салом! Имрӯз мо дар бораи операторҳои ҷаҳиш дар Java сӯҳбат хоҳем кард:
  • return
  • break
  • continue
  • goto
Аввалан, биёед муайян кунем, ки он воқеан чист. Чунон ки маълум аст, дар вазъияти муътадил программа ба таври хаттй — аз боло ба поён, бо фармони команда ичро карда мешавад. Ҷараёни хаттии барномаро метавон бо номи сохторҳои идоракунӣ тағйир дод: масалан, шохаҳо ( if) ва ҳалқаҳо ( for, whileва ғ.). Ба ѓайр аз конструксияњои идоракунї, иљрои хаттии барномаро тавассути баёнияњои гузариш таѓйир додан мумкин аст. Онҳо барои бозгардонидани иҷрои барнома ба макони мушаххас масъуланд, ки аз контекст ва изҳороти мушаххас вобаста аст. Операторҳои ҷаҳиш дар Java - 1Биёед ба ҳар як чор оператор бодиққат назар кунем.

бозгашт

Маҳз ҳамин оператор аст, ки навомадагон бештар бо аввал шинос мешаванд. Изҳорот returnусули даъватшударо қатъ мекунад ва иҷрои барнома ба маконе бармегардад, ки метод аз он даъват шуда буд. Он returnду шакл дорад:
  1. Дарҳол иҷрои усулро хотима медиҳад.
  2. Иҷрои усулро фавран ба итмом мерасонад ва дар натиҷаи усул баъзе арзишҳоро бармегардонад.
Синтаксиси ҳарду шакл ин аст:
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:
Ва ин аст, ки тамғакоғазҳо дар дохor codeи Java чунинанд:
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дар ду ҳолат истифода мешавад:
  1. Барои анҷом додани ҳама гуна шохаи иҷро дар блоки коммутатсионӣ.
  2. Барои боздоштани иҷрои як ҳалқа.
Оператор ду шакл дорад: бо аломатгузорӣ (тамга) ва бе. Синтаксиси ҳарду шакл ин аст:
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такрори ҷорӣро қатъ мекунад ва боиси оғоз шудани навбатии мегардад. Операторҳои ҷаҳиш дар Java - 2Ин метавонад муфид бошад, агар ба шумо лозим ояд, ки баъзе амалиётҳоро дар элементҳое, ки шартҳои муайянро қонеъ мекунанд, иҷро кунед. Фарз мекунем, ки мо сатр дорем ва мо мехоҳем шумори калимаҳоеро, ки бо ҳарфи "м" сар мешаванд, ҳисоб кунем:
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 дида баромадем:
  1. return— анҷом додани усул, баргардонидани арзиш аз усул.
    • бо арзиши бозгашт: усулҳое, ки арзишҳоро бармегардонанд;
    • арзиши бозгашт нест: voidусулҳои.
  2. break— боздоштани циклхо, блокхои коммутаторй.
    • бо барчаспҳо: давраҳои лонаҳои гуногун;
    • бе тамғакоғазҳо: шохаҳои коммутаторӣ аз блок; халалдор кардани ҳалқае, ки дар он даъват карда шудааст.
  3. continue.
    • бо барчаспҳо: давраҳои лонаҳои гуногун;
    • бе тамғакоғазҳо: идомаи ҳалқае, ки дар он даъват шуда буд.
  4. goto.
    • дар рӯйхати калимаҳои калидӣ мавҷуд аст, аммо истифода намешавад.
Хулоса аз ин ҳама оддӣ аст: беҳтар аст, ки ба равишҳои соддатарин бартарӣ диҳед, ки хондани codeро осонтар мекунанд. Кӯшиш кунед, ки рамзи худро бо ҳалқаҳои бисёрсатҳи дар дохor якдигар ҷойгиршуда бо миқдори зиёди аломатҳо, қатъҳо ва идомаҳо пур накунед.
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION