SlideShare a Scribd company logo
1 of 39
Download to read offline
6장 표현식 및 문장
          아꿈사
        발표자: 이재정


코드 다운로드: https://github.com/jjuiddong/TCPL
표현식 : expression
문장 : statement
컴파일러의 파서에서 흔히 사용하는 문법이다.
expression -> unary_expression |
assignment_operator
   ;
statement -> if_statement | switch_statement
   ;

출처:
http://www.csci.csusb.edu/dick/samples/c.
syntax.html
계산기 프로그램

계산기 프로그램의 구성요소
 - 입력문 분석기(parser) (=Yacc)
 - 입력처리 함수 (=Lex)
 - 기호 테이블
 - 구동기(driver)

소형 컴파일러에 가깝다.
왜 갑자기 계산기 인가?

아마도?
  - 컴파일러를 알면 언어를 더 수월하게 이해
할 수 있다.
  - 컴파일러를 만드는 입장에서 C++을 공부해
보자
  - 문법을 잘 이해하는 방법은 역시 문법을 만
들어보는 것이다.
계산기 입력 분석기

program: END | expr_list END
expr_list: expression PRINT |
            expression PRINT expr_list;
expression: expression + term |
             expression - term |
            term;
term: term / primary |
         term * primary |
         primary;
primary: NUMBER |
         NAME |
         NAME = expression |
        - primary |
        (expression);
입력 분석기는 재귀적 하강처리(recursive
descent)방식으로 해석한다. 흔히 하향식 (top-
down)기법이라 한다.
a=1+2
            program

            expr_list

        expression PRINT


              term

            primary


        NAME = expression

        a               expression + term


                      term       primary


                 primary         NUMBER


                 NUMBER              2

                        1
expression 은 primary(기본단위)로 이루어진다.
기본단위는 NUMBER, NAME, 사칙연산 *,/,+,-
로 이루어진다.

계산기 입력 분석기(parser)는 기본단위로 이루
어진 token들을 의미있는 데이타로 만들어내는
과정을 기술한다.
page 179

double expr()
{
   double left = term();
   for(;;)
       switch(curr_tok)
       case PLUS: left += term(); break;
       case MINUS: left -= term(); break;
   return left;
}
expression: expression + term |
                  expression - term |
                 term;
page 181

double term()
{
   double left = prim();
   for(;;)
       switch(curr_tok)
       case MUL: left *= prim(); break;
       case DIV: left /= prim(); break;
   return left;
}
term:      term / primary |
           term * primary |
           primary;
page 182

double prim()
{
   switch(curr_tok)
   case NUMBER:return number_value;
   case NAME: return table[string_value];
   case MINUS: return -prim();
   case '(': return expr();
}
primary: NUMBER |
             NAME |
             NAME = expression |
            - primary |
            (expression);
입력 처리 함수

page 185

switch-case 문으로 문자 하나하나를 검사해서
token을 얻는다.

Token_value get_token() 함수가 이 역할을 맡
는다.
기호 테이블

std::map<string,double> table;
구동기 (driver)
int main()
{
     table["pi"] = 3.1415926535897932385; // insert predefined names
     table["e"] = 2.7182818284590452354;

    while (cin) {
        get_token();
        if (curr_tok == END) break;
        if (curr_tok == PRINT) continue;
        cout << expr(false) << 'n';
    }

    return no_of_errors;
}
한정자를 사용한 string 선언
std::string str;


전역 네임스페이스를 선언한 후 string 선언
using namespace std;
string str;
a = 1 + 2;
expr   term   prim       a

                     =

                     expr    term   prim   1


                             +


                             term   prim   2
a = 1 x 2 + 3;
expr   term   prim       a

                     =

                     expr    term   prim   1


                                    x


                                    prim   2


                             +


                             term   prim   3
a = 1 + 2 x 3;
expr   term   prim       a

                     =

                     expr    term   prim   1


                             +


                             term   prim   2


                                    x


                                    prim   3
