2 장. 어휘원소, 연산자와 C 시스템 박종혁교수 UCS Lab Tel: 970-6702 Email: jhpark1@seoultech.ac.kr SeoulTech 2018-1 st 프로그래밍입문 (1)
2 목차 2.1 문자와어휘원소 2.2 구문법칙 2.3 주석 2.4 키워드 (Keyword) 2.5 식별자 (Identifier) 2.6 상수 (Integer, Constant) 2.7 문자상수, 문자열상수 2.8 연산자와구두점 2.9 연산자의우선순위와결합법칙 2.10 증가연산자와감소연산자 2.11 배정연산자 2.12 예제 : 2 의거듭제곱계산 2.13 C 시스템
3 어휘원소, 연산자, C 시스템 구문 올바른프로그램을만들수있게하는규칙 컴파일러 C 프로그램이구문에맞는지검사 오류가있다면, 오류메시지출력 오류가없다면, 목적코드생성 컴파일과정 C 프로그램 토큰으로분리 토큰을목적코드로변환 토큰종류 : 키워드, 식별자, 상수, 문자열상수, 연산자, 구두점
4 2.1 문자와어휘원소 프로그램에서사용할수있는문자 소문자 : a b c... z 대문자 : A B C... Z 숫자 : 0 1 2 3 4 5 6 7 8 9 특수문자 : + - * / = ( ) [ ] < > '! @ # $ % & _., ; :? 여백문자 : 공백, 개행, 탭 컴파일러는이러한문자들을구문단위인토큰으 로모은다.
5 어휘분석 /* Read in two integers and print their sum. */ 주석문 : /* 부터 */ 까지는공백으로대치 #include <stdio.h> 전처리지시자 : 전처리기가처리 int main(void){ int a, b, sum; 키워드 : int, void 식별자 : main, a, b, sum 연산자 : ( ) 구두점 : {,,, ; inta, b, sum; -> (X), int absum -->absum을하나의식별자,
6 예제프로그램 printf("input two integer: "); scanf("%d%d", &a, &b); printf, scanf : 식별자, (): 함수임을알림 "Input two integer: " : 문자열상수 & : 주소연산자, & a, & b (O), &a,&b (O), &a &b (X), a&, &b (X) sum=a + b ; =, + : 연산자, sum=a+b; (O), sum = a + b ; (O), s u m = a + b ;(X)
7 2.2 구문규칙 BNF(Backus-Naur Form) 으로기술예 ) digit = 0 1 2 3 4 5 6 7 8 9 생산규칙 의미 : 구문카테고리 digit 는기호 0 또는 1,..., 또는 9 로다시쓸수있다.
8 생산규칙에사용되는기호들 italics 구문카테고리 ::= " 다시쓰면 " 의기호 선택들을분리 { } 1 괄호안의항목중하나만선택 { } 0+ 괄호안의항목을영번이상반복 { } 1+ 괄호안의항목을한번이상반복 { } opt 옵션인항목
9 ** 생산규칙예제 ** letter_or_digit letter_or_digit ::= letter digit letter ::= lowercase_letter uppercase_letter lowercase_letter ::= a b c... z uppercase_letter ::= A B C... Z digit ::= 0 1 2 3 4 5 6 7 8 9 alphanumeric_string ::= {letter_or_digit} 0+ 3, ab777c, 알파뉴메릭문자열 u_alpha_string ::= uppercase_letter {letter_or_digit} 0+ conditional_statement ::= if (expression) statement {else statement} opt
10 2.3 주석 주석 /* 과 */ 사이에있는임의의문자열 주석은토큰이아님 컴파일러는주석을하나의공백문자로대치 문서화도구로사용함 ( 프로그램설명, 정확성증명 등 ) C++ 주석 줄단위주석 // 다음부터그행끝까지가주석임 C 스타일의주석도사용
11 ** 주석예제 ** C 스타일주석 /* a comment */ /* * A comment can be written in this fashion * to set it off from the surrounding code. */ /**************************** * If you wish, you can * * put comments in a box. * ****************************/ C++ 스타일주석 // This is a comment in C++.
12 2.4 키워드 키워드 C 언어에서고유한의미를가지는토큰 예약된단어 C 키워드 auto do goto signed unsigned break double if sizeof void case char else enum int long static struct volatile while const extern register switch continue float return typedef default for short union
13 2.5 식별자 식별자는문자, 숫자, 그리고특수문자인밑줄문자 (_) 로구성된토큰으로, 문자또는밑줄문자로시작해야함. C 시스템은소문자와대문자를구별함. 식별자의선택은의미를생각하여함.
14 식별자생성규칙 identifier ::= {letter underscore} 1 {letter underscore digit} 0+ underscore ::= _ 올바른예제 K, _id, iamanidentifier2, so_am_i
15 식별자의틀린예 not#me /* special character # not allowed */ 101_south /* must not start with a digit */ -plus /* do not mistake - for _ */ C 표준라이브러리에정의된식별자 : printf, scanf,... 의미가쉽게연상되는식별자 ( 변수 ) 사용할것. 밑줄문자 (_) 로시작되는식별자는가급적사용하지말것.
16 2.6 상수 정수상수 0, 17, 234, 0x17 실수상수 1.0, 3.141592, 23E2 문자상수 'a', 'b', '+', '\n' 문자열상수 "hello", "very good" 열거상수 enum 에의해선언된상수 ( 주의 ) -49 : 상수수식 // 음수정수상수는상수수식으로간주함
17 2.7 문자열상수 문자열상수 - 큰따옴표에의해묶인일련의문자들 올바른예제 "a string of text" "" " " " a = b + c; " " /* this is not a comment */ " " a string with double quotes \" within" 잘못된예제 /* "this is not a string" */ "and neither is this"
18 2.8 연산자와구두점 연산자 +, -, *, /, % 구두점 괄호, 중괄호, 콤마, 세미콜론등 연산자와구두점은문맥에따라결정됨 % printf("%d", a); // 형식제어문자 a = b % 7; // 나머지연산자 ( ) printf("hello"); // 연산자 a = (23 + 2) * 2 // 구두점
19 예제 ) 자판기잔돈계산프로그램 #include <stdio.h> int main() { int input, change; int w500, w100, w50, w10; } printf(" 돈을입력하세요 : "); scanf("%d", &input); change = input - 150; w500 = change / 500; change = change % 500; w100 = change / 100; change = change % 100; w50 = change / 50; change = change % 50; w10 = change / 10; printf("500 원짜리동전 %d 개 \n", w500); printf("100 원짜리동전 %d 개 \n", w100); printf("50 원짜리동전 %d 개 \n", w50); printf("10 원짜리동전 %d 개 \n", w10); return 0; // input 은투입액, change 는잔돈을저장할변수 // 각동전의개수를저장할변수 // 커피값이 150 원일때잔돈계산 // 500 원동전의개수 // 아직지급하지못한남은잔돈
20 2.9 우선순위와결합법칙 운선순위와결합법칙은평가순서를결정함 예 1 + 2 * 3 1 + (2 * 3) 1 + 2 3 ((1 + 2) 3) 연산자 ( ) ++ ( 후위 ) --( 후위 ) + ( 단항 ) - ( 단항 ) ++ ( 전위 ) -- ( 전위 ) * / % + - = += -= *= /= etc. 결합법칙 좌에서우로우에서좌로좌에서우로좌에서우로우에서좌로
21 우선순위 : (* /), (+-) 1+2*3 == 1+(2*3) --> 7 (1+2)*3 --> 9 문자열상수의예 결합법칙 : 좌에서우 1+2-3+4-5==(((1+2)-3)+4)-5
22 구구단프로그램 (1) 9 * 4 계산 #include <stdio.h> int main(void){ printf( 9 * 4 = %d\n", 9 * 4); return 0; }
23 구구단프로그램 (2) 9 * 4 계산 #include <stdio.h> int main(void){ int dap; } dap = 9 * 4; printf( 9 * 4 = %d\n", dap); return 0;
24 구구단프로그램 (3) 9 * 4 계산 #include <stdio.h> int main(void){ int a, b, dap; } a = 9; b = 4; dap = a * b; printf( %d * %d = %d\n", a, b, dap); return 0;
25 구구단프로그램 (4) 9 * 4 계산 #include <stdio.h> int main(void){ int a, b, dap; } printf("input two integers : "); scanf("%d%d", &a, &b); dap = a * b; printf( %d * %d = %d\n", a, b, dap); return 0;
26 2.10 증가와감소연산자 전위증감연산자 ++i, --i /* i = i + 1, i = i - 1 */ 후위증감연산자 i++, i-- /* i = i + 1, i = i - 1 */ 증감연산자수식의값 ++i, --i /* i + 1, i - 1 */ i++, i-- /* i, i */
27 증가 / 감소연산자틀린사용 777++ /* constant can not be incremented */ ++(a*b-1) /* ordinary expression not be incremented */ 예제코드 int a, b, c = 0; a = ++c; b = c++; printf("%d %d %d\n", a, b, ++c); /* 1 1 3 is printed */
28 2.11 배정연산자 다른언어와는달리 C 는 = 를연산자로다룸 a = ( b = 2 ) + ( c = 3 ); 배정연산자 =, +=, -=, *=, /=, %=, >>=, <<=, &=, ^=, = ( 주의 ) j *= k + 3 은 j = j * k + 3 이아니라, j = j * (k + 3) 임
29 배정연산자 선언및초기화 int i = 1, j = 2, k = 3, m = 4; 수식동일한수식결과값 i += j + k i = (i+ (j + k)) 6 j *= k = m + 5 j = (j * (k = (m +5))) 18
30 2.12 예제 2 의거듭제곱계산 #include <stdio.h> int main(void){ } 출력 int i = 0, power = 1; while (++i <= 10) printf("%-6d", power *= 2); printf("\n"); return 0; 2 4 8 16 32 64 128 256 512 1024
31 2.13 C 시스템 C 시스템 C 언어, 전처리기, 컴파일러, 라이브러리, 편집기등으로구성 전처리기 # 으로시작하는행을전처리지시자라고함 #include <filename> #include "filename" #define PI 3.141592 표준라이브러리 프로그램에유용한함수들로 C 시스템이제공함 printf(), scanf(), 등 사용자가알아서해당헤더파일을포함시켜야함
32