3.3 형변환    [DOC]    [SMTS]

 산술 연산에서 한 가지 주의할 점은 두 피연산자의 자료형이 다를 경우이다. 이 경우 결과값의 데이터형이 어떤 것이 되느냐가 문제가 될 수도 있다. 먼저, 같은 형끼리의 연산은 결과값도 바로 그 데이터형이 된다.


5/4 // 1 (정수/정수 ➜ 정수)
3/2 // 1 (정수/정수 ➜ 정수)
5.0/4.0 // 1.25 (실수/실수 ➜ 실수)
3.0/2.0 // 1.5 (실수/실수 ➜ 실수)

위 예에서 보듯이 정수형끼리의 나눗셈의 결과도 정수형이 됨에 유의해야한다. 즉, 2/2 는 1.5가 아니라 1이 된다.


 그리고 정수형과 실수형 간 사칙연산 결과는 실수형이 된다는 사실에 유의해야 한다. 즉, 피연산자 중에 하나라도 실수형이라면 결과값도 실수형이 된다.


5.0/4 ➜ 1.25 (실수/정수 ➜ 실수)
2/4.0 ➜ 0.5 (정수/실수 ➜ 실수)

다음 예제에서 이를 확인해 보자


ex03-04.c
#include <stdio.h>
int main()
{
  int ia = 10, ib = 4;
  float fa, fb = 4.0f, fc;
  fa = ia/ib; // (1)
  fc = ia/fb; // (2)
  ib = ia/fb; // (3)
  printf("fa=%f, fc=%f, ib=%d\n", fa, fc, ib);
}

실행 결과

fa=2.000000, fc=2.500000, ib=2

위의 실행 결과에서 변수 fa와 fc값이 왜 다른지 잘 이해해야 한다. (1)에서는 정수/정수이므로 결과값이 먼저 정수형으로 산출된다. 이 값이 실수형으로 형변환되어 실수형 변수 fa에 저장되는 것이다. 그러나 (2)에서는 정수/실수 이므로 결과값이 실수형으로 산출된다. 따라서 정확하게 계산된 값이 실수형 변수 fc에 대입되는 것이다. (3)의 경우는 계산 결과는 실수인데 정수형 변수 ib에 그것을 대입하도록 하였다. 이경우 실수는 정수로 자료형이 변환되며 소수점 이하는 버려진다. 그래서 2.5에서 소수점 이하는 버려진 2 라는 정수값이 ib에 대입되는 것이다.

3.3.1 자동 형변환 (automatic conversion)

 자동 형변환은 이와 같이 산술 연산에서 두 피연산자의 형이 다를 경우 둘 중 더 넓은 자료형으로 다른 하나가 자동으로 변환되는 것을 말한다. 다음에서 오른쪽으로 갈수록 더 넓은 자료형이다.


char < short < int < long < long long < float < double < long double

예를 들어 만약 a + b 에서 a가 long형, b가 double 형이라면 a가 더 넓은 double형으로 자동으로 변환 된 후 덧셈이 수행된다. char형과 long형이라면 둘 다 long형이 된다. 그리고 계산 결과는 항상 넓은 자료형이 된다. 만약 하나는 unsigned 형이고 다른 하나는 signed형이라면 결과를 예측할 수 없으므로 이런 경우는 가급적 피하여야 한다.

3.3.2 명시적인 형변환 (casting)

 사용자가 자료를 명시적으로 형변환해야 할 경우도 있다. 예를 들어서 int형 ia를 long형으로 바꾸고 싶다면 다음과 같이 변수 앞에 (자료형)을 붙여주면 된다.


(long)ia

변수 ia 자체는 변하지 않지만 (long)ia 는 long형 자료가 된다.


int ia=2, ib=4;
float fa = ia/ib;
float fb = (float)ia/ib;

이 예에서 fa 는 0.0 이 fb에는 0.5 가 저장된다. 왜냐면 ia/ib는 둘다 정수이기 때문에 결과값도 정수가 된다. 따라서 소수점 이하가 버려진다. 하지만 (float)ia/ib는 하나는 float형이고 다른 하나는 int 형이므로 ib가 float형으로 자동 형변환 되고 결과값도 float형이 된다. 따라서 정확한 실수값인 0.5가 저장되는 것이다.


 명시적 형변환의 다른 예를 들면 다음과 같다.


(long)(‘a’+2.0f)
fa = (float)((int)ia +1)
da = (double)sa/5

명시적 형변환의 우선 순위는 산술 연산보다 높다는 것도 알아두자.


