본문으로 이동
메뉴 여닫기
환경 설정 메뉴 여닫기
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.
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 연산자 우선순위

편집 원본 편집
순위 연산자 결합 방향
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에서 다르다.