0. 서론 |
이번 포스팅은 프로그래밍에 있어서 기본이 되는 연산자에 대해서 정리하고자 합니다.
연산자는 굉장히 간단합니다. 몇 가지 되지 않을 뿐더러 금방 이해할 수 있는 개념이라고 할 수 있습니다.
하지만, 이항 연산자에서 비트 단위로 계산하는 개념은 모르시는 분들이 많습니다. 요즘 같이 충분한 메모리와 용량이라면, 굳이 비트 수준으로 프로그래밍 할 필요가 있을까라는 생각을 하시는 분들이 보통 비트 연산자에 대해서 소홀하신 편인 것 같습니다. 하지만, 임베디드에서 iot까지.. row 수준으로 갈수록 비트 하나하나가 중요하다는 것을 요즘 들어서 저에게는 소중하다고 깨닫게 하는 것 같습니다.
어찌되었든, 알아서 나쁜 것은 없지 않을까요? 오늘 확실하게 정리하시는 것 어떨가 싶습니다.
1. 1순위 연산자 정리 |
() : 수식의 우선순위을 변경합니다.
[] : 배열을 선언하거나 배열 요소를 지정합니다.
. : 구조체 및 공용체의 멤버를 참조할 때 사용하는 연산자입니다.
-> : 구조체 및 공용체의 간접멤버를 참조할 때 사용하는 연산자입니다.
2. 단항연산자 |
- : 부호를 반전시킵니다.
+ : 부호를 유지시킵니다.
! : 논리부정 ( 0 = False, 1 = True)
ex) a = 3 > 5; // a에는 0, 즉 False 값이 들어갑니다.
a = !(3 > 5); // False 값을 부정하였으므로, a 에는 True 값이 들어갑니다.
++ : 1을 증가시키는 연산자 입니다.
-- : 1을 감소시키는 연산자 입니다.
++, -- 연산자는 전위형과 후위형으로 사용법이 나뉘어 집니다. 이러한 사용법은 다음의 예제로 설명하겠습니다.
OperatorEx1.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #include <stdio.h> int main(void) { int a = 0, b = 0; a++, b++; printf("a = %d, b = %d\n", a, b); ++a, ++b; printf("a = %d, b = %d\n", a, b); printf("a = %d, b = %d\n", ++a, ++b); printf("a = %d, b = %d\n", a++, b++); printf("a = %d, b = %d\n", a, b); return 0; } | cs |
결과 :
>> a = 1, b = 1 >> a = 2, b = 2 >> a = 3, b = 3 // ++ 연산자가 변수 앞에 붙었으므로, 출력하기 전에 변수 값이 1씩 증가합니다. >> a = 3, b = 3 // ++ 연산자가 변수 뒤에 붙었으므로, 출력 후에 값이 1씩 증가합니다. >> a = 4, b = 4 // 값이 뒤늦게 증가한 것을 확인할 수 있습니다. |
~ : 1의 보수 연산자입니다. 비트 값을 1은 0으로, 0은 1로 바꾸어주는 연산자입니다.
(type) : cast 연산자입니다. 자료형의 형변환을 명시적으로 변환하고자 할 때, 사용하는 연산자입니다.
자동형변환의 방식은 다음과 같습니다.
- 작은 자료형이 큰 자료형으로 변환됩니다. ex)
- 대입이 이루어지는 곳에서의 형변환으로는 오른쪽의 자료형이 왼쪽의 자료형으로 변환되어 대입됩니다.
- 주소인 데이터 자료형에서는 자동 형변환이 이루어지지 않습니다.
& : 주소를 나타내고자 할 때 사용하는 연산자 입니다.
* : 포인터 연산자입니다.
- 선언문에서 사용할 때 : 포인터 변수를 선언할 때 사용합니다.
- 실행문에서 사용할 때 : 포인터 변수를 가리키는 대상을 의미합니다.
ex) int* a = 5; // 포인터 변수를 선언한 것입니다.
printf("%d", *a); // 실행문에서 포인터 변수인 a를 참조하고자 *연산자를 사용한 것입니다.
sizeof : 변수, 상수 또는 데이터형의 크기를 bytes 수로 계산할 수 있는 연산자입니다.
3. 이항연산자 |
<<, >> : 쉬포트 (shift) 연산자입니다. 오른쪽 또는 왼쪽으로 bit단위로 데이터를 이동시키는 연산자 입니다.
shift 이동을 할 때, 공백을 메우는 법칙은 다음과 같습니다.
<< |
signed |
0으로 채워집니다. |
unsigned |
||
>> |
signed |
sign bit의 값으로 채워집니다. |
unsigned |
0으로 채워집니다. |
% : 나머지 연산자입니다. 몫을 구할 때는 '/' 연산자를 이용하고, 나머지는 '%'연산자를 이용하여 계산합니다.
<, >, <=, >= : 왼쪽과 오른쪽의 값을 비교하는 연산자 입니다.
ex) 5 > 3 : true
==, != : 서로 같은 지, 아닌 지를 비교하는 연산자 입니다.
--bit 단위로 계산할 때 사용하는 연산자. --
& : AND
| : OR
^ : XOR
x |
y |
x & y |
x | y |
x ^ y |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
1 |
1 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
0 |
1 |
&& : 논리곱
|| : 논리합
x |
y |
x && y |
x || y |
F |
F |
F |
F |
F |
T |
F |
T |
T |
F |
F |
T |
T |
T |
T |
T |
4. 삼항연산자 |
말 그대로 3개의 항으로 이루어진 식이라고 생각하면 되겠습니다.
? : 조건 연산자라고 합니다.
이 부분은 예제로 설명하는 것이 이해가 빠를 것으로 생각하여, 다음 예제로 설명을 하겠습니다.
tripleOperatorEx.cpp
1 2 3 4 5 6 7 | #include <stdio.h> int main(void) { int a = 3 , b = 5; (a > b) ? printf("%d > %d \n", a, b) : (a < b) ? printf("%d < %d \n", a, b) \ : printf( "%d == %d\n", a, b); return 0; } | cs |
결과:
>> 3 < 5 |
(a > b) ? printf("%d > %d \n", a, b) : (a < b) ? printf("%d < %d \n", a, b) : printf( "%d == %d\n", a, b);이 라인과 같이 이루어진 것을 삼항연산자라고 할 수 있습니다.삼항연산자의 식은 다음과 같습니다.(조건식) ? (True 식) : (False) 식삼항연산자는 조건식을 확인합니다. 확인 후, 조건식이 True값이면 True 식으로 이동하며, False 값일 경우에는 False 식으로 이동합니다.예를 들어볼까요.(13 == 15) ? printf("Hi"); : printf("Hello");답은 어떤 것일까요.먼저, 조건식을 보겠습니다. 13과 15는 같지 않으므로, False 값이 나올 것입니다. 그럼 후위 식을 출력하겠죠?그러므로 답은 Hello가 출력될 것입니다.이러한 것처럼 위의 식도 확인해보겠습니다.(a > b) ? printf("%d > %d \n", a, b) : (a < b) ? printf("%d < %d \n", a, b) : printf( "%d == %d\n", a, b);제 나름대로 이해하기 쉽도록 나누어 봤습니다.먼저, (a > b) 값은 조건식이 되겠습니다.조건식의 True 식은 printf("%d > %d \n", a, b)조건식의 False 식은 (a < b) ? printf("%d < %d \n", a, b) : printf( "%d == %d\n", a, b);하지만 False식에 조건이 또 있습니다. (a < b)(a < b) 조건식의 True 식은 printf("%d < %d \n", a, b)(a < b) 조건식의 False 식은 printf( "%d == %d\n", a, b);이렇게 나누어보니, 훨씬 이해하시기 쉬우실 것입니다. 그러므로 삼항연산자를 사용한 곳이 있다면, 당황해 하지마시고 차근차근 해석해 나가시길 바랍니다.이상 연산자 정리를 마치겠습니다. 글을 읽어 주셔서 감사합니다.제 글이 도움이 되셨거나 공감이 되시는 부분이 있으셨다면, 밑에 있는 공감 버튼 한 번씩 꾸욱 눌러주시면 감사하겠습니다.
공감 버튼은 저에게 큰 도움이 됩니다. 감사합니다.
'프로그래밍 > C || CPP' 카테고리의 다른 글
[C/C++] rand, srand로 랜덤 뽑기(로또/lotto) 프로그램 만들기 (0) | 2017.06.15 |
---|---|
[C/C++] 함수포인터(function pointer) 정리 (0) | 2017.05.30 |
C/C++ cpp, h 파일 분할 방법 (0) | 2017.05.21 |
C/C++ 가변인자 (variable argument) (2) | 2017.05.21 |
[C++ 정복하자] C에서 C++로 가기 위한 도약. [2] (0) | 2017.05.17 |
댓글