• 검색 결과가 없습니다.

C 의 기본 구성 요소

N/A
N/A
Protected

Academic year: 2022

Share "C 의 기본 구성 요소"

Copied!
16
0
0

로드 중.... (전체 텍스트 보기)

전체 글

(1)

C의 기본 구성 요소

자료형 불일치와 해결법

Chan-Su Shin

(2)

변환(conversion)과 캐스트(cast)

모든 상수, 변수, 수식은 유일한 자료형으로 정의되어야 한다

– int a; double b; 3.2e+4, `c’, 4, 3.14+5

변환(conversion)은

– 하나의 값을 다른 자료형에 배정할 때

int a = 3.5

– 서로 다른 자료형으로 구성된 수식을 계산할 때

int a = 4; double b = 5; float c;

c = a/b;

– 함수에 인자(parameter)를 넘겨줄 때

sin(3);

자동적으로 발생한다

(3)

배정에서의 변환

A = B;

– A의 자료형과 B의 자료형이 다르고 A의 자료형이 B의 값을 저장할 수 있을 때 B의 값이 A의 자료형에 맞게 자동 변환되어 A에 저장된다

예제

– float tree = 3; (int to float)

– int guess = 3.982; (float to int)

– int debt = 3.0E12; (undefined, system dependent)

문제

– 자료의 손실 (float to int: 소수부분 없어짐, long long to int: 범위를 넘어서는 bit는 무시)

– 정밀도의 손실 (double to float)

(4)

배정에서의 변환

예제

int i_value = 16777217;

float f_value = 16777216.0;

printf("The integer is: %d\n", i_value);

printf("The float is: %f\n", f_value);

printf("Their equality: %d\n", i_value == f_value);

(5)

수식에서의 변환

long double > double > float > unsigned long > long > unsigned int

> int > unsigned short > short > char

A B A op B

long double N long double

double N double

float N float

unsigned long N unsigned long

long int unsigned int Depend on size

long int N long int

unsigned int N unsigned int

int N int

(6)

수식에서의 변환

• char a = 10, b = 20, c;

c = a + b;

printf(“a+b = %d\n”, c);

• 32비트 컴퓨터 시스템에선, 기본 연산(+, -, *, /)을 32비트 단위로 수행한다. 즉, 32비트 두 수의 기본 연산을 한번에 (단위시간에) 처리한다.

• 따라서 위의 두 char 변수의 덧셈을 위해선, CPU가 10과 20을 32비트 정수로 변환해서 덧셈하고, 다시 8비트 문자변수 c에 저장한다.

• 이를 특별히 정수승급: integral promotion이라 부른다. (char 또는 short 형)

• char a = 10;

int b = 20;

printf(“a + b = %d\n”, a + b);

• 수식에서의 변환이 발생!

(7)

예제

선언

char c; short s; int i; long l; unsigned u;

unsigned long ul; float f; double d; long double ld;

수식 수식

c – s / i u * 7 - i

u * 2.0 – i f * 7 – i

c + 3 7 * s * ul

c + 5.0 ld + c

d + s u – ul

2 * i / l u - l

int

double int

double double long

unsigned float

unsigned long long double unsigned long

system dependent

(8)

캐스트(cast)

강제로 자료형을 변환하는 것

– 명시적으로 형을 변환하고자 할 때.

float a, d;

double b = 123456.90192, c = 1300495.09239;

a = b;

d = (float)c;

다음은 결과는?

int a, b;

a = 19.99 + 11.99;

b = (int)19.99 + (int)11.99;

printf(“a = %d, b = %d\n”, a, b);

(9)

요약

부동형을 정수형으로

– 소수부를 잃어버린다  계산결과를 예측할 수 없다.

큰 부동형 실수를 작은 부동형 실수로 (예: double  float)

– 정밀도(precision)가 손실될 수 있다.  결과를 예측할 수 없다.

큰 정수형을 작은 정수형으로 (예: long  shor)

– 값의 범위를 벗어날 경우 위쪽 비트는 무시된다.  결과를 예측할 수 없다.

(10)

연산자

Chan-Su Shin

(11)

연산자(operator)

산술 연산자

+ - * / % ++ --

7 % 5

비교 연산자

< <= > >= == !=

if ( 3 == 4 ) then yes else no

대입 연산자

= += -= *= /=

i = 5; j += i;

논리 연산자

&& || ! ?:

if (you are human && I am human) then we are both human else who we are?

비트 연산자

& | ^ ~ << >>

000010010 & 100101110 = 000000010

기타 연산자

( ) [ ] * &

sin( PI/4 ), A[5]

(12)

연산자(계속)

산술 연산자

– 단항 연산자 (unary operator)와 이항 연산자 (binary operator)

-6 + 7 * -2 = ?

– 우선순위(precedence)와 결합법칙(associative law)

1. + - (단항 연산자) 우에서 좌로 -+5 (-(+5))

2. * / % 좌에서 우로 3 * 2 / 4 ((3 * 2)/4) 3. + - (이항 연산자) 좌에서 우로 1 + 2 – 3 ((1 + 2) – 3)

예제

1. -+5 - 7

2. 5 * 4 / 2 % 6 – 8 3. 7 + 2 * - 5 / + 3

(13)

연산자(계속)

비교 연산자 (연산의 결과는?)

– A op B

> A is larger than B >= A is larger than or equal to B

< A is less than <= A is less than or equal to B

== A is equal to B != A is not equal to B

배정 연산자 (연산의 결과는?)

– C에서는 = 자체가 하나의 이항연산자로 정의된다.

A = (B = 2) + (C = 3 + 5);

– A op= B (op: 산술 이항 연산자, 논리 연산자)

A = A op (B);

A = B;

A += B; A = A + B;

A *= B + C; A = A * (B+C);

B = 2;

C = 3 + 5;

A = B + C;

(14)

연산자(계속)

증가, 감소 연산자

– ++A - - B 전위(prefix) 증감 연산자 change-then-use – A++ B- - 후위(postfix) 증감 연산자 use-then-change

– 상수나 수식에는 적용할 수 없고, 언제나 숫자 변수에만 적용할 수 있다.

예제

int A = 0, B = 0, C = 0;

C++; // C = C + 1; 과 같은 문장 A = ++C ;

B = C++;

printf(“ %d %d %d\n”, A, B, C);

int A = 10, B = 10;

printf(“ %d \n”, ++A);

printf(“ %d\n”, B++);

(15)

연산자(계속)

순위 연산자 결합법칙

1 ( ) ++(후위) -- (후위)

좌에서 우로

2 +(단항) -(단항) ++(전위) --(전위)

우에서 좌로

3 * / %

좌에서 우로

4 + -

좌에서 우로

5 = += -= *= /= …

우에서 좌로

(16)

연산자(계속)

예제 (실습시간 숙제)

한 수식 내에서 한 변수에 대한 증감 연산자는 한 번만 사용할 것

가능하면 ( )로 묶어 모호한 경우를 사전에 피할 것

int A = 2;

printf(“ %d ”, 5 * A++);

printf(“ %d ”, 5 * ++A);

int A = 2, B = 3, C = 1, D = 4;

A *= B = C + D++;

printf(“ %d \n”, A);

int A = 2;

(++A)++;

printf(“ %d \n”, A);

int A = 2;

A = 2 * A++ * (3 - ++A);

printf(“ %d \n”, A);

A = A++ + A++;

printf(“%d\n”, A);

참조

관련 문서

뒤에 a cute cat 이라는 명사구가 있으므로 What 으로 시작 하는 감탄문이 되어야 한다. 선행사가 사람이므로 주격 관계대명사 who 또는

9 On Saint Patrick ’ s Day, people in Ireland wear green jackets or hats with clovers on them.. 10 The color green is also important because it is the national

16 Right after that moment, not only Brielle ’ s heart rate but also her body temperature came back to normal.. 17 She began to breathe

뇌졸중 후 초기부터 죽은 뇌세포 주위의 세포들이 기능을 대신 하는 등의 다양한 기전을 통하여 마비 등의 후유증이 점차 좋 아지므로, 초기부터 다양한

13) Bouzigon E, Forabosco P, Koppelman GH, Cookson WO, Dizier MH, Duffy DL, Evans DM, Ferreira MA, Kere J, Laitinen T Coolerba G, Meyers DA, Moffatt M Coortin NG, NgCoY,

[r]

본 연구는 증거기반교수를 활용한 수감각 프로그램이 수학학습장애 위험군 아동의 수감각(수 의 분해와 합성)의 유창성과 기본 연산(basic facts) 능력에

나는 이것이 고객구분보다는 제품이나 서비스의 다양성 선택에 근거하기 때문에 이를 다양성 근거의 포지셔닝(vari ety based positioning)이라고 부른다... 예를