본문 바로가기
C │ C++ │ C#/C++

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

by Pokaa 2023. 8. 22.
728x90
728x90
SMALL
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;
728x90
300x250
LIST