관리 메뉴

나구리의 개발공부기록

Chapter 02 - C언어(연산자) 본문

728x90

2024년도 수제비 실기책(6판) 내용 정리


6. 연산자

1) 연산자(Operator)개념

  • 프로그램 실행을 위해 연산을 표현하는 기호

2) 연산자 종류

종류 설명 연산자
증감 연산자 피연산자를 1씩 증가 혹은 1씩 감소시킬 때 사용하는 연산자 ++, --
산술 연산자 산술식을 구성하는 연산자 +, -, *, /, %
시프트 연산자 비트를 이동시키는 연산자 <<, >>
관계 연산자 두 피연산자 사이의 크기를 비교하는 연산자 >, <, >=, <=, ==, !=
비트 연산자 비트 단위로 논리 연산할 때 사용하는 연산자 &, ^, |, ~
논리 연산자 두 피연산자 사이의 논리적인 관계를 정의하는 연산자 &&, ||, !
삼항 연산자 조건이 참일 경우 물음표와 콜론 사이의 값을 반환,
조건이 거짓일 경우 콜론과 세미 콜론 사이의 값을 반환하는 연산자
(조건식) ? (참) : (거짓);
대입 연산자 변수에 값을 대입할 때 사용하는 연산자
오른쪽에 있는 값을 이용해 왼쪽의 변수에 값을 대입
=, +=, -=, *=, /=, %=

3) 연산자 우선순위

우선순위 연산자 항의 개수  유형
1 x++ 단항 연산자 증감 연산자
x--
2 ++x
--x
! 논리 연산자(부정)
~ 비트 연산자(부정)
3 * 이항 연산자 산술 연산자
/
%
4 +
-
5 << 시프트 연산자
>>
6 < 관계 연산자
>
<=
>=
7 ==
!=
8 & 비트 연산자
9 ^
10 |
11 && 논리 연산자
12 ||
13 (조건식) ? a : b; 삼항 연산자 삼항 연산자
14 = 대입 연산자 대입 연산자
+=
-=
*=
/=
%=

4) 연산자 상세

(1) 증감 연산자(Increment & Decrement Operator)

