[C언어] - 연산자, 형변환
C언어의 연산자에 대해서 알아보도록 하겠습니다.
아래 표는 C언어의 연산자들과 우선순위를 나타낸 표입니다.
우선순위 | 연산자 | 설명 | 연산 방향 |
1 |
( ) [ ] . -> (자료형){값} |
함수 호출 배열 첨자 구조체/공용체 멤버 접근 포인터로 구조체/공용체 멤버 접근 복합 리터럴 |
→ |
2 |
++ -- +x -x ! ~ (자료형) *x &x sizeof |
증가 연산자 감소 연산자 단항 덧셈(양의 부호) 단항 뺄셈(음의 부호) 논리 NOT 비트 NOT 자료형 캐스팅(자료형 변환) 포인터 x 역참조 x의 주소 자료형의 크기 |
← |
3 |
* / % |
곱셈 나눗셈 나머지 |
→ |
4 |
+ - |
덧셈 뺄셈 |
→ |
5 |
<< >> |
비트를 왼쪽으로 시프트 비트를 오른쪽으로 시프트 |
→ |
6 |
< <= > >= |
작음 작거나 같음 큼 크거나 같음 |
→ |
7 |
== != |
같음 다름 |
→ |
8 | & | 비트 AND | → |
9 | ^ | 비트 XOR | → |
10 | | | 비트 OR | → |
11 | && | 논리 AND | → |
12 | || | 논리 OR | → |
13 | ? : | 삼항 연산자 | ← |
14 |
= += -= *= /= %= <<= >>= &= ^= |= |
할당 덧셈 후 할당 뺄셈 후 할당 곱셈 후 할당 나눗셈 후 할당 나머지 연산 후 할당 비트를 왼쪽으로 시프트한 후 할당 비트를 오른쪽으로 시프트한 후 할당 비트 AND 연산 후 할당 비트 XOR 연산 후 할당 비트 OR 연산 후 할당 |
← |
15 | , | 쉼표(콤마) 연산자 | → |
C언어의 특이한 연산
C언어는 Boolean 데이터 타입이 별도로 존재하지 않고, 정수를 빌려 거짓(0)과 참(0이 아닌 수(대표적으로 1))으로 나타냅니다.
따라서 다음과 같은 연산식이 성립합니다.
a > b > c
이는 (a > b) > c로 계산되며, a > b가 참일 때는 1 > c, 거짓일 때는 0 > c와 의미가 동일합니다.
if(a=0)
위 식은 a에 0을 지정하고, 해당 대입 연산자의 결과값이 r-value인 0이 되며, 따라서 이는 결과가 거짓이 되는 식입니다.
이것이 가능하기 때문에 다음과 같은 코드를 많이 작성합니다.
while(c = getchar()){...} -> getchar()로 받은 코드가 null문자(0)이면 while문의 조건이 0이되어 빠져나간다.
형변환
(자료)형 변환은 주어진 데이터의 자료형을 다른 다료형으로 변환하는 것입니다.
예를 들어 정수를 실수로, 실수를 정수로 바꾸는 것입니다.
형 변환은 자동으로 일어날수도 있으며, 명시적으로 형 변환을 시킬수도 있습니다.
#include <stdio.h>
int main()
{
double a = 245;//오차가 발생할 수 있음
int b = 1.623;//소수점 이하 버림
printf("%lf\n",a);
printf("%d\n",b);
return 0;
}
이에 대한 결과는 아래와 같습니다.
자동 형변환
정수 승격(Integral Promotion)
CPU는 대부분 int형 데이터에 최적화 되어있기 때문에, 연산 중 자동으로 int형으로 변환하여 연산이 발생하기도 합니다.
예를 들면
#include <stdio.h>
int main()
{
short n1 = 15, n2 = 25, n3 = n1+n2;
printf("%d\n", n3);
return 0;
}
위와 같은 상황에서 n3는 n1와 n2가 int로 바뀌어 더해진 후 다시 short로 형변환이 일어납니다.
피연산자 일치
피연산자의 자료형이 서로 다른 경우에도 자동으로 형변환이 일어납니다.
#include <stdio.h>
int main()
{
double num = 5.51 + 19;
int num2 = 1+1.9;
printf("%lf\n" , num);
printf("%d\n" , num2);
return 0;
}
결과는 아래와 같습니다.
위 경우 num은 19를 19.0으로, 즉 정수를 실수로 바꾸어 덧셈합니다.
피연산자를 일치시키기 위해 발생하는 형 변환은 다음과 같은 규칙을 지킵니다.
- 손실 최소화를 추구
- 바이트 크기가 큰 자료형이 우선
- 정수형이 실수형보다 우선 (double a = 19; 같이 정수 형태의 실수인 경우 정수로 생각하여 계산)
다음은 자동 형변환의 우선순위로 왼쪽의 자료형과 오른쪽의 자료형의 연산을 수행할 경우, 왼쪽이 오른쪽으로 형변환됩니다.
char -> int -> long -> float -> double -> long double
명시적 형변환
명시적 형변환은 명시적으로 형변환을 시켜주는것을 의미합니다.
형 변환 연산자를 사용하여 명시적 형변환을 할 수 있습니다.
아래는 명시적 형변환을 하지 않은 코드입니다.
#include <stdio.h>
int main()
{
int n1 = 3, n2 = 4;
double res;
res = n1/n2;
printf("%lf\n",res);//0.000000
return 0;
}
실행 결과는 0.000000이며, 이는 3/4를 수행한 값인 0이 double 자료형에 들어가므로 0.00000으로 출력된 것입니다.
그러나 명시적 형변환을 사용하면 아래와 같은 결과를 발생시킬 수 있습니다.
#include <stdio.h>
int main()
{
int n1 = 5, n2 = 4;
double res;
res = (double)n1/n2;
double res2;
res2 = n1/(double)n2;
double res3;
res3 = (double)(n1/n2);
printf("res = %lf\n", res);
printf("res2 = %lf\n", res2);
printf("res3 = %lf\n", res3);
return 0;
}
결과는 다음과 같습니다.