C++ 연산자 요약 정리

생성(메모리 지정) new (expr-list) type
(= placement new)
사후 증가 lvalue++
사전 증가 ++lvalue
~의 주소 &lvalue
L-Value, R-Value
L-Value : 메모리를 가진 데이타, 주소 연산을 통
해 주소를 얻어 올 수 있다.
  - non-modifiable lvalue
  - modifiable lvalue
R-Value : 임시 객체나 표현식(expression)

string s1 = "aaa";
string s3 = s1 + s2 + string("ccc");
function( string("aaa") );
string &s4 = "aaa"; // error
C++11 에서는 && 선언으로 R-Value를 레퍼런
스로 선언할 수 있다.
연산자 우선 순위
a+b*c => a+(b*c)
*p++ => (*p)++

우측 결합성(right-associativity)
단항 연산자, 대입 연산자
a=b=c => a=(b=c)

좌측 결합성,
단항 연산자, 대입 연산자를 제외한 나머지 연산
자
a+b+c => (a+b)+c
어휘 토큰으로 인정할 수 있는 가장 긴 문자열이
우선적으로 선택된다.

a+++b = (a++)+b
void f(int x, int y)
{
   int j = x = y;
   int *p = &++x;
   int *q = &(x++); // error
   int *pp = &(x>y? x:y);
}
int x = f(2) + g(3); // 함수 호출 순서는 미정의
int i = 1;
v[ i] = i++; // 실행 결과를 예측할 수 없음

단축 평가(short-cut evaluation)
&&(and) 연산은 좌변이 true일 때 우변 평가
|| (or) 연산은 좌변이 false일 때 우변 평가
비트단위 논리 연산자

& : bit and
| : bit or
^ : bit xor
~ : bit not
>> : shift left
<< : shift right
증가 연산과 감소 연산

void cpy(char *p, const char *q)
{
   while(*p++ = *q++);
}
동적 메모리 할당

new, delete : 힙 메모리에 객체 생성/삭제
new[ ], delete[ ] : 힙 메모리에 배열 생성/삭제
메모리 고갈
명시적 타입 변환

static_cast : 같은 클래스 계통 안의 포인터 타입
끼리 캐스팅
reinterpret_cast : 관련되지 않은 타입 사이 캐스
팅
(T)e 캐스팅 ex) int a = (int)b;
(T)e 캐스팅은 static_cast, reinterpret_cast,
const_cast를 모두 합친 변환함수다.
생성자

T(e) 표기법
int i = int(10);
string i = string("aa");

템플릿을 작성할 때 기본 타입과 사용자 정의 타
입을 구분없이 처리 할 수 있다.
C++ 문장

문장: statement
if 문, switch-case문, while 문 등을 뜻한다.
문장으로서의 선언문

코드 중간에 선언문을 놓을 수 있는 것의 장점
1. const 를 사용해서 프로그램을 안전성을 높일
수 있다.
2. 초기치가 주어질 때까지 객체생성을 미룰 수
있다.

.... program....
string s = "~~~";
조건식 내부에 선언문 두기

if (double d = prim())
{
~~
}

변수의 유효 범위를 가능한 작게 하는 방법
주석문 및 들여쓰기

다음과 같은 주석문은 쓰지말자.
// 변수 "v"를 초기화해야 한다.
// 변수 "v"는 함수 "f()"에의해서만 초기화되어야 한다.
// 이 파일에 있는 다른 함수들보다 "init()"를 먼저 호출할 것
// 프로그램의 마지막 부분에서 "cleanup()"을 호출할 것
// 함수 "weird" 는 사용하지 말 것
// 함수 "f()"는 두 개의 인자를 받는다.


코드에 자연스럽게 녹아 있는 것들은 주석문에 또 등장할 필
요가 없다.
저자가 좋아하는 주석문

1.   소스 파일 하나에 대한 주석문.
2.   각 클래스, 템플릿, 네임스페이스에 대한 주석문
3.   주요 함수에 대한 주석문. 여기에는 함수의 용도, 사용된 알고리즘, 함수의
     정상 작동을 보장하는 주변 환경에 대한 가정 등이 들어간다.
4.   전역 변수 및 네임스페이스 변수 그리고 상수에 대한 주석문
5.   코드가 단순하지 않은 경우 그리고 이식성이 보장되지 않을 경우에 달아 놓
     은 주석문


주석문을 잘 쓰는 것도 프로그램 잘 짜는 것만큼 어려우며,
꾸준히 연마해 두면 언젠가는 프로그래밍 능력과 함께 빛날
기술이다.
바른 프로그래밍을 위한 고수의 조언
1. 비 표준의 서드 파티 라이브러리 및 직접 손으로 만든 코드 보다는 표준 라이브러리를 우선적으로
고려할 것.
2. 복잡한 표현식은 금물
3. 연산자 우선순위가 의심되면 괄호를 사용할 것.
4. 명시적 타입 변환(캐스트)을 피할 것.
5. 명시적 타입 변환을 굳이 사용해야 한다면, C스타일의 캐스트 대신에 C++전용 캐스트 연산자를 사
용할 것.
6. 결과 값이 잘 정의된 경우에만 T(e) 표기법을 사용할 것.
7. 표현식 평가 순서가 불명확해지는 경우를 피하자.
8. goto는 가급적 기피 대상.
9. do문도 마찬가지
10. 어떤 값으로 초기화되기 전엔 그 변수를 선언하지 말자.
11. 주석문은 언제나 또박 또박, 명확하게.
12. 들여쓰기는 일관성 있게 구사하자.
13. 전역 함수 버전의 operator new()를 대신하고 싶으면 멤버 버전의 operator new() 를 우선적으로
고려하자.
14. 입력을 처리할 때는 언제든 입력이 엉망으로 들어올 수 있음을 명시할 것.

More Related Content

What's hot

Startup JavaScript 4 - 객체
Startup JavaScript 4 - 객체Startup JavaScript 4 - 객체
Startup JavaScript 4 - 객체Circulus
 
C수업자료
C수업자료C수업자료
C수업자료koominsu
 
Startup JavaScript 6 - 함수, 스코프, 클로저
Startup JavaScript 6 - 함수, 스코프, 클로저Startup JavaScript 6 - 함수, 스코프, 클로저
Startup JavaScript 6 - 함수, 스코프, 클로저Circulus
 
Haskell study 10
Haskell study 10Haskell study 10
Haskell study 10Nam Hyeonuk
 
Python3 10장 문자열이야기
Python3 10장 문자열이야기Python3 10장 문자열이야기
Python3 10장 문자열이야기Jihoon Kong
 
정규표현식 Regular expression (regex)
정규표현식 Regular expression (regex)정규표현식 Regular expression (regex)
정규표현식 Regular expression (regex)Sunyoung Kim
 
Erlang을 이용한 swap 서버
Erlang을 이용한 swap 서버Erlang을 이용한 swap 서버
Erlang을 이용한 swap 서버Jaejin Yun
 
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기Chris Ohk
 
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)Circulus
 
프로그래밍 대회: C++11 이야기
프로그래밍 대회: C++11 이야기프로그래밍 대회: C++11 이야기
프로그래밍 대회: C++11 이야기Jongwook Choi
 
1.3장 차수 높은 프로시저(higher order procedure)로 요약하는 방법
1.3장 차수 높은 프로시저(higher order procedure)로 요약하는 방법1.3장 차수 높은 프로시저(higher order procedure)로 요약하는 방법
1.3장 차수 높은 프로시저(higher order procedure)로 요약하는 방법홍준 김
 

What's hot (20)

Startup JavaScript 4 - 객체
Startup JavaScript 4 - 객체Startup JavaScript 4 - 객체
Startup JavaScript 4 - 객체
 
C수업자료
C수업자료C수업자료
C수업자료
 
Startup JavaScript 6 - 함수, 스코프, 클로저
Startup JavaScript 6 - 함수, 스코프, 클로저Startup JavaScript 6 - 함수, 스코프, 클로저
Startup JavaScript 6 - 함수, 스코프, 클로저
 
Ch05
Ch05Ch05
Ch05
 
Ch07
Ch07Ch07
Ch07
 
Haskell study 10
Haskell study 10Haskell study 10
Haskell study 10
 
Python3 10장 문자열이야기
Python3 10장 문자열이야기Python3 10장 문자열이야기
Python3 10장 문자열이야기
 
정규표현식 Regular expression (regex)
정규표현식 Regular expression (regex)정규표현식 Regular expression (regex)
정규표현식 Regular expression (regex)
 
What’s new in c++11
What’s new in c++11What’s new in c++11
What’s new in c++11
 
Ch08
Ch08Ch08
Ch08
 
Ch10
Ch10Ch10
Ch10
 
Erlang
ErlangErlang
Erlang
 
Erlang을 이용한 swap 서버
Erlang을 이용한 swap 서버Erlang을 이용한 swap 서버
Erlang을 이용한 swap 서버
 
Regex
RegexRegex
Regex
 
HI-ARC PS 101
HI-ARC PS 101HI-ARC PS 101
HI-ARC PS 101
 
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
 
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
 
프로그래밍 대회: C++11 이야기
프로그래밍 대회: C++11 이야기프로그래밍 대회: C++11 이야기
프로그래밍 대회: C++11 이야기
 
1.3장 차수 높은 프로시저(higher order procedure)로 요약하는 방법
1.3장 차수 높은 프로시저(higher order procedure)로 요약하는 방법1.3장 차수 높은 프로시저(higher order procedure)로 요약하는 방법
1.3장 차수 높은 프로시저(higher order procedure)로 요약하는 방법
 
3.포인터
3.포인터3.포인터
3.포인터
 

Similar to 6장 표현식 및 문장

Modern C++의 타입 추론과 람다, 컨셉
Modern C++의 타입 추론과 람다, 컨셉Modern C++의 타입 추론과 람다, 컨셉
Modern C++의 타입 추론과 람다, 컨셉HyunJoon Park
 
파이썬 스터디 2주차
파이썬 스터디 2주차파이썬 스터디 2주차
파이썬 스터디 2주차Han Sung Kim
 
[C++ Korea 2nd Seminar] C++17 Key Features Summary
[C++ Korea 2nd Seminar] C++17 Key Features Summary[C++ Korea 2nd Seminar] C++17 Key Features Summary
[C++ Korea 2nd Seminar] C++17 Key Features SummaryChris Ohk
 
스칼라와 스파크 영혼의 듀오
스칼라와 스파크 영혼의 듀오스칼라와 스파크 영혼의 듀오
스칼라와 스파크 영혼의 듀오Taeoh Kim
 
Javascript개발자의 눈으로 python 들여다보기
Javascript개발자의 눈으로 python 들여다보기Javascript개발자의 눈으로 python 들여다보기
Javascript개발자의 눈으로 python 들여다보기지수 윤
 
파이썬 기본 문법
파이썬 기본 문법파이썬 기본 문법
파이썬 기본 문법SeongHyun Ahn
 
C수업자료
C수업자료C수업자료
C수업자료koominsu
 
포트폴리오에서 사용한 모던 C++
포트폴리오에서 사용한 모던 C++포트폴리오에서 사용한 모던 C++
포트폴리오에서 사용한 모던 C++KWANGIL KIM
 
C++17 Key Features Summary - Ver 2
C++17 Key Features Summary - Ver 2C++17 Key Features Summary - Ver 2
C++17 Key Features Summary - Ver 2Chris Ohk
 
14장 - 15장 예외처리, 템플릿
14장 - 15장 예외처리, 템플릿14장 - 15장 예외처리, 템플릿
14장 - 15장 예외처리, 템플릿유석 남
 
