|| [[TableOfContents]] || ---- 어째서 Cì˜ ë£¨í”„ëŠ” 0부터 루프를 시작하는지... 사람들 헛갈리게 왜 0부터 시작하는지... [AcceleratedC++]ì˜ [AcceleratedC++/Chapter2]ì—ì„œ ì´ì•¼ê¸° ë˜ë”êµ°ìš”. 간단히 옮겨 봅니다. ---- AcceleratedC++ ì˜ ë‚´ìš© 부분 발췌 == ë£¨í”„ì˜ ì¹´ìš´íŠ¸ì˜ ì´ˆê¸°ê°’ì„ 0으로 ì„¤ì •í•˜ëŠ” ì´ìœ == ëŒ€ë¶€ë¶„ì˜ ê²½í—˜ìžˆëŠ” C++프로그래머들ì€, 처ìŒì—는 ì´ìƒí•˜ë‹¤ê³ ìƒê°í• 만한 í”„ë¡œê·¸ëž˜ë° ìŠµê´€ì„ ê°€ì§€ê³ ìžˆìŠµë‹ˆë‹¤. ê·¸ê²ƒì€ ë°”ë¡œ 번호를 매길 ë•Œì— ì–¸ì œë‚˜ 1부터 시작하는 ê²ƒì´ ì•„ë‹ˆë¼ 0부터 시작한다는 것입니다. for(int r=0; r!=rows; ++r) for(int r=1; r<=rows; ++r) 첫번째 ê²ƒì€ 0부터 번호를 ë§¤ê¸°ê³ !=를 ì‚¬ìš©í•˜ëŠ”ë° ë°˜í•´, ë‘번째 ê²ƒì€ 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]ì„ ì‚¬ìš©í•´ì•¼ 합니다. ë²”ìœ„ì˜ ëì´ ì‹œìž‘ë³´ë‹¤ ë” ìž‘ì„수 있따는 ê°€ëŠ¥ì„±ì€ í”„ë¡œê·¸ëž¨ 설계시 ëì´ ì •ì˜ë˜ì§€ ì•Šì•„ 버리는 ë¬¸ì œë¥¼ 야기 시킬수 있습니다. === ë‘번째 ì´ìœ : 루프 불변ì‹ì„ ë” ì‰½ê²Œ í‘œí˜„í• ìˆ˜ 있기 때문ì´ë‹¤. === 0부터 번호를 매기면 불변ì‹ì´ ë” ì§ê´€ì 입니다. 지금까지 rê°œì˜ í–‰ì„ ì¶œë ¥í–ˆë”°ê³ í‘œí˜„í• ìˆ˜ 있기 때문입니다. 만약 1부터 번호를 매긴다면? ì´ì œë§‰ r번째 í–‰ì„ ì¶œë ¥í•˜ë ¤ëŠ” 찰나ë¼ê³ ì •ì˜í• ìˆ˜ë„ ìžˆê² ì§€ë§Œ, 그러한 êµ¬ë¬¸ì€ ë¶ˆë³€ì‹ìœ¼ë¡œ ì •ë‹¹ì¹˜ 않습니다. 왜ëƒí•˜ë©´, whileì´ ì¡°ê±´ì‹ì„ 마지막으로 ê²€ì‚¬í• ë•Œ, rows+1ì´ ë˜ê¸° 때문입니다. ì´ë•Œ 우리가 ì›í•˜ëŠ” ê²ƒì€ rowsí–‰ë§Œì„ ì¶œë ¥í•˜ëŠ” 것 입니다. ë”°ë¼ì„œ 우리는 r번째 í–‰ì„ ë§‰ ì¶œë ¥ í•˜ë ¤ë˜ ê²ƒì´ ì•„ë‹Œ ì…ˆì´ ë©ë‹ˆë‹¤. 지금까지 r-1ê°œì˜ í–‰ë“¤ì„ ì¶œë ¥í–ˆë‹¤ê³ ë¶ˆë³€ì‹ì„ ì •ì˜í• ìˆ˜ë„ ìžˆì„ ê²ƒìž…ë‹ˆë‹¤. 하지만 불변ì‹ì„ 그런ì‹ìœ¼ë¡œ ì •ì˜ í–‡ë‹¤ë©´, rì„ 0부터 시작시켜 단순화 시키는 ê²ƒì´ ë” ë‚«ì§€ ì•Šì„까요? === 세번째 ì´ìœ : 비êµë¥¼ 위해 <=를 사용하는 ëŒ€ì‹ !=를 ì‚¬ìš©í• ìˆ˜ 있다는 것 입니다. === 사소한 것ì¼ì§€ 모르지만, 루프가 ëë‚ ë•Œ 우리가 ì§ìž‘ í• ìˆ˜ 있게 ë˜ëŠ” í”„ë¡œê·¸ëž¨ì˜ ìƒíƒœ ì •ë³´ì— ì˜í–¥ì„ 줄 수 있습니다. ì¡°ê±´ì‹ì´ r!=rowsë¼ë©´, 루프가 ëë‚ ë•Œ r==rowsë¼ëŠ” ì‚¬ì‹¤ì„ ì•Œìˆ˜ 있습니다. 불변ì‹ì€ rê°œì˜ í–‰ì„ ì¶œë ¥í–ˆë”°ëŠ” ì‚¬ì‹¤ì„ ë§í•´ 주기 때문ì—, ì •í™•ížˆ rowsê°œì˜ í–‰ì„ ì¶œë ¥í–ˆë‹¤ëŠ” ê²ƒì„ ì•Œ 수 있습니다. 한편, 만약 ì¡°ê±´ì‹ì´ <=rowsë¼ë©´, 그로부터 ì•Œ 수 있는 ì‚¬ì‹¤ì€ ìµœì†Œí•œ rowsê°œì˜ í–‰ì„ ì¶œë ¥í–ˆë‹¤ëŠ” 사실 ë¿ìž…니다. ë”°ë¼ì„œ ê·¸ ì´ìƒì„ ì¶œë ¥í–ˆì„ ìˆ˜ë„ ìžˆëŠ” 것입니다. 0부터 번호를 매기게 ë˜ë©´ ì •í™•ížˆ rowsë²ˆì˜ ë°˜ë³µì„ ìˆ˜í–‰í–ˆëŠ”ì§€ 확실히 í•˜ê³ ìž í• ë•Œ, R!=rows를 ì¡°ê±´ì‹ìœ¼ë¡œ ì‚¬ìš©í• ìˆ˜ 있습니다. ë˜í•œ, 반복횟수가 rows번 ë˜ëŠ” ê·¸ ì´ìƒì´ ë˜ê¸°ë§Œì„ ì›í•œë‹¤ë©´, r<rows를 ì‚¬ìš©í• ìˆ˜ 있습니다. 만약 1부터 번호르 ㄹ매기다면 최소 rowsë²ˆì˜ ë°˜ë³µë§Œì„ ì›í• ë•Œ r<=rows를 ì‚¬ìš©í• ìˆ˜ 있습니다. 하지만, rowsê°€ ì •í™•í•œ 숫ìžê°€ ë˜ë„ë¡ í•˜ë ¤ë©´ 어떻게 해야 í• ê¹Œìš”? 그런 경우ì—는 ì¢€ë” ë³µìž¡í•œ ì¡°ê±´ì‹ì¸ r==rows+1ê³¼ ê°™ì€ ë°©ë²•ì„ ì‚¬ìš© í• ìˆ˜ 있습니다. 하지만 ì´ë ‡ê²Œ 복잡하게 í•´ì„œ ì–»ì„수 있는 ì´ë“ì€ ê±°ì˜ ì—†ìŠµë‹ˆë‹¤. ---- ì¼ì°Œê¸° 다ìµìŠ¤íŠ¸ë¼ê°€ ê·¸ ì´ìœ 를 ë°í˜€ë†“았습니다. Seminar:WhyNumberingShouldStartAtZero ---- [í† ë¡ ë¶„ë¥˜]