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