[C++ Korea] Effective Modern C++ Study item14 16 +신촌
[C++ Korea] Effective Modern C++ Study item14 16 +신촌[C++ Korea] Effective Modern C++ Study item14 16 +신촌
[C++ Korea] Effective Modern C++ Study item14 16 +신촌Seok-joon Yun
 
R 프로그래밍 기본 문법
R 프로그래밍 기본 문법R 프로그래밍 기본 문법
R 프로그래밍 기본 문법Terry Cho
 
2012 Ds B1 01
2012 Ds B1 012012 Ds B1 01
2012 Ds B1 01seonhyung
 
자료구조 Project1
자료구조 Project1자료구조 Project1
자료구조 Project1KoChungWook
 
RNC C++ lecture_5 Array
RNC C++ lecture_5 ArrayRNC C++ lecture_5 Array
RNC C++ lecture_5 Arrayitlockit
 
[C++ Korea] Effective Modern C++ Study, Item 1 - 3
[C++ Korea] Effective Modern C++ Study, Item 1 - 3[C++ Korea] Effective Modern C++ Study, Item 1 - 3
[C++ Korea] Effective Modern C++ Study, Item 1 - 3Chris Ohk
 

Similar to 6장 표현식 및 문장 (20)

Modern C++의 타입 추론과 람다, 컨셉
Modern C++의 타입 추론과 람다, 컨셉Modern C++의 타입 추론과 람다, 컨셉
Modern C++의 타입 추론과 람다, 컨셉
 
파이썬 스터디 2주차
파이썬 스터디 2주차파이썬 스터디 2주차
파이썬 스터디 2주차
 
[C++ Korea 2nd Seminar] C++17 Key Features Summary
[C++ Korea 2nd Seminar] C++17 Key Features Summary[C++ Korea 2nd Seminar] C++17 Key Features Summary
[C++ Korea 2nd Seminar] C++17 Key Features Summary
 
스칼라와 스파크 영혼의 듀오
스칼라와 스파크 영혼의 듀오스칼라와 스파크 영혼의 듀오
스칼라와 스파크 영혼의 듀오
 
강의자료 2
강의자료 2강의자료 2
강의자료 2
 
Javascript개발자의 눈으로 python 들여다보기
Javascript개발자의 눈으로 python 들여다보기Javascript개발자의 눈으로 python 들여다보기
Javascript개발자의 눈으로 python 들여다보기
 
파이썬 기본 문법
파이썬 기본 문법파이썬 기본 문법
파이썬 기본 문법
 
06장 함수
06장 함수06장 함수
06장 함수
 
C수업자료
C수업자료C수업자료
C수업자료
 
포트폴리오에서 사용한 모던 C++
포트폴리오에서 사용한 모던 C++포트폴리오에서 사용한 모던 C++
포트폴리오에서 사용한 모던 C++
 
2012 Dm 07
2012 Dm 072012 Dm 07
2012 Dm 07
 
C++17 Key Features Summary - Ver 2
C++17 Key Features Summary - Ver 2C++17 Key Features Summary - Ver 2
C++17 Key Features Summary - Ver 2
 
C++11
C++11C++11
C++11
 
14장 - 15장 예외처리, 템플릿
14장 - 15장 예외처리, 템플릿14장 - 15장 예외처리, 템플릿
14장 - 15장 예외처리, 템플릿
 
[C++ Korea] Effective Modern C++ Study item14 16 +신촌
[C++ Korea] Effective Modern C++ Study item14 16 +신촌[C++ Korea] Effective Modern C++ Study item14 16 +신촌
[C++ Korea] Effective Modern C++ Study item14 16 +신촌
 
R 프로그래밍 기본 문법
R 프로그래밍 기본 문법R 프로그래밍 기본 문법
R 프로그래밍 기본 문법
 
2012 Ds B1 01
2012 Ds B1 012012 Ds B1 01
2012 Ds B1 01
 
