JavaRush /Java Blog /Random-TK /Java-da operatorlar

Java-da operatorlar

Toparda çap edildi
Salam! Bu gün Java-da bökmek operatorlary barada gürleşeris:
  • return
  • break
  • continue
  • goto
Ilki bilen, aslynda nämedigini kesgitläliň. Bilşiňiz ýaly, adaty ýagdaýda bir programma çyzykly ýerine ýetirilýär - ýokardan aşak, buýruk boýunça buýruk. Programmanyň çyzykly akymy dolandyryş gurluşlary diýlip atlandyrylyp bilner: mysal üçin şahalar ( if) we aýlawlar ( forwe whileş.m.). Dolandyryş gurluşlaryna goşmaça, programmanyň çyzykly ýerine ýetirilişi bökmek jümleleri bilen üýtgedilip bilner. Programmanyň ýerine ýetirilişine kontekste we anyk jümle bagly belli bir ýere gönükdirmek üçin jogapkärdirler. Java-da bökmek operatorlary - 1Dört operatoryň hersine has içgin seredeliň.

gaýdyp gel

Hut şu operator täze gelenler köplenç ilki bilen tanyşýarlar. Beýannama returnçagyrylan usuly ýatyrýar we programmanyň ýerine ýetirilişi usulyň çagyrylan ýerine gaýdyp gelýär. Iki returngörnüşi bar:
  1. Usulyň ýerine ýetirilişini derrew tamamlaýar.
  2. Usulyň ýerine ýetirilişini derrew tamamlaýar we usulyň netijesinde belli bir bahany yzyna berýär.
Iki görnüş üçin sintaksis:
return;
return value; // где value — некоторое возвращаемое meaning
Bahany yzyna gaýtaryp berýän usullar, returnçagyrylmagy kepillendirilen, yzyna gaýtaryş gymmaty bolan azyndan bir operator bolmaly we returnyzyna gaýtaryş gymmaty bolmadyk operator bolmaly däldir. Aşakdaky mysallara seredeliň:
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;
    }
}
Gymmatlygy (usullary) yzyna gaýtarmaýan usullarda , iň azyndan bir sözlemiň yzyna gaýtaryş gymmaty bolmazdan, yzyna gaýtaryş gymmaty bolan ýekeje sözlemiň voidbolmagy kabul ederliklidir, ýöne talap edilmeýär . Aşakdaky mysallar bilen seredeliň: returnreturn
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);
}

bellikleri

breakOperatorlara we operatorlara seretmezden ozal continueJava-daky ýazgylar hakda gürleşmek isleýärin. Bu möhümdir, sebäbi käbir ýagdaýlarda breakoperatorlar continuebellikler bilen bilelikde ulanylýar. Firstöne ilki bilen bu kod düzülýärmi diýen soraga jogap bermäge synanyşyň:
public static void main(String[] args) {
    https://www.google.com/
    System.out.println("Interesting...");
}
Bellik, koduň bir bölegi. Belligiň özi hiç hili işlemeýär. Bu, programmistiň soň ulanjak bolýan kodundaky bellik ýaly bir zat. Koddaky bellik gaty ýönekeý - at we sütün arkaly kesgitlenýär. Mysal üçin:
  • labelName:
  • outerLoop:
  • printing:
  • anyWordYouLike:
Etiketkalaryň Java kodunyň içindäki görnüşi:
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();
    }
}
Usulyň netijesi mainşeýle bolar:
Таблица Умножения
   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
definePrintNameAboveokardaky mysalda loop1:we loop2:bellikler. loop1:we loop2:iki aýlawy “belläň” - daşarky we içerki. Aşakdaky bölümdäki bellikleri ulanmaga serederis. Şol aralykda, bu kod düzülermi diýen soraga “ýok” diýip jogap beren bolsaňyz:
public static void main(String[] args) {
      https://www.google.com/
      System.out.println("Interesting...");
  }
IDE ulanyp, oňa ýene jogap bermäge synanyşyň.

arakesme

Operator breakiki ýagdaýda ulanylýar:
  1. Islendik ýerine ýetiriş şahasyny kommutator blokynda doldurmak.
  2. Bir aýlawyň ýerine ýetirilmegini kesmek.
