201303/연산자. 형변환(type casting).

2013. 4. 3. 16:42프로그래밍/C언어 TIP

◈ 연산자

연산에 사용도는 +,-,*,/등의 기호들을 연산자라고 하고 연산자를 사용하는 목적은 데이터의 처리를 좀더 수월하게 하기 위해서 사용된다. 연산자의 종류는 다음과 같다.

 

우선순위

연산자명

연산자(연산기호)

1 

괄호 및 포인트연산자(→)

() [] -> . 

2 

단항 연산자(←)

~ -- ++ - (자료형)! * & sizeof

3 

산술 승제연산자(→)

* / % 

4 

산술 가감연산자(→)

+ - 

5 

비트 이동연산자(→)

<< >> 

6 

비교 연산자(→)

< <= > >= == != 

7 

비트 논리연산자(→)

& ^ | 

8 

논리 연산자(→)

&& || 

9 

조건 연산자(←)

?: 

10 

부가 연산자(←)

= += -= *= /= %= >>= <<= &= ^= != 

11 

순서 연산자(→)

, 

 

단항연산자는 하나의 항만으로 처리가 가능한 연산자를 말한다. 하나이상의 항을 사용하는 경우는 다항 연산자에 속한다. 연산자는 우선순위에 따라 처리되며, 단항 연산자의 –는 음수를 나타내고, 산술 연산자중 –는 뺄셈 연산자를 나타낸다.

 

지금까지 배운 연산자의 종류는 +/- , = , sizeof가 있다. sizeof도 함수가 아닌 연산자로써의 의미를 가진다. 괄호의 종류는 ()둥근괄호, []대괄호, {}중괄호, < >꺽쇠괄호가 있으며 꺽쇠괄호는 컴파일 되는 과정중에는 사용하지 않고 전처리에서 사용한다.

 

◈ 형변환(type cast)

형변환은 특정한 값의 형을 일시적으로 변환시키는 것을 말한다. 예를 들어보자.

일반적인 수학식으로 8/3 = 2.666...이 된다. 하지만 C로 컴파일하면 2.000...이라는 답을 얻게 된다. 그 이유는 계산되는 두 수가 정수형(int)로 되어 있기 때문이다. int형으로 계산된 결과는 당연히 정수형의 답을 나타내게 된다. 그래서 2.666이 아닌 소수점 뒷자리를 모두 없앤 2.000 이 나오게 되는 것이다. 프로그램을 통해 알아보자.

아래 프로그램은 형동등에 의해 정수로 계산된 값이 float으로 바뀌면서 1.0000 나오게 하는 프로그램이다.

#include <stdio.h>

int main()

{

    float A = 8/3; //정수로 계산해서 실수 나오게 된다.

 

    printf("%f\n",A);

 

return 0;

}

계산의 조건은 항상 형동등이 발생해야 한다는 것이다. 위 소스를 고쳐보자.

    float A = 8/3.0; //정수 3을 실수 3.0으로 만들어 준다.

형동등을 위해 컴퓨터는 정수 8을 실수8.0

으로 만들어 실수계산기에 넣어 계산한다

그것을 형변환이라 한다.

정수가 실수로 변한 이유는 실수가 정수보다

크기가 크기 때문이다.

    

printf("%f\n",A); //float형의 답은 형식지정자 %f(실수로표현)에

에 따라 아래와 같은 정상적인 답을 얻게 된다.

 

좀더 자세한 소스로 형변환을 확인해보자.

#include <stdio.h>

 

int main()

{

    int A = 4;

    float B = 4.3;

    float C = A + B;

    //int C = A + B;

    printf("%f\n",C);

//printf("%d\n",C);

 

    return 0;

}

float C로 했을 때와 int C로 변수를 선언했을 때 서로 다른 결과를 얻게 된다.

float C선언 (%f)로 출력했을때,

정수 4가 실수로 형변환하면서 8.3이라는 결과값을 얻게 된다.

 

int C선언 (%d)로 출력했을때,

정수 4가 형변환하고 A + B가 더해져 8.3이 나오지만 int형으로 맞추기 위해 형변환이 또 한번 일어나게 된다. 그래서 소수점 이하자리가 모두 생략된 8이 출력되는 것이다.

 

다음 소스는 정수형에서 반올림을 확인하는 소스이다.

#include <stdio.h>

int main()

{

    int A = 4.1;

    int B = 4.9;

    printf("%d\n",A);

    printf("%d\n",B);

 

    return 0;

}

int형(정수형)에서는 소수점 이하 수가 반올림이 발생하지 않는 걸 확인 할 수 있고 소수점 이하자리의 표현도 하지 않는다는 것을 알았다.

다음 소스는 실수형에서의 반올림이 발생하는지는 확인하는 소스이다.

#include <stdio.h>

int main()

{

    float A = 5/3.0;

    

    printf("%f\n",A);

 

    return 0;

}

5/3은 1.66666...으로 6이 계속 나오게 되는 된다. 하지만 소수점 이하 6자리에서 반올림이 발생한 것을 확인 할 수 있다. 결론은 정수형에서는 반올림이 존재하지 않지만, 실수형에서는 존재한다는 걸을 알 수 있다.

 

◈ 비교연산자

비교연산자에는 <, <=, >, >=, ==, != 이 있으며, 논리값인 참과 거짓을 돌려주는 논리식을 만들 수 있다.

2 < 5 는 참이기도 하면서 논리로는 1에 해당된다. 반대로 2 > 5는 거짓이면서 논리에서는 0에 해당되는 값이다. 아래와 같은 출력문을 만들어 보자.

#include <stdio.n>

int main()

{

printf("%d\n", 2 < 5);

printf("%d\n", 2 > 5);

 

return 0;

}

결과는 직접 입력하여 확인해본다.

비교연산자에서 = 기호가 같이 쓰는 경우가 있다. 작거나 같다나 크거나 같다 등에서 = 기호가 쓰이게 되는데 = 기호는 반드시 오른쪽에 써야한다. <=, >= 왼쪽으로 쓰게 되면 오류가 발생하게 된다.

 

◈ 논리연산자

프로그램에서 여러 개의 논리식 또는 논리값을 이용하여 논리식을 만들 때 사용한다.

연산자 &&는 논리 AND를 표현하며, ||는 논리 OR을 표현하게 된다. 논리 NOT은 !가 붙게 된다.

예) a && b (AND)

a || b (OR)

!a (NOT)

논리연산자에서 0을 제외한 모든 수는 1로 간주된다. -5도 1로 표현되고 55.66도 1로 표현된다는 점을 유의한다.

 

◈ 증감연산자

변수의 값을 하나 증가시키거나 감소시킨다. a++는 의미는 a = a + 1;과 같다.

증감 연산자는 전치형과 후치형이 있다.

전치형

++a --a

후치형

a++ a—-

아래의 식으로 무엇이 다른지를 알아본다.

#include <stdio.h>

 

int main()

{

    int A=0;

    int B;

 

    scanf("%d",&A);

    B = ++A; //1을 증가시킨 다음, B에 값을 넘긴다.

    printf("A1:%d\n",A);

    printf("B1:%d\n",B);

    B = A++; //B에 값을 넘긴 다음 A에 값을 증가시킨다.

    printf("A2:%d\n",A);

    printf("B2:%d\n",B);

    return 0;

}

결과를 예상해본다.

위와 같은 결과가 나오게 된다. A는 계속 증가하지만 B는 후치형 증감 연산자에 의해 첫번째 A의 값을 먼저 받았기 때문에 증가하지 않고 11이 나오게 된 것이다.