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 378fad3

Browse files
committed
✨ for문 설명 완료
1 parent 7752271 commit 378fad3

File tree

1 file changed

+264
-1
lines changed

1 file changed

+264
-1
lines changed

‎7-control-flow/README.md

Lines changed: 264 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -590,4 +590,267 @@ int main()
590590
```
591591
```
592592
5
593-
```
593+
```
594+
595+
## for문(for statement)
596+
597+
마지막으로 소개할 반복문은 for문입니다. for문은 사용하는 방법이 두 가지입니다.
598+
599+
```
600+
for (<변수 선언문> [<조건식>]; [<반복식>]) <실행문>
601+
```
602+
```
603+
for ([<초기식>]; [<조건식>]; [<반복식>]) <실행문>
604+
```
605+
606+
for문은
607+
608+
1. `<변수 선언문>`이나 `<초기식>`을 실행합니다.
609+
2. `<조건식>`의 결과값이 거짓이라면 문장을 종료하고, 참이라면 3으로 갑니다.
610+
3. `<실행문>`을 실행합니다.
611+
4. `<반복식>`을 실행합니다.
612+
5. 2로 돌아갑니다.
613+
614+
즉, 양 쪽 다 다음과 같은 while문으로 치환할 수 있습니다.
615+
616+
```c
617+
{
618+
<변수 선언문> | <초기식>;
619+
while (<조건식>)
620+
{
621+
<실행문>
622+
<반복식>;
623+
}
624+
}
625+
```
626+
627+
> 앞으로 문법 설명에서 `|``또는`으로 해석해주세요.
628+
629+
예시를 보겠습니다.
630+
631+
```c
632+
#include <stdio.h>
633+
634+
int main()
635+
{
636+
for (int i = 0; i < 5; ++i)
637+
printf("%d ", i);
638+
}
639+
```
640+
```
641+
0 1 2 3 4
642+
```
643+
644+
이 예제에선 for문 안에서 변수 선언문을 사용했기 때문에, for문의 사용 방법 두 개 중 위의 문법이 적용됨을 알 수 있습니다. 더 쉬운 이해를 위해, 위 예제 속 for문을 while문으로 치환해보겠습니다.
645+
646+
```c
647+
#include <stdio.h>
648+
649+
int main()
650+
{
651+
{
652+
int i = 0;
653+
while (i < 5)
654+
{
655+
printf("%d ", i);
656+
++i;
657+
}
658+
}
659+
}
660+
```
661+
662+
`0 1 2 3 4 `가 출력된 과정이 보이시나요?
663+
664+
1. `0 < 5`의 결과는 참이기 때문에,
665+
2. `printf("%d ", i);`가 실행되어 `0 `이 출력됩니다.
666+
3. `++i`가 실행되어 `i``1`이 됩니다.
667+
4. `1 < 5`의 결과는 참이기 때문에,
668+
5. `printf("%d ", i);`가 실행되어 `1 `이 출력됩니다.
669+
6. `++i`가 실행되어 `i``2`가 됩니다.
670+
7. `2 < 5`의 결과는 참이기 때문에,
671+
8. `printf("%d ", i);`가 실행되어 `2 `가 출력됩니다.
672+
9. `++i`가 실행되어 `i``3`이 됩니다.
673+
10. `3 < 5`의 결과는 참이기 때문에,
674+
11. `printf("%d ", i);`가 실행되어 `3 `이 출력됩니다.
675+
12. `++i`가 실행되어 `i``4`가 됩니다.
676+
13. `4 < 5`의 결과는 참이기 때문에,
677+
14. `printf("%d ", i);`가 실행되어 `4 `가 출력됩니다.
678+
15. `++i`가 실행되어 `i``5`가 됩니다.
679+
16. `5 < 5`의 결과는 거짓이기 때문에, while문이 종료됩니다.
680+
681+
동일한 프로그램을 변수 선언문 대신 초기식을 사용하여 만들어보겠습니다.
682+
683+
```c
684+
#include <stdio.h>
685+
686+
int main()
687+
{
688+
int i;
689+
for (i = 0; i < 5; ++i)
690+
printf("%d ", i);
691+
}
692+
```
693+
694+
이 예제 속 for문을 while문으로 치환하면 다음과 같이 변합니다.
695+
696+
```c
697+
#include <stdio.h>
698+
699+
int main()
700+
{
701+
int i;
702+
{
703+
i = 0;
704+
while (i < 5)
705+
{
706+
printf("%d ", i);
707+
++i;
708+
}
709+
}
710+
}
711+
```
712+
713+
위 예제와 다르게 `int i;`가 위로 올라가긴 했지만, 실행엔 별로 차이가 없을 것입니다. 동일하게 `0 1 2 3 4 `를 출력한다는 것을 알 수 있습니다.
714+
715+
for문도 반복문이기 때문에 break문을 사용할 수 있습니다.
716+
717+
```c
718+
#include <stdio.h>
719+
720+
int main()
721+
{
722+
for (int i = 5; i >= 0; --i)
723+
{
724+
if (i == 2)
725+
break;
726+
printf("%d ", i);
727+
}
728+
}
729+
```
730+
```
731+
5 4 3
732+
```
733+
734+
위 예제의 for문을 while문으로 치환해보겠습니다.
735+
736+
```c
737+
#include <stdio.h>
738+
739+
int main()
740+
{
741+
{
742+
int i = 5;
743+
while (i >= 0)
744+
{
745+
if (i == 2)
746+
break;
747+
printf("%d ", i);
748+
--i;
749+
}
750+
}
751+
}
752+
```
753+
754+
`5 4 3 `이 왜 출력되는지 감이 잡히시나요? for문은 복잡하지만 아주 많이 사용되기 때문에, 분석하기 힘들실 땐 while문으로 치환해보시면서 for문에 익숙해지려고 노력해주세요.
755+
756+
for문은 배열과 함께 사용될 때 가장 강력합니다. [6장](../6-pointers-and-array)에서 `sizeof` 연산자로 배열의 길이를 구하는 방법을 배웠습니다. 이걸 for문과 함께 사용하면 배열의 모든 요소를 출력하는 코드를 쉽게 만들 수 있습니다.
757+
758+
```c
759+
#include <stdio.h>
760+
761+
int main()
762+
{
763+
int arr[] = { 1, 1, 2, 3, 5, 8, 13, };
764+
printf("int arr[] = { ");
765+
for (int i = 0; i < sizeof arr / sizeof(int); ++i)
766+
printf("%d, ", arr[i]);
767+
printf("};");
768+
}
769+
```
770+
```
771+
int arr[] = { 1, 1, 2, 3, 5, 8, 13, };
772+
```
773+
774+
사용자의 입력을 배열에 입력받을 때도 for문을 활용할 수 있습니다.
775+
776+
```c
777+
#include <stdio.h>
778+
779+
int main()
780+
{
781+
int arr[5];
782+
int len = sizeof arr / sizeof(int);
783+
for (int i = len - 1; i >= 0; --i)
784+
scanf("%d", arr + i);
785+
786+
for (int i = 0; i < len; ++i)
787+
printf("%d ", arr[i] * 2);
788+
}
789+
```
790+
```
791+
: 18 62 17 26 20
792+
40 52 34 124 36
793+
```
794+
```
795+
: 18
796+
: 62 17
797+
: 26 20
798+
40 52 34 124 36
799+
```
800+
801+
> `arr[i]``*(arr + i)`랑 동치라는 것을 기억해주세요. `&arr[i]``arr + i`가 됩니다.
802+
803+
> [6장](../6-pointers-and-array)에서 `scanf`가 사용자의 입력을 스페이스나 줄바꿈으로 구분한다고 언급한 것을 기억해주세요.
804+
805+
for문의 초기식, 조건식, 반복식은 모두 생략이 가능합니다. 초기식이나 반복식이 생략되는 것은 쉽게 이해할 수 있습니다. `for (; <조건식>;) <실행문>`처럼 쓰면 `while (<조건식>) <실행문>`이 되는 것과 큰 차이가 없습니다.
806+
807+
```
808+
for ([초기식]; <조건식>; [반복식]) <실행문>
809+
810+
->
811+
812+
{
813+
[초기식];
814+
while (<조건식>)
815+
{
816+
<실행문>
817+
[반복식];
818+
}
819+
}
820+
```
821+
822+
여기서 `[초기식]``[반복식]`만 생략하면 되니까요. 변수 선언문이 포함된 경우도 마찬가지입니다.
823+
824+
```
825+
for (<변수 선언문> <조건식>; [반복식]) <실행문>
826+
827+
->
828+
829+
{
830+
<변수 선언문>
831+
while (<조건식>)
832+
{
833+
<실행문>
834+
[반복식];
835+
}
836+
}
837+
```
838+
839+
근데 여기서 조건식을 생략해버리면 while문 안에 조건식이 들어있지 않게 되어 문법 오류가 발생합니다. 그래서 조건식이 생략되면 while문으로 치환했을 때 **조건식에 `1`이 들어있는 것**으로 생각합니다. 예시를 보겠습니다.
840+
841+
```c
842+
#include <stdio.h>
843+
844+
int main()
845+
{
846+
for (int i = 0;;i += 2)
847+
{
848+
printf("%d ", i);
849+
}
850+
}
851+
```
852+
```
853+
0 2 4 6 8 10 12 14 16 18 20 ...
854+
```
855+
856+
프로그램이 멈추지 않고 끝나는 것을 확인할 수 있습니다.

0 commit comments

Comments
(0)

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