728x90
반응형
연산자(operator)란?
- 연산자(operator)란 프로그램의 산술식이나 연산식을 표현하고 처리하기 위해 제공되는 다양한 기호를 의미한다.
산술 연산자(arithmetic operator)
- 산술 연산자는 사칙연산을 다루는 기본적이면서도 가장 많이 사용되는 연산자다.
- 산술 연산자는 모두 두 개의 피연산자를 가지는 이항 연산자이며, 피연산자들의 결합 방향은 왼쪽에서 오른쪽이다.

int num01 = 10;
int num02 = 4;
printf("+ 연산자에 의한 결괏값은 %d입니다.\n", num01 + num02);
printf("- 연산자에 의한 결괏값은 %d입니다.\n", num01 - num02);
printf("* 연산자에 의한 결괏값은 %d입니다.\n", num01 * num02);
printf("/ 연산자에 의한 결괏값은 %d입니다.\n", num01 / num02);
printf("% 연산자에 의한 결괏값은 %d입니다.\n", num01 % num02);
// + 연산자에 의한 결괏값은 14입니다.
// - 연산자에 의한 결괏값은 6입니다.
// * 연산자에 의한 결괏값은 40입니다.
// / 연산자에 의한 결괏값은 2입니다.
// % 연산자에 의한 결괏값은 2입니다.
C언어 연산자의 우선순위표
- 아래 표에서 나온 순서대로 우선순위가 빠른 연산자가 가장 먼저 실행된다.
- 또한, 같은 우선순위를 가지는 연산자가 둘 이상 있을 때에는 결합 순서에 따라 실행 순서가 결정된다.

대입 연산자(assignment operator)
- 대입 연산자는 변수에 값을 대입할 때 사용하는 이항 연산자이며, 피연산자들의 결합 방향은 오른쪽에서 왼쪽이다.
- 또한, 앞서 살펴본 산술 연산자와 결합한 다양한 복합 대입 연산자가 존재합니다.

int num01 = 7;
int num02 = 7;
int num03 = 7;
num01 = num01 - 5;
num02 -= 5;
num03 =- 5; // 단순히 -5를 변수 num03에 대입
printf("- 연산자에 의한 결괏값은 %d입니다.\n", num01);
printf("-= 연산자에 의한 결괏값은 %d입니다.\n", num02);
printf("=- 연산자에 의한 결괏값은 %d입니다.\n", num03);
// - 연산자에 의한 결괏값은 2입니다.
// -= 연산자에 의한 결괏값은 2입니다.
// =- 연산자에 의한 결괏값은 -5입니다.
증감 연산자(increment and decrement operator)
- 증감 연산자는 피연산자가 단 하나뿐인 단항 연산자로, 피연산자를 1씩 증가 혹은 1씩 감소시킬 때 사용하는 연산자다.
- 증감 연산자는 해당 연산자가 피연산자의 어느 쪽에 위치하는가에 따라 연산의 순서 및 결과가 달라진다.

int num01 = 7;
int num02 = 7;
int result01, result02;
result01 = (++num01) - 5;
result02 = (num02++) - 5;
printf("전위 증가 연산자에 의한 결괏값은 %d이고, 변수의 값은 %d로 변했습니다.\n", result01, num01);
printf("후위 증가 연산자에 의한 결괏값은 %d이고, 변수의 값은 %d로 변했습니다.\n", result02, num02);
// 전위 증가 연산자에 의한 결괏값은 3이고, 변수의 값은 8로 변했습니다.
// 후위 증가 연산자에 의한 결괏값은 2이고, 변수의 값은 8로 변했습니다.
- 위의 예제에서 첫 번째 연산은 변수 num01의 값을 먼저 1 증가시킨 후에 나머지 연산을 수행하지만 두 번째 연산에서는 먼저 모든 연산을 마친 후에 변수 num02의 값을 1 증가시킨다.
증감 연산자의 연산 순서
- 증감 연산자는 피연산자의 어느 쪽에 위치하는가에 따라 연산의 순서가 달라진다.\
int x = 10;
int y = x-- + 5 + --x;
printf("변수 x의 값은 %d이고, 변수 y의 값은 %d입니다.\n", x, y);
// 변수 x의 값은 8이고, 변수 y의 값은 23입니다.
- 다음 그림은 위의 예제에서 수행되는 연산의 순서를 보여준다.

- ① 첫 번째 감소 연산자(decrement operator)는 피연산자의 뒤쪽에 위치하므로, 덧셈 연산이 먼저 수행된다.
- ② 덧셈 연산이 수행된 후에 감소 연산이 수행된다. (x의 값 : 9)
- ③ 두 번째 감소 연산자는 피연산자의 앞쪽에 위치하므로, 덧셈 연산보다 먼저 수행된다. (x의 값 : 8)
- ④ 감소 연산이 수행된 후에 덧셈 연산이 수행된다.
- ⑤ 마지막으로 변수 y에 결괏값의 대입 연산이 수행된다. (y의 값 : 23)
비교 연산자(comparison operator)
- 비교 연산자는 왼쪽의 피연산자와 오른쪽의 피연산자를 비교하여, 어느 쪽이 더 큰지, 작은지, 또는 서로 같은지를 판단한다.
- 비교 연산자는 모두 두 개의 피연산자를 가지는 이항 연산자이며, 피연산자들의 결합 방향은 왼쪽에서 오른쪽이다.
- 참고로 C언어에서 거짓(false)은 0이며, 0이 아닌 모든 것은 참(true)으로 인식된다.

int num01 = 3;
int num02 = 7;
printf("== 연산자에 의한 결괏값은 %d입니다.\n", num01 == num02);
printf("<= 연산자에 의한 결괏값은 %d입니다.\n", num01 <= num02);
// == 연산자에 의한 결괏값은 0입니다.
// <= 연산자에 의한 결괏값은 1입니다.
논리 연산자(logical operator)
- 논리 연산자는 주어진 논리식을 판단하여, 참(true)과 거짓(false)을 결정하는 연산자다.
- AND 연산과 OR 연산은 두 개의 피연산자를 가지는 이항 연산자이며, 피연산자들의 결합 방향은 왼쪽에서 오른쪽이다.
- NOT 연산자는 피연산자가 단 하나뿐인 단항 연산자이며, 피연산자의 결합 방향은 오른쪽에서 왼쪽이다.
- 컴퓨터에서 참(true)은 보통 1로 표현되고 거짓(false)은 0으로 표현되지만, C언어에서 참(true)은 0이 아닌 모든 수이며 거짓(false)은 0으로 취급된다.

int num01 = 3;
int num02 = -7;
int result01, result02;
result01 = (num01 > 0) && (num01 < 5);
result02 = (num02 < 0) || (num02 > 10);
printf("&& 연산자에 의한 결괏값은 %d입니다.\n", result01);
printf("|| 연산자에 의한 결괏값은 %d입니다.\n", result02);
printf(" ! 연산자에 의한 결괏값은 %d입니다.\n", !result02);
// && 연산자에 의한 결괏값은 1입니다.
// || 연산자에 의한 결괏값은 1입니다.
// ! 연산자에 의한 결괏값은 0입니다.
비트 연산자(bitwise operator)
- 비트 연산자는 비트(bit) 단위로 논리 연산을 할 때 사용하는 연산자다.
- 비트 단위로 전체 비트를 왼쪽이나 오른쪽으로 이동시킬 때도 사용한다.

- 다음 그림은 비트 AND 연산자(&)의 동작을 나타낸다. 이처럼 비트 AND 연산자는 대응되는 두 비트가 모두 1일 때만 1을 반환하며, 다른 경우는 모두 0을 반환한다.

- 다음 그림은 비트 OR 연산자(|)의 동작을 나타낸다. 이처럼 비트 OR 연산자는 대응되는 두 비트 중 하나라도 1이면 1을 반환하며, 두 비트가 모두 0일 때만 0을 반환한다.

- 다음 그림은 비트 XOR 연산자(^)의 동작을 나타낸다. 이처럼 비트 XOR 연산자는 대응되는 두 비트가 서로 다르면 1을 반환하고, 서로 같으면 0을 반환한다.

- 다음 그림은 비트 NOT 연산자(~)의 동작을 나타낸다. 이처럼 비트 NOT 연산자는 해당 비트가 1이면 0을 반환하고, 0이면 1을 반환한다.

