Language/C

[C] C언어 연산자 - 산술, 대입, 증감, 비교, 논리, 비트, 삼항, 쉼표, sizeof, 포인터

재은초 2026. 6. 5. 00:17
728x90
반응형

연산자(operator)란?

  • 연산자(operator)란 프로그램의 산술식이나 연산식을 표현하고 처리하기 위해 제공되는 다양한 기호를 의미한다.

 

산술 연산자(arithmetic operator)

  • 산술 연산자는 사칙연산을 다루는 기본적이면서도 가장 많이 사용되는 연산자다.
  • 산술 연산자는 모두 두 개의 피연산자를 가지는 이항 연산자이며, 피연산자들의 결합 방향은 왼쪽에서 오른쪽이다.

https://www.tcpschool.com/c/c_operator_arithmetic

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언어 연산자의 우선순위표

  • 아래 표에서 나온 순서대로 우선순위가 빠른 연산자가 가장 먼저 실행된다.
  • 또한, 같은 우선순위를 가지는 연산자가 둘 이상 있을 때에는 결합 순서에 따라 실행 순서가 결정된다.

https://www.tcpschool.com/c/c_operator_arithmetic

 

대입 연산자(assignment operator)

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

https://www.tcpschool.com/c/c_operator_assignment

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씩 감소시킬 때 사용하는 연산자다.
  • 증감 연산자는 해당 연산자가 피연산자의 어느 쪽에 위치하는가에 따라 연산의 순서 및 결과가 달라진다.

https://www.tcpschool.com/c/c_operator_incAndDec

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입니다.
  • 다음 그림은 위의 예제에서 수행되는 연산의 순서를 보여준다.

https://www.tcpschool.com/c/c_operator_incAndDec

  • ① 첫 번째 감소 연산자(decrement operator)는 피연산자의 뒤쪽에 위치하므로, 덧셈 연산이 먼저 수행된다.
  • ② 덧셈 연산이 수행된 후에 감소 연산이 수행된다. (x의 값 : 9)
  • ③ 두 번째 감소 연산자는 피연산자의 앞쪽에 위치하므로, 덧셈 연산보다 먼저 수행된다. (x의 값 : 8)
  • ④ 감소 연산이 수행된 후에 덧셈 연산이 수행된다.
  • ⑤ 마지막으로 변수 y에 결괏값의 대입 연산이 수행된다. (y의 값 : 23)

 

비교 연산자(comparison operator)

  • 비교 연산자는 왼쪽의 피연산자와 오른쪽의 피연산자를 비교하여, 어느 쪽이 더 큰지, 작은지, 또는 서로 같은지를 판단한다.
  • 비교 연산자는 모두 두 개의 피연산자를 가지는 이항 연산자이며, 피연산자들의 결합 방향은 왼쪽에서 오른쪽이다.
  • 참고로 C언어에서 거짓(false)은 0이며, 0이 아닌 모든 것은 참(true)으로 인식된다.

https://www.tcpschool.com/c/c_operator_comparison

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으로 취급된다.

https://www.tcpschool.com/c/c_operator_logic

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) 단위로 논리 연산을 할 때 사용하는 연산자다.
  • 비트 단위로 전체 비트를 왼쪽이나 오른쪽으로 이동시킬 때도 사용한다.

https://www.tcpschool.com/c/c_operator_bitwise

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

https://www.tcpschool.com/c/c_operator_bitwise

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

https://www.tcpschool.com/c/c_operator_bitwise

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

https://www.tcpschool.com/c/c_operator_bitwise

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

https://www.tcpschool.com/c/c_operator_bitwise

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
반응형