source

System.out.println을 사용하지 않는 한 끝이 없는 것처럼 보이는 루프가 종료됩니다.

factcode 2022. 12. 25. 09:42
반응형

System.out.println을 사용하지 않는 한 끝이 없는 것처럼 보이는 루프가 종료됩니다.

단순한 코드를 가지고 있었는데 그 코드들은 끝없는 루프로 되어있었고x 더 될 것입니다.j

int x = 5;
int y = 9;
for (int j = 0; j < x; j++) {
   x = x + y;
}
System.out.println(y);

그대로, 그대로, 그대로 인쇄가 있습니다.y끝없이 루프되지 않습니다.을 사용하다이렇게 요, '다', '다', '다', '다', '다', '다', 다', '다'

int x = 5;
int y = 9;
for (int j = 0; j < x; j++) {
    x = x + y;
    System.out.println(y);
}
System.out.println(y);

끝없는 루프가 되는데 왜 그런지 모르겠어요.Java는 엔드리스 루프를 인식하고 첫 번째 상황에서는 건너뛰지만 두 번째 상황에서는 메서드 호출을 실행하여 예상대로 동작해야 합니까?혼란스러움:)

두 예 모두 끝이 없는 것은 아니다.

는 '한계'입니다.int자바(Java)「」의 값이 x0x7fffffff """는 ""로 표시됩니다.x 음이 되므로 음이 되거나, 음이 되다보다 .j.

와 두 은 내부 가 훨씬 더 코드가 더 오래 걸리고 내부 코드가 더 오래 수 입니다.x에서는 두 될 수 는 효과가.첫 번째 예에서는 두 번째보다 짧은 시간이 걸릴 수 있습니다.또한 이 코드는 효과가 없기 때문에 옵티마이저에 의해 삭제될 가능성이 높습니다.

여기서 설명한 것처럼 시간은 OS가 출력을 어떻게 버퍼링하는지, 터미널 에뮬레이터로 출력하는지 등에 따라 크게 달라지기 때문에 몇 분보다 훨씬 길어질 수 있습니다.

이들은 int로 선언되기 때문에 최대값에 도달하면 x 값이 음수가 되므로 루프가 끊어집니다.

그러나 System.out.println이 루프에 추가되면 실행 속도가 표시됩니다(콘솔로 출력하면 실행 속도가 느려집니다).단, 두 번째 프로그램(루프 내에 syso가 있는 프로그램)을 충분히 오래 실행하면 첫 번째 프로그램(루프 내에 syso가 없는 프로그램)과 같은 동작이 됩니다.

여기에는 다음 두 가지 이유가 있습니다.

  1. 는 Java를 합니다.for" " "는되지 않기 에 " "는 사용되지 .x루프를 삭제하기만 하면 됩니다.이것을 확인할 수 있습니다.System.out.println(x);스테이트먼트를 지정합니다.

  2. 가 실제로 하지 않고 , 최종적으로는 Java가 루프를 최적화하고 있을 이 있습니다.x에 비해 너무 커진다int넘칩니다.대부분의 경우 정수 오버플로가 정수를 만듭니다.xj보다 작기 때문에 루프에서 나와 값을 인쇄합니다.y. 이 또한 다음을 추가하여 확인할 수 있습니다.System.out.println(x);루프가 끝난 후.

또한 첫 번째 경우에도 결국 오버플로가 발생하기 때문에 두 번째 케이스가 되기 때문에 진정한 무한 루프가 되지 않습니다.

J< 0으로, x= 0으로, x+)는 최대값(j++)를 초과하는 정수(J++)는 최대값으로 실행될 때, 최대값을 초과하면 최대값(J+ 유형e는 저장에 사용되었습니다.두 번째 예에서는 루프가 끊어질 때까지 y 값만 출력합니다.

엔드리스 루프의 예를 찾고 있는 경우는, 다음과 같이 됩니다.

int x = 6;

for (int i = 0; x < 10; i++) {
System.out.println("Still Looping");
}

왜냐하면 (x)는 결코 10의 값에 도달하지 않을 것이기 때문이다.

또한 이중 for 루프를 사용하여 무한 루프를 생성할 수도 있습니다.

int i ;

  for (i = 0; i <= 10; i++) {
      for (i = 0; i <= 5; i++){
         System.out.println("Repeat");   
      }
 }

첫 번째 for 루프가 i < 10이라고 되어 있기 때문에 이 루프는 무한합니다.이것은 참이기 때문에 두 번째 for 루프로 들어가고 두 번째 for 루프는 (i)의 값이 == 5가 될 때까지 증가합니다.그런 다음 i < 10 이므로 다시 첫 번째 for 루프에 들어갑니다.두 번째 for 루프 후에 리셋되기 때문에 프로세스는 계속 반복됩니다.

유한 루프입니다. 왜냐하면 한 때,x상회하다2,147,483,647(이것은, 1개의 데이터 베이스의 최대치입니다.int),x음이 되고 다음보다 크지 않게 된다.jy를 인쇄하든 안 하든 더 이상 사용할 수 없습니다.

의 값을 변경할 수 있습니다.y로.100000및 인쇄y루프가 곧 끊어질 겁니다

이게 무한해졌다고 느끼는 이유는System.out.println(y);동작 없는 경우보다 코드가 실행되는 속도가 훨씬 느립니다.

흥미로운 문제 사실 두 경우 모두 루프가 끝없는 것은 아닙니다.

하지만 이 둘의 주요 차이점은 언제 종료될지, 그리고 얼마나 시간이 걸릴지입니다.x최대값을 초과해야 합니다.int가치관2,147,483,647그 후 오버플로 상태가 되어 루프가 종료됩니다.

이 문제를 이해하는 가장 좋은 방법은 간단한 예를 테스트하고 결과를 유지하는 것입니다.

:

for(int i = 10; i > 0; i++) {}
System.out.println("finished!");

출력:

finished!
BUILD SUCCESSFUL (total time: 0 seconds)

이 무한 루프를 테스트한 후 종료하는 데 걸리는 시간은 1초 미만입니다.

for(int i = 10; i > 0; i++) {
    System.out.println("infinite: " + i);
}
System.out.println("finished!");

출력:

infinite: 314572809
infinite: 314572810
infinite: 314572811
.
.
.
infinite: 2147483644
infinite: 2147483645
infinite: 2147483646
infinite: 2147483647
finished!
BUILD SUCCESSFUL (total time: 486 minutes 25 seconds)

이 테스트 케이스에서는, 프로그램의 종료와 실행 종료에 걸리는 시간의 큰 차이를 알 수 있습니다.

이이 없고 까지 몇 .i 치치 value.

마지막으로 루프용으로 프린트 스테이트먼트를 내부에 넣은 후, 프린트 스테이트먼트가 없는 첫 번째 케이스에서는 루프보다 시간이 더 걸린다는 결론을 내렸습니다.

프로그램을 실행하는 데 걸리는 시간은 사용하시는 컴퓨터의 사양(프로세서 용량), 운영체제 및 프로그램을 컴파일하는 IDE에 따라 달라집니다.

이 케이스는 다음에 대해 테스트 대상:

Lenovo 2.7GHz 인텔 Core i5

OS : Windows 8.1 64x

IDE: NetBeans 8.2

프로그램을 완료하는 데 약 8시간(486분)이 소요됩니다.

, 「 loop」의하는 것을 알 수 .i = i + 1는 최대 int 값에 도달하는 데 매우 느린 요인입니다.

이 계수를 변경하여 스텝의 증분을 보다 빠르게 하여 짧은 시간에 루프를 테스트할 수 있습니다.

라라 i = i * 10★★★★★★★★★★★★★★★★★★:

for(int i = 10; i > 0; i*=10) {
           System.out.println("infinite: " + i);
}
     System.out.println("finished!");

출력:

infinite: 100000
infinite: 1000000
infinite: 10000000
infinite: 100000000
infinite: 1000000000
infinite: 1410065408
infinite: 1215752192
finished!
BUILD SUCCESSFUL (total time: 0 seconds)

보시다시피 이전 루프에 비해 매우 빠릅니다.

프로그램을 종료하고 실행하는 데 1초 미만이 소요됩니다.

이 테스트 예시를 보면 문제를 명확히 하고 즈비넥 비스코브스키의 타당성을 입증해야 한다고 생각합니다.kvr000의 답변도 이 질문에 대한 답변이 될 것입니다.

언급URL : https://stackoverflow.com/questions/41972103/seemingly-endless-loop-terminates-unless-system-out-println-is-used

반응형