JavaRush /Java блогы /Random-KK /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болуы қолайлы, бірақ талап етілмейді . Мұны төмендегі мысалдармен қарастырайық: 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);
}

жапсырмалар

breakжәне операторларын қарастырмас бұрын continueмен Java тіліндегі белгілер туралы айтқым келеді. Бұл маңызды, себебі кейбір жағдайларда breakжәне операторлар continueбелгілермен бірге қолданылады. Бірақ алдымен бұл code құрастырылады ма деген сұраққа жауап беріп көріңіз:
public static void main(String[] args) {
    https://www.google.com/
    System.out.println("Interesting...");
}
Белгі — аталған code бөлігі. Жапсырманың өзі ешқандай функционалдылықты қамтамасыз етпейді. Бұл бағдарламашы кейінірек пайдаланғысы келетін codeтағы бетбелгі сияқты нәрсе. Кодтағы белгі өте қарапайым - атау және қос нүкте арқылы анықталады. Мысалы:
  • labelName:
  • outerLoop:
  • printing:
  • anyWordYouLike:
Жапсырмалар Java codeының ішінде осылай көрінеді:
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. Switch-regis блогындағы кез келген орындау тармағын аяқтау үшін.
  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Бұл белгілі бір шарттарды қанағаттандыратын элементтерде кейбір әрекеттерді орындау қажет болған жағдайда пайдалы болуы мүмкін. Бізде жол бар делік және біз «m» әрпінен басталатын сөздердің санын санағымыз келеді:
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
Айта кету керек, операторлар 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болып табылады . Және белгімен белгіленген циклдің ағымдағы итерациясын өткізіп жібереді. Кейбір жағдайларда сіз біреуін екіншісімен ауыстыра аласыз және бағдарламаның функционалдық мүмкіндіктерінің барлығы бірдей болып қалады. Біз нені таңдаған дұрыс (спойлер: codeты оқу мүмкіндігі) туралы төменде сөйлесеміз. Операторды тек жапсырмамен ғана емес, сонымен қатар -мен де ауыстыруға болады . Бұған дейін кірістірілген циклды бөлек әдіске жылжыту керек: 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;
}
Бірдей нәрсені жазудың көптеген жолдары. Қайсысын таңдау керек? Өнеркәсіптік бағдарламалауда бұл мәселе codeты түсінудің қарапайымдылығымен шешіледі. Ол неғұрлым қарапайым жазылса, соғұрлым жақсы. Кірістірілген циклдар неғұрлым көп болса, codeты қабылдау соғұрлым қиын болады. breakӘсіресе, ілмектер әртүрлі белгілермен белгіленген болса, олар үзілістер мен жалғастыруда ( және ) қолданылады continue. Tagтерді пайдаланбау мүмкін болса, мұны істеген дұрыс. Әйтпесе, мүмкіндігінше анық және әдемі жазуға тырысыңыз.

бару

Кейбір бағдарламалау тілдерінде оператор бар goto. Әдетте ол codeтың орындалуын белгімен белгіленген бағдарламаның қандай да бір бөлігіне қайта бағыттайды. Бірақ Java-да gotoбұл бар және олай емес деп айтуға болады. Оны анықтап көрейік. Java тіліндегі кілт сөздердің тізімінде сөз бар goto. Дегенмен, бұл мәлімдеме пайдаланылмаған деп белгіленген. Java тілін жасаушы Джеймс Гослинг бастапқыда JVM жүйесіндегі операторға қолдау көрсеткені goto. Алайда, бұл функция кейінірек жойылды. Себептердің бірі мынада: операторы бар code блоктары gotoбірдей функцияларды орындайтын, бірақ жоқ goto, бірақ балама тәсілдермен ( break, continue, code блогын әдістерде орналастыру) орындалатын code блоктары сияқты оқылмайтын болды. Іс жүзінде басқалары болды, мысалы:
  • операторларды қамтитын codeты оқу және түсіну қиындықтары goto;
  • компилятор үшін codeты оңтайландыруды қиындатады (кейде тіпті мүмкін емес);
  • codeта нәзік қателер жасау ықтималдығын арттыру.
gotoКейбір бағдарламалау тілдерінде оператор сәтті жұмыс істейтіні көпшілікке құпия емес . Дегенмен, бағдарламашылар оны пайдаланудан бас тартады. Мұның себептері туралы Хабредегі бір мақаладан оқи аласыз . Бірақ неге оны gotoсақталған сөздер тізімінде қалдыру керек? Бұл қарапайым: болашақ үшін. Егер, мысалы, айнымалылар, әдістер немесе сыныптар бүкіл әлем бойынша әзірлеушілердің Java codeында шақырылса, gotoбұл мәлімдеме Java-ның болашақ нұсқасында қайтарылса, барлық ескі code бұзылады. Мұндай сценарийді болдырмау үшін gotoол Java кілт сөздерінің тізімінде қалады, бірақ ешқандай функционалдылықты қамтамасыз етпейді. Бәлкім, бір күні gotoол біздің қатарымызға оралады, бірақ оның ықтималдығы төмен.

Нәтижелер

Біз Java тіліндегі әртүрлі секіру операторларын қарастырдық:
  1. return— әдісті аяқтау, әдістен мәнді қайтару.
    • қайтарылатын мәнмен: мәндерді қайтаратын әдістер;
    • қайтару мәні жоқ: voidәдістер.
  2. break— циклдардың, коммутатор-кап блоктарының үзілуі.
    • тегтермен: әртүрлі ұя салу циклдері;
    • жапсырмасыз: блоктың коммутаторлы тармақтары; ол шақырылған циклды үзу.
  3. continue.
    • тегтермен: әртүрлі ұя салу циклдері;
    • белгілерсіз: ол шақырылған циклдің жалғасы.
  4. goto.
    • кілт сөздер тізімінде бар, бірақ пайдаланылмайды.
Мұның бәрінен шығатын қорытынды қарапайым: codeты оқуды жеңілдететін қарапайым тәсілдерге артықшылық берген дұрыс. Кодыңызды көптеген белгілермен, үзілістермен және жалғастырулармен бір-бірінің ішіне салынған көп деңгейлі циклдармен шамадан тыс жүктемеуге тырысыңыз.
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION