[완료]C언어에서 for 문과 while 문 은 어떻게 다른가요?

bluesky.big의 이미지

안녕하세요.

제가 궁금한 사항은 C언어로 프로그래밍을 할 때 사용할때 for 문과 while 문 중에 어떤 것을 사용해야 하는지 알고싶습니다. 언떤 경우에 for가 더 좋다던지 아니면 어떤 경우에는 while문이 더 좋다던지 이런 것이 궁금합니다.
또 모든 for/while 은 서로 대치가 가능한가요? 즉 모든 for문을 약간 손을 보면 while로 바꿀 수 있다(?) 또한 모든 while문은 for문으로 대치가 가능하다(?).
그렇다면 왜 같은 역할을 하는 두가지가 존재하나요?
코드를 짜서 profile을 걸어보면 속도는 for문이 빠르거나 같다고 나옵니다. 비슷한 결과를 나타낼 때는 아무래도 compiler의 optimize 기능 때문인 것 같긴 합니다만......

명쾌한 답변 좀 부탁드리겠습니다!!!

mirr187의 이미지

for 와 while 두가지를 얘기할 때 가장 많이들 얘기하는 올바른 사용법(?)은 다음과 같습니다.

for 문은 특정한 범위를 가진 loop 에 이용하고,
while 문은 조건에 만족하는 결과를 얻기 위한 loop 에 이용된다는 거죠..

for 문의 경우 사용법의 특성상 loop의 범위가 정해져 있죠? 반면에 while 문 자체로는 loop의 범위가 정해져 있지 않습니다. 어떠한 특정한 조건에 해당하는 값이 올 때까지 loop라는거죠..

물론, 얘기하신 대로 서로간의 대치도 가능합니다.

ifree의 이미지

양천서.cpp

//100대까지만 팬다
for(int i = 0; i < 100; ++i)
{
hit();
if(confession()) break;
}

//자백할 때까지 팬다
while(!confession())
{
hit();
if(die()) break;
}

raymundo의 이미지

KLDP 에서 봤던 코드 중에 가장 인상깊은 코드입니다.

좋은 하루 되세요!

imposno의 이미지

//100대까지만 팬다
for(int i = 0; i < 100; ++i)
{
hit();
if(confession() || die()) break;
}

//자백할 때까지 팬다
while(!confession())
{
hit();
if(die()) break;
}

100대만 때리기로 결정했는데 confession 하거나 die하면 그만 해야겠죠?
모.. die해도 때릴수 있지만 암튼 적절한 예제였던것 같습니다.^^

jsk의 이미지

정말 와닿는 예네요^^

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

neocoin의 이미지

정말 머리에 쏙쏙 들어오는 설명이네요.

snowall의 이미지

라이센스 조건이 어떻게 되나요? 인용하고 싶습니다.

--------------------------
피할 수 있을때 즐겨라!
http://snowall.tistory.com

피할 수 있을때 즐겨라! http://melotopia.net/b

ifree의 이미지

CopyLeft 입니당

익명 사용자의 이미지

//100대까지만 팬다
for(;;)
{
hit();
if(confession()) break;
}

//자백할 때까지 팬다
while(!confession())
{
hit();
if(die()) break;
}

익명 사용자의 이미지

for문은 일단 한대 때리고 자백했는지 확인하는 것이고
while문은 자백했는지 확인하고 안했으면 때리는 것이네요.

익명 사용자의 이미지

참 대단하네요.
이런 것까지 정치적으로 이용해 먹는 수법들이...

존경스럽습니다.

지나가던사람의 이미지

오랬만에 봤는데 빵터지네요

comafast의 이미지

KLDP 에서 봤던 코드 중에 가장 인상깊은 코드입니다. 2

태산이높다하되의 이미지

KLDP 에서 봤던 코드 중에 가장 인상깊은 코드입니다. 3
------------------------------
서투른 목수는 다 탓 한다

------------------------------
서투른 목수는 다 탓 한다

parkssie의 이미지

KLDP 에서 봤던 코드 중에 가장 인상깊은 코드입니다. 4

Software Developer

라스코니의 이미지

이게 빠질 수 없겠네요...
일단 패고 본다...

do {
hit();
}
while(!confession())

keedi의 이미지

KLDP 에서 봤던 코드 중에 가장 인상깊은 코드입니다. 5

----
use perl;

Keedi Kim

----
use perl;

Keedi Kim

bluesky.big의 이미지

덕분에 빨리 이해가 되었습니다.
감사합니다.

cleansugar의 이미지

기능이 겹치는 것 맞습니다.

단지 읽기 편하라고 두 가지가 있는 거지요.

컴파일러가 동일한 결과로 번역한다고 알고 있습니다.

___________________

http://blog.aaidee.com

재벌 2세가 재벌이 될 확률과
금메달리스트 2세가 금메달을 딸 확률이 비슷해지도록
자유오픈소스 대안화폐를 씁시다.

아이디의 아이디어 무한도전
http://blog.aaidee.com

귀태닷컴
http://www.gwitae.com

bluesky.big의 이미지

제가 알기론 동일하게 컴파일되지 않는 것으로 알고 있습니다.
컴파일러에서 optimize 옵션을 주지 않으면 상당히 다른 assemble 코드가 생성되었습니다.
전에 간단하게 1~100000 까지 a=a+i; 이런식으로 해봤는데 assemble 코드가 상당히 다르던데요?
그래서 제가 주제글에 속도는 for <= while 이라고 적었습니다만...
혹시 제가 알고 있는 것이 잘못되었다면 바로 잡아주시기 바랍니다.

jick의 이미지

한가지 확실한 것은 "동일한 동작을 하는 코드를 생성해야 한다"입니다.

그런데 문제는 "동일한 동작을 하는 코드"는 여러 개가 있을 수 있다는 거죠. 컴파일러가 그중 뭘 선택하느냐는 컴파일러 마음대로입니다.

그런데 일반적으로 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++;
}

동작은 정확히 같을 것 같습니다만......

sangwoo의 이미지

for 문을 이렇게 바꿔서 테스트해봐도 다르르려나요?

sum = 0;
i = 0;
for (; i < 100; ) {
    sum += i;
    i++;
}

----
Let's shut up and code.

----
Let's shut up and code.

evax의 이미지

while문에 루프 언롤링 같은 최적화를 컴파일러가 적용하긴 어렵겠지요
반면 카운트 다운 do{}while 같은 경우엔 for문제 적용하기 힘들고요

그냥 단순하게 for <= while 이라고 생각하시면 안됨니다.....

아무튼 가장 중요한건 가독성 == 많이 쓰이는 형태로 할것
그래야 남도 편하고 자기도 편함니다.

phw0317의 이미지

예를 잘 보고 갑니다 ㅋ

라스코니의 이미지

ㅎㅎ 하나 더 추가

AAA:
while()
{
}

goto AAA;

끝난거 아니다.. 방심마라... ㅋㅋ

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.