JavaRush /جاوا بلاگ /Random-SD /جاوا ۾ جمپ آپريٽرز

جاوا ۾ جمپ آپريٽرز

گروپ ۾ شايع ٿيل
سلام! اڄ اسان جاوا ۾ جمپ آپريٽرز بابت ڳالهائينداسين:
  • return
  • break
  • continue
  • goto
پهرين، اچو ته وضاحت ڪريون ته اهو اصل ۾ ڇا آهي. جئين توهان کي خبر آهي، هڪ عام صورتحال ۾، هڪ پروگرام کي لڪير سان لڳايو ويندو آهي - مٿين کان هيٺ تائين، حڪم ذريعي حڪم. پروگرام جي لڪير جي وهڪري کي تبديل ڪري سگهجي ٿو نام نهاد ڪنٽرول ڍانچي: مثال طور، شاخون ( if) ۽ لوپس ( for، whileوغيره). ڪنٽرول ڍانچي جي اضافي ۾، هڪ پروگرام جي لڪير تي عملدرآمد جمپ بيانن سان تبديل ٿي سگهي ٿو. اهي ذميوار آهن پروگرام جي عمل کي هڪ مخصوص هنڌ ڏانهن منتقل ڪرڻ، جيڪو انحصار ۽ مخصوص بيان تي منحصر آهي. جاوا ۾ جمپ آپريٽرس - 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)، اھو قابل قبول آھي، پر گھربل نه آھي، گھٽ ۾ گھٽ ھڪڙي بيان کي 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، مان جاوا ۾ ليبل بابت ڳالهائڻ چاهيندس. اهو ضروري آهي ڇو ته ڪجهه حالتن ۾، break۽ آپريٽر continueاستعمال ڪيا ويندا آهن ليبل سان گڏ. پر پهرين، سوال جو جواب ڏيڻ جي ڪوشش ڪريو ته ڇا هي ڪوڊ گڏ ڪندو:
public static void main(String[] args) {
    https://www.google.com/
    System.out.println("Interesting...");
}
هڪ ليبل ڪوڊ جو هڪ نالي وارو ٽڪرو آهي. ليبل پاڻ کي ڪا به ڪارڪردگي مهيا نٿو ڪري. هي ڪوڊ ۾ هڪ بک مارڪ وانگر آهي جيڪو پروگرامر بعد ۾ استعمال ڪرڻ جو ارادو رکي ٿو. ڪوڊ ۾ هڪ ليبل بلڪل سادو بيان ڪيو ويو آهي - نالي ۽ ڪولن ذريعي. مثال طور:
  • 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:"نشان" ٻه چڪر - بيروني ۽ اندروني. اسان هيٺ ڏنل سيڪشن ۾ ليبل استعمال ڪرڻ تي نظر ڪنداسين. ساڳئي وقت ۾، جيڪڏهن توهان جواب ڏنو ته "نه" سوال جو ڇا هي ڪوڊ مرتب ڪندو:
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موجوده ورهاڱي ۾ مداخلت ڪري ٿو ۽ ايندڙ کي شروع ڪرڻ جو سبب بڻائيندو آهي. جاوا ۾ جمپ آپريٽرس - 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);
}
ھن ڪوڊ تي عمل ڪرڻ کان پوءِ ڪنسول ۾ ھيٺيون ٻاھر نڪرندو:
Кол-во слов, начинающихся с буквы М в предложении: [Мама мыла раму] = 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);
}
هن ڪوڊ جي پيداوار ٿي ويندي:
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۽ فرق اهو آهي جيڪو لوپ جي ورهاڱي کي مڪمل ڪري ٿو جنهن ۾ اهو لکيل آهي. ۽ هڪ ليبل سان، ليبل سان نشان لڳل چڪر جي موجوده تکرار کي ڇڏي ٿو. ڪجھ حالتن ۾، توھان ھڪڙي کي ٻئي سان تبديل ڪري سگھو ٿا، ۽ پروگرام جي ڪارڪردگي ۾ سڀ ڪجھ ساڳيو رھندو. اسان ان بابت ڳالهائينداسين جيڪو چونڊڻ لاءِ بهترين آهي (اسپائلر: ڪوڊ پڙهڻ جي صلاحيت) هيٺ. آپريٽر کي تبديل ڪري سگهجي ٿو نه رڳو هڪ ليبل سان، پر پڻ . بس ان کان اڳ توھان کي گھربل لوپ ھڪڙي الڳ طريقي سان منتقل ڪرڻ جي ضرورت آھي. 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;
}
ساڳي شيء لکڻ جا ڪيترائي طريقا. جنهن کي چونڊڻ لاء؟ صنعتي پروگرامنگ ۾، اهو مسئلو ڪوڊ کي سمجهڻ جي آسانيء سان فيصلو ڪيو ويو آهي. جيترو سادو لکجي، اوترو بهتر. وڌيڪ nested loops، وڌيڪ ڏکيو اهو ڪوڊ سمجهڻ آهي. خاص طور تي جيڪڏهن لوپ مختلف نشانين سان نشان لڳل آهن، جيڪي مداخلت ۽ تسلسل ۾ استعمال ڪيا ويا آهن ( break۽ continue). جيڪڏهن اهو ممڪن آهي ته ٽيگ استعمال نه ڪيو وڃي، اهو ڪرڻ بهتر آهي. ٻي صورت ۾، ممڪن طور تي واضح ۽ خوبصورت لکڻ جي ڪوشش ڪريو.

