728x90
커리큘럼을 복사해온 것을 보다가 연산자부분은 그냥 넘어가면 안되겠다 싶어서 손을 대게 되었다.
특히 비트연산자는 눈여겨볼 필요가 있다.
연산자 - 단항, 산술, 쉬프트-비트, 관계, 논리, 삼항, 대입
대략 이런 식으로 분류할 수 있단다.

1. 단항 연산자
말 그대로 operend가 하나다. 같은 수식도 위치에 따라 쓰임이 달라지는데 특히 단항 연산자가 그렇다.
종류 : + , - , ++, --
예 : int a = 10;이라고 가정해보자.
+10, -10, +a, -a (상수나 변수가 음수인지 양수인지를 나타낸다.)
++a, a++, --a, a-- (많이 사용되지만 결코 쉽지 않은 연산이다. ++은 a의 값을 1증가시켜 a에 대입하고 --는 그 반대다. 하지만 ++a처럼 연산이 앞에(선행) 있으면 해당 line에서 이미 연산이 되고 a++처럼 뒤에(후행) 있으면 다음 줄로 넘어갈 때 연산이 된다. 이 연산은 상수에는 사용할 수 없다.)
프로그래밍 습관에 대해서는 다른 카테고리에 계속 글을 올리겠지만 증가,감소연산자를 대입연산과 함께 사용하는 것은 아주 위험한 일이다.
=========================================
1.           a = 10;
             a = ++a - --a + a++;
             printf("%d\n",a);
-----------------------------------------
 2.        a = 10;
            printf("%d\n", ++a - --a + a++);
=========================================
1번과 2번 소스는 출력 결과가 다르게 나온다. 그런데 중요한 것은 이런 수식이 사용되면 안된다는 것이다. 이런 수식을 잘 사용한다고 자랑하는 것은 멀쩡한 손 놔두고 발로 젓가락질 할 줄 안다고 자랑하는 것과 비슷하다. 누누히 말하지만 소스를 보는 사람이 바보라고 생각하고 최대한 알아보기 쉽게 작성해야 한다.

2. 산술 연산자
종류 : + - * / %
예 : 우리가 생각하는 사칙연산과 똑같이 사용하면 된다. 사칙연산이라면서 왜 다섯개야?라고 생각한 당신! 눈치가 빠르다.
+ : 더하기
- : 빼기
* : 곱하기
/ : 나누기
%: 모듈러
+ -
는 단항연산에서도 사용되었다. 어떻게 쓰이느냐에 따라 연산이 달라진다는 것이다. 양쪽에 operend(피연산자)가 있으면 산술연산으로 계산되니 염두해두자. 그리고 C언어에서 이러한 연산들을 구분하는 것으로 띄어쓰기도 작용을 하므로 주의해야 한다. space bar한번에 전혀 엉뚱한 연산이 작동할 수도 있다.
b - --a, b - - -a, b-- -a 이 세가지가 모두 다르다는 말이다.
/연산은 나누기와 같은데 주의할 점은 C언어에서 int의 나누기연산이다. int는 정수를 취급하기 때문에 나누기 연산의 몫에서 정수부분만 가져온다. 이때 내림을 하는데 15/4의 경우 3.75가 아니라 3이 나온다.
%연산은 유용한 사용이 많으니 잘 기억해두자. 사칙연산도 아니면서 같이 껴 있으면 얼마나 중요한 녀석인지 감 잡아야 한다. 이녀석은 15%4의 결과로 3이 출력된다. %의 사용은 다방면으로 많은데 그중 흔히 사용되는 경우가 반복문 내에서 if문과 함께 사용되는 경우다.
if( i % 3 == 0) 이렇게 사용하면 i가 3의 배수일 때마다 if문이 작동한다.

3. 관계연산자
종류: <, >, <=, >=, ==, !=

A < B : A가 B보다 작다
A > B : A가 B보다 크다
A <= B : A가 B보다 작거나 같다. (작아도 true, 같아도 true)
A >= B : A가 B보다 크거나 같다. (커도 true, 같아도 true)
A == B : A와 B는 같다.
A != B : A와 B는 같지 않다.
주의할 것은 앞에 있는 A가 중심이고 식의 결과는 true나 false가 된다. C의 경우 true나 false의 개념이 없기 때문에 true는 1이 false는 0이 return된다.
(TIP: C에서는 0이면 false이고 나머지 다른 값이면 true가 된다.)

4. 삼항연산자
종류: 수식?A:B
예: (a>b) ? a++ : b++;
수식의 값이 참(true)이면 A가 실행되고 거짓(false)이면 B가 실행된다. 잘 사용되지 않는 수식이지만 복잡하고 긴 수식을 한방에 조지는 마법같은 효과가 있다.

5. 논리연산자
종류: &&, ||, !
ADN, OR, NOT이라고 부른다.
논리연산자는 계산식을 operend로 하는 것을 원칙으로 한다.
A && B : 두 식이 모두 참이다. (두 식이 모두 true면 true, 아니면 모두 false)
A || B : 둘중 하나는 참이다.(두 식이 모두 false면 false, 아니면 모두 true)
!A : A의 결과를 반대로~ (A가 true면 false, A가 false면 true)

6. 비트연산자
사실 내가 비트연산자 때문에 글을 쓰게 되었다. 비트연산은 조금쯤 깊이있게 생각해야 하기 때문에 일반적인 프로그래밍에서 많이 사용하지 않는 것이 좋다. 하지만 비트연산은 산술연산보다 확실히 빠르므로 반복횟수가 많고 계속적인 연산이 있을 경우, 비트연산이 편리한 수식일 경우 비트연산을 잘 사용하면 효율적이다.
종류 : &, |, ~
&(AND) : 비트가 둘다  1이면 1 아니면 0
|(OR) : 비트가 둘다 0이면 0 아니면 1
~(NOT): 비트 반대로
예)
이해만 확실히 하면 전혀 어려운 개념이 아니다. 다만 2진수로 생각해야 한다는 것이 문제다.

7. shift(쉬프트)
종류 : >>, <<
에) 20 << 3 이거 결과로 80 나온다. 왜 그런지 알아보자
20 : 0000 0001 0100
<<3
결과 : 0000 1010 0000
왼쪽으로 3칸 이동한 것을 볼 수 있다. shift연산자는 방향에 따라 이동하기때문에 헷갈리기 쉽다.
화살표가 있다고 생각하면 기억하기 쉽다.
<<------- 요녀석 왼쪽으로 이동하라는 이야기
------------>> 요녀석 오른쪽으로 이동하라는 이야기
주의: >> 요녀석 주의해야 한다. <<는 오른쪽에 0으로 무조건 채우면 된다.
그런데 >>는 MSB에 따라 달라진다. 그러니까 가장 왼쪽에 있는값이 1이면 1로 채우고 0이면 0으로 채워야 한다. 그러니까 양수면 0으로 채우고 음수면 1로 채우라는 이야기!
728x90

+ Recent posts