for(;;) vs while(1)

gurumong의 이미지

안녕하세요
얼마전에 아는 친구놈이 공부를 한다고 작성한 소스코드를 보았습니다
그런데 한 문장이 이상하게 보이더라구요
버뜨~! 그래서 컴파일을 했떠니 정상적으로 실행이 되는거였습니다

for(;;)라는 코드인데
제가 알기론 for문은 while문과 마찬가지로 조건식이 만족하는 동안 루프문을 도는걸로 알고있는데요
그런데 조건식이 아예 비여있는데 그것이 참값이 되는것인지 좀 의야했는데

아예 무한 루프를 만들것이면 (어떤 조건에 의해서 언젠가 탈출 하겠지만)
좀더 이쁘게 보이는 while(1)문을 쓰지 왜 for(;;)을 사용할까 궁금증이 생기더라구요

irc채널에서는 많이들 사용한다고 그러던데요
아무리 생각해봐도 이점이란게 타이핑 횟수가 1회 적다는것 이외에 안보이더라구요
왜 for(;;)문장을 많이들 사용하는것일까요?

익명사용자의 이미지

while(1)보다 for(;;)가 좀더 이쁘게 보입니다.

barmi의 이미지

for( ;; ) 에 한표...

코드읽을 때, forever라고 읽습니다. ^^;;

gamdora의 이미지

forever에 동의 한 표입니다. :)

cppig1995의 이미지

저도 while(1)을 씁니다.
C99에서 stdbool.h를 포함한 상태나 C++에서는 "while(true)"로도 쓸수 있구요.
for(;;)은 모양이 안예쁘고 이모티콘 -_-;;의 ;;처럼 생겼어요.
------------------------------------------------------
In simplexitate est opportunitas. --cppig1995
[낡배밀] 낡은 리눅스 배포판을 밀어내야 한다고 생각합니다.

Real programmers /* don't */ comment their code.
If it was hard to write, it should be /* hard to */ read.

ohhara의 이미지

저는 for (;;)를 씁니다.
누구한테 들은 얘기로(?) 구린 오래된 컴파일러를 쓰면 while (1)으로 했을 때 loop돌 때마다 1이 0이 아닌지 체크한다고 하더군요. (헛소리일지도. ^^;)

Taeho Oh ( ohhara@postech.edu , ohhara@plus.or.kr ) http://ohhara.sarang.net
Postech ( Pohang University of Science and Technology ) http://www.postech.edu
Digital Media Professionals Inc. http://www.dmprof.com

Taeho Oh ( ohhara@postech.edu ) http://ohhara.sarang.net
Postech ( Pohang University of Science and Technology ) http://www.postech.edu
Alticast Corp. http://www.alticast.com

cmoh1110의 이미지

얼마나 구린 컴파일러인지는 모르겠지만, 최소한 제가 쓰고 있는 gcc-3.4.6에서는
for(;;)나 while(1)이나 어셈블 코드는 똑같이 나오네요.

bash-3.00.15 $ cat loop.c
#include <stdio.h>
 
void func_while(void)
{
        while(1);
}
 
void func_for(void)
{
        for(;;);
}
bash-3.00.15 $ gcc -S ./loop.c
bash-3.00.15 $ cat loop.s
        .file   "loop.c"
        .text
.globl func_while
        .type   func_while, @function
func_while:
        pushl   %ebp
        movl    %esp, %ebp
<span><span>
.L2:
        jmp     .L2
</span></span>
        .size   func_while, .-func_while
.globl func_for
        .type   func_for, @function
func_for:
        pushl   %ebp
        movl    %esp, %ebp
<span><span>
.L5:
        jmp     .L5
</span></span>
        .size   func_for, .-func_for
        .section        .note.GNU-stack,"",@progbits
        .ident  "GCC: (GNU) 3.4.6 20060404 (Red Hat 3.4.6-3)"
bash-3.00.15 $
ohhara의 이미지

gcc-3.4.6정도면 상당히 최신의 상당히 좋은 컴파일러라고 생각합니다. -_-;;;

Taeho Oh ( ohhara@postech.edu , ohhara@plus.or.kr ) http://ohhara.sarang.net
Postech ( Pohang University of Science and Technology ) http://www.postech.edu
Digital Media Professionals Inc. http://www.dmprof.com

Taeho Oh ( ohhara@postech.edu ) http://ohhara.sarang.net
Postech ( Pohang University of Science and Technology ) http://www.postech.edu
Alticast Corp. http://www.alticast.com

han9551의 이미지

GCC-1.27에서 해봤는데도, 결과가 같습니다.
거의 10년 지났지만, 나중에 찾아볼 사람이 있을 것 같아서 기록해 놓습니다.,

$ cat t.c
void use_while(void)
{
  int i=0;
  while(1)
    ++i;
}
 
void use_for(void)
{
  int i=0;
  for(;;)
    ++i;
}
 
 
$ /usr/local/gcc -version
gcc version 1.27
 
$ /usr/local/gcc -c t.c -g
 
$ gdb ./t.o
GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.2) 7.7.1
...
...
Reading symbols from ./t.o...done.
(gdb) disassemble use_while
Dump of assembler code for function use_while:
   0x00000000 <+0>:	push   %ebp
   0x00000001 <+1>:	mov    %esp,%ebp
   0x00000003 <+3>:	sub    $0x4,%esp
   0x00000006 <+0>:	movl   $0x0,-0x4(%ebp)
   0x0000000d <+0>:	incl   -0x4(%ebp)
   0x00000010 <+3>:	jmp    0xd <L2>
   0x00000012 <+0>:	leave  
   0x00000013 <+1>:	ret    