종류 설명
++x 변수의 값을 1 증가시킨 후에 해당 변수를 사용하는 연산자
x++ 변수를 사용한 후에 변수의 값을 1 증가시키는 연산자
--x 변수의 값을 1 감소시킨 후에 해당 변수를 사용하는 연산자
x-- 변수를 사용한 후에 변수의 값을 1 감소시키는 연산자
#include <stdio.h>
int main() {
  int x = 3, y = 3;
  printf("%d", x++); // 3 출력 후 x의 값을 1 증가
  printf("%d", x);   // 4 출력
  printf("%d", ++y); // y의 값을 1 증가시킨 후 y의 값을 출력, 4 출력
  printf("%d", y);   // 4 출력
  return 0;
}
#include <stdio.h>
int main() {
  int x=3, y=3;
  int z = x++ + ++y; // y의 값을 1 증가시킨 후 x(4) + y(3) 연산을 하고 그 값을 z에 대입, z == 7
                     // 그 후 x의 값을1 증가시킴, x == 4
  printf("%d %d %d", x, y, z);  // 4, 4, 7 출력
  return 0;
}
#include <stdio.h>
int main() {
  int x = 3, y = 3;
  x++;   // 단독 사용시 단순히 1 증가, x는 4가 됨
  ++y;   // 위와 동일
  printf("%d %d, x, y); 4, 4 출력
  return 0;
}

(2) 산술 연산자(Arithmetic Operator)

 

  • C언어에서 정수와 정수를 나누기(/) 연산하게 되면 정수 / 정수로 계산되어 소수점이 버려지게 됨
  • 소수점을 나오게 하고자 하면 정수 / 실수를 연산하거나 실수 / 실수로 연산하면 됨
종류 설명
+ 양쪽의 값을 더하는 연산자
- 왼쪽 값에서 오른쪽 값을 빼는 연산자
* 두 개의 값을 곱하는 연산자
/ 왼쪽 값을 오른쪽 값으로 나누는 연산자
% 왼쪽 값을 오른쪽으로 나눈 나머지를 계산하는 연산자, 정수끼리만 계산할 수 있음
#include <stdio.h>
int main() {

  int x = 3, y = 2;
  float z = 2.0;
  
// x를 y로 나눈 나머지와 y를 x로 나눈 나머지를 정수형식으로 출력,
  printf("%d %d\n", x%y, y%x);  // 1, 2

// x를 y로 나눈 몫을 정수형식으로, x를 z를 나눈 몫을 소수점둘째자리까지 표현하는 실수 형식으로 출력
  printf("%d %.2f", x/y, x/z);  // 1, 1.50
  
  return 0;
  
}

(3) 시프트 연산자(Shift Operator)

 

  • <<로 1비트 이동시킬 때마다 2배씩 증가하게 되고, >>로 1비트 이동시킬 때마다 2배씩 감소(2진법의 자리가 변환하기 때문)
  • 비트연산자로 계산할 때는 2진수로 변환 후 계산
종류 설명
<< 왼쪽 값을 오른쪽 값 만큼 비트를 왼쪽으로 이동하는 연산자
>> 왼쪽 값에 오른쪽 값만큼의 부호 비트를 채우면서 오른쪽으로 이동하는 연산자
#include <stdio.h>
int main() {
  int x = 11;
  
  // x의 값을 3만큼 왼쪽으로 비트연산, 계산을 위해서 우선 x를 2진수로 변환
  // 11의 2진수는 1011이고 해당 값을 3만큼 왼쪽으로 이동시키면 1011000으로 변경 됨(이동한 자리는 0으로 채움)
  // 10진수로 변환하면 88이 됨
  printf("%d", x<<3); // 88 출력
 
  // 위와 동일하게 x의 2진수의 값은 1011이고 해당 값을 1반큼 오른쪽으로 비트연산 수행
  // x의 값은 101이 되고 10진수로 변환하면 값은 5가 됨
  printf("%d", x>>1); // 5 출력
  
  return 0;
}
// 출력 : 885(개행문자가 없어서 붙혀서 출력됨)

(4) 관계 연산자 (relation Operator)

 

  • 참이면 1을 거짓이면 0을 반환
종류 설명
> 왼쪽에 있는 값이 오른쪽에 있는 값보다 크면 참을 반환하고, 아니면 거짓을 반환
< 왼쪽에 있는 값이 오른쪽에 있는 값보다 작으면 참을 반환하고, 아니면 거짓을 반환
>= 왼쪽에 있는 값이 오른쪽에 있는 값보다 크거나 같으면 참을 반환하고, 아니면 거짓을 반환
<= 왼쪽에 있는 값이 오른쪽에 있는 값보다 작거나 같으면 참을 반환하고, 아니면 거짓을 반환
== 왼쪽에 있는 값과 오른쪽에 있는 값이 같으면 참을 반환하고, 아니면 거짓을 반환
!= 왼쪽에 있는 값과 오른쪽에 있는 값이 다르면 참을 반환하고, 아니면 거짓을 반환
#include <stdio.h>
int main() {
  printf("%d\n", 3==3); // 3==3의 결과는 참이므로 참의 값을 10진 정수형태로 출력, 1 출력
  printf("%d\n", 3!=3); // 3!=3의 결과는 거짓이므로 거짓의 값을 10진 정수형태로 출력, 0출력
  
  return 0;
}

(5) 비트 연산자(Bit Operator)

종류 설명
& 두 값을 비트로 연산하여 같은 비트의 값이 모두 1이면 해당 비트의 값이 1이 되고 아니면 0이 됨 (AND)
| 두 값을 비트로 연산하여 같은 비트의 값이 하나라도 1이면 해당 비트의 값이 1이되고 아니면 0이됨 (OR)
^ 두 값을 비트로 연산하여 같은 비트의 값이 서로 같으면 0이되고 다르면 1이되는 연산자 (XOR)
~ 모든 비트의 값을 반대로 바꾸는 반전 기능을 하는 연산자 (NOT)
  • AND연산 : 피연산자가 모두 True인 경우에만 결과가 True이고 그 외에는 모두 False
  • OR연산 : 피연산자가 모두 False인 경우에만 결과가 False이고 그 외에는 모두 True
  • XOR연산 : 피연산자가 모두 다르면 True, 서로 같으면 False
피연산자 피연산자 AND OR XOR
True True True True False
True False False True True
False True False True True
False False False False False
#include <stdio.h>
int main() {

  // 비트 연산을 하기 위해 12와 10을 모두 2진수로 변환하여 각 비트의 자리를 연산자에 맞게 비교
  // 12의 2진수는 1100
  // 10의 2진수는 1010
  
  // &연산은 비교할 비트의 자리가 둘다 1이여야 1이 되므로 1000이됨
  printf("%d", 12 & 10); // 1000을 10진 정수로 출력, 8
  
  // |연산은 비교할 비트의 자리가 하나라도 1이면 1이되므로 1110이됨
  printf("%d", 12 | 10); // 1110을 10진 정수로 출력, 14
  
  // ^연산은 비교할 비트의 자리가 같으면 0이고 다르면 1이 되므로 110이됨
  printf("%d", 12 ^ 10); // 110을 10진 정수로 출력, 6
  
  // ~연산은 부호를 반대로 바꾼 값에 1을 뺀 값이 출력됨
  printf("%d", ~12); // -13이 출력
  
  return 0;
}
// 출력 : 모두 개행이 없으므로 8146-13 이 출력됨
  • ~ (NOT) 연산은 2진수로 변환했을 때 각 자릿수에 대해 0이면 1로, 1이면 0으로 변환시키면 되는데 Sign Bit와 같은 컴퓨터 구조에 관한 내용을 알고 있으야 하므로 부호를 반대로 바꾼 값에 1을 뺀 값이라고 기억해두면 됨

(6) 논리 연산자(Logic Operator)

 

  • 참이면 1을 거짓이면 0을 반환
종류 설명
&& 두 개의 논리값이 모두 참이면 참을 반환하고 아니면 거짓을 반환 (AND)
|| 두 개의 논릿값 중 하나라도 참이면 참을 반환하고 아니면 거짓을 반환 (OR)
! 한 개의 논릿값이 참이면 거짓을 반환하고 거짓이면 참을 반환하는 연산 (NOT)
#include <stdio.h>
int main() {
  int x = 5, y = 3;
  
  // x > 5은 false(0), y >= 3은 true(1), 두 개의 논리값을 &&연산
  printf("%d", x>5 && y>=3); // 모두 참이 아니므로 false, 10진 정수 형태로 출력, 0
  
  // 위와 동일한 논리값을 || 연산
  printf("%D", x>5 || y>=3); // 둘중 하나가 참이므로 true, 10진 정수 형태로 출력, 1
  
  return 0;
}
// 출력 : 01

(7) 삼항 연산자(Ternary Operator)

 

  • 조건식 ? 참일때값 : 거짓일때값;
#include <stdio.h>
int main() {
  int a = 26, b = 91;
  
  // a < b의 조건이 참이면 a의 값을, 거짓이면 b의 값을 x에 대입
  int x = a < b ? a : b; //조건식이 참이므로 x에 26이 대입
  
  printf("%d", x); //26 출력
  return 0;
}

(8) 대입 연산자(Assignment Operator)

종류 설명
= 왼쪽의 변수에 오른쪽의 값을 대입
+= 왼쪽의 변수에 오른쪽의 값을 더한 후, 그 결과값을 왼쪽의 변수에 대입
-= 왼쪽의 변수에 오른쪽의 값을 뺀 후, 그 결과값을 왼쪽의 변수에 대입
*= 왼쪽의 변수에 오른쪽의 값을 곱한 후, 그 결과값을 왼쪽의 변수에 대입
/= 왼쪽의 변수에 오른쪽의 값을 나눈 후, 그 몫을 왼쪽의 변수에 대입
%= 왼쪽의 변수에 오른쪽의 값을 나눈 후, 그 나머지를 왼쪽의 변수에 대입
#include <stdio.h>
int main(){
  int a = 17;
  a += 1; // a에 1을 더한후 연산결과를 다시 a에 저장, 18
  a -= 2; // a에 2를 뺀 후 연산결과를 다시 a에 저장, 16
  a *= 3; // a에 3을 곱한 후 연산 결과를 다시 a에 저장, 48
  a /= 4; // a에 4를 나눈 후 몫을 다시 a에 저장, 12
  a %= 5; // a에 5를 나눈 후 나머지를 다시 a에 저장, 2
  printf("%d", a); // 2가 출력됨
  return 0;
}
728x90