본문으로 건너뛰기

연산자와 표현식

연산자(Operator)

  • 값 또는 변수에 대한 연산을 수행하는 기호
  • 피연산자(operand)와 함께 표현식을 구성한다.

산술 연산자

+, -, *, /, %

정수와 실수의 연산 차이

int a = 10, b = 3;
printf("%d\n", a / b); // 3
printf("%f\n", 10.0 / 3) // 3.333333
  • 피연산자 중 하나라도 실수 타입이면 실수 연산이 수행된다.
  • % 연산자는 정수 타입에만 사용 가능하다. 실수에 사용하면 컴파일 에러

대입 연산자

=, +=, -=, *=, /=, %=

int x = 5;
x += 2; // x = x + 2

증감 연산자

++, --

전위형과 후위형 차이

int a = 3;
printf("%d\n", ++a) // 4
printf("%d\n", a++) // 4, 출력 후 5로 증가
  • 전위형(++a): 값을 증감 처리 후에 결과값 반환
  • 후위형(a++): 결과값 반환 후에 값을 증감 처리

관계 연산자

  • ==, !=, <, >, <=, >=
int a = 5, b = 10;
if (a < b) {
printf("a는 b보다 작다");
}
  • 실수(double, float) 비교 주의

    2진수는 실수에 대해 근사 표현하기 때문에 미세한 오차가 발생할 수 있다.

    double x = 0.1 + 0.2;
    if (x == 0.3) {/* false일 수 있음 */}

논리 연산자

  • &&, ||, !
int a = 0, b = 1;
if (a || b) {
printf("true");
}
  • 단락 평가(short-circuit)

    • &&: 왼쪽이 거짓이면 오른쪽은 평가하지 않음
    • ||: 왼쪽이 참이면 오른쪽은 평가하지 않음
  • &&||보다 우선순위가 높다.

    int a = 0, b = 1, c = 2;
    if (a || b && c) {
    // a || (b && c)로 결합됨
    // b && c 먼저 평가 -> a와 결과를 || 비교
    }

비트 연산자

  • &, |, ^, ~, <<, >>
  • 하드웨어 제어, 플래그 처리
int a = 5; // 0101
int b = 3; // 0011
printf("%d\n", a & b); // 0001 -> 1
  • &: 비트 AND
  • |: 비트 OR
  • ^: 비트 XOR
  • ~: 비트 NOT
  • <<: 왼쪽 시프트(n비트만큼 이동)
  • >>: 오른쪽 시프트(n비트만큼 이동)

삼항 연산자

  • 조건 ? 참 : 거짓
int x = 5, y = 10;
int max = (x > y) ? x : y; // max = 10

쉼표 연산자

  • 표현식을 순서대로 실행, 마지막 결과값 반환
int a = (1 + 2, 3 + 4); // 7

sizeof 연산자

  • 피연산자의 바이트 크기 반환
printf("%d", sizeof(int)); // 4

표현식(Expression)

  • 값으로 평가되는 코드 조각
  • 연산자와 피연산자로 구성
  • 표현식은 값을 만들지만 실행 명령은 아님
3 + 4
a * (b + C)
x = y + 1

문장(Statement)

  • 프로그램이 실행하는 최소 단위 명령문
  • 표현식 뒤에 세미콜론이 붙으면 하나의 문장이 됨
3 + 4;
x = y + 1;

세미콜론(;) 의미

  • 세미콜론(;)은 표현식의 실행이 끝남을 뜻하는 종결 기호이다.
  • 세미콜론이 붙어야 실행 문장이 됨
x + y // 표현식, 실행되지 않음
x + y; // 문장, 실행되고 결과는 버려짐

; 하나만 써도 빈 문장(null statement)으로 해석됨