@@ -590,4 +590,267 @@ int main()
590
590
```
591
591
```
592
592
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