여태까지 명확하지는 않지만 직관적으로 다뤄왔던 연산자 우선순위를 확실히 알게 되었다.
연산순위가 헷갈릴때는 ()를 이용해 직관적으로 연산순위를 지정해줄테지만 긴가민가(?) 한 부분을 확실히해서
개운한 기분이었다.
또한, 피연산자들이 상수, 변수, 리터럴이냐에 따라 다르게 적용된다는점을 알게 되었다.
새롭게 알게되거나 헷갈릴만한 내용들만 정리했다.
종류 | 연산방향 | 연산자 | 우선순위 |
---|---|---|---|
단항 연산자 | <- | ++ -- + - ~ ! (타입) | 높음 |
산술 연산자 | -> | * / % | |
-> | + - | ||
-> | << >> >>> | ||
비교 연산자 | -> | < > <= >= instanceof | |
-> | == != | ||
논리 연산자 | -> | & | |
-> | ^ | ||
-> | | | ||
-> | && | ||
-> | || | ||
삼항 연산자 | -> | ?: | |
대입 연산자 | <- | = (op)= | 낮음 |
boolean, char을 제외한 기본형에 부호를 결정한다
char c1 = 'a';
char c2 = c1 + 1; //컴파일 오류발생
char c3 = 'a' + 1; //컴파일 오류없음.
c2는 rvalue가 int형으로 산술변환되어 char 자료형에 대입이안된다.
c3는 rvalue가 리터럴로만 되어있어 컴파일시에 미리 계산되어 'b'로 되기 때문에 문제가 없다.
0.1f != 0.1d;
float와 double는 2진수로 표현된 가장 가까운수를 저장하는데, 정밀도 차이때문에 실제 저장되는값이 다르다.
&& : 합연산(AND)
|| : 곱연산(OR)
! : 논리부정
논리 연산자의 연산방향은 ->이다.
따라서, 합연산시에 좌측 피연산자가 true면 우측 피연산자 값을 확인하지 않고 true를 반환
곱연산시에 죄측 피연산자가 false면 우측 피연산자 값을 확인하지 않고 false 반환
& : 합연산(AND)
| : 곱연산(OR)
^ : XOR연산 (결과가 다르면 1, 같으면 0)
~ : 비트 전환 연산자
>> : 우측 쉬프트 (2^n 만큼 나눈값)
<< : 좌측 쉬프트 (2^n 만큼 곱한값)
파이썬 조건문 공부할때 정리했던 C언어의 조건연산자와 동일하다.
boolean condition;
condition ? x : y;
이때, x,y 사이에서 산술변환이 발생한다.