슬라이드 0

Download Report

Transcript 슬라이드 0

Sogang University
C 프로그래밍 (STS2008)
C Programming
1. Introduction to the C Language
2. Structure of a C Program
0
2014. 1학기 C프로그래밍
Identifier
▪ Identifier
▫ Identifier는 데이터나 객체에 부여하는 이름을 뜻함
▪ Identifier의 규칙
▫
▫
▫
▫
첫 글자는 영문자나 언더스코어(‘_’) 로 시작
영문자, 숫자, 언더스코어로만 구성되어야
처음 63글자만 구별 가능
Keyword는 사용할 수 없음 예) double, int, switch, if, else, return, static 등
▪ Identifier의 예
서강대학교 컴퓨터 공학과
1
2014. 1학기 C프로그래밍
Types
▪ A set of values and a set of operations that can be applied on
those values.
▫ Void : void 타입은 값을 갖고 있지 않으며, 연산 없음
▫ Derived : 다른 타입들로 구성된 복잡한 구조
예) pointer, enumerated type, union, array, and structure
서강대학교 컴퓨터 공학과
2
2014. 1학기 C프로그래밍
Types
▪ Boolean Type
▫ Boolean Type은 true와 false 오직 2가지 값으로 나타냄
▫ Boolean Type이 규정되기 전에도 integer값을 이용해 표현
▫ True  0 이외의 수 (positive or negative)
▫ False  0 (zero)
▪ Character Type
▫ 1byte로 저장되며 하나의 문자 저장
▫ 저장할 수 있는 문자는 alphabet문자에 한정된 것이 아니라 숫자와 기타기호도
포함
▫ char형은 0~255의 값을 갖는 작은 int형으로 해석가능
그래서 C에서는 char형을 자주 int형과 같이 취급함
▫ 예) char형 변수는 내부적으로는 정수형이므로 산술연산이 가능
▫ 다음의 경우 문자 ‘A’의 다음 두 번째 문자인 ‘C’가 출력
char c = ‘A’;
printf("%c", c+2);
서강대학교 컴퓨터 공학과
// c = 65
// c+2 = 67 => ‘C’
3
2014. 1학기 C프로그래밍
Types
▪ Integer Type
▫ int 형은 정수를 저장
▫ short int, int, long int, long long int 로 구분됨
▫ 각각의 integer size 들은 signed 혹은 unsigned 될 수 있음
※ 위의 표는 일반적인 값을 나타내며 플랫폼에 따라 달라질 수 있다.
▪Floating-Point Type
▫ float 형은 실수를 저장
▫ real, imaginary, complex 로 분류됨
▫ real type 은 float, double, long double로만 구분됨
서강대학교 컴퓨터 공학과
4
2014. 1학기 C프로그래밍
Variables And Constants
▪ Variables
▫ 값을 저장할 수 있는 기억장소에 이름을 붙인 것으로 선언된 후 쓰여야 함
▫ 변수를 선언할 때는 변수의 type과 변수의 이름을 나란히 써줌
▫ 변수의 선언은 함수의 첫 부분에서만 가능
▪ variable initialization(변수의 초기화)
▫ 변수를 초기화하지 않으면 어떤 값이 들어있는지 알 수 없음
초기화 이전에 저장되어 있는 값을 쓰레기 값(garbage)이라 함
▪ Constants
▫ 프로그램이 실행되는 동안에 변하지 않는 데이터 값
const float pi = 3.14159
서강대학교 컴퓨터 공학과
5
2014. 1학기 C프로그래밍
Output Formatting : printf
▪ C에서 출력을 하는 방법은 여러가지가 있지만 가장 쉽게 쓸 수 있는
것은 printf(print formatted)이다.
▪ “ ” 안에 출력할 내용을 적는다.
▪ 변수의 값을 출력할 때는 “ ” 안의 해당 위치에 형식문자(%d, %c,
etc..)를 적고, “ ” 뒤에 해당하는 변수를 순서대로 적는다.
printf (“ … %d … %f …“, int형변수, float형변수);
서강대학교 컴퓨터 공학과
6
2014. 1학기 C프로그래밍
Output Formatting : printf
전체 폭은 5이며,
정렬은 기본적으로 우측정렬
▪ int형 변수 값의 출력 형식
▫ %d 사이에 폭을 나타내는 정수를 기술
▫ 필드 폭을 지정하면 자동적으로 우측정렬이
된다. 좌측정렬을 위해서는 필드 폭 앞에 ‘-’ 를
붙임
3 0
printf(“%5d”, 30);
전체 폭은 5이며,
정렬은 기본적으로 우측정렬,
+ 의미는 값의 부호 출력
+ 3
printf(“%+5d”, 30);
▪ float형 변수값의 출력 형식
▫ 필드 폭을 지정하려면 %f 사이에 폭을 기술
▫ %10f 라고 기술하면
전체 폭은 10, 소수점 이하 자리수 폭은 기본 6으로 지정
0
전체 폭은 8이며, 변환문자 f는
소수점 이하 6자리가 기본
printf(“%f”, 3.1);
3 . 1 0 0 0 0 0
▫ %10.5f 이면
전체 폭은 10, 5는 소수점 이하 자리수의 폭을 의미
▫ 지정한 전체 폭이 출력 값의 전체 폭보다
작으면, 지정된 작은 폭은 무시하고 원래의
출력 값의 폭으로 출력
전체 폭은 5이며, 소수점 이
하 2자리, 정렬은 – 부호에
의해 좌측정렬
printf(“%-5.2f”, 3.1);
서강대학교 컴퓨터 공학과
3 . 1 0
7
2014. 1학기 C프로그래밍
Output Formatting : printf
▪ 오류가 있는 output의 예
▫ Three conversion specifications, but only two values
printf(“%d %d %d\n”, 44, 55);
44, 55, 134513316
(세 개의 값이 출력된다, 이때 뒤에 오는 argument의 수가 달라 match
되는 값이 없어 쓰레기 값 이 출력 된다.)
▫ Two conversion specifications, with three values
printf(“%d %d\n”, 44, 55, 66);
44, 55
(세 번째 값은 무시된다.)
▫ Format specification does not match the data type
float x = 123.45;
printf(“The Data are : %d\n”, x);
The Data are : -1073741824
(float type에 변수를 int type으로 출력하여 잘못된 결과 값이 나온다.)
서강대학교 컴퓨터 공학과
8
2014. 1학기 C프로그래밍
Input Formatting: scanf
▪ C에서 입력을 받는 방법 중가장 쉽게 쓸 수 있는 것은 scanf()이다.
▫ scanf()는 도스창인 표준 입력으로부터 여러 종류의 자료 값을 입력 받을 수 있음
▫ 사용법은 printf()와 유사
▫ 단, 입력 값을 저장할 변수의 이름 앞에 ‘&’를 반드시 붙여줘야 한다.
(&은 해당 변수의 주소를 의미하는 연산자)
scanf(“ %d %f ”, &age, &weight);
서강대학교 컴퓨터 공학과
9
2014. 1학기 C프로그래밍
C Programs - Comment
▪ comment는 reader가
프로그램을 이해하는데
도움을 줌
▪ opening token: /*
▪ closing token: */
▪ 컴파일러는 /* …… */ 사이의
모든 내용을 무시
▪ 컴파일러는 // …… 다음의 한
라인의 내용 을 무시
이 부분만 주석
으로 처리
▪ 주석 내부에 주석을 중복하여
사용하는 경우 일부는
주석처리가 되지 않는다.
주석처리 되지 않은
부분
서강대학교 컴퓨터 공학과
10
2014. 1학기 C프로그래밍
Number Bases
▪ Decimal Integer
▫ 0, 237, 18567, -789
▪ Octal Integer (0으로 시작)
▫ 017, 05643, 0234
▪ Hexadecimal Integer (0x로 시작)
▫ 0x12FF, 0x56ABC, 0x89A345
예)
unsigned int A = 0347;
unsigned int B = 0x56A7C;
서강대학교 컴퓨터 공학과
/*octal number 347*/
/*hexadecimal number56A7C*/
11
2014. 1학기 C프로그래밍
Number Conversion
▪ 2진수, 8진수, 16진수 사이의 변환
▫ 2진수를 오른쪽에서부터 3bits로 묶어서 8진수로 변환.
ex) 0111001100011110
0 111
001
100
011
071436
110
▫ 2진수를 오른쪽에서부터 4bits로 묶어서 16진수로 변환
ex) 0111001100011110
0111
0011
0001
731E
1110
▫ 8진수 하나의 숫자는 2진수의 3자리로 변환
06504
110
101
▫ 16진수 하나의 숫자는 2진수의 4자리로 변환
0011 0010
0x32FC
000
1111
100
1100
▫ 16진수  8진수는 2진수로 변환하여 변환
서강대학교 컴퓨터 공학과
12
2014. 1학기 C프로그래밍
Expressions
▪ 프로그램 언어에서 변수나 상수, 연산자로 구성된 식
▪ 표현식은 항상 결과(반환) 값을 갖음
▫ Operator(연산자) : +, -, *, / 등
▫ Operand (피연산자): operator를 가지고 계산되는 상수 또는 변수
서강대학교 컴퓨터 공학과
13
2014. 1학기 C프로그래밍
Expressions
▪ Primary expression
: operator가 없이 오직 하나의 operand로 이루어진 가장 기본적인 형태
▫ 식별자( Identifier )
▫ 식별자 예 : a, b12, price, calc, INT_MAX 등
▫ 상수 ( Constants )
▫ Constants 예 : 5, 123.45, ‘A’, “Welcome” 등
▫ 괄호식 ( Parenthetical Expression )
▫ 괄호식 예 : (2*3)+4, (a=23+b*6) 등
서강대학교 컴퓨터 공학과
14
2014. 1학기 C프로그래밍
Expressions
▪ Prefix expression
▫ 형식 : operator가 operand 앞에 나옴
▪ Postfix expression
▫ 형식 : operator가 operand 뒤에 나옴
서강대학교 컴퓨터 공학과
15
2014. 1학기 C프로그래밍
Expressions
▪ ++a 과 a++의 차이
▫ prefix와 postfix는 증가/감소 연산을 수행하는 시점이 다름
▫ prefix의 경우, 변수의 참조보다 먼저 연산을 수행
▫ postfix의 경우, 변수의 참조 후에 연산을 수행
<prefix>
<postfix>
int x, a=1;
x = ++a;
int x, a=1;
x = a++;
a에 1을 더한 후, x에 그 값을 대입한다.
 x의 값은 2가 된다.
x에 값을 대입한 후, a에 1을 더한다.
 x의 값은 여전히 1이다.
서강대학교 컴퓨터 공학과
16
2014. 1학기 C프로그래밍
Expressions
▪ 증가연산(prefix, postfix)과 일반산술연산(infix)의 비교
printf
X
10
10
11
11
11
10
10
10
10
printf
X
10
서강대학교 컴퓨터 공학과
11
10
10
10
9
10
10
10
17
2014. 1학기 C프로그래밍
Expressions
▪ 증감연산 사용 이유
▫ 증감연산자를 이용하면 프로그램 형태가 간결
▫ 기계어 코드와 일대일 대응되므로 실행속도가 개선
▪ 주의점
▫ 연산자의 위치에 따라 evaluation value가 다르므로 주의 요구
▫ 증감연산자는 ++, --자체가 연산자 기호  중간에 공백이 들어가면 안됨
▫ 산술연산이나 관계, 논리연산보다 그 평가를 먼저 한다.
▫ 증감연산자는 피연산자로 변수를 사용할 수 있지만, 상수나 일반 수식을
피연산자로 사용 불가능
▫ 다음과 같은 수식은 잘못된 수식
int a = 10;
++300; /* 상수에는 증가 연산자를 사용할 수 없다 */
(a+1)--; /* 일반 수식에는 증가 연산자를 사용할 수 없다 */
서강대학교 컴퓨터 공학과
18
2014. 1학기 C프로그래밍
Binary expression
▪ Binary expression
▫ 형식 : 피연산자 – 연산자 – 피연산자 (operand – operator - operand)
▫ Operator가 operand사이에 있음
▫ Binary expression 예
▫ a+7, 3+4, b-11 등
 additive expression (+, -)