Operatoryň iki görnüşi bar: bellikler (bellik) we daşynda. Iki görnüş üçin sintaksis:
break labelName; // Синтаксис оператора с меткой
break; // Синтаксис оператора без метки
Wyklýuçatel bloklarynda operator breaketiketkasyz ulanylýar:
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);
}
Aýlawlarda, breakkäbir şertler berjaý edilenden soň gaýtalanmalary kesmek üçin jümle ulanylýar. Bu köplenç bir massiw ýa-da elementler ýygyndysy bilen gaýtalanmaly we ondan zerur şertleri kanagatlandyrýan käbir element tapmaly bolanda tapylyp bilner. Geliň, bu mysaly gözden geçireliň. Bir massiwimiz bar we massiwde negatiw elementleriň bardygyny ýa-da ýokdugyny kesgitlemeli:
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;
   }
}
Geliň, şol bir mysala dürli aýlawlar bilen seredeliň. Sikl 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;
        }
    }
}
Sikl 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 ++;
    }
}
Sikl 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);
}
Aýlawlardaky sözlemiň başga bir mysaly, breakkäbir şertler berjaý edilende çäksiz aýlawy kesmekdir. Ine, ulanyjynyň “durmak” sözüne girýänçä ulanyjynyň girizen setirini görkezýän programmanyň mysaly:
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);
    }
}
breakOperatory bellik bilen bilelikde ulanmagy göz öňünde tutalyň . Bellik bilen arakesme birnäçe siklli ýagdaýlarda ulanylýar, üstesine-de biri beýlekisinde höwürtge döredýär. Bu ýagdaýda siklleriň biri (ýa-da ähli sikller) bellik bilen bellenýär. Ondan soň, operator breakbelligi görkezmek bilen islenýän aýlawy kesýär. Negativearamaz elementiň bardygyna, ýöne massiwde däl-de, matrisada barlygyna düşünmeli bir mysaly gözden geçireliň:
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;
               }
           }
       }
}

üznüksizlik

Operatoryň continueiki görnüşi hem bar - etiketkasyz we ýok:
continue; // форма оператора без метки
continue labelName; // форма оператора с меткой
breakAýlawyň galan gaýtalanmalaryny kesýän operatordan tapawutlylykda , operator continuehäzirki gaýtalanmagy kesýär we indiki biriniň başlamagyna sebäp bolýar. Java-da bökmek operatorlary - 2Belli bir şertleri kanagatlandyrýan elementler boýunça käbir amallary ýerine ýetirmek zerur bolsa, bu peýdaly bolup biler. Bir setir bar diýeliň we "m" harpyndan başlanýan sözleriň sanyny sanamak isleýäris:
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);
}
Bu kody ýerine ýetireniňizden soň, konsolda aşakdaky çykyş bolar:
Кол-во слов, начинающихся с буквы М в предложении: [Мама мыла раму] = 2
Operator continue, bellik bilen bilelikde elementleriň üstünde gaýtalananda hem ulanylýar. Geliň, negatiw elementler bilen hatar sanyny sanamaly matrisany göz öňüne getireliň:
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);
}
Bu koduň çykyşy:
Rows With Negative Elements Count = 3
breakOperatorlary we şol bir işlemegi continuegazanmak returnüçin dürli usullarda ulanyp boljakdygyny aýtmak gerek . continueŞeýlelikde, iň soňky mysaly täzeden ýazyp we ulanyp bilersiňiz 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);
}
Etiketkanyň arasyndaky breakwe tapawudy, ýazylan aýlawyň gaýtalanmalaryny tamamlaýan zat. Bellik bilen , bellik bilen bellenen sikliň häzirki gaýtalanmasyny geçiriň. Käbir ýagdaýlarda birini beýlekisine çalyşyp bilersiňiz we programmanyň işleýşindäki hemme zat öňküligine galar. Aşakda haýsysynyň saýlanmalydygy barada gürleşeris (spoiler: kod okalmagy). Operator diňe bir bellik bilen däl, eýsem çalşylyp bilner . Ondan öň öýjükli aýlawy aýratyn usula geçirmeli: continuebreakcontinuebreakcontinuereturn
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;
}
Şol bir zady ýazmagyň köp usuly. Haýsyny saýlamaly? Senagat programmirlemesinde bu mesele koda düşünmek aňsatlygy bilen çözülýär. Näçe ýönekeý ýazylsa, şonça gowy. Öýlenen aýlawlar näçe köp bolsa, kody kabul etmek şonça kyn. breakEsasanam aýlawlar arakesmelerde we dowamlarda ( we ) ulanylýan dürli ýazgylar bilen bellenen bolsa continue. Bellikleri ulanmazlyk mümkin bolsa, muny etmek has gowudyr. Otherwiseogsam, mümkin boldugyça aýdyň we owadan ýazmaga synanyşyň.

