본문 바로가기
C언어

세이버의 C언어 강의 9강_연산자란 무엇인가(part 2)

by 비원(Be one) 2018. 11. 11.
반응형

여러분 안녕하세요. 세이버입니다.

 

이번 강에서는 저번 강에 이어 관계 연산자, 논리 연산자, 조건 연산자, 비트 논리 연산자, 비트 이동 연산자를 알아보겠습니다.

연산자에 대한 간략한 설명은 8강을 참고해주세요.

세이버의 C언어 강의 8강_연산자란 무엇인가(part 1) : https://poci.tistory.com/10

 

세이버의 C언어 강의 8강_연산자란 무엇인가(part 1)

여러분 안녕하세요. 세이버입니다. 저번 강에는 scanf 함수를 이용하여 변수에 값을 입력하는 방법에 대해서 배워보았습니다. 이번 강에서는 연산자를 통하여 다양한 계산을 하는 법을 알아보도록 하겠습니다. 1...

poci.tistory.com


1. 관계 연산자

관계 연산자는 두 값의 크기를 비교하는 연산자입니다.

수학에서는 보통 , , , , 이런 기호로 값의 크기를 비교합니다.

관계 연산자가 위와 같은 기호를 의미합니다.

 

그런데 , 는 키보드에 없어서 문제가 되고, =는 대입연산자라서 문제가 됩니다.

그래서 관계 연산자는 >, >=, <, <=, ==를 사용합니다.

, 대신 >=, <=를 사용하고, = 대신 ==를 사용합니다.

=== 혼동하지 않도록 주의하세요.

 

그리고 한가지 더 있습니다.

두 값의 크기가 다른지 확인할 때는 !=를 사용합니다. 와 같은 의미입니다.

 

또한 한 가지 더 주의할 점은 연산의 결과값입니다.

산술, 증감 연산자는 3+1(4), 15--(14) 이런 식으로 많은 수들이 결과값이 될 수 있습니다.

하지만 관계 연산자의 결과값은 0, 1 입니다. 1은 참, 0은 거짓을 의미합니다.

 

변수 num1의 값과 num2의 값이 다르기에 8행에 있는 ==연산의 결과가 0입니다.

변수 num1보다 num2가 작아서 9행의 결과값은 0, 10행의 결과값은 1입니다.

그리고 변수 num1의 값과 num2의 값이 다르기에 10행의 != 연산자의 결과가 1입니다.

 

이 연산자는 향후 배울 조건문에 꼭 필요한 연산자이기에 숙지해주시길 바랍니다.

 

2. 논리 연산자

논리 연산자는 두 가지 이상의 조건의 결과값들을 연산하는 것입니다.

논이 연산자는 &&, ||, !가 있는데, &&는 두 피연산자의 값이 1일때 1의 결과를 얻고, ||는 두 피연산자 중 하나 이상이 1일때 1의 결과를 얻습니다.

!는 피연산자가 0이면 1의 결과를, 1이면 0의 결과를 얻습니다.

 

이렇게 말로 쓰면 조급 복잡해서 표로 보여드리겠습니다.

 

피연산자 && 피연산자 결과값
1 && 1 1
1 && 0 0
0 && 1 0
0 && 0 0

 

피연산자 || 피연산자 결과값
1 || 1 1
1 || 0 1
0 || 1 1
0 || 0 0

 

! 피연산자 결과값
! 1 0
! 0 1

 

변수 num1의 값이 변수 num2보다 작아서 num1<=num2의 값은 1입니다.

그리고 변수 num1의 값과 변수 num2의 값이 다르기에 num1!=num21입니다.

그래서 8행의 result에는 1이 들어있는 것입니다..

 

한번 다른 예제들로 실습해보시길 바랍니다.

 

3. 조건 연산자

조건 연산자는 주어진 조건을 만족하냐에 따라 값을 다르게 설정할 때 사용합니다.

조건 연산자는 [조건]?[값1]:[값2] 이런 식으로 이루어지는데요, 다른 연산자와는 달리 피연산자가 3개이기에 다른 책에서는 '삼항 연산자'라고도 합니다.

조건을 만족하면 값1을, 만족하지 않으면 값2로 설정되는 구조입니다.

 

말로는 어려우니 실습을 통해 알아보겠습니다.

 

8행과 같이 조건연산자를 사용합니다.

num1>=num2가 조건이 되고, num1은 값1, num2는 값2가 됩니다.

변수 num1의 값이 변수 num2의 값보다 작으므로 조건 num1>=num2는 거짓입니다.

그래서 변수 result의 값에다가 num2의 값을 대입하여 변수 result20이 들어가게 되는 겁니다..

 

향후 조건문을 배울 예정인데 조건문과 같은 역할을 하는 연산자입니다.

이 연산자는 그다지 많이 쓰지는 않지만 알아두면 편리합니다.

 

4. 비트 연산자

이제 남은 연산자는 비트 논리 연산자, 비트 이동 연산자입니다.

이 둘을 합쳐서 비트 연산자라고 합니다.

 

