C Language
반복문 / 루프 : for, while, do-while
수색…
통사론
- / * 모든 버전 * /
- for ([식], [식], [식]) one_statement
- for ([expression]; [expression]; [expression]) {0 또는 여러 문장}
- while (expression) one_statement
- while (expression) {0 또는 여러 문장}
- while (식) while one_statement;
- while (expression) while {하나 이상의 문장};
- // 위의 양식 외에도 C99 이후
- for (선언; [expression]; [expression]) one_statement;
- for (선언; [expression]; [expression]) {0 또는 여러 문장}
비고
반복문 / 루프는 두 가지 범주로 나뉩니다.
- 머리글 제어 반복문 / 루프
- 발 제어 반복문 / 루프
헤드 제어 반복문 / 루프
for ([<expression>]; [<expression>]; [<expression>]) <statement>
while (<expression>) <statement>
for ([declaration expression]; [expression] [; [expression]]) statement
발 제어 반복 문 / 루프
do <statement> while (<expression>);
For 루프
반복적으로 한 블록의 코드를 실행하려면 루프가 그림에 나타납니다. for
루프는 코드 블록이 고정 된 횟수만큼 실행될 때 사용됩니다. 예를 들어 크기 n
의 배열을 사용자 입력으로 채우기 위해 scanf()
를 n
번 실행해야합니다.
#include <stddef.h> // for size_t
int array[10]; // array of 10 int
for (size_t i = 0; i < 10; i++) // i starts at 0 and finishes with 9
{
scanf("%d", &array[i]);
}
이런 식으로 scanf()
함수 호출은 n
번 (이 예에서는 10 번) 실행되지만 한 번만 기록됩니다.
여기서, 변수 i
는 루프 인덱스이며, 제시된대로 가장 잘 선언됩니다. size_t
( 크기 유형 ) 유형 은 데이터 객체를 세거나 루프하는 모든 것에 사용해야합니다.
for
변수를 선언하는 방법은 C99 표준으로 업데이트 된 컴파일러에서만 사용할 수 있습니다. 어떤 이유로 든 더 오래된 컴파일러를 사용하는 경우 for
루프 앞에 루프 인덱스를 선언 할 수 있습니다.
#include <stddef.h> /* for size_t */
size_t i;
int array[10]; /* array of 10 int */
for (i = 0; i < 10; i++) /* i starts at 0 and finishes at 9 */
{
scanf("%d", &array[i]);
}
While 루프
while
루프는 조건이 참일 때 코드를 실행하는 데 사용됩니다. while
루프는 코드 블록이 가변 횟수만큼 실행될 때 사용됩니다. 예를 들어 표시된 코드는 사용자가 0
이 아닌 숫자를 삽입하는 한 사용자 입력을 가져옵니다. 사용자가 0
삽입하면 while 조건이 더 이상 true가 아니므로 실행은 루프를 종료하고 후속 코드로 계속 진행됩니다.
int num = 1;
while (num != 0)
{
scanf("%d", &num);
}
Do-While 루프
for
및 while
루프와는 달리 do-while
루프는 루프가 끝날 때 조건의 진위를 확인합니다. 이는 do
블록이 한 번 실행되고 블록의 맨 아래에서 while
의 조건을 확인한다는 것을 의미합니다. 즉 do-while
루프가 항상 적어도 한 번 실행된다는 것을 의미합니다.
예를 들어이 do-while
루프는이 값들의 합이 50
보다 크거나 같아 질 때까지 사용자로부터 숫자를받습니다.
int num, sum;
num = sum = 0;
do
{
scanf("%d", &num);
sum += num;
} while (sum < 50);
do-while
루프는 대부분의 프로그래밍 스타일에서 비교적 드뭅니다.
for 루프에서의 구조와 흐름
for ([declaration-or-expression]; [expression2]; [expression3])
{
/* body of the loop */
}
for
루프에서 루프 조건에는 세 가지 표현식이 있으며 모두 선택적입니다.
- 첫 번째 표현식 인
declaration-or-expression
은 루프를 초기화 합니다. 루프의 시작 부분에서 정확히 한 번 실행됩니다.
루프 변수 또는 일반 표현식의 선언 및 초기화 중 하나 일 수 있습니다. 이것이 선언 인 경우, 선언 된 변수의 범위는 for
문에 의해 제한됩니다.
이전 버전의 C에서는 표현식을 사용할 수 있었지만 여기서는 루프 변수의 선언을 for
앞에 배치해야 for
.
- 두 번째 표현식 인
expression2
가 테스트 조건 입니다. 초기화 후 처음 실행됩니다. 조건이true
컨트롤이 루프 본문에 입력됩니다. 그렇지 않으면 루프 끝에서 루프 본문 밖으로 이동합니다. 이 후,이 조건은 update 문과 body가 실행될 때마다 검사됩니다.true
컨트롤이 루프 본문의 처음으로 돌아갑니다. 조건은 대개 루프 본문이 실행되는 횟수를 확인하는 것입니다. 이것이 루프를 종료하는 주요 방법이며, 다른 방법은 점프 문을 사용하는 것입니다. - 세 번째 표현식 인
expression3
이 update 문 입니다. 루프 본문을 실행할 때마다 실행됩니다. 이것은 종종 루프 본문이 실행 된 횟수를 유지하는 변수를 증가시키기 위해 사용 되며이 변수는 반복자라고 불립니다.
루프 본문 실행의 각 인스턴스를 반복 이라고합니다.
예:
for(int i = 0; i < 10 ; i++)
{
printf("%d", i);
}
출력은 다음과 같습니다.
0123456789
위의 예에서 처음 i = 0
이 실행되어 i
초기화합니다. 그런 다음 조건 i < 10
이 확인되고 true
평가됩니다. 컨트롤이 루프의 본문에 들어가고 i
값이 인쇄됩니다. 그런 다음에 제어부 이동 i++
값 갱신 i
이어서 0에서 1로, 상태를 다시 확인하고, 처리는 계속된다. 이것은 i
의 값이 10이 될 때까지 계속됩니다. 그런 다음 조건 i < 10
은 false
평가 한 후 컨트롤이 루프 밖으로 이동합니다.
무한 루프
루프는 컨트롤이 들어 왔지만 결코 루프의 몸체를 벗어나지 않으면 무한 루프 라고합니다. 이것은 루프의 테스트 조건이 false
평가되지 않을 때 발생합니다.
예:
for (int i = 0; i >= 0; )
{
/* body of the loop where i is not changed*/
}
위의 예제에서 변수 i
, iterator는 0으로 초기화됩니다. 테스트 조건은 처음에 true
입니다. 그러나, i
신체 어디서나 수정되지 않으며 업데이트 표현식은 비어 있습니다. 그러므로, i
0으로 남을 것이고, 테스트 조건은 결코 false
평가되지 않을 것이고, 무한 루프가 될 것이다.
점프 문 이 없다고 가정하면 무한 루프가 형성 될 수있는 또 다른 방법은 명시 적으로 조건을 true로 유지하는 것입니다.
while (true)
{
/* body of the loop */
}
for
루프에서 조건문은 선택적입니다. 이 경우, 조건은 항상 true
이며, 무한 루프가됩니다.
for (;;)
{
/* body of the loop */
}
그러나 경우에 따라 break
와 같은 점프 문을 사용하여 루프를 종료하려는 의도로 의도적으로 조건이 true
로 유지 될 수 있습니다.
while (true)
{
/* statements */
if (condition)
{
/* more statements */
break;
}
}
루프 언 롤링 및 더프의 장치
경우에 따라 직선 전방 루프가 루프 본문 내에 완전히 포함될 수없는 경우도 있습니다. 이는 루프가 일부 문 B에 의해 채워질 필요가 있기 때문입니다. 그런 다음, 반복문은 A를 반복하여 시작한 다음 A 가 반복되고 B가 반복됩니다.
do_B();
while (condition) {
do_A();
do_B();
}
코드에서 B를 두 번 반복하는 것과 관련하여 잘라 내기 / 붙여 넣기의 문제가 발생하지 않도록 Duff 's Device를 적용하여 switch 문과 fall through 비헤이비어를 사용하여 while
본문의 중간에서 루프를 시작합니다.
switch (true) while (condition) {
case false: do_A(); /* FALL THROUGH */
default: do_B(); /* FALL THROUGH */
}
더프의 장치는 루프 풀기를 구현하기 위해 실제로 개발되었습니다. n
이 양수 값을 갖는 부호있는 정수형 인 메모리 블록에 마스크를 적용한다고 가정 해보십시오.
do {
*ptr++ ^= mask;
} while (--n > 0);
n
이 항상 4로 나눌 수 있다면, 이것을 쉽게 풀 수 있습니다 :
do {
*ptr++ ^= mask;
*ptr++ ^= mask;
*ptr++ ^= mask;
*ptr++ ^= mask;
} while ((n -= 4) > 0);
그러나 Duff 's Device를 사용하면 코드가 n
이 4로 나눌 수없는 경우 루프 중간에서 올바른 위치로 점프하는 언 롤링 관용구를 따라갈 수 있습니다.
switch (n % 4) do {
case 0: *ptr++ ^= mask; /* FALL THROUGH */
case 3: *ptr++ ^= mask; /* FALL THROUGH */
case 2: *ptr++ ^= mask; /* FALL THROUGH */
case 1: *ptr++ ^= mask; /* FALL THROUGH */
} while ((n -= 4) > 0);
컴파일러의 최적화 엔진은 프로그래머를 대신하여 루프를 풀 수 있기 때문에 이러한 종류의 수동 언 롤링은 최신 컴파일러에서는 거의 필요하지 않습니다.