Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C 언어 연산자와 표현식 총정리: 산술부터 비트 연산까지 한눈에 보기

C 언어에서 연산자(Operator)는 데이터에 대해 특정 연산을 수행하는 기호입니다. C 언어의 연산자는 다음과 같이 분류할 수 있습니다.

  • 산술 연산자 (Arithmetic operators)
  • 관계 연산자 (Relational operators)
  • 논리 연산자 (Logical operators)
  • 대입 연산자 (Assignment operators)
  • 증감 연산자 (Increment & Decrement operators)
  • 비트 연산자 (Bitwise operators)
  • 조건 연산자 (Conditional operators)
  • 특수 연산자 (Special operators)

1. 산술 연산자 (Arithmetic Operator)

산술 연산자는 덧셈, 뺄셈 등 수치 계산을 수행하는 데 사용됩니다.

연산자설명예시a=20, b=10결과
+덧셈a+b20+1030
-뺄셈a-b20-1010
*곱셈a*b20*10200
/나눗셈a/b20/102 (몫)
%나머지 연산a%b20%100 (나머지)

예제 프로그램

#include<stdio.h>
main() {
    int a = 20, b = 10;
    printf("%d\n", a+b);
    printf("%d\n", a-b);
    printf("%d\n", a*b);
    printf("%d\n", a/b);
    printf("%d\n", a%b);
}

실행 결과

30
10
200
2
0

2. 관계 연산자 (Relational Operators)

관계 연산자는 두 표현식을 비교하는 데 사용되며, 그 결과는 참(true)일 때 1, 거짓(false)일 때 0으로 반환됩니다.

연산자설명예시a=10, b=20결과
<작다a<b10<201
<=작거나 같다a<=b10<=201
>크다a>b10>200
>=크거나 같다a>=b10>=200
==같다a==b10==200
!=같지 않다a!=b10!=201

예제 프로그램

#include<stdio.h>
main() {
    int a = 10, b = 20;
    printf("%d ", a<b);
    printf("%d ", a<=b);
    printf("%d ", a>b);
    printf("%d ", a>=b);
    printf("%d ", a==b);
    printf("%d ", a!=b);
}

실행 결과

1 1 0 0 0 1

3. 논리 연산자 (Logical Operators)

논리 연산자는 두 개 이상의 표현식을 논리적으로 결합할 때 사용됩니다. 종류로는 논리곱(&&), 논리합(||), 부정(!)이 있습니다.

논리곱 AND (&&): 두 조건이 모두 참일 때만 참

exp1exp2exp1&&exp2
TTT
TFF
FTF
FFF

논리합 OR (||): 두 조건 중 하나라도 참이면 참

exp1exp2exp1||exp2
TTT
TFT
FTT
FFF

부정 NOT (!): 참은 거짓으로, 거짓은 참으로 바꿉니다.

exp!exp
TF
FT
연산자설명예시a=10, b=20, c=30결과
&&논리곱 AND(a>b)&&(a<c)(10>20)&&(10<30)0
||논리합 OR(a>b)||(a<c)(10>20)||(10<30)1
!부정 NOT!(a>b)!(10>20)1

예제 프로그램

#include<stdio.h>
main() {
    int a = 10, b = 20, c = 30;
    printf("%d ", (a>b) && (a<c));
    printf("%d ", (a>b) || (a<c));
    printf("%d ", !(a>b));
}

실행 결과

0 1 1

4. 대입 연산자 (Assignment Operators)

대입 연산자는 변수에 값을 저장(할당)하는 데 사용됩니다. 단순 대입과 복합 대입으로 나눌 수 있습니다.

연산자설명예시
=단순 대입a=10
+=, -=, *=, /=, %=복합 대입a+=10 → a=a+10
a-=10 → a=a-10

예제 프로그램

#include<stdio.h>
main() {
    int a = 10;
    printf("%d\n", a);
    a += 10;
    printf("%d\n", a);
}

실행 결과

10
20

5. 증감 연산자 (Increment & Decrement Operators)

증가 연산자 (++)

변수의 값을 1만큼 증가시킵니다. 전위(prefix)와 후위(postfix) 두 가지 방식이 있습니다.

  • 전위 증가 (++a): 값을 먼저 1 증가시킨 후 연산에 사용합니다.
    z = ++a; // a = a+1 실행 후 z = a
  • 후위 증가 (a++): 연산에 현재 값을 먼저 사용한 후 1 증가시킵니다.
    z = a++; // z = a 실행 후 a = a+1