먼저 비트 논리 연산자를 알아보겠습니다.

비트 논리 연산자는 위에서 배운 논리 연산자(&&, ||, !)를 비트단위에 적용시킨다고 보시면 됩니다.

비트 논리 연산자에는 &, |, ~, ^가 있습니다.

 

&&&와 같은 기능, |||와 같은 기능, ~는 !와 같은 기능입니다.

, &는 모든 비트가 1일 때 1을 반환하고, |는 둘 중 하나 이상의 비트가 1일 때 1을 반환합니다.

~01, 10으로 반환합니다.

 

^는 새로 추가된 개념으로 XOR 연산을 합니다.

XOR 연산이란 두 비트의 값이 다르면 1을 반환하고, 같으면 0을 반환하는 연산입니다.

 

표로 표현하면 다음과 같습니다.

 

비트값 & 비트값 결과값
1 & 1 1
1 & 0 0
0 & 1 0
0 & 0 0

 

비트값 | 비트값 결과값
1 | 1 1
1 | 0 1
0 | 1 1
0 | 0 0

 

~ 비트값 결과값
~ 1 0
~ 0 1

 

비트값 ^ 비트값 결과값
1 ^ 1 0
1 ^ 0 1
0 ^ 1 1
0 ^ 0 0

예를 들어 1015가 있다고 가정합시다.

102진수로 1010이고, 152진수로 1111입니다.

10&15 연산을 한다고 했을 때 다음과 같이 연산이 됩니다.

 

1 & 1 = 1
0 & 1 = 0
1 & 1 = 1
0 & 1 = 0

따라서 10&15의 결과는 10(1010)이 됩니다.

 

그럼 10 |15 연산은 어떨까요?

 

1 | 1 = 1
0 | 1 = 1
1 | 1 = 1
0 | 1 = 1

따라서 10 |15의 결과는 15(1111)가 됩니다.

 

코드로 표현하면 이렇게 됩니다.

다른 값들을 이용해서 직접 실습해보시길 바랍니다.

 

마지막으로 비트 이동 연산자입니다.

비트 이동 연산자는 말 그대로 비트를 이동시킨다는 의미입니다.

비트 이동 연산자는 >>, <<가 있습니다.

>>는 오른쪽으로, <<는 왼쪽으로 비트를 이동시킵니다. (화살표 방향대로 이동시킵니다.)

 

비트 이동 연산자는 [변수]>>[이동 시킬 횟수] 이렇게 사용합니다.

변수 num10이 있고, num>>2라고 했을 때

그림과 같은 방식으로 비트 수가 2칸씩 오른쪽으로 이동합니다.

그런데 이동하는 과정에서 2개의 비트 공간에 값이 손실되게 되는데요, 이때 빈 비트에 0이 대입됩니다.

만약 피연산자가 음수면 1이 대입됩니다.

따라서 num>>22가 됩니다.

 

반대로 num<<2는 다음과 같습니다.

왼쪽으로 2칸씩 이동하고, 누락된 부분은 0이 대입되어 40이 됩니다.

따라서 num<<240이 됩니다.

 

코드로 표현하면 다음과 같습니다.

 

한 가지 팁은 오른쪽으로 한 칸씩 비트가 이동할 때마다 피 연산자의 /2가 되고,

왼쪽으로 한 칸씩 비트가 이동할 때마다 피 연산자의 *2가 된다는 것입니다.

이 팁을 이용하면 비트가 이동된 값을 쉽게 계산할 수 있습니다.


이번 강에서는 조금 어려운 개념의 연산자들을 다루어보았습니다.

특히 비트 연산자에서 약간 멘붕이 오신 분들도 있으실 겁니다.

그렇지만 처음에만 힘들 뿐5번만 다른 값으로 실습해보시면 이해가 되실 겁니다.

이해가 되신 후에는 쉽게 코드로 작성하실 수 있으실 겁니다.

 

그럼 저는 다음 강을 준비하러 가보겠습니다.

오늘도 수고하셨습니다.

 


정리

- 관계 연산자 : 두 값의 크기를 비교하는 연산자 (>, >=, <, <=, ==, !=)

- 논리 연산자 : 두 가지 이상의 조건의 결과값들을 연산하는 연산자 (&&, ||, !)

- 조건 연산자 : 주어진 조건을 만족하냐에 따라 값을 다르게 설정하는 연산자 (? :)

- 비트 논리 연산자 : 논리 연산자를 비트 단위로 정의한 것 (&, |, ~, ^)

- 비트 이동 연산자 : 피연산자의 비트를 이동시키는 연산자 (>>, <<)

     ※ 오른쪽으로 한 칸씩 비트가 이동할 때마다 피 연산자의 /2

     ※ 왼쪽으로 한 칸씩 비트가 이동할 때마다 피 연산자의 *2


강의가 유익하셨거나 마음에 드셨으면 구독과 좋아요, 댓글 부탁드립니다.

궁금하신 점이나 질문은 댓글이나 메일을 남겨주세요.

 

poci5003@gmail.com

 

 

 

 

 

 

반응형