방금 대답 할 수없는 질문이 있습니다.
Java에이 루프 정의가 있다고 가정하십시오.
while (i == i) ;
루프가 무한 루프가 아니고 프로그램이 하나의 스레드 만 사용 하는 경우 의 유형 i과 값은 무엇입니까?i
방금 대답 할 수없는 질문이 있습니다.
Java에이 루프 정의가 있다고 가정하십시오.
while (i == i) ;
루프가 무한 루프가 아니고 프로그램이 하나의 스레드 만 사용 하는 경우 의 유형 i과 값은 무엇입니까?i
답변:
double i = Double.NaN;
Double.equals () 용 API는 "Double.NaN == Double.NaN의 값은 false"입니다. 이것은 " 부동 소수점 유형, 형식 및 값 " 의 Java 언어 사양에 자세히 설명되어 있습니다 .
NaN수치 비교 연산자, 그래서 순서가있다<,<=,>, 및>=반환false하나 또는 두 피연산자가있는 경우NaN. 항등 연산자의==반환false피연산자 인 경우NaN, 그리고 비항 등 연산자의!=반환true피연산자 인 경우NaN. 특히,x!=x인true경우에만xISNaN하고(x<y) == !(x>=y)있을 것입니다false경우x또는y이다NaN.
x == x항상 마찬가지입니다. 왜 아무것도 같지 않아야합니까?
null=null는 null입니다. NULL IS NULL
그러면 값이 i유효하지 않습니다. "숫자가 아님".
인터넷 검색 후 Java에서 NaN (Not a Number)을 가질 수 있음을 알았습니다! 따라서 Float Pointing 숫자는 데이터 유형이고 값은 NaN입니다. 여기를 참조 하십시오
다른 사람들이 NaN이라고 말했기 때문에 공식 (JDK 6) 구현에 대해 궁금해했습니다 Double.isNaN.
/**
* Returns <code>true</code> if the specified number is a
* Not-a-Number (NaN) value, <code>false</code> otherwise.
*
* @param v the value to be tested.
* @return <code>true</code> if the value of the argument is NaN;
* <code>false</code> otherwise.
*/
static public boolean isNaN(double v) {
return (v != v);
}
Nan을 예외와 동등한 것으로 생각하지만 계산에서 마술 값을 사용합니다. 계산이 실패 했으므로 (예 : 음의 제곱근, 0으로 나누기 등) 다른 것과 비교하는 것은 의미가 없습니다. 결국 0으로 나누기가 nan이면 -2의 제곱근 또는 -3의 제곱근과 같습니다.
Nan은 추가 예외를 발생시키지 않고 유효하지 않은 답변을 반환하는 단계를 포함하는 계산을 허용합니다. 답이 가치인지 확인하려면 Float.isNan () o를 통해 nandness가 아닌지 테스트하십시오.
나는 추가 할 것이다
float i = Float.NaN;
만큼 잘
double i = Double.NaN;
이러한 종류의 질문에서 일반적인 트릭은 i가 int라고 가정한다는 것입니다. 다른 일반적인 가정은 s는 String, x, y는 double, ch는 char, b는 byte 등일 수 있습니다. 이와 같은 질문이 표시되면 'i'가 예상 유형이 아니라고 확신 할 수 있습니다.
비슷한 질문이다; 이것은 반복되지 않습니다. 'x'는 무엇입니까?
while(x == x && x != x + 0) { }
내가 좋아하는 또 다른 질문은; 이 루프는 무한 루프이며 x의 가능한 값은 무엇입니까? (: 나는 그들 중 12 명을 센다 :)
while(x != 0 && x == -x) { }
나는 이것이 Java 질문이라는 것을 알고 있지만 다른 언어에 대한 질문을 고려하는 것은 흥미 롭습니다.
C에서 'int'와 같은 간단한 유형은 'i'가 소멸성으로 선언 된 경우 '유니버스가 차가워지기 전에 종료'동작을 나타낼 수 있습니다 (따라서 컴파일러는 각 반복에 대해 'i'를 두 번 읽습니다) 그리고 'i'가 실제로 다른 것에 영향을 줄 수있는 메모리에 있다면. 그런 다음 단일 반복의 두 번의 읽기 사이에서 'i'가 변경되면 루프가 종료됩니다. ( 추가 : 가능한 위치- 'i'가 실제로 I / O 포트의 주소에 위치하고 위치 센서에 연결된 마이크로 컴퓨터에서 'i'가 포인터 변수 인 경우 더 적합합니다 ( 휘발성 메모리에 대한 포인터) 및 명령문은 ' while (*i == *i);'입니다.)
다른 답변에서 알 수 있듯이 C ++에서 사용자 정의 클래스에 있으면 사용자가 '=='연산자를 제공 할 수 있으므로 모든 것이 가능할 수 있습니다.
NaN과 달리 SQL 기반 언어에서 i 값이 NULL이면 루프가 무한하지 않습니다. 그러나 NULL이 아닌 값은 루프를 무한대로 만듭니다. 이것은 NaN과 달리 숫자가 루프를 무한대로 만드는 Java와 비슷합니다.
나는 구조가 실제로 사용되는 것을 보지 못하지만 흥미로운 사소한 질문입니다.
이 솔루션을 보지 못한 것에 놀랐습니다.
while (sin(x) == sin(x)) //probably won't eval to true
주석에 대한 응답으로 다음을 실행하십시오.
double x = 10.5f;
assert (x == asin(sin(x)));
x는 이론상으로 항상 arcsine (sin (x))과 같아야하지만 실제로는 그렇지 않습니다.
x하면 정확히 동일한 정확도로 동일한 결과를 얻을 수 있습니다. 전달 된 값 asin()이 정확하게 정확하지 않기 때문에 Arcsin은 부동 소수점 숫자를 가진 sin의 결과를 되돌릴 수 없습니다 . 따라서 결과 asin()가 정확하지 않아 x == asin(sin(x))거짓이됩니다. 또한 arcsin은 반드시 sin 연산을 "실행 취소"할 필요는 없습니다. sin 함수는 x의 여러 값에 대해 동일한 결과를 제공 할 수 있으므로 asin()-π / 2와 π / 2 사이의 숫자 만 반환합니다.
i == i원자가 아닙니다. 그러한 프로그램에 의해 입증 :
static volatile boolean i = true;
public static void main(String[] args) throws InterruptedException
{
new Thread() {
@Override
public void run() {
while (true) {
i = !i;
}
}
}.start();
while (i == i) ;
System.out.println("Not atomic! i: " + i);
}
업데이트 다음은 무한 루프가 아닌 예입니다 (새 스레드가 생성되지 않음).
public class NoNewThreads {
public static void main(String[] args) {
new NoNewThreads();
System.gc();
int i = 500;
System.out.println("Still Running");
while (i == i) ;
}
@Override
protected void finalize() throws Throwable {
super.finalize();
Thread.sleep(1000);
System.exit(0);
}
}
while (i == i);실행 되지 않습니다.