3 장 C 프로그램을이루는구성요소 김명호
내용 주석문 토큰 키워드 식별자 상수 문자열상수 구두자 1
구문 Syntax 올바른프로그램을만들수있게하는규칙 컴파일러 C 프로그램이구문에맞는지검사 오류가있다면, 오류메시지출력 오류가없다면, 목적코드생성 전처리기 컴파일러이전에호출 2
컴파일러 컴파일과정 C 프로그램 토큰으로분리 토큰을목적코드로변환 토큰종류 : 키워드, 식별자, 상수, 문자열상수, 구두자 3
주석문 컴파일러는주석문을공백으로처리 주석문 여러줄주석 줄단위주석 (C99) 주석은문서화도구로사용됨 프로그램설명이나알고리즘등기술 4
여러줄주석 주석문 /* 과 */ 사이에있는임의의문자열 주석은토큰이아님 컴파일러는주석을하나의공백문자로대치 문서화도구로사용함 ( 프로그램설명, 정확성증명등 ) 줄단위주석 // 으로시작 : 그다음부터그행끝까지가주석임 C99에추가 5
주석예제 프로그램 3.1 /***************************************** * 이프로그램은예제프로그램입니다. * * 2431 년 9 월 1 일 * *****************************************/ #include <stdio.h> int main(void) { printf(" 나의 "); printf(" 첫번째프로그램 "); return 0; } 6
/* 첫번째주석예제 */ /*** 두번째주석예제 ***/ /* * 세번째 * 주석예제 */ 주석예제 /*************************** * 네번째 * * 주석예제입니다. * ****************************/ 7
주석예제 프로그램 3.2 /* 반지름을입력받아원의넓이를구하는프로그램 * 2014 년 3 월 20 일 * 김진혁작성 */ #include <stdio.h> int main(void) { } float a; // 반지름변수 printf(" 반지름 : "); scanf("%f", &a); // 원의넓이 = 반지름 * 반지름 * 원주율 (3.14) printf(" 반지름이 %f인원의넓이 : %f\n", a, a * a * 3.14); return 0; 8
키워드 키워드 C 언어에서고유한의미를가지는토큰 예약된단어 프로그래머가다른의미로재정의할수없음 변수나함수이름으로사용할수없음 9
프로그램 /* 반지름을입력받아원의넓이를구하는프로그램 * 2014년 3월 20일 * 김진혁작성 */ #include <stdio.h> int main(void) { float a; // 반지름변수 printf(" 반지름 : "); scanf("%f", &a); // 원의넓이 = 반지름 * 반지름 * 원주율 (3.14) printf(" 반지름이 %f인원의넓이 : %f\n", a, a * a * 3.14); return 0; } 10
프로그램 /* 반지름을입력받아원의넓이를구하는프로그램 * 2014년 3월 20일 * 김진혁작성 */ #include <stdio.h> int main(void) { float a; // 반지름변수 printf(" 반지름 : "); scanf("%f", &a); // 원의넓이 = 반지름 * 반지름 * 원주율 (3.14) printf(" 반지름이 %f인원의넓이 : %f\n", a, a * a * 3.14); return 0; } 11
키워드 auto double inline sizeof volatile break else int static while case enum long struct _Bool char extern register switch _Complex const float restrict typedef _Imaginary continue for return union default goto short unsigned do if signed void * inline, restrict, _Bool, _Complex, _Imaginary 는 C99 에서추가 12
키워드 프로그램 3.3 #include <stdio.h> int main(void) { typedef int double; // 오류 : double을 int로재정의 int float; // 오류 : float을 int 형의변수로선언 return 0; } 13
식별자 변수, 함수, 사용자정의형에이름을부여하기위함 14
프로그램 /* 반지름을입력받아원의넓이를구하는프로그램 * 2014년 3월 20일 * 김진혁작성 */ #include <stdio.h> int main(void) { float a; // 반지름변수 printf(" 반지름 : "); scanf("%f", &a); // 원의넓이 = 반지름 * 반지름 * 원주율 (3.14) printf(" 반지름이 %f인원의넓이 : %f\n", a, a * a * 3.14); return 0; } 15
식별자 식별자는문자, 숫자, 그리고특수문자인밑줄문자 (_) 로구성된토큰으로, 문자또는밑줄문자로시작해야함 C 는소문자와대문자를구별함 식별자는그의미를생각하고선택해야함 키워드는사용자식별자로사용할수없음 라이브러리함수명, main, 미리정의된문자상수등은사용자식별자로사용하지않는것이좋음 16
식별자 올바른식별자 k _id iamanidentifier2 so_am_i 잘못된식별자 not#me 101_south -plus 17
예제프로그램 프로그램 3.4 #include <stdio.h> int main(void) { float a, b; } scanf("%f", &a); b = a * 2.54; printf("%f => %f\n", a, b); return 0; 18
프로그램 3.5 예제프로그램 #include <stdio.h> #define INCH2CM 2.54 int main(void) { float length_inch, length_cm; scanf("%f", &length_inch); length_cm = length_inch * INCH2CM; printf("%f => %f\n", length_inch, length_cm); return 0; } 19
상수 정수상수 부동형상수 문자상수 열거상수 enum 에의해선언된상수 상수는값과형을가짐 20
정수상수 정수상수 (Integer Constant) 10진정수 16진정수 : 0x로시작 8진정수 : 0으로시작 21
10 진정수상수 0, 17, 234 16 진정수상수 0~9, a(a)~f(f) 0x17, 0x234, 0xFFFF 변환명세 : %x, %#x 8 진정수상수 0~7 017, 0234 변환명세 : %o, %#o 정수상수 22
프로그램 3.6 #include <stdio.h> int main(void) { } 예제프로그램 printf("%d %x %o\n", 19, 19, 19); printf("%d %x %o\n", 0x1c, 0x1c, 0x1c); printf("%d %#x %#o\n", 017, 017, 017); return 0; 23
프로그램결과 19 13 23 28 1c 34 15 0xf 017 24
부동형상수 부동형상수 (Floating Constant) 0.17, 0.234 정수상수와구분해서사용해야함 10 진부동형상수 1.7e10 (= 1.7 X 10 10 ) 16 진부동형상수 0x1.7p10 (= (0x1.7) X 2 10 ) 25
프로그램 3.7 예제프로그램 #include <stdio.h> int main(void) { printf("%.2f\n", 1 / 3); printf("%.2f\n", 1 / 3.0); return 0; } 26
프로그램결과 0.00 0.33 27
문자상수 문자상수 (Character Constant) 작은따옴표로둘러싸인문자 'a', 'b', '+',... 와이드문자상수 일반문자상수에 L 접두사붙여표현 L'a', L'b',... 탈출문자 키보드로표현할수없는문자를나타내기위해 '\n', '\a', '\t',... 28
탈출기법 인쇄할수없는문자는탈출기법을사용하여표현함 예를들어, 수평탭문자는문자상수와문자열에서 \t 로표현됨 \t 가 \ 와 t 두문자로기술되지만, 이것은한문자임 프로그램내에서특별한의미를갖는문자들이본래의의미를갖기위해서도탈출기법을사용해야함 큰따옴표를포함하는 "abc" 라는문자열은 "\"abc\"" 로표기함 작은따옴표문자상수 ' 는 '\'' 로표기함 29
탈출문자 탈출문자 \a \\ \b \r \" \f \t \n \0 \' \v 의미 경고역슬래시백스페이스캐리지리턴큰따옴표폼피드수평탭개형널문자작은따옴표수직탭 30
프로그램 3.8 예제프로그램 #include <stdio.h> int main(void) { printf("\a"); printf("i like\b\b\bove C.\n"); return 0; } 31
프로그램결과 < 삑 > I love C. 32
열거상수 열거상수 (Enumeration Constant) - enum 으로정의된식별자 33
문자열상수 문자열상수 (String Constant) 큰따옴표에의해묶인일련의문자들 문자열내에 를넣기위해서는앞에 \ 붙임 공백에의해분리된두문자열상수는하나의문자열로결합 문자열상수중간에 \ 를삽입하면다음줄로문자열이연결됨 34
프로그램 3.9 예제프로그램 #include <stdio.h> int main(void) { printf("%s\n", " 재 "" 미 " " 있는 " "\"C\"!"); printf("%s\n", "\\n는 \ 개행문자.\n"); return 0; } 35
프로그램결과 재미있는 "C"! \n 는개행문자. 36
구두자 구두자 (Punctuator) [ ] ( ) { }. -> ++ -- & * + - ~! / % << >> < > <= >= ==!= ^ &&? : ;... = *= /= %= += -= <<= >>= &= ^= =, # ## <: :> <% %> %: %:%: // 다이그래프 (digraph) // [, ], {, }, #, ## 37
구두자 어떤구두자는사용된위치에따라의미가달라질수있음 ( ) printf("%d", a * (b + a)); 어떤구두자는다른문자와같이사용되면다른의미를가짐 + +, ++, += 38
산술연산자 프로그램 3.10 #include <stdio.h> int main(void){ printf("9 + 5 = %d\n", 9 + 5); printf("9-5 = %d\n", 9-5); printf("9 * 5 = %d\n", 9 * 5); printf("9 / 5 = %d\n", 9 / 5); printf("-9 = %d\n", -9); printf("+9 = %d\n", +9); printf("9 %% 5 = %d\n", 9 % 5); printf("9.0 + 5.0 = %f\n", 9.0 + 5.0); printf("9.0-5.0 = %f\n", 9.0-5.0); printf("9.0 * 5.0 = %f\n", 9.0 * 5.0); printf("9.0 / 5.0 = %f\n", 9.0 / 5.0); printf("-9.0 = %f\n", -9.0); printf("+9.0 = %f\n", +9.0); return 0; } 39
프로그램결과 9 + 5 = 14 9-5 = 4 9 * 5 = 45 9 / 5 = 1-9 = -9 +9 = 9 9 % 5 = 4 9.0 + 5.0 = 14.000000 9.0-5.0 = 4.000000 9.0 * 5.0 = 45.000000 9.0 / 5.0 = 1.800000-9.0 = -9.000000 +9.0 = 9.000000 40
우선순위와결합순위 하나의수식에여러개의연산자가올수있음 운선순위와결합순위는수식의평가순서를결정함 연산자 ( ) ++ ( 후위 ) --( 후위 ) + ( 단항 ) - ( 단항 ) ++ ( 전위 ) -- ( 전위 ) * / % + - = += -= *= /= %= >>= <<= &= ^= = 결합순위좌에서우로우에서좌로좌에서우로좌에서우로우에서좌로 41
우선순위와결합순위 예 우선순위 1 + 2 * 3 1 + (2 * 3) -a b (-a) - b 결합순위 1 + 2-3 + 4 5 (((1 + 2) - 3) + 4) - 5 괄호로우선순위변경가능 (1 + 2) * 3 42
배정연산자 배정수식형식 예 변수 = 수식 // = 기호오른쪽수식의값이변수에배정됨 a = b + c x = x + 1 배정문 b = 2; 43
배정연산자 다른언어와는달리 C 는 = 를연산자로다룸 b = 2; c = 3; a = b + c; a = ( b = 2 ) + ( c = 3 ); a = b = c = 0; a = (b = (c = 0)); 44
증가와감소연산자 전위증가연산자 ++i i = i + 1 전위감소연산자 --i i = i 1 후위증가연산자 i++ i = i + 1 후위감소연산자 i-- i = i - 1 45
증가와감소연산자 전위와후위연산자는같은기능을하지만수식의값에차이가있음 ++i 수식의값 : 새로운 i 의값 --i 수식의값 : 새로운 i 의값 i++ 수식의값 : 이전 i 의값 i-- 수식의값 : 이전 i 의값 46
i 가 3 일때 ++i 수식의값 : 4 --i 수식의값 : 2 i++ 수식의값 : 3 i-- 수식의값 : 3 증가와감소연산자 47
프로그램 3.11 예제프로그램 #include <stdio.h> int main(void) { int a, b, c, d; c = d = 0; a = ++c; // 이전값이 0인 c에전위 ++ 적용 b = d++; // 이전값이 0인 d에후위 ++ 적용 printf("a = %d, b = %d, c = %d, d = %d\n", a, b, c, d); return 0; } 48
프로그램결과 a = 1, b = 0, c = 1, d = 1 49
복합배정연산자 다른연산자와배정연산자가연결된형태 변수의새로운값이이전값과연관될때유용 k = k + 2 형태의수식을축약해서표현 복합배정연산자 +=, -=, *=, /=, %=, >>=, <<=, &=, ^=, = k = k + 2; k += 2; ( 주의 ) j *= k + 3;? j = j * k + 3;? j = j * (k + 3); 50
프로그램 3.12 예제프로그램 #include <stdio.h> int main(void) { int i = 1, j = 2, k = 3, m = 4; printf("i += j + k : %d\n", i += j + k); printf("j *= k = m + 5 : %d\n", j *= k = m + 5); return 0; } 51
프로그램결과 i += j + k : 6 j *= k = m + 5 : 18 52