C언어 while문과 for문의 차이는 무엇일까요?

hbdhmj819의 이미지

보통 for문과 while문의 차이라고 하면 for문은 특정 범위 안(특정 횟수)에서 반복하는 것이고, while문은 조건이 참인 동안에 반복을 한다고 합니다.

python 같은 경우에는 이 설명에 딱 맞는데, C언어나 JAVA는 초기식, 조건식, 증감식 생략으로 무한 루프로 돌릴 수도 있고, 아니더라도 while문과 같은 방식?으로 코드를 반복하는 게 가능합니다. 그 역으로 for문 코드를 while문으로 변환해서 사용하는 것도 가능하고요.

그렇다면 굳이 for문과 while문 두 개가 존재하는 이유는 무엇일까요? 처음에는 for문은 일단 한 번은 실행하지만 while문은 조건이 거짓이면 아예 실행을 하지 않는 게 차이라고 생각했는데 for문도 조건식 부분을 손 보면 아예 실행하지 않는 게 가능하고....

아무리 생각해도 차이점을 모르겠네요. 예전에 테스트해봤을 때는 둘이 실행 시간에도 차이가 없었던 것으로 기억합니다.

익명 사용자의 이미지

Quote:
python 같은 경우에는 이 설명에 딱 맞는데

python의 경우에도 for문을 조건이 참인 동안 반복하는 데, while문을 특정 범위 안(특정 횟수)에서 반복하는 데 쓸 수 있습니다.

그렇게 쓰는 게 자연스럽지 않을 뿐더러 (python의 철학에 어긋나기도 하고요) 코드를 읽는 사람의 기대를 배신하기 때문에 별로 권장되지 않을 뿐이지요.

C언어의 경우에도 마찬가지입니다. for문과 while문 모두 서로를 대신하여 쓰일 수 있을 만큼 충분히 유연합니다.

원래 언어 문법이 유연할수록 같은 의도를 나타낼 수 있는 두 가지 이상의 방법이 있는 경우가 많아집니다.

======

결국 프로그래머가 뚜렷한 의도를 가지고 for문이든 while문이든 합리적인 형태로 표현한다면, 컴파일러가 받아들여서 해석한 결과인 control flow는 동일할 수밖에 없습니다.

그러니 for과 while의 차이는 결국,
(1) 어느 쪽이 내 의도를 좀 더 편하게, 간결하게 나타낼 수 있는가
(2) 다른 프로그래머들이 읽었을 때 어느 쪽이 내 의도를 좀 더 직접적으로 드러내는가,
정도의 차이일 뿐입니다.

말씀하신 대로, for문을 보면 대체로 프로그래머들은 정해진 범위 혹은 횟수를 반복할 거라고 기대합니다.
while문을 보면 정해진 조건이 만족되는 동안 확실하지 않은 횟수를 반복할 거라고 기대하지요.

그 기대를 배신하는 건 가능하지만 권장되지 않습니다. 그 뿐입니다.

라스코니의 이미지

for 문과 while 문은 조금씩 손보면 완전히 동일하게 상호 호환되죠.

for 문이 조금더 패키징(?) 가능한게 for(초기화; 조건문; 변경문) 식이기 때문에 while(조건문) 문 보다는 좀더 쓰임새가 있다고 보이지만...... 개인적으로 저는 for 문 보다는 while 문을 좋아합니다.

물론 단순 증감 동작만 필요할때는 for 문이죠. 결국은 가독성 차이라고 봅니다.
for 문이 확 이해가 잘되는 편이면 for 문이 취향에 맞는거죠.

그러고보니 이 논쟁은 자칫하면 big-endian, little-endian 논쟁으로 발전할 수도 있겠네요. ^^

pronaman의 이미지

영어권에서 for 5 years 라고 하고 while I sleep이라고 하잖아요. 결국 사용자의 의도륾 명확히 알고 가독성을 높이기 위해 두가지가 있는거죠. for는 몇번 돌지 알때 쓰는 거고, while은 어떤 조건이 만족하는동안이란 개발자의 의도를 파악하는데 도움이 됩니다. for(;;)이런식으로 쓰고 그 안에서 조건을 써서 분기하는건 가독성에 불필요하죠. 가독성은 가장 중요한 요소중 하나입니다.

chocokeki의 이미지

embedded 시스템에서는 디버깅할 때 step by step 진행시 for 루프는 가끔 이상하게 디버깅 되는 케이스가 있기 때문에 while이 편합니다

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.