[C++ Primer Plus] Chapter 5. 루프와 관계표현식
Table of Contents
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)
cin
은EOF
(파일의 끝; End Of File; -1)를 탐지했을 때eofbit
와failbit
를1
로 설정한다.cin.eof()
는eofbit
가1
이면true
를 리턴한다.cin.fail()
는eofbit
혹은failbit
이1
이면true
를 리턴한다.
EOF
가 설정되면cin
이 더 이상 입력을 받지 않는다. 따라서 다시 입력을 받으려면cin.clear()
를 해주어야 한다.