할당 및 동등성 검사가있는이 if 문이 거짓으로 평가되는 이유는 무엇입니까?


105

할당과 동등성 검사 -d가 함께 있을 때 Java if 문 은 어떻게 작동합니까 OR??

public static void test() {
    boolean test1 = true; 
    if (test1 = false || test1 == false) {
        System.out.println("TRUE");
    } else {
        System.out.println("FALSE");
    }       
}

이 인쇄가 FALSE 인 이유는 무엇입니까?


1
실행하고 확인하십시오. false를 할당하고 true를 할당하면 어떤 부울 값이 인쇄되는지 확인합니다. 그런 다음 OR 작동 방식을 읽으십시오.
Pratik

2
디버그 모드에서이 코드가 TRUE 값을 제공하고 실행 모드에서 FALSE 값을 제공한다고 말하고 싶습니다. 왜 그렇게 ??? ... (내 중단 점을 if 조건에 두었습니다) ...
CoderNeji

test1=false, test1==false이며 false, false || false이고 false or false이다 false.
Jared Burrows

나는 당신이 조언을 요청하지 않았다는 것을 알고 있지만 아래 답변은 우선 순위 문제를 식별하므로 문제를 피하는 데 도움이 된 몇 가지 사례가 있습니다 (이것을 고수 할 때) : (1) 100 %가 아닌 경우 항상 괄호를 사용하십시오. 특정 우선 순위 또는 다른 개발자를 돕기 위해 더 쉽게 읽을 수 있습니다. 다른 사람들이 모든 연산자에 대한 우선 순위 규칙을 기억할 것이라고 가정하지 마십시오. (2) 매우 간단한 if 조건을 제외하고 혼동을 줄이기 위해 일반적으로 if 할당을 피해야합니다. 몇 가지 일반적인 예외가 있습니다 (특히 I / O, 네트워킹 등에 대한 간단한 검사). 내 2 센트.
rimsky

때문에test1 = true
jono

답변:


189

식은 생각대로 구문 분석되지 않습니다. 아니에요

(test1=false) || (test1 == false)

이 경우 결과는 true이지만

test1 = (false || test1 == false)

false || test1 == falseexpression 의 값이 먼저 계산 되고 계산에 들어가도록 설정 false되었기 때문에 test1입니다 true.

이 방식으로 파싱되는 이유는의 우선 순위 가 연산자 ||보다 낮지 만 ==할당 연산자의 우선 순위보다 높기 때문 =입니다.


2
+1 @RohanFernando, 다음과 같이 할당 주위에 대괄호를 추가 ((test1 = false) || test1 == false)하면 전체 값은 true.
Arnon Zilca 2015

1
파싱이 일어난 이유를 적어주세요 ... 연산자의 우선 순위 때문인가요?
kondu

3
@kondu 즉 공정의 후속 질문은 내가 보여주는 우선 순위 테이블에 링크를 추가 할 편집의 ==위입니다 ||만, =다음과 같습니다 ||.
dasblinkenlight 2015

마지막 단락은 첫 번째 구문이 아닌 두 번째 구문 분석이 선택되는 이유를 이해하려면 할당이 비 할당 연산자 (여기에서 ||) 보다 낮은 우선 순위를 갖는다는 (쉽게 기억할 수있는) 규칙을 아는 것으로 충분하다는 점에서 오해의 소지가 있습니다 . 의 상대적 우선 순위 ||==그 해석이 보여에만 관련이 없는 같이 test1 = ((false || test1) == false)나는 사람이 합리적으로 더 일반적으로하는 방식으로 (즉, 상대적인 우선 순위를 기대하거나 것이라고 생각하지 않는, ||, &&관계보다 우선 순위가에 용이도 항상 사용했기 때문에 기억하십시오).
Marc van Leeuwen

1
의 상대적 우선 순위 @MarcvanLeeuwen ||==대를 ||하고 =이유를 설명이 동작합니다 다르게의 (공통)의 경우에서 a == b || c == d.
Aaron Dufour

83

이것은 기본적으로 우선 순위 문제입니다. 코드가 다음과 같다고 가정합니다.

if ((test1 = false) || (test1 == false))

...하지만 그렇지 않습니다. 실제로 다음과 같습니다.

if (test1 = (false || test1 == false))

... 이는 다음과 같습니다.

if (test1 = (false || false))

(때문에는 test1것입니다 true로 시작하는)

... 이는 다음과 같습니다.

if (test1 = false)

false을에 할당하고 test1표현식의 결과는 false.

연산자 우선 순위에 대한 유용한 표는 연산자에 대한 Java 자습서를 참조하십시오 .


2

연산자의 우선 순위를 살펴보십시오

Expression test1 = false || test1 == false은 다음 단계에서 평가됩니다.

STEP : 1- test1 = false || test1 == false // 우선 순위 ==가 가장 높음

STEP : 2- test1 = false || false // 연산자 ||가 더 높은 우선 순위를 가짐

단계 : 3- test1 = false

단계 : 4- false

expression의 boolean 값이 false가되므로 else 문이 실행됩니다.


-11

(test1 = false || test1 == false)둘 다 거짓이기 때문에 거짓을 반환합니다. (test1 = false || test1 == true)그들 중 하나가 사실이기 때문에 이것은 사실입니다


1
완전히 틀 렸습니다. 질문이 어떤 일이 발생 하는지를 설명하는 두 개의 고품질 답변을받은 후 왜 그렇게 잘못된 정보로 대답하겠습니까?
l4mpi

5
이러한 낮은 품질의 두 가지 답변은 개별적으로 작성된 의견을받을 가치가 없습니다. 당신의 대답이 말도 안된다는 것을 알고 있습니까? 그렇지 않다면 Jon과 blinkenlight의 두 답변을주의 깊게 읽으십시오.
l4mpi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.