연산자
IT 위키
더 많은 작업
- 상위 문서: 정보처리기사/프로그래밍 언어 활용
- Operator
- 피연산자에 대해 산술, 비교, 논리 등의 연산을 수행하도록 지시하는 기호
| 구분 | 연산자 | 설명 |
|---|---|---|
| 산술 | + - * / % | 정수끼리 나누면 몫만 남는다(C, Java). Python은 / 가 실수 나눗셈, // 가 몫 |
| 관계 | == != < > <= >= | 결과는 참/거짓(C는 1/0) |
| 논리 | && || ! | Python은 and, or, not |
| 비트 | & | ^ ~ | AND, OR, XOR, NOT. ~x 는 -(x+1) |
| 시프트 | << >> >>> | 왼쪽 n비트 이동은 2n배. >>> 는 Java의 부호 없는 오른쪽 시프트(빈자리를 0으로 채움) |
| 대입 | = += -= *= /= %= 등 | 복합 대입 연산자 |
| 증감 | ++ -- | 전위(++a)는 증가 후 사용, 후위(a++)는 사용 후 증가. Python에는 없음 |
| 조건(삼항) | 조건 ? 값1 : 값2 | Python은 값1 if 조건 else 값2 |
- 관련 문서: C 언어 비트 연산, C 언어 삼항 연산자, 논리 연산
| 순위 | 연산자 | 결합 방향 |
|---|---|---|
| 1 | () [] -> . 후위 ++ -- | → |
| 2 | 단항: 전위 ++ -- + - ! ~ * & sizeof (형 변환) | ← |
| 3 | * / % | → |
| 4 | + - | → |
| 5 | << >> | → |
| 6 | < <= > >= | → |
| 7 | == != | → |
| 8 | & | → |
| 9 | ^ | → |
| 10 | | | → |
| 11 | && | → |
| 12 | || | → |
| 13 | ?: | ← |
| 14 | = += -= 등 대입 | ← |
| 15 | , (콤마) | → |
- 암기 순서: 단항 → 산술 → 시프트 → 관계 → 비트(& → ^ → |) → 논리(&& → ||) → 조건 → 대입 → 콤마
- 비트 연산자는 관계 연산자보다 우선순위가 낮으므로
a & b == c는a & (b == c)로 해석된다.
- C(C99 이후)와 Java는 몫을 0 방향으로 버리고, 나머지의 부호는 피제수(왼쪽 피연산자)를 따른다.
- Python의 // 는 음의 무한대 방향으로 내림하고, % 의 부호는 제수(오른쪽 피연산자)를 따른다.
- Short-circuit Evaluation: && 는 왼쪽이 거짓이면, || 는 왼쪽이 참이면 오른쪽을 평가하지 않는다.
- 오른쪽에 증감 연산이나 함수 호출이 있으면 실행되지 않으므로 결과가 달라진다.
#include <stdio.h>
int main(void) {
int a = 5, b = 3;
int c = a++ + ++b; /* 5 + 4 */
printf("%d %d %d\n", a, b, c); /* 6 4 9 */
printf("%d %d %d %d\n", a & b, a | b, a ^ b, ~a); /* 4 6 2 -7 */
printf("%d %d %d\n", 7 / -2, -7 % 3, 7 % -3); /* -3 -1 1 */
int x = 0, y = 0;
if (x++ > 0 && y++ > 0) { }
printf("%d %d\n", x, y); /* 1 0 */
if (x++ > 0 || y++ > 0) { }
printf("%d %d\n", x, y); /* 2 0 */
return 0;
}
int a = -16;
System.out.println(a >> 2); // -4
System.out.println(a >>> 28); // 15
System.out.println(10 % -3 + " " + -10 % 3); // 1 -1
System.out.println(1 + 2 + "3" + 4 + 5); // 3345
System.out.println(5 & 3 | 4 ^ 1); // 5 (& → ^ → | 순)
print(7 // 2, -7 // 2, -7 % 3, 7 % -3) # 3 -4 2 -2
print(2 ** 3 ** 2) # 512 (** 는 오른쪽 결합)
print(5 / 2, 0 or "A", 3 and 0) # 2.5 A 0
- Java의 문자열 연결은 왼쪽부터 평가되므로 1 + 2 가 먼저 3이 된 뒤 "3"과 연결된다.
- -16 은 32비트로 0xFFFFFFF0 이므로 >>> 28 하면 0xF(15)가 된다.
- 전위·후위 증감 연산자가 섞인 식의 결과와 변수 최종값을 계산한다.
- 비트 연산(& | ^ ~, 시프트) 결과를 2진수로 풀어 계산한다.
- 단락 평가 때문에 실행되지 않는 증감 연산을 찾는다.
- 음수의 정수 나눗셈·나머지 결과가 C/Java와 Python에서 다르다.