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);
컴파일러의 최적화 엔진은 프로그래머를 대신하여 루프를 풀 수 있기 때문에 이러한 종류의 수동 언 롤링은 최신 컴파일러에서는 거의 필요하지 않습니다.