어째서 C� 루프는 0부터 루프를 시작하는지... 사람들 헛갈리게 왜 0부터 시작하는지...
AcceleratedC++� AcceleratedC++/Chapter2�서 �야기 ��군요.
간단히 옮겨 봅니다.
AcceleratedC++� AcceleratedC++/Chapter2�서 �야기 ��군요.
간단히 옮겨 봅니다.
AcceleratedC++ � 내용 부분 발췌
1. 루프ì�˜ 카운트ì�˜ 초기값ì�„ 0으로 ì„¤ì •í•˜ëŠ” ì�´ìœ ¶
대부분ì�˜ 경험있는 C++프로그래머들ì�€, 처ì�Œì—�는 ì�´ìƒ�í•˜ë‹¤ê³ ìƒ�ê°�í• ë§Œí•œ 프로그래ë°� 습관ì�„ ê°€ì§€ê³ ìžˆìŠµë‹ˆë‹¤. 그것ì�€ 바로 번호를 매길 때ì—� ì–¸ì œë‚˜ 1부터 시작하는 것ì�´ 아니ë�¼ 0부터 시작한다는 것입니다.
for(int r=0; r!=rows; ++r)
for(int r=1; r<=rows; ++r)
첫번째 것ì�€ 0부터 번호를 ë§¤ê¸°ê³ !=를 사용하는ë�° 반해, ë‘�번째 것ì�€ 1부터 번호를 ë§¤ê¸°ê³ <=로 비êµ�합니다. 반복횟수는 둘다 ë�™ì�¼í•©ë‹ˆë‹¤. ë‘�번째 것보다 첫 번재 것ì�„ ë�” 성호하는 ì�´ìœ ê°€ 있ì�„까요?
for(int r=0; r!=rows; ++r)
for(int r=1; r<=rows; ++r)
첫번째 것ì�€ 0부터 번호를 ë§¤ê¸°ê³ !=를 사용하는ë�° 반해, ë‘�번째 것ì�€ 1부터 번호를 ë§¤ê¸°ê³ <=로 비êµ�합니다. 반복횟수는 둘다 ë�™ì�¼í•©ë‹ˆë‹¤. ë‘�번째 것보다 첫 번재 것ì�„ ë�” 성호하는 ì�´ìœ ê°€ 있ì�„까요?
1.1. 첫번째 ì�´ìœ : ë¹„ëŒ€ì¹ ì �ì�¸ 범위를 사용하기 때문ì—� 범위를 설명하기 쉽기 때문ì�´ë‹¤. ¶
첫번째 for문ì�€ [0, rows)를 사용하는 것ì�´ íŽ¸í•˜ê³ , ë‘�번째 for문ì�€ 1, rows를 사용하는것ì�´ ë�” 편하다.
보통 비대ì¹í˜• 범위는 대ì¹í˜• 범위보다 ë�” 사용하기 쉽습니다. 왜ëƒ�하면 다ì�Œê³¼ ê°™ì�€ 중요한 ì†�성ì�´ 있기 때문입니다. [m, n)ê³¼ ê°™ì�€ 형ì‹�ì�˜ 범위는 n-mê°œì�˜ 요소들ì�„ 가지며 m,nì�˜ 형ì‹�ì�€ n-m+1ì�˜ 요소들ì�„ 가집니다. ë”°ë�¼ì„œ [0, rows)ì—�서 요소들ì�˜ 개수는 ì§�ê´€ì �ì�¸ë�° 반해, 1, rowsì—�서 요소들ì�˜ 개수는 ë�œ ì§�ê´€ì � 입니다. ì�´ëŸ¬í•œ ì†�성차ì�´ëŠ”, 특히 빈 범위ì�˜ 경우ì—� ë�” ëšœë ·í•©ë‹ˆë‹¤. 만약 비 대ì¹í˜• 범위를 사용한다면, 빈 범위를 [m,n)으로 í‘œí˜„í• ìˆ˜ 있지만, 대ì¹í˜• 범위ì—�서는 n, n-1ì�„ 사용해야 합니다. 범위ì�˜ ë��ì�´ 시작보다 ë�” ìž‘ì�„수 있따는 가능성ì�€ 프로그램 설계시 ë��ì�´ ì •ì�˜ë�˜ì§€ 않아 버리는 ë¬¸ì œë¥¼ 야기 시킬수 있습니다.
보통 비대ì¹í˜• 범위는 대ì¹í˜• 범위보다 ë�” 사용하기 쉽습니다. 왜ëƒ�하면 다ì�Œê³¼ ê°™ì�€ 중요한 ì†�성ì�´ 있기 때문입니다. [m, n)ê³¼ ê°™ì�€ 형ì‹�ì�˜ 범위는 n-mê°œì�˜ 요소들ì�„ 가지며 m,nì�˜ 형ì‹�ì�€ n-m+1ì�˜ 요소들ì�„ 가집니다. ë”°ë�¼ì„œ [0, rows)ì—�서 요소들ì�˜ 개수는 ì§�ê´€ì �ì�¸ë�° 반해, 1, rowsì—�서 요소들ì�˜ 개수는 ë�œ ì§�ê´€ì � 입니다. ì�´ëŸ¬í•œ ì†�성차ì�´ëŠ”, 특히 빈 범위ì�˜ 경우ì—� ë�” ëšœë ·í•©ë‹ˆë‹¤. 만약 비 대ì¹í˜• 범위를 사용한다면, 빈 범위를 [m,n)으로 í‘œí˜„í• ìˆ˜ 있지만, 대ì¹í˜• 범위ì—�서는 n, n-1ì�„ 사용해야 합니다. 범위ì�˜ ë��ì�´ 시작보다 ë�” ìž‘ì�„수 있따는 가능성ì�€ 프로그램 설계시 ë��ì�´ ì •ì�˜ë�˜ì§€ 않아 버리는 ë¬¸ì œë¥¼ 야기 시킬수 있습니다.
1.2. ë‘�번째 ì�´ìœ : 루프 불변ì‹�ì�„ ë�” 쉽게 í‘œí˜„í• ìˆ˜ 있기 때문ì�´ë‹¤. ¶
0부터 번호를 매기면 불변ì‹�ì�´ ë�” ì§�ê´€ì �입니다.
지금까지 rê°œì�˜ í–‰ì�„ ì¶œë ¥í–ˆë”°ê³ í‘œí˜„í• ìˆ˜ 있기 때문입니다. 만약 1부터 번호를 매긴다면? ì�´ì œë§‰ r번째 í–‰ì�„ ì¶œë ¥í•˜ë ¤ëŠ” 찰나ë�¼ê³ ì •ì�˜í• 수ë�„ ìžˆê² ì§€ë§Œ, 그러한 구문ì�€ 불변ì‹�으로 ì •ë‹¹ì¹˜ 않습니다. 왜ëƒ�하면, whileì�´ ì¡°ê±´ì‹�ì�„ 마지막으로 ê²€ì‚¬í• ë•Œ, rows+1ì�´ ë�˜ê¸° 때문입니다. ì�´ë•Œ 우리가 ì›�하는 것ì�€ rows행만ì�„ ì¶œë ¥í•˜ëŠ” 것 입니다. ë”°ë�¼ì„œ 우리는 r번째 í–‰ì�„ 막 ì¶œë ¥ í•˜ë ¤ë�˜ 것ì�´ 아닌 ì…ˆì�´ ë�©ë‹ˆë‹¤. 지금까지 r-1ê°œì�˜ 행들ì�„ ì¶œë ¥í–ˆë‹¤ê³ ë¶ˆë³€ì‹�ì�„ ì •ì�˜í• 수ë�„ 있ì�„ 것입니다. 하지만 불변ì‹�ì�„ 그런ì‹�으로 ì •ì�˜ 햇다면, rì�„ 0부터 시작시켜 단순화 시키는 것ì�´ ë�” ë‚«ì§€ 않ì�„까요?
지금까지 rê°œì�˜ í–‰ì�„ ì¶œë ¥í–ˆë”°ê³ í‘œí˜„í• ìˆ˜ 있기 때문입니다. 만약 1부터 번호를 매긴다면? ì�´ì œë§‰ r번째 í–‰ì�„ ì¶œë ¥í•˜ë ¤ëŠ” 찰나ë�¼ê³ ì •ì�˜í• 수ë�„ ìžˆê² ì§€ë§Œ, 그러한 구문ì�€ 불변ì‹�으로 ì •ë‹¹ì¹˜ 않습니다. 왜ëƒ�하면, whileì�´ ì¡°ê±´ì‹�ì�„ 마지막으로 ê²€ì‚¬í• ë•Œ, rows+1ì�´ ë�˜ê¸° 때문입니다. ì�´ë•Œ 우리가 ì›�하는 것ì�€ rows행만ì�„ ì¶œë ¥í•˜ëŠ” 것 입니다. ë”°ë�¼ì„œ 우리는 r번째 í–‰ì�„ 막 ì¶œë ¥ í•˜ë ¤ë�˜ 것ì�´ 아닌 ì…ˆì�´ ë�©ë‹ˆë‹¤. 지금까지 r-1ê°œì�˜ 행들ì�„ ì¶œë ¥í–ˆë‹¤ê³ ë¶ˆë³€ì‹�ì�„ ì •ì�˜í• 수ë�„ 있ì�„ 것입니다. 하지만 불변ì‹�ì�„ 그런ì‹�으로 ì •ì�˜ 햇다면, rì�„ 0부터 시작시켜 단순화 시키는 것ì�´ ë�” ë‚«ì§€ 않ì�„까요?
1.3. 세번째 ì�´ìœ : 비êµ�를 위해 <=를 사용하는 ëŒ€ì‹ !=를 ì‚¬ìš©í• ìˆ˜ 있다는 것 입니다. ¶
사소한 것ì�¼ì§€ 모르지만, 루프가 ë��ë‚ ë•Œ 우리가 ì§�ìž‘ í• ìˆ˜ 있게 ë�˜ëŠ” 프로그램ì�˜ ìƒ�태 ì •ë³´ì—� ì˜�í–¥ì�„ 줄 수 있습니다.
ì¡°ê±´ì‹�ì�´ r!=rowsë�¼ë©´, 루프가 ë��ë‚ ë•Œ r==rowsë�¼ëŠ” 사실ì�„ 알수 있습니다. 불변ì‹�ì�€ rê°œì�˜ í–‰ì�„ ì¶œë ¥í–ˆë”°ëŠ” 사실ì�„ ë§�í•´ 주기 때문ì—�, ì •í™•ížˆ rowsê°œì�˜ í–‰ì�„ ì¶œë ¥í–ˆë‹¤ëŠ” 것ì�„ 알 수 있습니다. 한편, 만약 ì¡°ê±´ì‹�ì�´ <=rowsë�¼ë©´, 그로부터 알 수 있는 사실ì�€ 최소한 rowsê°œì�˜ í–‰ì�„ ì¶œë ¥í–ˆë‹¤ëŠ” 사실 ë¿�입니다. ë”°ë�¼ì„œ ê·¸ ì�´ìƒ�ì�„ ì¶œë ¥í–ˆì�„ 수ë�„ 있는 것입니다. 0부터 번호를 매기게 ë�˜ë©´ ì •í™•ížˆ rows번ì�˜ 반복ì�„ 수행했는지 확실히 í•˜ê³ ìž� í• ë•Œ, R!=rows를 ì¡°ê±´ì‹�으로 ì‚¬ìš©í• ìˆ˜ 있습니다. ë˜�한, 반복횟수가 rows번 ë˜�는 ê·¸ ì�´ìƒ�ì�´ ë�˜ê¸°ë§Œì�„ ì›�한다면, r
ì¡°ê±´ì‹�ì�´ r!=rowsë�¼ë©´, 루프가 ë��ë‚ ë•Œ r==rowsë�¼ëŠ” 사실ì�„ 알수 있습니다. 불변ì‹�ì�€ rê°œì�˜ í–‰ì�„ ì¶œë ¥í–ˆë”°ëŠ” 사실ì�„ ë§�í•´ 주기 때문ì—�, ì •í™•ížˆ rowsê°œì�˜ í–‰ì�„ ì¶œë ¥í–ˆë‹¤ëŠ” 것ì�„ 알 수 있습니다. 한편, 만약 ì¡°ê±´ì‹�ì�´ <=rowsë�¼ë©´, 그로부터 알 수 있는 사실ì�€ 최소한 rowsê°œì�˜ í–‰ì�„ ì¶œë ¥í–ˆë‹¤ëŠ” 사실 ë¿�입니다. ë”°ë�¼ì„œ ê·¸ ì�´ìƒ�ì�„ ì¶œë ¥í–ˆì�„ 수ë�„ 있는 것입니다. 0부터 번호를 매기게 ë�˜ë©´ ì •í™•ížˆ rows번ì�˜ 반복ì�„ 수행했는지 확실히 í•˜ê³ ìž� í• ë•Œ, R!=rows를 ì¡°ê±´ì‹�으로 ì‚¬ìš©í• ìˆ˜ 있습니다. ë˜�한, 반복횟수가 rows번 ë˜�는 ê·¸ ì�´ìƒ�ì�´ ë�˜ê¸°ë§Œì�„ ì›�한다면, r









