c언어

[C언어] - 연산자, 형변환

말 랑 2022. 4. 19. 03:09
728x90

 

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;
}

결과는 다음과 같습니다.

 

 

 

 

 

 

 

728x90