전위 증가 (++a)후위 증가 (a++)
main() {
    int a = 10, z;
    z = ++a;
    printf("z=%d\n", z);
    printf("a=%d\n", a);
}
main() {
    int a = 10, z;
    z = a++;
    printf("z=%d\n", z);
    printf("a=%d\n", a);
}
실행 결과실행 결과
z=11
a=11
z=10
a=11

감소 연산자 (--)

변수의 값을 1만큼 감소시키며, 역시 전위와 후위 방식이 있습니다.

  • 전위 감소 (--a): 값을 먼저 1 감소시킨 후 연산에 사용합니다.
    z = --a; // a = a-1 실행 후 z = a
  • 후위 감소 (a--): 연산에 현재 값을 먼저 사용한 후 1 감소시킵니다.
    z = a--; // z = a 실행 후 a = a-1
전위 감소 (--a)후위 감소 (a--)
main() {
    int a = 10, z;
    z = --a;
    printf("z=%d\n", z);
    printf("a=%d\n", a);
}
main() {
    int a = 10, z;
    z = a--;
    printf("z=%d\n", z);
    printf("a=%d\n", a);
}
실행 결과실행 결과
z=9
a=9
z=10
a=9

6. 비트 연산자 (Bitwise Operators)

비트 연산자는 데이터를 비트(bit) 단위로 직접 처리합니다.

연산자설명
&비트곱 AND
|비트합 OR
^배타적 논리합 XOR
<<왼쪽 시프트
>>오른쪽 시프트
~1의 보수 (One's Complement)

비트곱 AND (&): 두 비트가 모두 1일 때만 1

Bitwise AND
aba&b
000
010
100
111

비트합 OR (|): 두 비트 중 하나라도 1이면 1

Bitwise OR
aba|b
000
011
101
111

배타적 논리합 XOR (^): 두 비트가 서로 다를 때만 1

Bitwise XOR
aba^b
000
011
101
110

예제 프로그램

#include<stdio.h>
main() {
    int a = 12, b = 10;
    printf("%d ", a&b);
    printf("%d ", a|b);
    printf("%d ", a^b);
}

실행 결과

8 14 6

왼쪽 시프트 (<<)

값을 왼쪽으로 1비트 이동하면 원래 값의 2배가 됩니다.

예: a = 10이면, a<<1 = 20

오른쪽 시프트 (>>)

값을 오른쪽으로 1비트 이동하면 원래 값의 절반이 됩니다.

예: a = 10이면, a>>1 = 5

1의 보수 (~)

모든 비트를 반전시켜 1은 0으로, 0은 1로 바꿉니다.

예: a = 5이면, ~a = 2 (4비트 기준)

보수 연산의 규칙

  • 부호 있는(signed) 경우: 1의 보수 = -(주어진 값 + 1)
    예: ~10 = -(10+1) = -11, ~(-10) = -(-10+1) = 9
  • 부호 없는(unsigned) 경우: 1의 보수 = 65535 - 주어진 값

예제 프로그램

#include<stdio.h>
main() {
    int a = 20, b = 10, c = 10;
    printf("%d\n", a<<1);
    printf("%d\n", b>>1);
    printf("%d\n", ~c);
}

실행 결과

40
5
-11

7. 조건 연산자 (? :)

조건 연산자는 삼항 연산자(Ternary operator)라고도 불리며, 세 개의 피연산자를 가집니다.

exp1 ? exp2 : exp3

exp1이 참이면 exp2가 평가되고, 거짓이면 exp3가 평가됩니다. if-else 문과 동일한 동작을 합니다.

if (exp1)
    exp2;
else
    exp3;

예제 프로그램

#include<stdio.h>
main() {
    int z;
    z = (5>3) ? 1 : 0;
    printf("%d", z);
}

실행 결과

1

8. 특수 연산자 (Special Operators)

특수 연산자에는 콤마(,), 앰퍼샌드(&), sizeof 연산자 등이 있습니다.

  • 콤마 ( , ): 변수를 구분하는 구분자로 사용됩니다. 예: a=10, b=20
  • 주소 연산자 (&): 변수의 메모리 주소를 얻습니다.
  • sizeof ( ): 자료형이나 변수의 크기를 바이트 단위로 반환합니다.

예제 프로그램

#include<stdio.h>
main() {
    int a = 10;
    float b = 20;
    printf("a=%d b=%f\n", a, b);
    printf("a address = %u\n", &a);
    printf("b address = %u\n", &b);
    printf("a size = %ld\n", sizeof(a));
    printf("b size = %ld\n", sizeof(b));
}

실행 결과

a=10 b=20.000000
Address of a = 1234
Address of b = 5678
Size of a = 4 bytes
Size of b = 4 bytes

* 주소값은 실행 환경마다 다르게 출력될 수 있습니다.