Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 1256ab3

Browse files
committed
✨ 무한 루프 설명 완료
1 parent 378fad3 commit 1256ab3

File tree

1 file changed

+80
-1
lines changed

1 file changed

+80
-1
lines changed

‎7-control-flow/README.md

Lines changed: 80 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -426,7 +426,7 @@ int main()
426426

427427
## while문(while statement)
428428

429-
컴퓨터의 가장 강력한 점 중 하나는 주어진 일을 아주 많은 횟수로 꾸준히 할 수 있다는 점입니다. 십만명 정도를 대상으로 하는 통계를 낸다고 했을 때, 사람이 하려고 하면 몇 천명도 되지 않아 지칠 것입니다. 하지만 컴퓨터는 십만명이 아니라 십억명이라고 해도 지치지 않고 통계에 필요한 계산을 수행할 수 있습니다. 반복문은 이렇게 반복되는 작업을 수행하기 위해 사용되는 문장입니다.
429+
컴퓨터의 가장 강력한 점 중 하나는 주어진 일을 아주 많은 횟수로 꾸준히 할 수 있다는 점입니다. 십만명 정도를 대상으로 하는 통계를 낸다고 했을 때, 사람이 하려고 하면 몇 천명도 되지 않아 지칠 것입니다. 하지만 컴퓨터는 십만명이 아니라 십억명이라고 해도 지치지 않고 통계에 필요한 계산을 수행할 수 있습니다. `반복문(loop)` 이렇게 반복되는 작업을 수행하기 위해 사용되는 문장입니다.
430430

431431
while문은 C의 반복문 중 하나입니다. while문은 다음과 같이 씁니다.
432432

@@ -798,6 +798,8 @@ int main()
798798
40 52 34 124 36
799799
```
800800

801+
> 위 예제에선 `arr[4]`, `arr[3]`, `arr[2]`, ... 순서대로 사용자의 입력을 받고 있습니다.
802+
801803
> `arr[i]``*(arr + i)`랑 동치라는 것을 기억해주세요. `&arr[i]``arr + i`가 됩니다.
802804
803805
> [6장](../6-pointers-and-array)에서 `scanf`가 사용자의 입력을 스페이스나 줄바꿈으로 구분한다고 언급한 것을 기억해주세요.
@@ -849,8 +851,85 @@ int main()
849851
}
850852
}
851853
```
854+
855+
이 예제를 while문으로 치환하면 다음과 같이 쓸 수 있습니다.
856+
857+
```c
858+
#include <stdio.h>
859+
860+
int main()
861+
{
862+
{
863+
int i = 0;
864+
while (1)
865+
{
866+
printf("%d ", i);
867+
i += 2;
868+
}
869+
}
870+
}
871+
```
872+
873+
이 프로그램을 `Ctrl + F5`를 눌러 실행해보면
874+
852875
```
853876
0 2 4 6 8 10 12 14 16 18 20 ...
854877
```
855878

856879
프로그램이 멈추지 않고 끝나는 것을 확인할 수 있습니다.
880+
881+
## 무한 루프(infinite loop)
882+
883+
반복문은 조건식이 참이면 주어진 문장을 계속 수행합니다. 조건식으로 `1`이나 `2`이나, `20 < 100`처럼 결정값이 항상 참으로 간주되는 값인 식을 사용하면 반복문은 영원히 반복되게 됩니다. 이런 반복문을 `무한 루프(infinite loop)`라고 부릅니다. 방금 다룬 예제도 무한 루프를 사용한 프로그램입니다.
884+
885+
프로그램의 종류에 따라 무한 루프를 사용해야하는 경우도 있지만, 대부분의 프로그램의 경우엔 무한 루프를 사용할 일이 없습니다. `무한 루프에 갇히다`라는 표현이 있을 정도로 무한 루프가 실행 중인 상황은 대게 버그가 발생한 경우입니다. 예를 들어, 주어진 배열의 원소를 거꾸로 출력하는 프로그램을 만들어보려고 합니다.
886+
887+
```c
888+
#include <stdio.h>
889+
890+
int main()
891+
{
892+
int arr[] = { 1, 2, 3, 4, 5 };
893+
int len = sizeof arr / sizeof(int);
894+
895+
for (int i = len - 1; i >= 0; ++i)
896+
printf("%d ", arr[i]);
897+
}
898+
```
899+
900+
그런데, 원래 `--i`라고 써야 하는 걸 `++i`라고 써버렸습니다. `i >= 0`은 항상 `1`이 됩니다. 반복문의 조건식이 항상 참이니 무한 루프가 됩니다. 이처럼 무한 루프가 발생한 경우엔 보통 좋지 않은 일이 일어났을 가능성이 높습니다. 그래서 조건식에 항상 참이 되는 식을 넣지는 않았는지 확인하고, 혹시 `1`을 꼭 넣어야 한다면 break문을 적절히 사용할 필요가 있습니다.
901+
902+
```c
903+
#include <stdio.h>
904+
905+
int main()
906+
{
907+
printf("Summation calculator\n");
908+
int sum = 0;
909+
while (1)
910+
{
911+
printf("Gimme a number: ");
912+
int i; scanf("%d", &i);
913+
if (!i)
914+
break;
915+
sum += i;
916+
}
917+
printf("Sum: %d", sum);
918+
}
919+
```
920+
```
921+
Summation calculator
922+
Gimme a number: 7
923+
Gimme a number: 18
924+
Gimme a number: 25
925+
Gimme a number: 16
926+
Gimme a number: 19
927+
Gimme a number: -34
928+
Gimme a number: 14
929+
Gimme a number: 0
930+
Sum: 65
931+
```
932+
933+
> 위 예제처럼 break문이 실행될 수 있는 가능성이 충분히 있으면 조건식이 `1`이라고 하더라도 무한 루프라고 부르지 않습니다.
934+
935+
> `!i`에 주목해주세요. 부정 연산자는 참인 값을 거짓으로, 거짓인 값을 참으로 바꿔줍니다. 즉, `0`이 아닌 식은 `0`으로, `0`인 식은 `1`로 바꿔주는 연산자입니다. 그래서 `i``0`이 아니면 조건식의 결과값이 `0`이 되어 if문 안쪽이 실행되지 않고, `i``0`이면 조건식의 결과값이 `1`이 되어 if문 안쪽이 실행됩니다. 이렇게 사용자가 `0`을 입력하면 반복문을 종료하게 만들 수 있습니다.

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /