C++ Chapter 5.2 : 반복문(while, do-while, for)과 점프(break, continue, goto)

Date:     Updated:

카테고리:

태그:

인프런에 있는 홍정모 교수님의 홍정모의 따라 하며 배우는 C++ 강의를 듣고 정리한 필기입니다. 😀
🌜 [홍정모의 따라 하며 배우는 C++]강의 들으러 가기!


while 반복문

형태

while (반복조건)
{

}

while (1)
{
    // 무한 루프
}
  • for문과 다르게 몇번 반복해야하는지 반복횟수 변수를 따로 설정해야 하는 경우가 많다.
  • break로 while문을 빠져나올 수 있다.

예시 1 : count 변수가 static일 때

while (1)
{
    static int count = 0;
    cout << count << endl; // 0 1 2 3 4 5 6 ... 무한으로 출력될 것
    ++count;
}

static 변수의 초기화는 첫번째 실행시에만 되며 변수 값이 메모리 안에 계속 유지된다. 따라서 반복 때마다 새롭게 count 변수가 선언되는것이 아닌 기존 count 값이 계속 유지가 되는 식이다. 따라서 0 1 2 3 4 5 … 수가 무한으로 출력될 것.

while (1)
{
    int count = 0;
    cout << count << endl; // 0 0 0 0 0 ... 0만 무한으로 출력될 것
    ++count;
}

static을 떼면 일반 지역변수가 되버린다. 따라서 while문 내에서 다음 반복 때마다 count 변수가 새로 선언되고 새로 0으로 초기화되기 때문에 0이 무한으로 출력되게 된다.

예시 2 : count 변수의 데이터 타입을 unsigned int로 한다면

unsigned int count = 10;

while (count >= 0)
{
    if (count == 0) cout << "zero";
    else cout << count << " ";

    count--;
}
  • count 변수 값 감소시 overflow 문제가 발생할 수 있다. “10 9 8 7 6 5 4 3 2 1 zero” 까지는 잘 출력되는데 count가 -1, 즉 음수가 될 때부터는 이상한 값들이 무한으로 출력되기 시작함.
    • count값은 unsigned이기 때문에 음수를 표현할 수 없고 따라서 음수가 되자마자 unsigned가 표혈할 수 있는 양수 최대값으로 순환하게 된다.
    • count는 음수가 되지않고 반복 조건에 계속 해당되어 무한 루프에 빠지게 된다.
  • unsigned가 빠르고 최적화에 좋긴 하다.
    • unsigned를 사용할 경우 count 변수 값이 반복 때마다 감소될 경우 overflow 문제 조심할 것.

예시 3 : 이중 while문

int outer_count = 1;

while (outer_count <= 5)
{
    int inner_count = 1;
    while (inner_count < outer_count)
    {
        cout << inner_count++ << " "; 
    }

    cout << endl; // 개행
    ++outer_count;
}
/* 출력
1
1 2
1 2 3 
1 2 3 4
*/
  • 큰 while문은 매번 반복할 때마다 inner_count 변수를 새로 선언하고 1로 초기화 할 것임.
  • 반복조건이 while (inner_count <= outer_count) 라면 1 2 3 4 5 까지 출력될 것.


do-while 반복문

  • 반드시 1번은 실행한다.
    • 그냥 while문은 반복조건에 처음부터 해당되지 않으면 아예 반복을 시작하지도 않을 수 있다.
    int main()
    {
        int selection;
    
        do
        {
            cout << "1. add" << endl;
            cout << "1. add" << endl;
            cout << "1. add" << endl;
            cout << "1. add" << endl;
            cin << selection;
        } while (selection <= 0 || selection >= 5);
    }
    
    • int selection 이게 do 안에서 선언되면 while의 반복 조건에서 selection 값을 확인할 수가 없다.
      • do 안에서 선언되면 do의 { } 범위 안에서만 사용할 수 있는 지역변수가 되기 때문 !
      • while의 반복 조건 ( )와는 다른 범위다.
    • cin << selection; 반드시 1번은 입력을 받으니까 무조건 1번은 입력을 꼭 받는다.
    • 반드시 1번 이상은 반복적으로 실행해야하는 경우 사용하기 좋다.
    • while 뒤에 ; 붙여주기


for 반복문

정해진 횟수만큼 반복문을 돌리기에 편하다.

형태

for ( A; B; C)
{
    D
}
  • A B D C B D C B D C … 순으로 실행된다.
    • A : 반복자 초기화.
    • B : for문 반복 조건 따짐. 참이여야 for문 중괄호 {} 내용 실행.
    • C : 다음 반복시 반복자 변화
    • D : 반복할 내용
  • A B C 3 개를 다 채울 필요는 없다.
  • for문의 무한 루프 : for(;;;)


점프

break문

break : 현재의 반복문 하나를 아예 빠져 나옴

continue문

continue : 다음 반복으로 건너뛴다.

특정 상황에서 더이상 반복문 실행을 하고 싶지 않아 다음 반복으로 넘기고 싶을 때.

int count = 0;

do
{
    if (count == 5)
        continue;
    
    cout << count << endl;   // count 가 5 일 땐 이 부분이 실행되지 않음.
    
    count++;
} while (count < 10);

  • 위 코드는 무한 루프에 빠지게 된다. if (count == 5) 에 걸릴 때 continue되고 또 if문을 만나 continue되어 count 값이 무한으로 5를 유지하게 되기 때문이다.
  • 위와 같은 문제를 방지하기 위해 while문 조건문 안에서 count 증감을 해주기도 한다.
    while (++count < 10);

goto문

  • goto 라벨이름
    • 해당 라벨으로 이동해라 !
  • goto문은 잘 안쓰인다. 스파게티 코드가 될 가능성이 높아서.
double x;

tryAgain : // label

	cout << "Enter a non-negative number" << endl;
	cin >> x;

	if (x < 0.0) // 음수 입력했으면
		goto tryAgain; // 다시 입력하게끔 ! 입력 전에 위치한 라벨로 이동함

	cout << sqrt(x) << endl;



🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기

Cpp 카테고리 내 다른 글 보러가기

댓글 남기기