وڃ

ڪجھ پروگرامنگ ٻولين ۾ ھڪڙو آپريٽر آھي goto. عام طور تي اهو ڪوڊ ايگزيڪيوشن کي ليبل سان نشان لڳل پروگرام جي ڪجهه حصي ڏانهن منتقل ڪري ٿو. پر جاوا ۾ goto، ھڪڙو چئي سگھي ٿو، اھو آھي ۽ اھو نه آھي. اچو ته ان جو اندازو لڳايو. جاوا ۾ لفظن جي لسٽ ۾ لفظ شامل آھي goto. بهرحال، هي بيان نشان لڳل آهي جيئن استعمال نه ڪيو ويو آهي. حقيقت اها آهي ته جيمس گوسلنگ، جاوا ٻولي جو خالق، شروعات ۾ JVM ۾ آپريٽر جي مدد شامل ڪئي goto. بهرحال، اها خاصيت بعد ۾ ڪٽي وئي. انهن مان هڪ سبب اهو آهي ته ڪوڊ جا بلاڪ جيڪي آپريٽر تي مشتمل هوندا هئا، gotoايترا پڙهڻ لائق نه هوندا هئا جيئن ڪوڊ جا بلاڪ جيڪي ساڳيا ڪم سرانجام ڏين پر بغير goto، پر متبادل طريقن سان ( break،، continueڪوڊ بلاڪ کي طريقن ۾ رکڻ). اتي، حقيقت ۾، ٻيا هئا، جهڙوڪ:
  • ڪوڊ پڙهڻ ۽ سمجهڻ ۾ مشڪل جنهن ۾ آپريٽر شامل آهن goto؛
  • کمپائلر لاءِ پيچيده ڪوڊ جي اصلاح (۽ ڪڏهن ڪڏهن ناممڪن)؛
  • ڪوڊ ۾ ذيلي غلطيون پيدا ڪرڻ جو امڪان وڌائڻ.
اهو ڪيترن ئي لاء ڪو به راز ناهي ته ڪجهه پروگرامنگ ٻولين ۾ آپريٽر gotoڪافي ڪاميابي سان ڪم ڪري ٿو. بهرحال، پروگرامر ان کي استعمال ڪرڻ کان پاسو ڪندا آهن. توهان هن جي سببن جي باري ۾ پڙهي سگهو ٿا Habré تي هڪ مضمون ۾ . پر پوءِ ان کي gotoمحفوظ لفظن جي لسٽ ۾ ڇو ڇڏيو؟ اهو سادو آهي: مستقبل لاء. جيڪڏهن، مثال طور، متغير، طريقا، يا طبقن کي سڏيو وڃي ٿو، ڊولپرز جي جاوا ڪوڊ ۾ سڄي دنيا ۾ goto، جيڪڏهن اهو بيان Java جي مستقبل جي ورزن ۾ واپس ڪيو وڃي، سڀ پراڻو ڪوڊ ڀڄي ويندو. اهڙي صورتحال کان بچڻ لاء، gotoاهو Java keywords جي فهرست ۾ رهي ٿو، پر ڪا به ڪارڪردگي نه رکندو آھي. شايد ڪنهن ڏينهن gotoهو اسان جي صفن ۾ واپس اچي، پر ان جو امڪان گهٽ آهي.

نتيجا

اسان جاوا ۾ مختلف جمپ آپريٽرز کي ڏٺو آهي:
  1. return- طريقي جي مڪمل ٿيڻ، طريقي جي قيمت واپس ڪرڻ.
    • واپسي جي قيمت سان: طريقا جيڪي واپسي قدر؛
    • ڪابه واپسي قيمت: voidطريقا.
  2. break- چڪر جي مداخلت، سوئچ ڪيس بلاڪ.
    • ٽيگ سان: مختلف nesting جا چڪر؛
    • ليبل کان سواء: بلاڪ جي سوئچ ڪيس شاخون؛ ان لوپ ۾ مداخلت ڪرڻ جنهن ۾ ان کي سڏيو ويو.
  3. continue.
    • ٽيگ سان: مختلف nesting جا چڪر؛
    • بغير ليبل: لوپ جو تسلسل جنهن ۾ ان کي سڏيو ويندو هو.
  4. goto.
    • لفظن جي لسٽ ۾ آهي، پر استعمال نه ڪيو ويو آهي.
هن سڀني مان نتيجو سادو آهي: اهو بهتر آهي ته ترجيح ڏيو آسان ترين طريقن کي جيڪي ڪوڊ پڙهڻ لاء آسان بڻائين. ڪوشش نه ڪريو پنھنجي ڪوڊ کي اوورلوڊ ڪرڻ جي گھڻ-سطح لوپس سان ھڪ ٻئي جي اندر گھڻن نشانن، رڪاوٽن ۽ تسلسل سان.
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION