[C언어] 연산자 : 그 외 유용한 연산자 (1/2)
형 변환 연산자
형 변환 연산자는 피연산자를 하나 가지며 피연산자의 값을 원하는 형태로 바꿉니다. (ex. 정수 > 실수, 실수 > 정수)
#include <stdio.h>
int main(void){
int a = 20, b = 3;
double res;
res = ((double)a)/((double)b);
printf("a = %d, b = %d\n", a, b);
printf("a / b의 결과 : %.1lf\n", res);
a = (int)res;
printf("(int) %.1lf의 결과 : %d\n", res, a);
return 0;
}
실행 결과
a = 20, b = 3
a / b의 결과 : 6.7
(int) 6.7의 결과 : 6
정수형 20/3은 6입니다. 그런데 실수형으로 바꾼 뒤 나눠주면 6.666...이 되죠. 반대로 실수를 정수로 바꿔주면 소수점 이하의 값은 모두 버리니 6.666... > 6이 됩니다.
자동 형 변환
자동 형 변환은 컴파일 과정에서 피연산자의 형태가 다를 때 형태를 일치시키는 작업을 뜻합니다. 기본 규칙은 크기가 작은 값이 크기가 큰 값으로 바뀌는 겁니다. (ex. 정수/실수 > 실수/실수, 정수 : 4바이트, 실수 : 8바이트)
sizeof 연산자
피연산자를 하나만 사용할 수 있는 sizeof 연산자는 피연산자의 크기를 바이트 단위로 계산해 주는 연산자입니다. 피연산자의 대상은 변수, 상수, 수식, 자료형 등이 될 수 있습니다.
이 연산자는 데이터의 크기 확인이나 메모리를 동적으로 할당 하는 작업 등에 유용하게 사용됩니다.
#include <stdio.h>
int main(void){
int a = 10;
double b = 3.14;
printf("int형 변수의 크기 : %zd\n", sizeof(a));
printf("double형 변수의 크기 : %zd\n", sizeof(b));
printf("정수형 상수의 크기 : %zd\n", sizeof(10));
printf("수식의 결괏값의 크기 : %zd\n", sizeof(1.5 + 3.4));
printf("char 자료형의 크기 : %zd\n", sizeof(char));
return 0;
}
실행 결과
int형 변수의 크기 : 4
double형 변수의 크기 : 8
정수형 상수의 크기 : 4
수식의 결괏값의 크기 : 8
char 자료형의 크기 : 1
앞서 잠깐 언급했듯이 자료형의 크기는 컴파일러에 따라 다를 수 있습니다. 따라서 int형의 크기를 확인할 필요가 있을 때, sizeof 연산자를 사용합니다.
복합대입 연산자
만약 연산 결과를 피연산자에 저장할 필요가 있다면 추가로 대입 연산을 수행해야 합니다. 이때 복합대입 연산자를 사용하면 간편합니다. 복합대입 연산자에는 +=, -=, *=, /=, %= 이렇게 총 5가지가 있습니다.
#include <stdio.h>
int main(void){
int a = 10, b = 20;
int res = 2;
a += 20;
res *= b + 10;
printf("a= %d, b = %d\n", a, b);
printf("res = %d\n", res);
return 0;
}
실행 결과
a= 30, b = 20
res = 60
위 복합대입 연산자의 순서는 다음과 같습니다.
a += 20;
> a = a + 20;
> a = 10 + 20;
> a = 30;
res += b + 10;
> res = res * (b + 10);
> res = 2 * (20 + 10);
> res = 2 * 30;
> res = 60;
콤마 연산자
콤마 연산자는 한 번에 여러 개의 수식을 차례로 나열해야 할 때 사용합니다. 왼쪽부터 오른쪽으로 차례로 연산을 수행하며 가장 오른쪽의 피연산자가 최종 결괏값이 됩니다.
int a = 20, b = 10;
int res;
res = (++a, ++b);
// a = 21, b = 11
// res = 11
콤마 연산자는 대입 연산자보다 우선순위가 낮은 유일한 연산자입니다. 따라서 대입 연산자와 함께 사용할 때는 반드시 괄호가 있어야 합니다.
조건 연산자
조건 연산자는 유일한 삼항 연산자로 ?와 : 기호를 함께 사용합니다. 조건 연산자는 첫 번째 피연산자가 참이면 두 번째 피연산자가 결괏값이 되고, 첫 번째 피연산자가 거짓이면 네 번째 피연산자가 결괏값이 됩니다.
#include <stdio.h>
int main(void){
int a = 10, b = 12;
int res;
res = (a > b) ? a : b;
printf("큰 값 : %d\n", res);
return 0;
}
실행 결과
큰 값 : 12
먼저 (a > b)를 수행합니다. b가 12로 10보다 크니 거짓(0)이 됩니다. 조건 연산자에서 조건이 거짓이면 삼항이 결괏값이 되니 삼항에 있는 b(12)가 res에 대입이 됩니다. 결국 res는 12가 됩니다.