Programing

어떤 i 값이 while (i == i + 1) {}을 영원히 반복합니까?

crosscheck 2020. 7. 17. 19:17
반응형

어떤 i 값이 while (i == i + 1) {}을 영원히 반복합니까?


나는 영국의 대학 시험에서 고급 프로그래밍 과정을 통해이 퍼즐 러를 뛰어 넘었다 .

i가 지금까지 선언되지 않은 다음 루프를 고려하십시오.

while (i == i + 1) {}

while 루프가 계속 지속되도록i 이 루프 앞에 있는의 정의를 찾으십시오 .

다음 코드는이 코드 스 니펫에 대해 동일한 질문을했습니다.

while (i != i) {}

나에게 명백했다. 물론이 다른 상황에서 그것은 NaN이전의 상황에 정말로 붙어 있습니다. 오버플로와 관련이 있습니까? Java에서 그러한 루프가 영원히 반복되는 원인은 무엇입니까?


우선, 이후 while (i == i + 1) {}루프의 값을 변경하지 않고 i,이 루프가 무한대의 값을 선택하는 것과 동일하게 i만족을 i == i + 1.

이러한 많은 값이 있습니다.

"이국적인"것부터 시작합시다 :

double i = Double.POSITIVE_INFINITY;

또는

double i =  Double.NEGATIVE_INFINITY;

이러한 값을 만족시키는 이유 i == i + 1
JLS 15.18.2에 명시되어 있습니다. 숫자 유형에 대한 가산 연산자 (+ 및-) :

무한대와 유한 값의 합은 무한 피연산자와 같습니다.

무한 값에 유한 값을 추가하면 무한 값이되므로 이는 놀라운 일이 아닙니다.

그 값의 가장 특징 i이 충족는 i == i + 1단순히 큰 double(또는 float) 값 :

예를 들면 다음과 같습니다.

double i = Double.MAX_VALUE;

또는

double i = 1000000000000000000.0;

또는

float i = 1000000000000000000.0f;

doublefloat유형은 충분히 큰 걸릴 그렇다면, 제한된 정밀도를 가지고 double또는 float추가 값을 1같은 값 발생합니다 그것.


이 퍼즐은 Joshua Bloch와 Neal Gafter의 "Java Puzzlers : 함정, 함정 및 코너 케이스"책에 자세히 설명되어 있습니다.

double i = Double.POSITIVE_INFINITY;
while (i == i + 1) {}

또는:

double i = 1.0e40;
while (i == i + 1) {}

1충분히 큰 부동 소수점 값에 추가 하면 값이 변경되지 않기 때문에 두 번째 모두 무한 루프가 발생 합니다.이 값은 후속 1에 "갭을 연결하지"않기 때문 입니다.

두 번째 퍼즐에 대한 참고 사항 (향후 독자를위한) :

double i = Double.NaN;
while (i != i) {}

NaN은 자체 2를 포함하여 부동 소수점 값과 같지 않기 때문에 무한 루프 가 발생합니다 .


1-Java Puzzlers : 트랩, 함정 및 코너 케이스 (4 장-Loopy Puzzlers)

2- JLS §15.21.1


그냥 아이디어 : 부울은 어떻습니까?

bool i = TRUE;

이 경우가 i + 1 == i아닙니까?


double i = Double.POSITIVE_INFINITY;

참고 URL : https://stackoverflow.com/questions/53516189/for-what-value-of-i-does-while-ii-1-loop-forever

반응형