c언어의 주요한 연산자들을 지난시간 학습했습니다. 그러나 c언어에서는 그보다 훨씬 많은 연산자가 있다는 것 아시나요? 이번시간은 많이 쓰이진 않더라도 알아두고 넘어가야할 c언어의 또다른 연산자들을 알아보겠습니다.
복합 대입 연산자
사실 대입 연산자에는 두 가지 종류가 있습니다. 단순대입 연산자와 복합 대입연산자 입니다. 단순대입 연산자는 지난시간 다룬 ‘=’이고, 복합대입 연산자는 단순대입 연산자에 산술연산자, 비트연산자가 결합된 것입니다.
산술연산자가 합쳐진 복합대입 연산자로는 +=, -=, *=, /=가 있고, 비트연산자가 합쳐진 복합대입 연산자로는 &=, |=, <<=, >>=, ^=, ~=가 있습니다. 여기서 복합대입 연산자는 어떤 역할일까요?
a += 3;은 a = a+3;과 완벽하게 똑같습다. 그러니까 +=라는 복합대입 연산자 안에,
왼쪽변수(a)를 오른쪽상수(3)와 더한 다음(a+3), 그 값을 다시 왼쪽 변수에 저장, 오버라이트(overwrite, 기존 값을 무시하고 새로운 값으로 덮어씌우는 것)의 과정이 함축되어있는 것입니다.
단항 증/감 연산자
항이 1개인 단항 증감 연산자는, ++, --등으로 표시되는데, ++a처럼 앞에 붙으면 ‘전위식’, 반대로 a++로 아래에 붙으면 ‘후위식‘으로 구분합니다. 단항 증감 연산자는 '1이 쓰이는 복합 대입연산자의 축약형'이라 할 수 있습니다.
그래서 a = a+1; 은 a += 1; 과 같고, a++이나 ++a 와 같습니다. 다 같은 뜻이니 1을 가감하는 것은 단항 증감 연산자를 쓰는 것이 간략하고 좋습니다.
그러나 둘의 차이는 바로 연산 순서의 차이가 있는데요, 다른말로 연산자 우선순위라고 합니다. 어떤 연산자 부터 실행이 될꺼냐의 순서인데, 전위식(++a꼴)은 우선순위가 높고, 후위식(a++)은 우선순위가 거의 마지막이여서 printf함수로 출력할 때, ++a는 a+1값이 출력되는 반면에, a++는 a값이 출력되고, 그 행이 끝나고 나서야 a+1가 저장되게 됩니다.
괄호 연산자
3+4*2 라는 식에서는 4*2 가 먼저 계산된 후 3+가 다음으로 계산된다는 것은 설명할 필요 없는 규칙입니다. 그러나 여기서 ()가 들어가면 어떻게 될까요? (3+4)*2라는 식으로 연산자를 씌우게 되면, 식의 결과는 괄호가 없을 때는 11이였지만 14로 결과가 변한다는 사실은 압니다. 괄호연산자는 이처럼, 연산순서를 바꿔놓을 수 있는 역할이다.
형 변환 연산자
형 변환 연산자는 ‘강제 형 변환 연산자’로 불리는 중요한 연산자입니다. 여기서 이 형은 자료형입니다.
자료형은 정보를 해석하는 방식이라고 했습니다. 그렇듯이 65라는 수도 문자로 해석한다면 char형으로 A문자로 되지만, 숫자로 해석한다면 int형으로 10진수로 65로 될 수도 있고, float형으로 65.0f로 될 수도 있습니다. 65라는 본질은 같지만, 이 해석방법을 달리하는 것이 형 변환 연산자입니다. 이 연산자는 항이 1개인 단항연산자로, 다른 연산자보다 우선되는 연산자라는 것도 중요하니 알아둡시다.
예를 들자면, 정수와 정수의 연산을 실수형식문자로 출력하면, 에러가 나거나 아예 값을 읽지 못합니다. (왜인지 모르겠으면 3.15일자의 '형 확장'편을 참고하세요) 정수 자료형 n / 10 * 100.0f 식은 연산결과가 이미 n / 10에서 정수와 정수의 연산이기에 나온 값의 소수점 아래 부분은 절사되는 문제가 발생합니다. 여기서 강제형 변환 연산자로 정수 자료형 n을 실수로 바꿔주게 되면, 실수와 정수의 연산으로 바뀌어 연산해서 소수점 아래 부분이 절사되는 일이 없어집니다. 이 강제 형 변환 연산자는 (float)로 가로 안에 바뀔 자료형이 쓰이며, (float)(n / 10) * 100.0f 로 식을 쓸 수 있습니다.
sizeof 연산자
sizeof 연산자의 형식은 sizeof(피연산자) 꼴입니다. 이 때의 피연산자는 변수이름, 식별자, 자료형, 연산식이 될 수 있지만 그 결과는 ‘자료형이 뭔가?‘ 이다. sizeof의 결과는 byte 단위의 크기(길이)를 정수로 계산해 주는 것으로, 중요한 점은 이 연산을 cpu가 아닌 compiler(컴파일러)가 연산한답니다.
자료형은 char는 1바이트, int는 4바이트, char*(포인터)는 주소니까 32비트 플랫폼기준으로 4바이트가 됩니다.
배열선언에서의 자료형은 char szName[16]이라고 배열선언 한다면 char[16]이 자료형이 됩니다.(여기서 배열의 이름의 본질은 ‘주소’다. 변수의 이름은 ‘메모리‘다에 차이가 있다.) 그래서 char 1byte × 16개가 되서 16바이트가 됩니다.
(변수는 자료형이 1개 있다고, 배열은 자료형이 n개 있다고 볼 수 있다.)
이 sizeof 연산자는 간단하게 컴퓨터에서 메모리를 명시해야 될 때가 있을 때 printf안에 sizeof를 넣어서 명시해주는 것이 가장 좋은 쓰임이자 습관이니 잘 써먹도록 합시다.
콤마 연산자
열거 순서대로 수행되는 연산자로, a =(a = 10, a + 2); 라고 하면 a가 10으로 저장된 후에 그 a에 2를 더하는 역할입니다. 후에 for문의 계수를 여러개로 할 때 사용되니 참고합시다. (근데 거의 안쓴다네요.)
조건 연산자
다른 연산자와 특이한 연산자인 조건 연산자의 형식은, ‘ 조건식 ? a : b ’으로 c언어의 유일한 3항 연산자입니다. 여기서 조건식에서 0은 거짓, 0이 아닌 수는 참이 되므로, a는 참일 때 실행이 되고, b는 거짓일 때 실행이 됩니다.
예를 들어, nA > nB ? nA++ : nB++; 가 된다면 nA가 nB보다 클 경우 참이 되어서 nA에 1이 더해지게 되고, nA가 nB보다 같거나 작을 경우 거짓이 되어서 nB에 1이 더해지는 것입니다.
a는 참일 때, b는 거짓일 때 실행된다고 했지만, 선택한다고 보는 것이 맞습니다. 두 경우를 선택해서 하나를 결과를 옮기는 것이기 때문이다. 이것은 다음에 배울 제어문과 매우 비슷합니다.
너무 많은 연산자를 학습해서 난감할 수 있는데요. 지금 당장 이해가 안되더라고 직접 써보고 이해하면서 천천히 내 것으로 만들도록 합시다. 마지막에 나온 조건연산자는 이제부터 배울 제어문과 비슷한데요. 연산자는 단순한 계산이라면, 제어문 부터는 알고리즘이 있는 진짜 프로그램이라 볼 수 있습니다. 그럼 기대되는 마음으로 다음강의를 들어가 볼까요?
'c언어' 카테고리의 다른 글
조건문이란, if문 (0) | 2019.07.05 |
---|---|
산술연산자 응용 (0) | 2019.07.02 |
C언어 형식문자, 심화 (4) | 2019.07.02 |
비트, 논리, 비교연산 예제 (0) | 2019.06.30 |
비트, 비교, 논리 연산자 (0) | 2019.06.30 |