'프로그래밍언어.Lib > C,C++' 카테고리의 다른 글

3.4 관계 연산자  (0) 2015.05.19
3.2 산술 연산자와 부호 연산자  (0) 2015.05.19
C/C++의 연산자 종류  (0) 2015.05.19
C/C++의 goto 명령  (0) 2015.05.19
C/C++의 continue 명령  (0) 2015.05.19
Posted by 살레시오
,

 연산자(operator)는 주어진 데이터에 대해서 계산이나 비교 등을 수행하여 결과 값을 얻어내는 명령어를 말한다. C/C++ 에는 다양한 연산자가 마련되어 있으며 일반적으로 분류하면 다음 표와 같다.


[표 1] 연산자의 종류

구분

연산자

비고

산술 연산자

+  -  *  /  %

%는 나머지 연산자

부호 연산자

+  -

부호 표시

관계 연산자

<  >  <=  >=  ==  !=

대, 소, 등가 관계

논리 연산자

&&  ||  !

AND, OR, NOT

조건 연산자

? :

참, 거짓

증감 연산자

++  --

1증가, 1감소

대입 연산자

=

+=  -=  *=  /=  %=

&=  |=  ^=  <<=  >>=

오른쪽의 값을 왼쪽에 대입

비트 연산자

&  |  ~  ^  <<  >>

AND, OR, NOT, XOR, shift

형변환 연산자

(데이터형)

sizeof 연산자

sizeof

데이터 형의 크기

쉼표 연산자

,

구분

간접 지정 연산자

( ) [ ] -> *

함수, 배열, 구조체, 포인터


연산의 대상이 되는 수치나 변수 값을 피연산자라고 하며, 연산자는 피연산자의 개수에 따라서 이항(二項) 연산자와 단항(短項) 연산자로 나뉜다.


  • 피연산자 : 연산의 대상이 되는 수치나 변수.

  • 이항 연산자 : 피연산자가 두 개인 연산자.

  • 단항 연산자 : 피연산자가 하나인 것.


예를 들어서 덧셈(+)이나 뺄셈(-)은 피연산자가 하나이면 연산을 수행하지 못하고 반드시 두 개가 있어야 그 두 수를 더하거나 뺄 수 있으므로 이항 연산자이다. 이에 반해서 부호연산자(+. -)는 하나의 항의 부호를 규정하는 것이므로 피연산자가 하나이고 단항 연산자이다.


C++ 강좌 전체 목록 >>>


c{c++},n{c0041}

'프로그래밍언어.Lib > C,C++' 카테고리의 다른 글

3.2 산술 연산자와 부호 연산자  (0) 2015.05.19
3.3 형변환  (0) 2015.05.19
C/C++의 goto 명령  (0) 2015.05.19
C/C++의 continue 명령  (0) 2015.05.19
C/C++의 break 명령  (0) 2015.05.19
Posted by 살레시오
,

4.8 goto 명령     [doc]      [smts]

 프로그램 중간에 주소(이름)을 만들어 지정해 주고 goto문을 사용하여 그 지점으로 한 번에 프로그램 수행을 이동할 수 있다.


label:
  .....
  ......
  goto label;

goto 명령은 원하는 곳으로 무조건 이동을 수행한다. 아무 곳으로라도 즉시로 이동할 수 있어 일견 굉장히 편하고 유용한 명령어처럼 보이나 프로그램의 구조를 저해하는 문제점을 내포하고 있어서 일반적으로 잘 쓰이지 않는 명령어이다. 대부분의 경우는 break, continue와 같은 명령어를 이용하여 문제를 해결할 수 있기 때문이다.


하지만 다중루프를 한 번에 빠져나가야 하는 경우에는 break문을 복잡하게 사용하기보다는 goto문이 쓰이기도 한다. 아래의 예를 살펴보자.


  for(...) {
      for (...) {
          for(...) {
              if (...) goto OutOfHere;
          }
      }
  }
OutOfHere:
  ......
  ......

 하지만 goto문은 실제 프로그램에서 거의 쓰이지 않으므로 구체적인 예제는 생략한다.



'프로그래밍언어.Lib > C,C++' 카테고리의 다른 글

3.3 형변환  (0) 2015.05.19
C/C++의 연산자 종류  (0) 2015.05.19
C/C++의 continue 명령  (0) 2015.05.19
C/C++의 break 명령  (0) 2015.05.19
C/C++ 의 do ~ while 반복문  (0) 2015.05.18
Posted by 살레시오
,