Chapter 2 Lexical Elements, Operators, and the C System 프로그래밍 기초와 실습 Chapter 2 Lexical Elements, Operators, and the C System
Contents Characters and Lexical Elements Comments Keywords Identifiers Constants String Constants Operators and Punctuators Precedence and Associativity of Operators Increment and Decrement Operator Assignment Operators
Characters and Lexical Elements Characters that can be used in a program Lowercases letters a b c d . . . z Uppercase letters A B C D . . . Z Digits 0 1 2 3 4 5 6 7 8 9 Other characters + - * / = ( ) { } [ ] < > ’” ! @ # $ % ^ & _ | \ . , ; : ? White space characters space, form feed and new-line, horizontal and vertical tab C-program은 이들 character의 집합인 ‘token’으로 구성되며 ‘token’은 compiler 에 의해 하나의 unit으로 해석된다.
Characters and Lexical Elements token의 종류 - identifier : letters, digits, ‘_’로 구성된 token - operator : 연산자 - punctuator : { } , ; ( ) - keyword : c에서 특별한 의미를 갖는 예약 어 Token사이의 white space는 허용되며 적절한 spaces의 사용으로 보다 readability의 향상 가능. Space, tab, new line, .. All legal statements printf(“Height : %d\n”, height); printf(“Height : %d\n”,height); /* no space */ printf (“Height : %d\n”, /* three lines */ Height) ;
/* Read in two scores and print their sum */ #include <stdio.h> int main(void) { int score_1 , score_2 , sum; printf("Input two scores as integers: "); scanf("%d%d", &score_1, &score_2); sum = score_1 + score_2; printf("%d + %d = %d\n", score_1, score_2, sum); return 0; }
Comments /* 와 */ 사이에 있는 문장. Compiler 에 의해 무시되는 문장. 프로그램의 수행과는 무관. 프로그램 흐름의 이해를 높이기 위한 문장. 프로그램 작성자, 작성일, 목적, 설명 등을 표시. [Ex] /* 2001년9월15일 * * 홍길동 작성 */ #include <stdio.h> main( ) { int n ; /* 정수형 변수 선언 */ n = 25 * 10; /* 대입문 */ printf(“%d”, n); /* 출력문 */ }
Keywords Keywords 는 하나의 token으로 간주되며 program에서 특별한 의미를 갖는 예약 어 입니다. auto do goto signed unsigned break double if sizeof void case else int static volatile char enum long struct while const extern register switch continue float return typedef default for short union
Identifiers 함수 명, 변수 명 등을 말한다. 영문자(a-z, A-Z), 숫자(0-9), underscore (_)로 구성 영문자 나 underscore(_) 로 시작. 대, 소문자 구별. 255자 까지 가능, 그러나 첫 31자 까지만 인식. Keywords 는 사용될 수 없다.
Identifiers [Ex1] /* Legal identifiers */ times10 get_next_char _done [Ex2] /* Illegal identifiers */ 10times /* 영문자나 _로 시작되어야 한다. */ get-next-char /* 특수문자 – 는 허용되지 않는다. */
Constants C는 여러 유형의 상수 값들을 조작. Integer Constants : Float Constants : C에서 정수형은 Decimal, Octal, Hexadecimal로 표현된다. Float Constants : Decimal point로 표현 Exponent로 표현 [Ex] 17 /* decimal integer constant */ 017 /* octal integer constant : 17(8) = 15 */ 0x17 /* hexadecimal integer constant 17(16)= 23 */ -17 /* negative decimal integer constant */ [Ex] 57.0 /* Decimal point로 표현 */ 5.70E1 /*Exponent로 표현 */ .57e+02 570.e-01
Constants Character Constants : Single Quote(’)로 둘러 싸인 문자 Escape Sequences : Character Escapes Numeric Escapes – ASCII Code값으로 표시 [Ex] ‘A’, ‘b’ Name Character Numeric (Oct) (Hex) new line \n \12 \x0a Alert \a \7 \x07 back space \b \10 \x08 horizontal tab (8cs) \t \11 \x09 Vertical tab \v \13 \x0b Double quote \” \42 \x22 Single quote \’ \47 \x27 Back slash \\ \114 \x5c ESC \33 \x1b Constant도 하나의 token으로 간주
String Constants Double quote marks(“)로 둘러 싸인 일련의 characters의 집합 Compiler에 의해 Array 형태로 저장 Character constants와 구분. white space에 의해 구분되는 두개의 string은 compiler에 의해 single string으로 간주 [Ex] “Hello!”, “123” [Ex] “a” /* String */ ‘a’ /* Character */ [Ex] “abc” “def” “abcdef”
The C System Preprocessor #define #로 시작되는 모든 statement의 처리 syntax compile 전에 symbol을 모두 value로 바꾸어 준다. [Ex] #include<stdio.h> #define PI 3.14159 #define symbol value 수현아! Define문은 여기서 전혀 언급이 안되니? 간단히라도 언급하는 것이 좋지 않을까??? TAX_RATE이 바뀔 경우 program 전체를 수정하지 않고 #define 부분만 수정하면 된다. [Ex] #define TAX_RATE 0.1 : printf(“Tax rate is %f”, TAX_RATE); tax = income * TAX_RATE; compile전에 TAX_RATE는 모두 0.1로 바뀐다.
The C System #include compile전에 주어진 File의 복사본을 include문 대신 삽입 삽입되는 File은 Header File로 확장자명은 ‘~.h’ Header File의 주된 내용은 Function prototypes, #define [Ex] “stdio.h” contains : int printf(const char *format, …); /* printf의 prototype */ int scanf(const char *format, …); /* scanf의 prototype */ 수현아! Define문은 여기서 전혀 언급이 안되니? 간단히라도 언급하는 것이 좋지 않을까??? [Ex] #include <filename.h> #include “filename.h” System에서 지원하는 standard library가 있는 위치에서 검색. Current directory에서 Header File 검색
The C System The Standard Library [ 보다 신속한 수행을 위해 compile된 함수 제공 제공되는 함수 사용을 위해 함수 호출문과 그 함수를 호출하기 위한 function prototype의 제공 필요 standard library : compile된 함수들로 구성. standard header file : 주로 function prototypes들을 포함하는 file로 library함수를 사용하기 위해서는 그 function prototype이 정의된 header file의 include필요 [Ex] #include<stdio.h> /* scanf 사용을 위한 header file삽입 */ : scanf(“%d”, &a); /* data입력을 위한 library함수 호출 */ [
Operators and Punctuators Unary Operators : +, - : 양수, 음수 표현 Right associative (오른쪽에서 왼쪽방향으로 계산) [Ex] int a = 1, b ; b = -a + 3 ; /* b = (-1) + 3 = +2 */ b = -a + -+b; b= (-1) + (-(+(+2))) = (-1) + (-(+2)) = (-1) + (-2) = (-1) – 2 = -3
Operators and Punctuators Binary operator : + , - , * , / , % *, /, % 가 +, - 보다 우선순위가 높다. Left associative (왼쪽에서 오른쪽 방향으로 계산) % operator 나머지를 계산 Operand의 type이 integer 가 아닌 경우 error 배수 구하기 등에 사용 [Ex] if ( n%3 == 0) /* n이 3의 배수라면 */
Operators and Punctuators [Ex] #include<stdio.h> main( ) { int a=3, k, b, sum, rem; k = 6; scanf( “%d”, &b) ; /* 5로 입력한다고 가정 */ sum = a + b * k ; /* Expression */ rem = sum % 10 ; printf ( “ %d + %d * %d = %d \n”, a, b, k, sum ) ; printf ( “ remainder = %d \n”, rem ) ; } 3 +5 * 6 = 33 reminder = 3
Precedence and Associativity of Operators Operator precedence and associativity. Operator Associativity ( ) ++(postfix) --(postfix) left to right +(unary) -(unary) ++(prefix) --(prefix) right to left * / % + - = += -= *= /= etc. [Ex] a = b += c++ - d + --e / -f ; (a = (b += (c++) – d) + (--e) / (-f)) ⑧ ⑦ ① ⑤ ⑥ ③ ④ ②
Increment and Decrement Operators Increment operator Postfix k++ Prefix ++k Decrement operator Postfix k-- Prefix --k k = k + 1 ; 와 동일 k = k - 1 ; 와 동일 Prefix : operand가 사용되기 전에 먼저 증가/감소 시킴 Postfix : operand가 사용된 후에 증가/감소 시킴
Increment and Decrement Operators [Ex] int i = 4, j; j = ++i + 3; printf(“i : %d, j = %d\n”, i, j); j = i++ + 3; j = --i + 3; j = i-- + 3; i를 먼저 증가시킨 후, j는 그 값에 3을 더함 j는 i에 3을 더한 값이 되고 그 후에 i를 1증가시킴 새로 추가한 슬라이드 입니다. i = 5, j = 8 i = 6, j = 8 i = 4, j = 8
Increment and Decrement Operators [Ex] int i, j, k = 5; i = j = 0; ++j; i++; printf(“1: i=%d, j=%d, k=%d\n”, i, j, k); k = ++i; printf(“2: i=%d, j=%d, k=%d\n”, i, j, k); k = i++; printf(“3: i=%d, j=%d, k=%d\n”, i, j, k); k = --i + j++ ; printf(“4: i=%d, j=%d, k=%d\n”, i, j, k); i = i -1; k = i + j j=j+1; 새로 추가한 슬라이드 입니다. 1: i=1, j=1, k=5 2: i=2, j=1, k=2 3: i=3, j=1, k=2 4: i=2, j=2, k=3
Assignment Operators Compiler는 = 을 operator로 인식. variable = right_side : variable 을 위한 메모리 공간에 right_side 의 값이 할당된다. 모든 operators 중에서 우선순위가 가장 낮다. right to left의 Associativity를 갖는다. [Ex] b = 2; c = 3; a = b + c; /* a = (b = 2) + (c = 3) */ a = b = c = 0; /* a = ( b = (c = 0) ) ) */
Increment and Decrement Operators ++ , -- 는 오직 variables에 만 사용 가능하며, constants 나 일반 수식에는 사용될 수 없다. [Ex] 777++; /* constants 에 사용될 수 없다. */ ++(a * b – 1) /* expression 에 사용될 수 없다. */
Assignment Operators Compound Assignment Compound Assignment operators op= variable = variable op (expression) => variable op= expression [Ex] *=, -=, /=, %=, += Left와 right side에 동일 variable을 사용하는 경우 compound assignment 로 simplify 가능 [Ex] int k = 5; k += 2; /* k = k + 2, k=7 */ k -= 2; /* k = k - 2, k=5 */ k *= 2; /* k = k * 2, k=10 */ k /= 2; /* k = k / 2, k=5 */ k %= 2; /* k = k % 2, k=1 */
Assignment Operators [Ex] int i = 24; printf(“+ i : %d\n”, i); printf(“\n”); printf(“ i++ : %d\n”, i++); printf(“ ++i : %d\n”, ++i); printf(“i += i : %d\n”, i+=i); printf(“i : %d \n”, i); i의 현재 값인 24를 먼저 출력한 후 i의 값을 1증가시킴. i=25가 됨 i는 1을 증가시켜 26이 되고 26을 출력함 새로 추가한 슬라이드 입니다. + i : 24 - i : -24 i++ : 24 ++i : 26 i += i : 52 i : 52
Assignment Operators [Ex] int j = 1, k ; k = ++j ; j += k-- + 5 ; printf ( “value j = %d, k = %d”, j, k ); j=j+1; k=j;와 동일 : prefix이므로 먼저 j의 값이 increment j=2, k=2 j=j+k+5; k=k-1;와 동일 : postfix이므로 계산된 후에 Decrement compound assignment가 나오는 예제라서 뒤로 옮겼습니다. 이전에는 increment and decrement operators에 있던 예제입니다. j=9, k=1
먼저 exponent의 값이 incremented된 후 10과 비교 Computing Powers of 2 /* Some powers of 2 are printed */ #include <stdio.h> int main(void) { int exponent = 0, power_of_two = 1; while(++exponent <= 10) printf(“%5d”, power_of_two *= 2); printf(“\n”); return 0; } 먼저 exponent의 값이 incremented된 후 10과 비교 2 4 8 16 32 64 128 256 512 1024
Use of function in the library /* printing random numbers. */ #include <stdio.h> #include <stdlib.h> int main(void) { int i, n; printf(“\n%s\n%s”, “Some randomly distributed integers will be printed.”, “How many do you want to see? ”); scanf(“%d”, &n); for(i = 0; i < n; ++i) { if( i % 6 == 0) printf(“\n”); printf(“%9d”, rand()); } printf(“\n”); return 0; rand()함수는 0~32767사이의 난수, integer를 return해주는 library함수로 이 함수의 prototype은 stdlib.h에 정의됨 Some randomly distributed integers will be printed. How many do you want to see? 10 ꎠ 16838 5758 10113 17515 31051 5627 23010 7419 16212 4086 10을 입력 시
Style Space의 절약 보다 Readability 가 중요하다. Compound Assignment의 선호 z = 3; and x = ( y = 2) + (z = 3); x = y + z; Compound Assignment의 선호 a += 7; and a = a + 7; program readability의 향상을 위해 반드시 comment의 삽입 필요 Program의 작성일, 작성자, program의 목적, block단위 또는 line단위의 수행 방법 등을 반드시 표시 수현아! 왜 prefix가 더 선호 되는지 이유를 써 줄래? 내 생각에는 그다지 차이 없을 것 같은데… 단지 programmer의 선호 인지…..
Lexical Elements, Operators, and the C System 수고하셨습니다. Lexical Elements, Operators, and the C System