Skip to main content

[C++ Primer Plus] Chapter 5. 루프와 관계표현식

C++ 기초 플러스 책을 읽고 공부한 노트입니다.




표현식 #

  • 대입 표현식은 값을 가지기 때문에 이런 구문도 가능하다.
x = y = z = 0;

  • 표현식에 세미콜론을 붙이면 구문이 된다.
    • statement = expression + semicolon



시퀀스 포인트 (Sequence Point) #

  • 시퀀스 포인트란 프로그램의 실행이 다음 단계로 넘어가기 전에, 모든 부수 효과(변수 값 변경 등)들이 확실하게 평가되는 포인트이다.
  • 예를 들면 세미콜론, 완전 수식(while문의 조건문)의 끝, || 연산자 등은 시퀀스 포인트이다.
    • 따라서 아래 예제에서는 시퀀스 포인트에서 다음 명령을 실행하기 전에 증가 연산자로 인해 값이 증가한다.
int point = 1;     
point++; // 여기

while(point++ < 10) // 여기 
{ 
    //… 
}



접두어와 접미어 방식 #

  • 내장 데이터형의 경우에는 둘 다 결과적으로 동일한 결과를 가져온다.
  • 하지만 클래스와 같이 사용자 정의 데이터형인 경우에는 접두어 방식이 효율적이다.
    • 왜냐하면 접미어 방식은 복사본을 만들어서 값을 증가시키고 복사본을 리턴하는 방식으로 동작하기 때문이다.



포인터와 증가/감소 연산자 #

표기 설명
*++pt 오른쪽부터 왼쪽으로 결합하므로, ++pt는 주소 증가, 그 후 *(++pt)는 값 출력.
++*pt *pt는 값이므로, ++(*pt)는 값이 증가.
(*pt)++ *pt는 값이므로, (*pt)++는 다음 단계로 넘어가면서 값이 증가.
*pt++ pt++는 주소 증가지만 다음 단계로 넘어갈 때 증가.
*(pt++)는 현재 주소의 값 출력. 그 후 다음 단계로 넘어가면서 주소 증가.



콤마 연산자로 두 개의 표현식 넣기 #

// temp를 사용해서 i인덱스와 j인덱스에 해당하는 값을 교환하여 거꾸로 만들기

int i, j, temp;
for (i = 0, j = size - 1; i < j; i++, j--)
    // ...	
  • temp가 바깥에 선언되었다.
    • 매 주기마다 새로 대입하고 해제되지 않아도 돼서 좋다.
  • i, j가 바깥에 선언되었다.
    • int i = 0, j = size - 1에서 콤마는 연산자가 아닌 분리자가 된다. 그래서 for 제어문 안에서 선언할 수 없다.



문자열 비교 #

  • C스타일
    • strcmp()를 사용한다.
    • 같으면 0, 첫문자가 앞순서면 -1, 뒷순서면 1을 리턴
    • 대문자가 소문자보다 앞이다.
char word[5] = "word";
if (strcmp(word, "mate") == 0)
    //...  

  • string
    • 관계 연산자를 사용한다.
string word = "word";
if (word == "mate")
    //...



시간지연 루프 #

  • 프로세스 성능에 따라 1초에 반복되는 루프문의 수가 달라질 수 있다. 그래서 똑같은 시간을 재기 위해서는 클록 수를 카운트한다.

  • clock()
    • 프로그램 실행 순간부터 이 함수가 호출될 때 까지의 클록 수
  • CLOCK_PER_SEC
    • 1초 당 클록 수
  • clock_t형
    • clock()의 리턴 데이터형이 시스템마다 달라질 수 있는데 그것을 모두 수용할 수 있는 데이터형이다.

clock_t delay = 10 * CLOCK_PER_SEC;  // 10초 지연한다. 
clock_t start = clock();  

while(clock() - start < delay)  



루프와 텍스트 입력 #

  • cin >> ch

    • 빈칸, 탭, 개행을 무시하고 건너뛴다.
      • 입력: Do you need#
      • 출력: Doyouneed
  • cin.get(ch);

    • 빈칸, 탭, 개행을 포함한다.
      • 입력: Do you need#
      • 출력: Do you need

  • 운영 체제들이 리디렉션(표준 스트림을 사용자 지정 위치로 우회할 수 있는 것) 기능을 제공하기 때문에, 파일 입력 대신 키보드 입력을 바탕으로 프로그램을 실행할 수 있다.
    • 키보드로 Ctrl + Z를 입력하면 EOF를 나타낼 수 있다.
// cin.get(ch)는 cin을 리턴하고. cin은 읽기가 성공하면 true를 리턴한다. 
while (cin.get(ch))              

// cin.get()은 문자를 읽어서 리턴한다. 그 문자가 EOF이면 -1이겠다. 
while ((ch = cin.get()) != EOF)  
  • cinEOF(파일의 끝; End Of File; -1)를 탐지했을 때 eofbitfailbit1로 설정한다.
    • cin.eof()eofbit1이면 true를 리턴한다.
    • cin.fail()eofbit 혹은 failbit1이면 true를 리턴한다.
  • EOF가 설정되면 cin이 더 이상 입력을 받지 않는다. 따라서 다시 입력을 받으려면 cin.clear()를 해주어야 한다.