자바(SE)

Comparing identical expressions

  • -

Comparing identical expressions

Comparing identical expression은 다음과 같은 문장을 작성할 때 이클립스에서 표시되는 warning 메시지이다.

도대체 이 뻔한걸 왜 해보는거야?

어차피 완벽하게 동일한 결과인데 왜 확인하려는건지 모르겠다는 정도로 해석해볼 수 있다.

그런데 위 메시지를 쫒다가 stackoverflow.com에서 재밋는걸 발견하고 포스팅 해본다.

재밋는거 하나 추가요..

        int a = 1;
        int b = 3;
        System.out.println((a == (a = b)) +" : "+a+" : "+b); // false : 3 : 3

        a = 1;
        System.out.println(((a = b) == a)+" : "+a+" : "+b);  // true : 3 : 3

당연히 최강 우선순위를 가진 연산자 ()가 가장 강한 녀석이다.

첫 번째 동작을 살펴보면 (a=b)에 의해 a에 b가 할당되고 결과로 a==b인 상황이니 false가 맞다. 

두 번째 동작을 살펴보면 역시 (a=b)에 의해 b가 할당되고 b==a니까 false가 맞다.. 근데 true???

왜 그렇지?

오류의 원인은 괄호가 맨 먼저 계산될 것이라는 착각이다. 실제 계산은 왼쪽에서 오른쪽으로 진행되다가 괄호를 만나면 그 안을 먼저 계산해간다.

첫 번째 동작을 생각해보면

  1. 1== 이 작성되고 괄호 안으로 들어간다.
  2. 괄호 안에서 a=b가 동작하므로 a에 3이 할당되고 이제 a는 3이되고 괄호 안은 3이다.
  3. 최종 식은 1==3이 되니까 false이다.

두 번째 동작을 생각해보면

  1. a=b가 동작해서 (a=b)에 의해 a에 3이 할당되고 a는 3이 되고 괄호 안은 3이다.
  2. 최종 식은 3==a 이므로 3=3이 되고 결과는 true이다.

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.