자료구조 Project1
자료구조 Project1자료구조 Project1
자료구조 Project1
 
RNC C++ lecture_5 Array
RNC C++ lecture_5 ArrayRNC C++ lecture_5 Array
RNC C++ lecture_5 Array
 
[C++ Korea] Effective Modern C++ Study, Item 1 - 3
[C++ Korea] Effective Modern C++ Study, Item 1 - 3[C++ Korea] Effective Modern C++ Study, Item 1 - 3
[C++ Korea] Effective Modern C++ Study, Item 1 - 3
 

More from 재정 이

Tcpl 14장 예외처리
Tcpl 14장 예외처리Tcpl 14장 예외처리
Tcpl 14장 예외처리재정 이
 
Tcpl 12장 파생클래스
Tcpl 12장 파생클래스Tcpl 12장 파생클래스
Tcpl 12장 파생클래스재정 이
 
The c++ programming language 10장 클래스 발표
The c++ programming language 10장 클래스 발표The c++ programming language 10장 클래스 발표
The c++ programming language 10장 클래스 발표재정 이
 
이중으로 연결된 목록
이중으로 연결된 목록이중으로 연결된 목록
이중으로 연결된 목록재정 이
 
이중으로 연결된 목록
이중으로 연결된 목록이중으로 연결된 목록
이중으로 연결된 목록재정 이
 

More from 재정 이 (9)

Tcpl 14장 예외처리
Tcpl 14장 예외처리Tcpl 14장 예외처리
Tcpl 14장 예외처리
 
Tcpl 12장 파생클래스
Tcpl 12장 파생클래스Tcpl 12장 파생클래스
Tcpl 12장 파생클래스
 
The c++ programming language 10장 클래스 발표
The c++ programming language 10장 클래스 발표The c++ programming language 10장 클래스 발표
The c++ programming language 10장 클래스 발표
 
이중으로 연결된 목록
이중으로 연결된 목록이중으로 연결된 목록
이중으로 연결된 목록
 
이중으로 연결된 목록
이중으로 연결된 목록이중으로 연결된 목록
이중으로 연결된 목록
 
유향트리
유향트리유향트리
유향트리
 
유향트리
유향트리유향트리
유향트리
 
Mix 설명
Mix 설명Mix 설명
Mix 설명
 
이항계수
이항계수이항계수
이항계수
 

