본문 바로가기
C 프로그래밍 C programming/수업

연산자

by 윤시여 2022. 2. 6.

<수식>

= 대입
+ 더하기
- 빼기
/ 나누기
* 곱하기
% 나머지

 - +와 =는 양수. 음수 표현으로도 쓸 수 있다.

 

 

<증감 연산자>

++ 1을 더한다 x++ (==x+1)
-- 1을 뺀다 x-- (==x-1)

 - 근데 ++x와 x++는 다르다. 

++x  수식의 값이 증가된 x의 값
x++ 수식의 값은 증가되지 않은 원래 x의 값

 못알아 먹을 거 같으니까 예시를 보자.

x=10
y=x++ ; 

이 경우 y는 10이 되고 x는 11이 된다.
왜냐하면 y에 먼저 대입을 하고(=) x에 1을 더하라는(++) 거니까 
x=10
y=++x;

이 경우는 y는 11, x도 11이 된다.
왜냐하면 y는 1을 더한(++) x니까 

 적고나니까 컴퓨터는 차례대로 읽는 게 느껴진다.

 

 

<관계>

>,< 크다
>=, <= 크거나 같다
== 같다
!= 같지 않다

 

<논리 연산자>

 - C에서 0이 아닌 모든 숫자는 참이고, 참은 1로 거짓은 0으로 인출된다.

&& and 둘 다 참이어야 1을 인출
|| or 둘 중 하나만 참이면 1을 인출
! not 참이면 0, 거짓이면 1을 인출

 - 이해하지 못한 당신을 위한 예시가 있다.

 

Y=3 
→ !Y=

  해석해보자. 
  Y는 3이므로 참이다. 따라서 Not Y는 0이 인출된다. 
!Y=0
!0=

  !Y가 나왔다는 건 Y가 참이라는 뜻이다. 
  이 때 0은 거짓이므로 !0은 1이 인출된다.

 

 

<복합 연산자>

+= x=x+y → x+=y
x=x+1 → x+=1
-= x=x-y → x-=y
/= 이하 동문
%= 이하동문

 

 

<조건> 

? 조건자

- if랑 비슷하게 이용이 된다.

MAX_VALUE = (X>Y) ? X:Y

  참이면 X가 MAX_VALUE의 갑승로, 거짓이면 Y가 MAX_VALUE의 값으로 인출된다.

 

 

<비트 연산자>

 - 컴퓨터는 비트를 사용해서 계산한다. 비트 연산자는 십진법 숫자를 이진법으로 바꾸어서 비트단위로 연산하게 된다. 이 때 연산자는 각 자리마다 따로 따로 계산된다.

& And 둘 다 참이면 1로 인출
| Or 둘 중 하나만 참이면 1 인출
^ Xor 두 개가 같으면 0, 다르면 1을 인출
~ Not 참이면 0을, 거짓이면 1을 인출(반전)
<< 이동 9<<1 : 해당 방향으로 1만큼 이동시키세요
>> 이동 이하 동문

 

 이해가 더럽게 안 갈테니 예시를 보자.

int 9
int 10
9||10=1
9|10=

우선 ||을 계산하기 위해 9와 10을 2진법으로 표현해야 한다.
9는 1001, 10은 1010이 된다. 
자, 여기서 |은 or 이므로 둘 중 하나만 참이면 1을 인출한다.
따라서 1011이란 값이 도출되며 이를 십진법으로 변환하면 11이 된다. (9|10=11)

1001 (9)
1010 (10)
------
1011 (11)

 

어렵지? 하나 더 보자.

int 9
int 10
9&&10 = 1
9&10 =

&는 둘 다 참일 때만 1을 인출하므로 1000(8)이 인출된다. (9&10=8)

 

 - 여기까지 따라 왔다면, 더 디테일하게 가보자. Not을 이해하기 위해 필요한 과정이다.

컴퓨터는 32비트 표현을 쓴다. 

따라서 int 9(int는 4byte 표현으로, 1byte=8Bit라서 32 Bit) 사실상 

00000000 00000000 00000000 00001001로 표현된다. 

이 때 !9를 처리하게 되면 11111111 11111111 11111111 11110110이 인출되는데 이는 9의 음수표현이다. 

<이진수의 음수표현> 
 - 이진수의 음수 표현에는 3가지 방식이 있다. 
  1) 절댓값 2)1의 보수 3)2의 보수.

  1) 절댓값 표현
    - 최상위 비트를 부호 비트로 써준다. (양수는 0, 음수는 1) 
      ex. 00110101(+53), 10110101(-53)
    - 최상위 비트를 부호를 나타내는 데 쓰기 때문에 비효율적이고 +0과 -0이 생기기 때문에 비선호된다.

  2) 1의 보수 
  - 원래 숫자랑 합이 1이 되는 수가 음수라는 개념. 
    ex. 00110101(+53), 11001010(-53)
  - 모든 자리를 쓸 수 있지만(부호로 낭비하지 않음) +0(00000000)과 -0(11111111)이 생긴다. 그래서 나온 게

  3) 2의 보수
   - 1의 보수에 1을 더한 값으로 컴퓨터가 사용하는 방법이다. 
    ex. 00110101(+53), 11001011(-53)
   - -0이 생기지 않기 때문에 더 많은 수를 표현할 수 있다.

 - 자 이걸 이해했다면 이제 ~(not)에 대해 이해를 해보자. 

int 9
~9=

9는 00000000 00000000 00000000 00001001이다 
이 때 ~9는 11111111 11111111 11111111 11110110이다. 
그런데 컴퓨터는 2의 보수를 사용하므로 나타내진 숫자를 1의 보수로 바꾸기 위해서 1을 빼주면
11111111 11111111 11111111 11110101(1의 보수)이 된다.
따라서 이를 양수 표현으로 고쳐주게 되면 00000000 00000000 00000000 00001010이므로 10이 된다. 
시발 조난 어렵고 재밌다.

 

- 이동 연산자 예시도 보자.

int 9
9<<1=

9는 00000000 00000000 00000000 00001001이니까 한 칸씩 이동시키면
00000000 00000000 00000000 00010010이 된다.

 

 

<예제 - 윤년 판단하기> 

- 윤년은 4로 나누어떨어지고 100으로 떨어지지 않는 달이다. 이 때 400으로 나누어 떨어지는 날은 윤년에 해당된다. 

  문제를 요악하면 (4로 나누어떨어짐 그리고 200으로 나누어 떨어지지 않음) 혹은 400으로 나누어 떨어짐.

  따라서 4로 나눠떨어짐 && 100으로 나눠떨어짐 을 먼저 처리하고 || 400으로 나눠떨어짐 을 써주면 된다. 

 

 

<예제 - 큰 수 판단하기 >

- 사용자로부터 두 수를 입력받아 큰 수와 작은 수를 도출해주는 프로그램을 작성해보라.

 나 사실 이거 좀 어려운데 대충 큰 거 작은 거 도출해주세요 하니까 된다.

 ? 조건문은 그냥 바로 집어넣어도 계산해준다고 그런다. 

 MAX_VALUE와 MIN_VALUE로 따로 지정해주는 것도 좋을 것 같다. 해보고 온다.

 

이렇게 하는 게 다른 사람이 열어봤을 때 더 편할 것 같다. 

'C 프로그래밍 C programming > 수업' 카테고리의 다른 글

switch문(조건문)과 while문(반복문)  (0) 2022.02.20
다중 if 문  (0) 2022.02.13
조건문 01 if문  (0) 2022.02.06
프로그래밍 기본 용어와 카레  (0) 2022.01.27
0125 4장  (0) 2022.01.25