source

(i<=j&j<=i&i!=j)가 TRUE로 평가되는 이유는 무엇입니까?

gigabyte 2022. 12. 28. 21:40
반응형

(i<=j&j<=i&i!=j)가 TRUE로 평가되는 이유는 무엇입니까?

무한 루프에서 동작하는 자바 코드를 작성했습니다.

코드는 다음과 같습니다.

public class TestProgram {
    public static void main(String[] args){
        Integer i = new Integer(0);
        Integer j = new Integer(0);

        while(i<=j && j<=i && i!=j){
            System.out.println(i);
        }
    }
}

에서는, 「」의를 합니다.while그이 '아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아.while루프. 하지만 실제로는 무한 루프이며 값을 계속 출력합니다.

여기서 무슨 일이 일어나고 있는 거야?

  • i <= j에 의해 됩니다.true 자동 하고 그 에 int에서 int unboxing이 이루어지기 i ★★★★★★★★★★★★★★★★★」j인 「Default(디폴트값를 합니다.0.

  • j <= i에 의해 됩니다.true위와 같은 이유로.

  • i != j에 의해 됩니다.true 둘 다i ★★★★★★★★★★★★★★★★★」j는 다른 오브젝트입니다.오브젝트를 비교할 때 자동 언박스가 필요 없습니다.

, 않을 것입니다.i ★★★★★★★★★★★★★★★★★」j이치노

당신이 비교하고 있기 때문에

  • 0 < = 0 (true) // unboxing

  • 0 > = 0 (true) // unboxing

  • reference != secondReference (true)원시적인 비교가 아니라 객체를 생성할 때 사용합니다.이 때문에 평가됩니다.

정수 객체가 다릅니다.기본 int 타입과는 다릅니다.

다음 답변을 참조하십시오.Java에서 두 정수를 올바르게 비교하려면 어떻게 해야 합니까?

i != j거짓일 줄 알았던 부분이 참입니다.

우리가 먼저 이해해야 할 두 가지 다른 사건이 있습니다

케이스 1:

        Integer i = new Integer(10);
        Integer j = new Integer(10);

        System.out.println((i<=j && j<=i && i!=j));
        System.out.println(i!=j);

케이스 2:

        Integer i = 10;
        Integer j = 10;

        System.out.println((i<=j && j<=i && i==j));
        System.out.println(i==j);

둘 다 다르다

1: ★★★★★★1:i!=j 되다true둘 다 힙에서 서로 다른 두 개체를 참조하며 같을 수 없기 때문입니다.하지만

2: ★★★★★i==j 되다true둘 다 는 '정수 리터럴'을 유지하기 때문입니다.pool for Integer literals가 것(-128 <= X <= 127)따라서 이 경우 10 <=true 결과 true이므로 둘 다 동일한 개체를 참조합니다.

조건이 true이기 때문에 루프가 종료되지 않습니다(i != j는 true이므로 true이며, 대신 Integer.valueOf를 사용합니다). 루프 내부에서는 값이 변경되지 않으므로 조건이 항상 true로 유지됩니다.

아마도 그 이유는 'i'와 'j'가 모두 객체이고 객체 비교가 객체 참조 비교와 동일하지 않기 때문일 것이다.i!=j 대신 !i.j.를 사용하는 것을 검토해 주세요.

정수 객체가 다릅니다.기본 int 타입과는 다릅니다.그냥 그렇게 하면 돼요.여러분이 하는 일은 단지 대상을 비교하는 것이고, 결과는 물론 진실입니다.

정수 a = 새 정수(0), 정수 b = 새 정수(0);

<=와 >=의 비교에서는 박스 해제된 값 0이 사용되고 !=에서는 참조가 비교되며 서로 다른 개체이므로 성공합니다.

이것 또한 효과가 있을 것이다.

정수 a = 1000, 정수 b = 1000,

단, 이것은 그렇지 않습니다.

정수 a = 100, 정수 b = 100,

그 이유는 Integer가 내부적으로 -128 ~127 범위의 Integer 개체에 캐시를 사용하고 해당 캐시에서 해당 범위의 인스턴스를 반환하기 때문입니다.잘 모르겠지만 패키지 "java.lang"의 최대값도 변경할 수 있을 것 같습니다.정수.IntegerCache.high" 를 클릭합니다.

자세한 것은, https://www.owasp.org/index.php/Java_gotchas#Immutable_Objects_.2F_Wrapper_Class_Caching 를 참조해 주세요.

프로그램이 계속 같은 값을 표시합니다.i왜냐하면 당신은 그 가치를 증가시키거나 감소시키지 않기 때문이다.i또는j의 조건은 항상 true로 평가되기 때문에 무한 루프입니다.

(amp;amp;&amp;amp;amp;&amp;amp;amp;amp;amp;amp;를 사용하는 경우, 첫 번째 조건이 거짓 상태를 확인합니다.그리고 justomment.첫 번째 조건과 두 번째 조건은 true이고 세 번째 조건에서는 두 조건이 같으며 조건이 false이기 때문에 false가 됩니다.

언급URL : https://stackoverflow.com/questions/18804599/why-does-i-j-j-i-i-j-evaluate-to-true

반응형