6장 표현식 및 문장

  • 1. 6장 표현식 및 문장 아꿈사 발표자: 이재정 코드 다운로드: https://github.com/jjuiddong/TCPL
  • 2. 표현식 : expression 문장 : statement 컴파일러의 파서에서 흔히 사용하는 문법이다. expression -> unary_expression | assignment_operator ; statement -> if_statement | switch_statement ; 출처: http://www.csci.csusb.edu/dick/samples/c. syntax.html
  • 3. 계산기 프로그램 계산기 프로그램의 구성요소 - 입력문 분석기(parser) (=Yacc) - 입력처리 함수 (=Lex) - 기호 테이블 - 구동기(driver) 소형 컴파일러에 가깝다.
  • 4. 왜 갑자기 계산기 인가? 아마도? - 컴파일러를 알면 언어를 더 수월하게 이해 할 수 있다. - 컴파일러를 만드는 입장에서 C++을 공부해 보자 - 문법을 잘 이해하는 방법은 역시 문법을 만 들어보는 것이다.
  • 5. 계산기 입력 분석기 program: END | expr_list END expr_list: expression PRINT | expression PRINT expr_list; expression: expression + term | expression - term | term; term: term / primary | term * primary | primary;
  • 6. primary: NUMBER | NAME | NAME = expression | - primary | (expression);
  • 7. 입력 분석기는 재귀적 하강처리(recursive descent)방식으로 해석한다. 흔히 하향식 (top- down)기법이라 한다.
  • 8. a=1+2 program expr_list expression PRINT term primary NAME = expression a expression + term term primary primary NUMBER NUMBER 2 1
  • 9. expression 은 primary(기본단위)로 이루어진다. 기본단위는 NUMBER, NAME, 사칙연산 *,/,+,- 로 이루어진다. 계산기 입력 분석기(parser)는 기본단위로 이루 어진 token들을 의미있는 데이타로 만들어내는 과정을 기술한다.
  • 10. page 179 double expr() { double left = term(); for(;;) switch(curr_tok) case PLUS: left += term(); break; case MINUS: left -= term(); break; return left; } expression: expression + term | expression - term | term;
  • 11. page 181 double term() { double left = prim(); for(;;) switch(curr_tok) case MUL: left *= prim(); break; case DIV: left /= prim(); break; return left; } term: term / primary | term * primary | primary;
  • 12. page 182 double prim() { switch(curr_tok) case NUMBER:return number_value; case NAME: return table[string_value]; case MINUS: return -prim(); case '(': return expr(); } primary: NUMBER | NAME | NAME = expression | - primary | (expression);
  • 13. 입력 처리 함수 page 185 switch-case 문으로 문자 하나하나를 검사해서 token을 얻는다. Token_value get_token() 함수가 이 역할을 맡 는다.
  • 15. 구동기 (driver) int main() { table["pi"] = 3.1415926535897932385; // insert predefined names table["e"] = 2.7182818284590452354; while (cin) { get_token(); if (curr_tok == END) break; if (curr_tok == PRINT) continue; cout << expr(false) << 'n'; } return no_of_errors; }
  • 16. 한정자를 사용한 string 선언 std::string str; 전역 네임스페이스를 선언한 후 string 선언 using namespace std; string str;
  • 17. a = 1 + 2; expr term prim a = expr term prim 1 + term prim 2
  • 18. a = 1 x 2 + 3; expr term prim a = expr term prim 1 x prim 2 + term prim 3
  • 19. a = 1 + 2 x 3; expr term prim a = expr term prim 1 + term prim 2 x prim 3
  • 20. C++ 연산자 요약 정리 생성(메모리 지정) new (expr-list) type (= placement new)
  • 21. 사후 증가 lvalue++ 사전 증가 ++lvalue ~의 주소 &lvalue
  • 22. L-Value, R-Value L-Value : 메모리를 가진 데이타, 주소 연산을 통 해 주소를 얻어 올 수 있다. - non-modifiable lvalue - modifiable lvalue R-Value : 임시 객체나 표현식(expression) string s1 = "aaa"; string s3 = s1 + s2 + string("ccc"); function( string("aaa") ); string &s4 = "aaa"; // error
  • 23. C++11 에서는 && 선언으로 R-Value를 레퍼런 스로 선언할 수 있다.
  • 24. 연산자 우선 순위 a+b*c => a+(b*c) *p++ => (*p)++ 우측 결합성(right-associativity) 단항 연산자, 대입 연산자 a=b=c => a=(b=c) 좌측 결합성, 단항 연산자, 대입 연산자를 제외한 나머지 연산 자 a+b+c => (a+b)+c
  • 25. 어휘 토큰으로 인정할 수 있는 가장 긴 문자열이 우선적으로 선택된다. a+++b = (a++)+b
  • 26. void f(int x, int y) { int j = x = y; int *p = &++x; int *q = &(x++); // error int *pp = &(x>y? x:y); }
  • 27. int x = f(2) + g(3); // 함수 호출 순서는 미정의 int i = 1; v[ i] = i++; // 실행 결과를 예측할 수 없음 단축 평가(short-cut evaluation) &&(and) 연산은 좌변이 true일 때 우변 평가 || (or) 연산은 좌변이 false일 때 우변 평가
  • 28. 비트단위 논리 연산자 & : bit and | : bit or ^ : bit xor ~ : bit not >> : shift left << : shift right
  • 29. 증가 연산과 감소 연산 void cpy(char *p, const char *q) { while(*p++ = *q++); }
  • 30. 동적 메모리 할당 new, delete : 힙 메모리에 객체 생성/삭제 new[ ], delete[ ] : 힙 메모리에 배열 생성/삭제
  • 32. 명시적 타입 변환 static_cast : 같은 클래스 계통 안의 포인터 타입 끼리 캐스팅 reinterpret_cast : 관련되지 않은 타입 사이 캐스 팅 (T)e 캐스팅 ex) int a = (int)b; (T)e 캐스팅은 static_cast, reinterpret_cast, const_cast를 모두 합친 변환함수다.
  • 33. 생성자 T(e) 표기법 int i = int(10); string i = string("aa"); 템플릿을 작성할 때 기본 타입과 사용자 정의 타 입을 구분없이 처리 할 수 있다.
  • 34. C++ 문장 문장: statement if 문, switch-case문, while 문 등을 뜻한다.
  • 35. 문장으로서의 선언문 코드 중간에 선언문을 놓을 수 있는 것의 장점 1. const 를 사용해서 프로그램을 안전성을 높일 수 있다. 2. 초기치가 주어질 때까지 객체생성을 미룰 수 있다. .... program.... string s = "~~~";
  • 36. 조건식 내부에 선언문 두기 if (double d = prim()) { ~~ } 변수의 유효 범위를 가능한 작게 하는 방법
  • 37. 주석문 및 들여쓰기 다음과 같은 주석문은 쓰지말자. // 변수 "v"를 초기화해야 한다. // 변수 "v"는 함수 "f()"에의해서만 초기화되어야 한다. // 이 파일에 있는 다른 함수들보다 "init()"를 먼저 호출할 것 // 프로그램의 마지막 부분에서 "cleanup()"을 호출할 것 // 함수 "weird" 는 사용하지 말 것 // 함수 "f()"는 두 개의 인자를 받는다. 코드에 자연스럽게 녹아 있는 것들은 주석문에 또 등장할 필 요가 없다.
  • 38. 저자가 좋아하는 주석문 1. 소스 파일 하나에 대한 주석문. 2. 각 클래스, 템플릿, 네임스페이스에 대한 주석문 3. 주요 함수에 대한 주석문. 여기에는 함수의 용도, 사용된 알고리즘, 함수의 정상 작동을 보장하는 주변 환경에 대한 가정 등이 들어간다. 4. 전역 변수 및 네임스페이스 변수 그리고 상수에 대한 주석문 5. 코드가 단순하지 않은 경우 그리고 이식성이 보장되지 않을 경우에 달아 놓 은 주석문 주석문을 잘 쓰는 것도 프로그램 잘 짜는 것만큼 어려우며, 꾸준히 연마해 두면 언젠가는 프로그래밍 능력과 함께 빛날 기술이다.
  • 39. 바른 프로그래밍을 위한 고수의 조언 1. 비 표준의 서드 파티 라이브러리 및 직접 손으로 만든 코드 보다는 표준 라이브러리를 우선적으로 고려할 것. 2. 복잡한 표현식은 금물 3. 연산자 우선순위가 의심되면 괄호를 사용할 것. 4. 명시적 타입 변환(캐스트)을 피할 것. 5. 명시적 타입 변환을 굳이 사용해야 한다면, C스타일의 캐스트 대신에 C++전용 캐스트 연산자를 사 용할 것. 6. 결과 값이 잘 정의된 경우에만 T(e) 표기법을 사용할 것. 7. 표현식 평가 순서가 불명확해지는 경우를 피하자. 8. goto는 가급적 기피 대상. 9. do문도 마찬가지 10. 어떤 값으로 초기화되기 전엔 그 변수를 선언하지 말자. 11. 주석문은 언제나 또박 또박, 명확하게. 12. 들여쓰기는 일관성 있게 구사하자. 13. 전역 함수 버전의 operator new()를 대신하고 싶으면 멤버 버전의 operator new() 를 우선적으로 고려하자. 14. 입력을 처리할 때는 언제든 입력이 엉망으로 들어올 수 있음을 명시할 것.