▫ 10*12, a /4, 5%2 등  multiplicative expression (*, /, %)
▫ %(modulo)는 나머지를 구하는 연산자
서강대학교 컴퓨터 공학과
19
2014. 1학기 C프로그래밍
Assignment expression
▪ Assignment expression
▫ 수학에서는 “우측의 값과 좌측의 값이 같다”라는 의미이나,
C 언어에서는 “우측의 값을 좌측의 저장 장소에 저장하라”라는 의미
▫ 분류
▫ simple assignment

▫ 예) a=5, b=x+1, i=i+1등
▫ Compound assignment
▫ 예) x+=y, x*=y, x/=y 등
서강대학교 컴퓨터 공학과

20
2014. 1학기 C프로그래밍
Assignment expression
▪ Destination of an assignment
▫ 대입 명령은 항상 대입 연산자의 오른쪽에서 왼쪽으로
Ex) A = 9;
: 변수(variable) A에 값(value) 9를 대입
9 = A;
: 9는 올바른 변수 이름이 아니므로 잘못된 표현
Ex) X = Y * Z; : 변수 Y와 Z를 곱한 결과값을 변수 X에 대입
X * Y = Z;
: X * Y는 식별자, 즉 하나의 변수가 아닌 표현식
이므로 C 문법에 어긋난 잘못된 표현
Ex) A = B;
: 변수 B가 갖는 값을 변수 A에 대입
B = A;
: 변수 A가 갖는 값을 변수 B에 대입
따라서 위의 두 대입 명령문은 다른 의미를 갖는다.
같다는 표현을 하기 위해서는 “= =“ 연산자 이용!
Ex) A = B = C = 0; or A = ( B = ( C = 0 ));
대입 명령은 항상 연산자의 오른쪽에서 왼쪽으로 대입되므로 위의 두
명령은 같은 의미를 갖는다.
Ex) counter = 3;
3
4
20
counter = counter + 1;
counter
counter
counter
counter = 5 * counter;
서강대학교 컴퓨터 공학과
21
2014. 1학기 C프로그래밍
Precedence & Associativity
▪ Precedence : 다른 연산자들 사이의 우선 순위
▫ 수학에서도 곱하기나 나누기 연산자가 더하기나 빼기 연산자보다도
우선 순위가 더 높은 것처럼 C언어에서도 연산자 사이에 우선순위가
있다.
▫ Precedence의 예
▫ 2+3*4(2+(3*4))
▫ - b ++  ( - ( b++ ) )
▪ Associativity : 같은 순위의 연산자들 사이의 우선 순위
▫ Associativity의 예
▫ Left-to-Right (Simple Assignment)
▫3*8/4%4*5((((3*8)/4)%4)*5)
▫ Right-to-Left (Compound Assignment)
▫ a += b *=c -= 5  ( a += ( b *= ( c -= 5 ) ) )
(a=a+(b=b*(c=c–5)))
서강대학교 컴퓨터 공학과
22
2014. 1학기 C프로그래밍
Precedence tale for C expression
서강대학교 컴퓨터 공학과
23
2014. 1학기 C프로그래밍
Type Conversion
▪ Type Conversion
▫ 일반적으로 C 언어의 연산식에서 여러 피연산자의 자료형이 서로
다른 경우, 하나의 통일된 자료형으로 자동 변환하여 연산을 수행
▫ Implicit type conversion (coercion) :
C 컴파일러가 판단하여 자동으로 데이터형을 변형하는 경우
▫ 다음과 같은 경우 C 컴파일러가 판단하여 자동 형 변환을 수행한다.
▫ 수식에서 데이터형이 혼합되어 사용되었을 때 값을 변환
▫ 특정한 데이터형의 변수에 다른 데이터형의 값을 대입할 때, 값을 변환
▫ Explicit type conversion (cast) : 프로그래머가 형 변환자(cast)를
사용하여 강제적으로 변형하는 경우
서강대학교 컴퓨터 공학과
24
2014. 1학기 C프로그래밍
Implicit type conversion
▪ 서로 다른 데이터 형이 혼합하여 사용될 때
▫ 수식에서 형 변환은 보통 범위가 큰 데이터형으로 변환
▫ Conversion Rank
▫ 각각의 타입들에 대해 계급을 할당
▫ Ex) long double 타입의 실수는 long 타입의 정수보다
높은 계급을 갖고 있다.
“모든 문자들은 숫자 값을 가
지고 있기 때문에 문자를 정
수와 부동소수점 값에 더할
수 있다”
서강대학교 컴퓨터 공학과
25
2014. 1학기 C프로그래밍
Implicit type conversion
▪ 형 확장(Promotion)
▫ 하나 이상의 데이터 형이 혼합식을 구성할 때
▫ 가장 큰 데이터 형에 맞춰 자동으로 형 변환이 이루어지는 규칙을 적용
1)
ch * i  ch는 int형으로 확장되어 i과 계산 수행된다. 여
기서 ch는 대문자 A 인데 이는 ASCII 코드값 65 로 계산
된다.
2) * f  1)에서 계산된 결과는 float형으로 확장되어
f와 계산 수행된다.
3) + 300  300도 float형으로 확장되어 2)의 결과에 더해진
다.
4) 계산의 결과는 double형으로 확장되어 d에 대입된다.
<실행결과>
서강대학교 컴퓨터 공학과
26
2014. 1학기 C프로그래밍
Implicit type conversion
▪ 범위가 큰 데이터 형에서 작은 데이터 형으로의 변환은 문제 발생
형변환
문 제 점
큰 부동 소수점형을
작은 부동 소수점형으로
double  float
정밀도(유효 숫자)에 손실이 있다.
원래 값이 변환 데이터형의 범위를 벗어나는 경우의 결과는 예측
불허이다.
부동 소수점형을
정수형으로
float  int
소수부를 잃어버리게 된다.
원래 값이 변화 데이터형의 범위를 벗어나는 경우는 결과는 예측
불허이다.
큰 정수형을
작은 정수형으로
long  short
원래 값이 변화 데이터형의 범위를 벗어나는 경우에 일반적으로
하위 바이트들만이 복사된다.
서강대학교 컴퓨터 공학과
27
2014. 1학기 C프로그래밍
Explicit type conversion
▪ Explicit conversion ( casting, cast operation )
▫ 프로그래머가 강제적으로 변수의 데이터형 변환 가능
▫ 피연산자의 값을 앞 위치의 괄호 안에서 지정한 자료형으로 변환하는 연산
( type ) expression 
expression 의 값을
type의 데이터형으로 강제로 변환
치환문에 의한 형변환
캐스트 연산자에 의한 강제 형변환
<실행결과>
서강대학교 컴퓨터 공학과
28
2014. 1학기 C프로그래밍
Explicit type conversion
▪ 시스템, OS (운영체제), 컴파일러의 종류에 따라 각 데이터형의 메모리
저장 크기가 다를 수 있음
▪ 프로그램이 사용하는 데이터형의 크기를 알 수 있는 방법으로 sizeof
연산자를 사용할 수 있음 (unary expression)
▫ sizeof ( type )
▫ 위의 연산자를 사용하면 해당 데이터형의 크기를 byte 단위로 알려줌
Ex)
sizeof(int);
sizeof(float);
cf) 시스템에 따라 데이터형의 크기가 다를 수 있다는 점은, 한 환경에서 다른
환경으로 프로그램을 가져갈 때 문제를 일으킬 수 있다.
sizeof() 연산자는 데이터형의 크기가 중요시 되는 프로그램에서 유용하게 사용될
수 있다.
서강대학교 컴퓨터 공학과
29
2014. 1학기 C프로그래밍
Statements
▪ 프로그램에 의해서 수행되는 하나의 동작(action)
▪ 직접적으로 하나 또는 그 이상의 실행 가능한 컴퓨터 명령어로 변환됨
▪Statement의 종류
▫ Null statement
▫ ;  statement가 있어야 하지만 아무런
동작도 필요하지 않을 경우 사용
▫ loop등에서 유용하게 사용
예) for( ; ; )
▫ Expression statements
▫ 표현식 뒤에 세미콜론(;)을 붙여 statement로
변환
▫ ‘;’는 컴퓨터에게 statement의 끝임을 나타냄
▫ Compound statements
▫ 0 (zero) 또는 그 이상의 문장으로 구성되는
코드 단위 : Block
▫ main 함수를 만들 때도 compound statements
사용
▫ 세미콜론(;)이 필요하지 않음
서강대학교 컴퓨터 공학과
30