흥미로운 문제 실제로 두 경우 모두 루프는 끝이 없습니다
그러나 그들 사이의 주요 차이점은 언제 종료되고 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
값이 있는 오버플로 상태에 도달하는 데 몇 시간이 걸립니다 .
마지막으로 우리는 print 문을 for 루프 안에 넣은 후에 print 문이없는 첫 번째 경우에 루프보다 훨씬 더 많은 시간이 걸릴 것이라는 결론을 내 렸습니다.
프로그램을 실행하는 데 걸리는 시간은 컴퓨터 사양, 특히 처리 능력 (프로세서 용량), 운영 체제 및 프로그램을 컴파일하는 IDE에 따라 다릅니다.
이 사례를 다음에서 테스트합니다.
Lenovo 2.7GHz Intel Core i5
운영체제 : Windows 8.1 64x
IDE : NetBeans 8.2
프로그램을 마치는 데는 약 8 시간 (486 분)이 걸립니다.
또한 for 루프에서 단계가 증가하는 것을 알 수 있습니다. 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 초도 걸리지 않습니다.
이 테스트 예제 이후 나는 문제를 명확히하고 Zbynek Vyskovsky-kvr000의 답변의 타당성을 증명해야한다고 생각하며 , 또한이 질문에 대한 답변이 될 것 입니다.
x
증가 하기 때문 입니다. 즉, 상한에 도달하지 않으므로 루프가 "영원히"실행됩니다. 영원히는 아니지만 언젠가는 오버플로가 발생할 가능성이 높습니다.j
j