31 – 연산자 우선순위

하나의 연산식을 작성하더라도 여러 개의 연산자가 사용될 수 있다. 일반적인 사칙연산에서도 보면 덧셈, 뺄셈보다 곱셉, 나눗셈이 더 우선적으로 사용되듯, 연산자들 사이에는 우선순위가 존재한다. 꼭 알아둬야 한다.

우선순위는 아래의 표를 참조하면 된다. 엑셀로 따로 정리를 하였다.

스크린샷_2017-03-15_21-38-33

30 – 형 변환 & 캐스트 연산자

int형 데이터와 float형 데이터에 대한 연산, 즉 서로 다른 데이터형에 대한 연산은 이루어지지 않는다. 내부에서의 표현하는 방식이 전혀 다르기 때문이다. 그러나, 언어에서는 서로 다른 데이터형일 때, 작은 크기의 데이터형을 큰 데이터형으로 변호나해 연산을 할 수 있게 해준다. C언어도 해당된다.

음… 예시 코드에도 사용했던 것인데, 예시를 살펴본다.

스크린샷 2017-02-16 오후 3.07.12

char형은 1바이트이고, int형은 4바이트로 표현된다.

char | 01100001
int    | 00000000000000000000000100000000

이 둘을 연산하기 위해서는 이 둘의 크기가 같아야 연산을 할 수 있는데, int형의 사이즈를 줄이면 데이터가 잘릴 수 있기 때문에 char형을 늘려야 한다. 데이터 형을 늘릴 때에는 앞자리를 전부 0으로 채운다.

char | 00000000000000000000000001100001
int    | 00000000000000000000000100000000

이렇게 하여 둘을 연산한 결과는 int형태로 되어 연산이 된다. 실행 결과는 아래와 같다.

스크린샷 2017-02-16 오후 3.07.24

이런 연산 시 데이터형 자동변환에는 규칙이 있다. 규칙에 대해서는 다음과 같다.

  1. long double형이 있으면, 다른 피연산자를 long double형으로 변환하다.
  2. 그렇지 않고 double형이 있으면, 다른 피연산자를 double형으로 변환한다.
  3. 그렇지 않고 float형이 있으면, 다른 피연산자를 float형으로 변환한다.
  4. 그렇지 않고 (unsigned) long형이 있으면, 다른 피연산자를(unsigned) long형으로 변환한다.
  5. 그렇지 않고(unsigned) int형이 있으면, 다른 피연산자를(unsigned) int형으로 변환한다.
  6. 그렇지 않으면 char형 또는 short형을 int 형으로 변환한다.

이게 왜 이렇게 되는지는 컴퓨터 구조에서 숫자 연산 과정을 살펴보면서 이 규칙을 보면 잘 이해가 될 것이다. (이래서 기본 이론이 진짜 중요하다.)

그리고 C언어에서는 사용자가 임의로 현 변환을 할 수 있다. (다른 언어도 마찬가지) 이 때 사용하는 연산자가 캐스트 연산자이다. 변환하려는 변수 앞에 괄호를 처리하여 바꾸려는 형을 작성해준다. 아래의 예시를 보면, 10.7과 30.8같은 소수점 연산자를 int형으로 변환하였다.

스크린샷 2017-02-16 오후 3.07.43스크린샷 2017-02-16 오후 3.07.55

29 – sizeof

특정 변수를 선언할 때, 해당되는 사용 값 만큼의 메모리를 선언한다. 그러나 임의의 데이터형의 크기만큼 메모리를 할당받을 수도 있는데, 이를 동적 할당이라고 한다. (이 부분에 대해서는 나중에 자세히 확인하도록 하겠다.) 이러한 경우에는 해당 변수가 얼마나 사이즈를 잡고 있는지 모르는 경우가 많다. 그래서 사이즈를 확인하기 위해 sizeof라는 연산자를 사용한다. 출력되는 변수의 크기는 바이트 수이다.

사용법은 다음과 같다.

sizeof(int) – int형의 크기
sizeof(num) – num 변수의 크기

실제로 프로그래밍을 하다 보면 이 사이즈를 알아야 하는 경우가 상당히 많다. 그렇기 때문에 자주 쓰일 것이다. 예시대로 꼭 해서 출력해보자.

스크린샷 2017-02-16 오후 3.06.06스크린샷 2017-02-16 오후 3.06.28

28 – 연산자 (조건)

조건 연산자는 주어진 조건을 만족하는지에 따라 지정된 명령을 실행하는 연산자이다. 가장 간단한 조건 연산자로는 if가 있다. if문의 경우에는 해당되는 값이 참일 경우와 그렇지 않을 경우에 따라서 저리한다. 이와 같은 단순한 if의 경우에는 특정 조건이 어떤지에 따라 단순한 표현으로 처리를 할 수 있다. 예를 들어보자.

if(i > j)
{
max = i;
}
else
{
max = j;
}

이런 단순한 조건의 경우에는 굳이 이렇게 여러 문장으로 처리하기 보다는 간단히 나타낼 수 있는 표현이 있는데, 이것이 바로 조건 연산자다. 위의 예시를 조건 연산자로 표현하면 다음과 같다.

max = (i>j) ? i : j;

표현식을 보면

[수식 1] ? [수식 2] : [수식 3]

이런 식으로 되어 있고, 수식 1에 조건이 들어가며, 조건이 참일 경우에는 수식 2가, 그렇지 않으면 수식 3이 실행된다. 단순 비교와 단순 처리의 경우에 이런 처리를 사용하여 하는 경우가 많다.

아래의 예시는 키보드로 입력한 내용을 읽어서 출력하는데, 대문자를 입력하면 소문자로 변환해서 출력하는 프로그램이다.

스크린샷 2017-02-16 오후 3.03.58스크린샷 2017-02-16 오후 3.04.47

27 – 연산자(콤마)

콤마 연산자는 연결되어 있는 여러 수식을 하나의 수식으로 만들기 위해 사용된다. 사실 특정한 연산작업을 하는 것보다는, 한번에 선언하거나 한번에 처리할 수 있기 위해서 작성한다고 보면 더 쉽게 볼 수 있다. 수식1, 수식2, 수식3, …, 수식n 같은 식으로 연속적으로 이용한다. 예시 코드가 상당히 간단하기 때문에 일단 예시 코드부터 올리겠다.

스크린샷 2017-02-16 오후 3.03.33

선언문에서도 i와 j를 똑같이 int형으로 선언하기 위해서 콤마 연산자로 동시에 선언하였고,  두 번째 문장에서는 i에 대한 연산을 순차처리하는 부분에서 두 문장을 하나의 문장으로 처리한 것이다.

나열하면

j=3;
i=j+4;

이 두 문장이 콤마 연산자를 사용함으로써 한 문장으로 된 것이다. 그래서 실행 결과가 i에서는 7, j에서는 3이 된 것이다.

스크린샷 2017-02-16 오후 3.03.45

콤마 연산자의 경우에는 좀 많은 코드를 보면서 ‘아, 이렇게 콤마가 쓰이는구나 정도로만 알아도 될 거 같다.