Блокирует ли оператор continue весь код под ним, даже если он находится внутри оператора if? - PullRequest
0 голосов
/ 04 августа 2020

Вот мой код.

    public class TwinPrimeNumbers {
        
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            
            boolean isTwinPrime = false;
            int count = 0, countTwo = 0, countThree = 0;
            
            inner:
            for (int i = 1; i <= 100; i++) {
                
                for (int j = 1; j <= ((i + 2) / 2); j++) { 
                    
                    if (i % j == 0) 
                        count++; 
                    
                    if ((i + 2) % j == 0)
                        countTwo++; // 1
                }
                
                if (count >= 1 || countTwo >= 1) { // This part is having a problem.
                    continue inner;
                }
    
                else {
                    
                    for (int j = 1; j <= ((i + 1) / 2); j++) {
                        
                        if ((i + 1) % j == 0) {
                            countThree++;
                        }
                    }
                }
                isTwinPrime = (i + 2) - i == 2;
    
                if ( isTwinPrime == true && countThree >= 2 && count == 1 && countTwo == 1)
                    System.out.printf("Twin Primes: ( %d, %d ) %n", i, (i + 2));
                count = 0;
                countTwo = 0;
                countThree = 0;
            }
        }
    }

У меня проблема, когда этот оператор появляется в моем коде. В консоли нет вывода. Блокирует ли оператор continue другой приведенный ниже код?

**if (count >= 1 || countTwo >= 1) {
    continue inner;
}**

Потому что при запуске программы нет вывода.

Ответы [ 3 ]

1 голос
/ 04 августа 2020
Оператор

continue пропускает текущую итерацию l oop.

В вашем коде count >= 1 || countTwo >= 1 истинно для каждого значения i, поэтому оператор continue выполняется на каждой итерации внешнего l oop, и как только оператор continue выполняется, он возвращается к началу l oop, даже не выполняя приведенные ниже операторы. В конце концов, условие завершения l oop оценивается как false и, следовательно, l oop прерывается.

В вашем случае нет абсолютно никакого использования метки, потому что без метки ваш код будет выполняться точно так же так же, как и с этикеткой.

Также ваш лог c неверен. Вы можете упростить свой код, как показано ниже:

public class TwinPrimeNumbers {
    static boolean isPrime(int n) { 
        if (n <= 1) return false; 
  
        for (int i = 2; i < n; i++) 
            if (n % i == 0) return false; 
  
        return true; 
    } 
    
    public static void main(String args[]) {
        int primeOne = -1;
        
        for (int i = 1; i <= 100; i++) {
            // if current number is prime and the differene between
            // previously saved prime number and current number is 2, 
            // then we have a pair of Twin Primes 
            if (i - primeOne == 2 && TwinPrimeNumbers.isPrime(i)) {
                System.out.printf("Twin Primes: ( %d, %d ) %n", primeOne, i);
                // update primeOne
                primeOne = i;
            }
            // if previous condition is false and current number is prime,
            // save it in primeOne variable 
            else if (TwinPrimeNumbers.isPrime(i)) {
                primeOne = i;
            }
        }
    }
}

вывод:

Twin Primes: ( 3, 5 ) 
Twin Primes: ( 5, 7 ) 
Twin Primes: ( 11, 13 ) 
Twin Primes: ( 17, 19 ) 
Twin Primes: ( 29, 31 ) 
Twin Primes: ( 41, 43 ) 
Twin Primes: ( 59, 61 ) 
Twin Primes: ( 71, 73 ) 
0 голосов
/ 04 августа 2020

Привет и добро пожаловать в StackOverflow! Вариант использования

continue как goto на самом деле не рекомендуется, так как он представляет собой безусловный переход по коду.

В этом случае вы можете отказаться от лейбла, так как ваш оператор continue не входит более чем в один l oop. Код становится:

int count = 0, countTwo = 0, countThree = 0;
            
for (int i = 1; i <= 100; i++) {
   for (int j = 1; j <= ((i + 2) / 2); j++) {     
       if (i % j == 0) 
          count++; 
                    
       if ((i + 2) % j == 0)
          countTwo++; // 1
   }
   
   if (count >= 1 || countTwo >= 1) { // This part is having a problem.
      continue;
   }

...
.
0 голосов
/ 04 августа 2020

continue inner означает продолжение выполнения со следующей итерации l oop, помеченной inner, независимо от того, где находится этот оператор (кроме этого, он может появляться только внутри указанного l oop).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...