[완료]C언어에서 for 문과 while 문 은 어떻게 다른가요?
글쓴이: bluesky.big / 작성시간: 목, 2010/07/15 - 2:18오후
안녕하세요.
제가 궁금한 사항은 C언어로 프로그래밍을 할 때 사용할때 for 문과 while 문 중에 어떤 것을 사용해야 하는지 알고싶습니다. 언떤 경우에 for가 더 좋다던지 아니면 어떤 경우에는 while문이 더 좋다던지 이런 것이 궁금합니다.
또 모든 for/while 은 서로 대치가 가능한가요? 즉 모든 for문을 약간 손을 보면 while로 바꿀 수 있다(?) 또한 모든 while문은 for문으로 대치가 가능하다(?).
그렇다면 왜 같은 역할을 하는 두가지가 존재하나요?
코드를 짜서 profile을 걸어보면 속도는 for문이 빠르거나 같다고 나옵니다. 비슷한 결과를 나타낼 때는 아무래도 compiler의 optimize 기능 때문인 것 같긴 합니다만......
명쾌한 답변 좀 부탁드리겠습니다!!!
Forums:
for 와 while 두가지를
for 와 while 두가지를 얘기할 때 가장 많이들 얘기하는 올바른 사용법(?)은 다음과 같습니다.
for 문은 특정한 범위를 가진 loop 에 이용하고,
while 문은 조건에 만족하는 결과를 얻기 위한 loop 에 이용된다는 거죠..
for 문의 경우 사용법의 특성상 loop의 범위가 정해져 있죠? 반면에 while 문 자체로는 loop의 범위가 정해져 있지 않습니다. 어떠한 특정한 조건에 해당하는 값이 올 때까지 loop라는거죠..
물론, 얘기하신 대로 서로간의 대치도 가능합니다.
양천서.cpp//100대까지
양천서.cpp
//100대까지만 팬다
for(int i = 0; i < 100; ++i)
{
hit();
if(confession()) break;
}
//자백할 때까지 팬다
while(!confession())
{
hit();
if(die()) break;
}
KLDP 에서 봤던 코드
KLDP 에서 봤던 코드 중에 가장 인상깊은 코드입니다.
좋은 하루 되세요!
한가지 추가!!
//100대까지만 팬다
for(int i = 0; i < 100; ++i)
{
hit();
if(confession() || die()) break;
}
//자백할 때까지 팬다
while(!confession())
{
hit();
if(die()) break;
}
100대만 때리기로 결정했는데 confession 하거나 die하면 그만 해야겠죠?
모.. die해도 때릴수 있지만 암튼 적절한 예제였던것 같습니다.^^
너무 좋아^^;
정말 와닿는 예네요^^
---
Linux jsk-gentoo-q70 2.6.34-gentoo-r1 #4 SMP PREEMPT Mon Jul 12 03:15:56 KST 2010 i686 Intel(R) Core(TM)2 Duo CPU T7300 @ 2.00GHz GenuineIntel GNU/Linux
정말 ..
정말 머리에 쏙쏙 들어오는 설명이네요.
라이센스 조건이
라이센스 조건이 어떻게 되나요? 인용하고 싶습니다.
--------------------------
피할 수 있을때 즐겨라!
http://snowall.tistory.com
피할 수 있을때 즐겨라! http://melotopia.net/b
CopyLeft 입니당
CopyLeft 입니당
근데 이건 같지 않나요?
//100대까지만 팬다
for(;;)
{
hit();
if(confession()) break;
}
//자백할 때까지 팬다
while(!confession())
{
hit();
if(die()) break;
}
for문은 일단 한대 때리고 자백했는지 확인하는
for문은 일단 한대 때리고 자백했는지 확인하는 것이고
while문은 자백했는지 확인하고 안했으면 때리는 것이네요.
참 대단하네요. 이런 것까지 정치적으로 이용해 먹는
참 대단하네요.
이런 것까지 정치적으로 이용해 먹는 수법들이...
존경스럽습니다.
ㅋㅋㅋㅋㅋㅋ
오랬만에 봤는데 빵터지네요
KLDP 에서 봤던 코드
KLDP 에서 봤던 코드 중에 가장 인상깊은 코드입니다. 2
KLDP 에서 봤던 코드
KLDP 에서 봤던 코드 중에 가장 인상깊은 코드입니다. 3
------------------------------
서투른 목수는 다 탓 한다
------------------------------
서투른 목수는 다 탓 한다
KLDP 에서 봤던 코드
KLDP 에서 봤던 코드 중에 가장 인상깊은 코드입니다. 4
Software Developer
후후,, 그렇다면
이게 빠질 수 없겠네요...
일단 패고 본다...
do {
hit();
}
while(!confession())
KLDP 에서 봤던 코드
KLDP 에서 봤던 코드 중에 가장 인상깊은 코드입니다. 5
----
use perl;
Keedi Kim
----
use perl;
Keedi Kim
좋은 예제 감사합니다.
덕분에 빨리 이해가 되었습니다.
감사합니다.
기능이 겹치는 것
기능이 겹치는 것 맞습니다.
단지 읽기 편하라고 두 가지가 있는 거지요.
컴파일러가 동일한 결과로 번역한다고 알고 있습니다.
___________________
http://blog.aaidee.com
재벌 2세가 재벌이 될 확률과
금메달리스트 2세가 금메달을 딸 확률이 비슷해지도록
자유오픈소스 대안화폐를 씁시다.
아이디의 아이디어 무한도전
http://blog.aaidee.com
귀태닷컴
http://www.gwitae.com
동일한 결과(?)
제가 알기론 동일하게 컴파일되지 않는 것으로 알고 있습니다.
컴파일러에서 optimize 옵션을 주지 않으면 상당히 다른 assemble 코드가 생성되었습니다.
전에 간단하게 1~100000 까지 a=a+i; 이런식으로 해봤는데 assemble 코드가 상당히 다르던데요?
그래서 제가 주제글에 속도는 for <= while 이라고 적었습니다만...
혹시 제가 알고 있는 것이 잘못되었다면 바로 잡아주시기 바랍니다.
...
한가지 확실한 것은 "동일한 동작을 하는 코드를 생성해야 한다"입니다.
그런데 문제는 "동일한 동작을 하는 코드"는 여러 개가 있을 수 있다는 거죠. 컴파일러가 그중 뭘 선택하느냐는 컴파일러 마음대로입니다.
그런데 일반적으로 for loop는 전형적으로 쓰이는 방식이 있고, 컴파일러 제작자가 보기에 이런 형태가 많이 쓰이니 for loop에 대해서만 최적화를 대단히 열심히 연구했을 수도 있지요.
그러므로 그런 경우에는 같은 코드를 짜도 컴파일러가 for에 대해 더 빠른 코드를 만들어낼 수도 있는데, 이런 건 같은 컴파일러라도 버전이나 최적화 옵션에 따라 언제든 바뀔 수 있기 때문에 너무 크게 신경쓰지 않으시는 게 좋을 것 같습니다.
이렇게 해도 다른가요???
sum = 0;
for(i=0;i<100;i++) {
sum += i;
}
---------------------
sum = 0;
i = 0;
while(i<100) {
sum += i;
i++;
}
동작은 정확히 같을 것 같습니다만......
for 문을 이렇게
for 문을 이렇게 바꿔서 테스트해봐도 다르르려나요?
----
Let's shut up and code.
----
Let's shut up and code.
최적화의 예라면
while문에 루프 언롤링 같은 최적화를 컴파일러가 적용하긴 어렵겠지요
반면 카운트 다운 do{}while 같은 경우엔 for문제 적용하기 힘들고요
그냥 단순하게 for <= while 이라고 생각하시면 안됨니다.....
아무튼 가장 중요한건 가독성 == 많이 쓰이는 형태로 할것
그래야 남도 편하고 자기도 편함니다.
아 정말 멋진
예를 잘 보고 갑니다 ㅋ
ㅎㅎ 하나 더
ㅎㅎ 하나 더 추가
AAA:
while()
{
}
goto AAA;
끝난거 아니다.. 방심마라... ㅋㅋ
댓글 달기