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+b | 20+10 | 30 |
| - | 뺄셈 | a-b | 20-10 | 10 |
| * | 곱셈 | a*b | 20*10 | 200 |
| / | 나눗셈 | a/b | 20/10 | 2 (몫) |
| % | 나머지 연산 | a%b | 20%10 | 0 (나머지) |
예제 프로그램
#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<b | 10<20 | 1 |
| <= | 작거나 같다 | a<=b | 10<=20 | 1 |
| > | 크다 | a>b | 10>20 | 0 |
| >= | 크거나 같다 | a>=b | 10>=20 | 0 |
| == | 같다 | a==b | 10==20 | 0 |
| != | 같지 않다 | a!=b | 10!=20 | 1 |
예제 프로그램
#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 (&&): 두 조건이 모두 참일 때만 참
| exp1 | exp2 | exp1&&exp2 |
|---|---|---|
| T | T | T |
| T | F | F |
| F | T | F |
| F | F | F |
논리합 OR (||): 두 조건 중 하나라도 참이면 참
| exp1 | exp2 | exp1||exp2 |
|---|---|---|
| T | T | T |
| T | F | T |
| F | T | T |
| F | F | F |
부정 NOT (!): 참은 거짓으로, 거짓은 참으로 바꿉니다.
| exp | !exp |
|---|---|
| T | F |
| F | T |
| 연산자 | 설명 | 예시 | 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 | ||
|---|---|---|
| a | b | a&b |
| 0 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
비트합 OR (|): 두 비트 중 하나라도 1이면 1
| Bitwise OR | ||
|---|---|---|
| a | b | a|b |
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 1 |
배타적 논리합 XOR (^): 두 비트가 서로 다를 때만 1
| Bitwise XOR | ||
|---|---|---|
| a | b | a^b |
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
예제 프로그램
#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
* 주소값은 실행 환경마다 다르게 출력될 수 있습니다.