goto

Käbir programmirleme dillerinde operator bar goto. Adatça kod ýerine ýetirilişini bellik bilen bellenen programmanyň käbir bölegine gönükdirýär. Javaöne Java goto-da biri bar we beýle däl diýip biler. Geliň, düşüneliň. Java-da açar sözleriň sanawynda bu söz bar goto. Şeýle-de bolsa, bu jümle ulanylmaýar. Hakykat, Java dilini döreden Jeýms Goslingiň başda JVM-de operatora goldaw bermegi goto. Şeýle-de bolsa, bu aýratynlyk soň kesildi. Munuň sebäplerinden biri, operatory öz içine alýan kod bloklarynyň şol bir funksiýany ýerine ýetirýän, ýöne bolmasa , alternatiw çemeleşmeler bilen ( , kod blokyny usullara ýerleşdirmek) kod gotobloklary ýaly okalmazlygydyr . Aslynda beýlekiler bardy, meselem:gotobreakcontinue
  • operatorlary öz içine alýan kody okamakda we düşünmekde kynçylyk goto;
  • düzüji üçin kod optimizasiýasyny çylşyrymlaşdyrmak (we käwagt mümkin däl);
  • kodda inçe ýalňyşlyklary döretmek ähtimallygyny ýokarlandyrýar.
gotoKäbir programmirleme dillerinde operatoryň üstünlikli işleýändigi köplere syr däl . Şeýle-de bolsa, programmistler ony ulanmakdan saklanýarlar. Munuň sebäpleri barada Habre hakda bir makalada okap bilersiňiz . Thenöne näme üçin ony gotoätiýaçlyk sözleriň sanawynda goýmaly? Bu ýönekeý: gelejek üçin. Mysal üçin, bütin dünýäde döredijileriň Java kodunda üýtgeýjiler, usullar ýa-da synplar diýilse, gotobu jümle Java-yň geljekki wersiýasynda yzyna gaýtarylsa, ähli köne kod bozular. Şeýle ssenariýadan gaça durmak üçin gotoJava açar sözleriniň sanawynda galýar, ýöne hiç hili işlemeýär. Belki bir gün gotool ýene-de hatarymyza gaýdyp geler, ýöne munuň ähtimallygy pes.

Netijeler

Java-da dürli bökmek operatorlaryna göz aýladyk:
  1. return- usulyň tamamlanmagy, usuldan bahany yzyna gaýtarmak.
    • gaýtarma bahasy bilen: bahalary yzyna gaýtarýan usullar;
    • yzyna gaýtaryş gymmaty ýok: voidusullar.
  2. break- siklleriň kesilmegi, wyklýuçatel bloklary.
    • bellikler bilen: dürli höwürtge siklleri;
    • etiketkasyz: blokyň kommutator şahalary; diýilýän aýlawy kesmek.
  3. continue.
    • bellikler bilen: dürli höwürtge siklleri;
    • etiketkasyz: atlandyrylan aýlawyň dowamy.
  4. goto.
    • açar sözleriň sanawynda, ýöne ulanylmaýar.
Bularyň hemmesinden netije ýönekeý: kody okamagy aňsatlaşdyrýan iň ýönekeý çemeleşmelere ileri tutmak has gowudyr. Koduňyzy köp sanly bellikler, bökdençlikler we dowamlylyklar bilen biri-biriniň içinde ýerleşdirilen köp derejeli aýlawlar bilen ýüklemezlige çalşyň.
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION