Почему результат этого кода равен 234, а не 23?

#java

#java

Вопрос:

Поэтому у меня может быть не очень четкое представление о том, как работают циклы while. Но я ожидал, что результат этого кода будет 23 вместо 234. Я думал, что оператор x ; находящийся перед печатью x, сделает так, что цикл завершится сразу, когда x станет 4, но это не так, он просто продолжает работать, выполняется путем печати x, которая становится 4, а затем заканчивается.

Я думаю, это всего лишь правила Java, но это кажется нелогичным. Может быть, оператор break будет в порядке?

 void printNums(){
  int x = 1;
  int y = 0;
  while(x != 4){
    while(y < 0){
      System.out.print(y);
      y  ;
    } 
    x  ;
    System.out.print(x);
  } 
  System.out.print(" ") 
} 
  

Комментарии:

1. y никогда не было < 0, этот второй цикл while никогда не выполнялся, поэтому выполняется только while of x . Когда x == 4 цикл заканчивается там, дальше не идет.

Ответ №1:

Я думал, что оператор x ; находящийся перед печатью x, сделает так, чтобы цикл заканчивался сразу, когда x становится 4

Это то, что вы неправильно понимаете. Все тело цикла всегда выполняется на каждой итерации (если вы не прерываете или не возвращаетесь из него, или не выходите из него другим способом).

 while (x != 4) {
    ...
    x  ; <-- Java doesn't "watch" x. If x becomes 4, next statement will still run
    System.out.print(x);
}
  

Условие цикла ( x != 4 ) выполняется в начале каждой итерации. Только когда выполняется все тело цикла, условие вычисляется снова, чтобы проверить, следует ли его запускать еще раз. x не «просматривается» так, что всякий раз, когда оно становится 4, break; выполняется автоматически. Если вам это нужно, вы должны явно завершить цикл самостоятельно.

Ответ №2:

Условие цикла не проверяется постоянно. Он проверяется только каждый раз, когда начинается новая итерация.

Когда x равно 3 и x выполняется, x становится 4, но условие цикла проверяется не сразу. Остальная часть цикла ( System.out.println строка) все равно будет выполнена. Условие цикла проверяется только тогда, когда текущая итерация завершается ( } достигается), и вот-вот начнется новая итерация. И в этот момент x оказывается, что равно 4, и цикл останавливается.

Если вы хотите, чтобы условие цикла проверялось при каждом изменении x , вам нужно написать проверки вручную:

 while(x != 4){
    x  ;
    if (x == 4) break;
    System.out.print(x);
} 
System.out.print(" ");
  

Обратите внимание, что y это никогда не меньше 0, поэтому внутренний цикл while никогда не выполняется.

Ответ №3:

 Before going to for loop 
x =1
y=0 
Fist iteration -
y= 0 , so never go to internal while loop
x  
x=2 , so print 2 

second iteration -
x =2
y=0 

y= 0 , so never go to internal while loop
x  
x=3 , so print 3

Third iteration -

x =3
y=0 

y= 0 , so never go to internal while loop
x  
x=4 , so print 4

but now x=4 , means 4!=4 false, so outer loop ends...
  

следовательно, в консоли вы увидите вывод 2 3 4.

Ответ №4:

  1. На первой итерации x = 1, поскольку y = 0, цикл while для (y <0) никогда не выполняется. Затем x увеличивает значение x, и теперь x равно 2.

  2. На второй итерации x = 2, которая отличается от 4, цикл while для (y<0) снова игнорируется. Затем x увеличивает значение x, и теперь x равно 3.

  3. На третьей итерации x = 3, которая отличается от 4, цикл while для (y<0) снова игнорируется. Затем x увеличивает значение x, и теперь x равно 4.

Затем, поскольку x = 4, цикл while (x! = 4) принимает значение false, и цикл останавливается.

Следовательно, вы получаете 234.

Комментарии:

1. Если вы хотите получить 23, вы можете сделать следующее: void printNums(){ int x = 1; int y = 0; while(x < 3){ —- Это игнорируется все время, так как y = 0, а 0 не меньше 0, равно. while(y < 0){ System.out.print(y); y ; } x ; System.out.print(x); } System.out.print(» «) ; } Надеюсь, это поможет.