End of assembler dump.
(gdb) disassemble use_for
Dump of assembler code for function use_for:
   0x00000014 <+0>:	push   %ebp
   0x00000015 <+1>:	mov    %esp,%ebp
   0x00000017 <+3>:	sub    $0x4,%esp
   0x0000001a <+0>:	movl   $0x0,-0x4(%ebp)
   0x00000021 <+0>:	incl   -0x4(%ebp)
   0x00000024 <+0>:	jmp    0x21 <L5>
   0x00000026 <+0>:	leave  
   0x00000027 <+1>:	ret    
End of assembler dump.
thx-gg의 이미지

정보 얻어갑니다!

kall의 이미지

for(;;)라고 쓰는게 뭔가 있어보인달까요 ;;

가독성을 생각하면 while(1)같은게 한눈에 들어오긴하지만
어차피 눈에 익으면 for(;;)도 똑같아서..

----
자신을 이길 수 있는자는
무슨짓이든 할수있다..
즉..무서운 넘이란 말이지 ^-_-^
나? 아직 멀었지 ㅠㅠ

----
자신을 이길 수 있는자는
무슨짓이든 할수있다..
즉..무서운 넘이란 말이지 ^-_-^
나? 아직 멀었지 ㅠㅠ

kyagrd의 이미지

스티븐스 아저씨의 책이던가요 하여간 네트웍 프로그래밍 할 때 꼭 보는 책에 for(;;) 이렇게 되어 있던데요.

네트워크 프로그래밍 그 책으로 공부하면서 따라 쓰다 보면 for(;;) 이렇게 그냥 무심코 쓰게 되는 건지도 모르죠.

--
There's nothing so practical as a good theory. - Kurt Lewin

--
There's nothing so practical as a good theory. - Kurt Lewin
"하스켈로 배우는 프로그래밍" http://pl.pusan.ac.kr/~haskell/

hongminhee의 이미지

저도 예전에 while(1)보다 for(;;)가 빠르다는 이야기를 들은 적이 있습니다. 아마 실제로는 동일하겠지만, 배울 때 저렇게 배우면 습관으로 굳어질 수도 있을 것 같습니다. 저는 while(1)을 사용합니다~

Scarecrow의 이미지

while(1)뿐만 아니라
while("infinite"), while(69), while(3.14) 전부 무한루프가 됩니다.
즉 0이 아닌값이면 계속 수행되는거죠.
조건식의 값을 상수로 줘서 무한루프로 만들어 버린 경우라 할 수 있죠...
(상수는 말그대로 값이 안 변하니까 무한이죠.)

물론 같은 원리로 for(;"infinite";)도 무한루프로 동작합니다.

그런데 for(;;)같은 형식은 조건식의 값으로 상수를 주어 무한루프로 만들었다기 보다
조건식이 생략되었을때 for문은 무한루프와 같이 동작한다는 C언어 규정에 따르는 동작이겠지요.
그러니까 그렇게 동작이 되는거죠. 그런 규정이 없다면 문법오류가 되겠지만
문법오류가 아니고 무한루프로 수행이 된다는건 그런 규정이 따로 있다는 것입니다.

정리하면 C언어는 무한루프에 대해서 for(;;)와 같은 규정을 가지고 있다고 생각할 수 있습니다.
그래서 전 상수를 사용한 트릭적인 방법보다 언어에서 규정하고 있는 듯한 방법인
for(;;)를 더 선호합니다.

시그너쳐: ./configure --prefix=/usr; make; sudo checkinstall

whitelazy의 이미지

while(1)이랑 for(;;)랑 섞어 쓰다가 언젠가 for(;;)구문이 더 빠를수도 있다고 들어서 for를 더 쓰다보니 습관이 되더군요
좋은 컴파일러들이야 당연히 다 비슷하겠지만 습관이란게...;;;

cronex의 이미지

개인적으로는 가능하면 while(1)이나 for(;;)등의 무한루프는 가능하면 안씁니다.
물론 편하기는 합니다만 가독성이 떨어진다랄까.... 그런 느낌이 들어서요.
만약 조건을 나중에 검사 해야 하는 경우가 생기면 보통 do ~ while 문을 사용하는 편입니다.

------------------------------------------------------------
이 멍청이~! 나한테 이길 수 있다고 생각했었냐~?
광란의 귀공자 데코스 와이즈멜 님이라구~!

------------------------------------------------------------
이 멍청이~! 나한테 이길 수 있다고 생각했었냐~?
광란의 귀공자 데코스 와이즈멜 님이라구~!

whitenoise의 이미지

굳이 for 문의 이점이라고 갖다 붙이자면,

혹시 코드 테스트하느라 루프에 test condition 넣었다 뺐다 해야 할 경우가 있을 때 initialize, test, increment 를 한 줄에서 해결할 수 있다는 점 정도..

chadr의 이미지

사실 while(1) 하는것보단.. for(;;) 하는게 타자 수도 더 적고
1을 칠려면 위에까지 올라가야하지만 ;; 을 칠려면 세끼손가락 연타만 두번 해주면 되기때문에..
단순하 귀차니즘을 for(;;)을 쓰기도 합니다;
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

prether의 이미지

전 future proofing을 위해 for(;;)을 씁니다.

나중에 초기화, exit 조건, STEP등이 들어갈걸 대비해서요

/***************************************
Being the one is just like being in love.
***************************************/

while(1)의 이미지

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