int num01 = 15;
int num02 = 8;
printf(" ~ 연산자에 의한 결괏값은 %d입니다.\n", ~num01); // 1의 보수
printf("<< 연산자에 의한 결괏값은 %d입니다.\n", num02 << 1); // 곱하기 2
printf(">> 연산자에 의한 결괏값은 %d입니다.\n", num02 >> 1); // 나누기 2
// ~ 연산자에 의한 결괏값은 -16입니다.
// << 연산자에 의한 결괏값은 16입니다.
// >> 연산자에 의한 결괏값은 4입니다.
삼항 연산자(ternary operator)
- 삼항 연산자는 다른 언어에는 존재하지 않는 C언어만의 독특한 연산자다.
- 이 연산자는 C언어에서도 유일하게 피연산자를 세 개나 가지는 조건 연산자다.
- 삼항 연산자는 짧은 if / else 문 대신에 사용할 수 있으며, 코드를 간결하게 작성할 수 있도록 도와준다.
조건식 ? 반환값1 : 반환값2
- 물음표(?) 앞의 조건식에 따라 결괏값이 참(true)이면 반환값1을 반환하고, 결괏값이 거짓(false)이면 반환값2를 반환한다. 이때 반환값에는 값뿐만 아니라 수식, 함수 호출 등 여러 가지 형태의 명령문이 올 수 있다.
int num01 = 15;
int num02 = 8;
int result;
result = (num01 > num02) ? num01 : num02;
printf("둘 중에 더 큰수는 %d입니다.\n", result);
// 둘 중에 더 큰수는 15입니다.
쉼표 연산자
- 쉼표(,) 연산자는 얼핏 연산자가 아닌 것처럼 보이지만 다양한 용도로 사용되는 연산자다.
- 이 연산자는 ① 두 연산식을 하나의 연산식으로 나타내고자 할 때나 ② 둘 이상의 인수를 함수로 전달하고자 할 때 사용된다.
int num01 = 15, num02 = 8;
printf("첫 번째 수는 %d이고, 두 번째 수는 %d입니다.\n", num01, num02);
// 첫 번째 수는 15이고, 두 번째 수는 8입니다.
- 위의 예제에서 쉼표 연산자는 둘 이상의 변수를 동시에 선언하고, 둘 이상의 인수를 동시에 printf() 함수로 전달하기 위해서 사용되었다.
sizeof 연산자
- sizeof 연산자에 피연산자로 타입뿐만 아니라 변수나 상수가 전달받을 수 있으며, 해당 피연산자의 크기를 바이트 단위로 반환한다.
- 사용자의 컴퓨터 환경에 따라 타입에 할당되는 메모리의 크기가 달라질 수 있으며, sizeof 연산자를 통해 현재 여러분이 사용하는 컴퓨터 환경에서의 타입 크기를 알아볼 수 있다.
int num = 100;
double score = 95.5;
printf("num의 크기: %zu 바이트\n", sizeof(num));
printf("score의 크기: %zu 바이트\n", sizeof(score));
// num의 크기: 4 바이트
// score의 크기: 8 바이트
포인터 연산자
- C언어에서 포인터와 연관되어 사용되는 연산자는 ① 주소 연산자(&)와 ② 참조 연산자(*)가 있다.
- 주소 연산자(&)는 변수의 이름 앞에 사용하여 해당 변수의 주소값을 반환한다. '&'기호는 앰퍼샌드(ampersand)라고 읽으며 번지 연산자라고도 불린다.
- 참조 연산자(*)는 포인터의 이름이나 주소 앞에 사용하여 포인터에 가리키는 주소에 저장된 값을 반환한다.
- C언어에서 '*'기호는 사용하는 위치에 따라 다양한 용도로 사용되는데, 이항 연산자일때는 곱셈 연산으로 사용되며 포인터의 선언 시나 메모리에 접근할 때도 사용된다.
Reference
728x90
반응형
'Language > C' 카테고리의 다른 글
| [C] C언어 배열 - 1차원, 다차원 (0) | 2026.06.06 |
|---|---|
| [C] C언어 함수 - 정의, 변수의 유효 범위, 재귀 호출 (0) | 2026.06.06 |
| [C] C언어 제어문 - 조건문, 반복문 (0) | 2026.06.05 |
| [C] C언어 타입 - 변수, 상수, 기본 타입, 타입 변환 (0) | 2026.06.04 |
| [C] C언어 개요 - 정의, 기초, 프로그래밍, 특징, 입출력 함수 (0) | 2026.06.01 |