C 프로그래밍에서 대?


78

이 C 세 루프는 다음과 같습니다 for, while그리고 do-while. 그들 사이의 차이점은 무엇입니까?

예를 들어 거의 모든 while진술이 진술로 대체 될 수있는 것 같습니다 for. 그렇다면 어떤 이점이 while있습니까?


9
조건부 GOTO루프를 잊었습니다 . 사람들은 그것을 루프로 생각하지 않지만 모든 루프는 본질적으로 조건부 GOTO 루프로 컴파일됩니다.
Armstrongest

1
재귀도 루프로 간주되지 않습니까?
Nyan

이 컴파일러를 쓰기 쉽게되지 않을 것 그보다 효율적으로 루프 86 ISA 컴파일 간단한에서 loop보다 명령 (뺄셈, 비교 및 단일 명령에 점프), 그 컴파일 whileloop지시? 현재 컴파일러 forloop명령어로 컴파일 됩니까?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

답변:


166

동안 루프는 항상 먼저 조건을 평가합니다.

A는 루프 동안 / 할 항상에서 코드를 실행할 do{}첫 번째 블록을 다음 조건을 평가합니다.

루프는 당신이 카운터 변수, 체크 상태, 한 줄에 모든 카운터를 증가하는 방법을 개시 할 수 있습니다.

하루가 끝나면 모두 여전히 루프이지만 실행 방법에 대한 유연성을 제공합니다.

다음은 문제를 해결하는 데 도움이 될 수있는 서로 다른 유형의 루프를 사용 하는 이유에 대한 훌륭한 설명입니다 . 감사합니다 clyfe

사이의 주요 차이점 for의와 while의는 화용론의 문제이다 : 우리가 일반적으로 사용for 반복 알려진 수있을 때, 사용의 while구조 할 때 사전에 알려져 있지에서 반복 횟수. whiledo ... while 문제는 두 번째 시작 한 번에 명령을 실행, 어용으로도, 그리고 나중에 그냥 동안 간단한처럼 동작합니다.


For 루프는 간결하기 때문에 특히 좋습니다. 이 for 루프의 경우 :

while 루프로 작성하려면 다음을 수행해야합니다.

이 경우 따라 count++;잡아야 할 것이 더 많으며 논리에서 손실 될 수 있습니다. 이것은 위치에 따라 번거로울 수 있습니다.count 증가 와 루프의 논리 전후에 증가해야하는지 여부 있습니다. for루프를 사용하면 카운터 변수는 항상 루프의 다음 반복 전에 증가하여 코드에 일부 균일 성을 추가합니다.


완성도를 위해 이야기 break하고continue 여기에서 루프 처리를 수행 할 때 유용하게 사용되는 진술 .

break 는 현재 루프를 즉시 종료하고 더 이상 반복이 실행되지 않습니다.

continue현재 반복 을 종료 하고 다음 반복 으로 이동합니다.

for 루프에서 유의 continue평가 part3의 표현 for (part1; part2; part3); 반대로 while 루프에서는 루프 조건을 재평가하기 위해 점프합니다.


7
'계속'의 행동에 대해 논의해야합니까? 'for'루프 대 'while'루프? 그렇지 않으면 좋은 대답입니다.
Jonathan Leffler

3
+1은 훌륭한 답변입니다. 주목할만한 점은 for 루프에는 카운터 변수가 필요하지 않습니다. C 스타일 언어에서는 실제로 (<start statement>; <continuation>; <execute after each iteration>)입니다. 가장 일반적인 사용법은 카운터 변수입니다. for (int x = 0 [start]; x <100 [continue?]; ++ x [post-iteration])
Sean Edwards

10
사이의 주요 차이점 for's과는 while's우리가 일반적으로 사용 어용의 문제이다 for있을 때 반복 알려진 번호 , 사용의 while구조 할 때 사전에 알려져 있지에서 반복 횟수 . whiledo ... while문제는 두 번째 지침 실행, 어용으로도 한 번 시작시, 그리고 나중에 그냥 간단한처럼 작동합니다 while.
clyfe

2
, 때로는 "기본"을 재 방문 +1 잘 쓰여진 대답은 모두에게 좋은
JYelton

1
나는 대답을 좋아한다. 특히 'for'의 경우 카운터를 증가시킬 때 균일성에 대해 이야기하는 부분과 'while'의 경우 잠재적으로 반복의 어느 곳에서나 이야기하는 부분을 좋아한다. 솔직히 말해서, 여기에 새로운 것은 많지 않지만 그렇게 설득력있게 말하지 않았을 것입니다
Shravan

16

속도와 성능에 대한 강한 우려가있는 경우 가장 좋은 방법은 어셈블리 수준에서 컴파일러가 생성 한 코드를 확인하는 것입니다.

예를 들어, 다음 코드는 "do-while"이 조금 더 빠르다는 것을 보여줍니다. 이것은 "jmp"명령어가 "do-while"루프에서 사용되지 않기 때문입니다.

BTW,이 특정 예에서 최악의 경우는 "for"루프에 의해 제공됩니다. :))

// "FOR"루프 :

// "WHILE"루프 :

// "DO-WHILE"루프 :


11

가독성을 위해


3
이를 위해 goto를 루프로 사용할 수도 있습니다.
WhirlWind

또 다른 문제는 재귀입니다. 그리고 모든 스타일의 루프를 다른 스타일로 바꿀 수 있습니다.
WhirlWind

10
사실 ... 모든 루프는 정말 멋진 GOTO 브랜치입니다.
Armstrongest

@WhirlWind 재귀가없는 언어에서는 스택 오버플로로 끝날 것입니다. (그리고 당신은 나를 조금 미소를 만들 것 스택 오버 플로우에 대해 물어 여기에 끝낼 수 있습니다.)
숀 에드워즈

@Sean 그래, 나는 그것에 대해 생각하고 있었고 스택 오버플로를 피할 수있는 방법이 있다면. 물론 꼬리 재귀가 있다면 ...
WhirlWind 2010-06-01

10

그것들은 모두 상호 교환 가능합니다. 당신은 하나의 유형을 선택하고 영원히 사용할 수 있지만 일반적으로 주어진 작업에 대해 하나가 더 편리합니다. "왜 스위치가 있고 if 문을 여러 개 사용할 수 있습니다"라고 말하는 것과 같습니다. 사실이지만 변수에서 값 집합을 확인하는 것이 일반적인 패턴이라면 언어 기능이 있으면 편리하고 읽기가 훨씬 쉽습니다. 하기 위해서


4
별로. for와 while은 모두 본문을 0 번 실행할 수 있습니다. do-while은 실행할 수 없습니다.

4
@Neil do {if(!cond) break; /* do stuff */ } while(cond);. 추악하고 반복적이지만, 변형이 존재하는 이유에 대한 내 요점입니다. :)
Michael Mrozek

@Neil : 추가 플래그를 사용하여 첫 번째 실행을 건너 뛸 수 있습니다. Interchangeable은 그것이 얼마나 쉽고 유용한 지에 대해 아무것도 말하지 않습니다. ;)
보안

3
루프의 본문은 여전히 ​​입력되어 있습니다. 이는 while 및 for의 경우가 아닙니다.

2
@Neil 글쎄, "루프의 몸체"의 특정 정의에 대해. 이 같은 문제가 어느 쪽이든의 원인 - 그것은 실행되지 않는 /* do stuff */경우 일부 cond거짓
마이클 Mrozek

8

특정 반복 횟수가 아니라 조건이 참인 동안 루프를 실행하려면 다른 사람이 이해하기가 훨씬 쉽습니다.

다음과 같은 것보다 :


나는 훨씬 쉬운 것에 대해 모른다 . C에 첫 번째 형식이 없다면 지금 쯤이면 두 번째 형식을 보는 데 익숙 할 것이라고 추측 할 수 있습니다.
caf

공정한 충분하지만, 난 내가 유지 된 코드의 두 번째 버전을 본다면 나는 ... "WTF"를 생각하고있을 것입니다 보장
저스틴 이디어

2
코드는 산문으로 읽어야하며 전자는 자연어에 훨씬 더 가깝습니다. 아마도 "훨씬 쉬울 것"은 아니지만 인식하고 이해하는 데 훨씬 더 빠를 것입니다.
FredCooke 2014

5

for루프는 본질적으로 멋진 while루프 라는 것을 기억하십시오 . 그들은 같은 것입니다.

for 루프의 장점은 실수로 무한 루프를 수행하는 것이 더 어렵다는 것입니다. 또는 일반적으로 초기 문에 루프 var를 배치하기 때문에 하나를 수행 할 때 더 분명합니다.

while당신이 표준 증분 패턴을 수행하지 않을 때 루프는 더 분명하다. 예를 들면 :


6
for ()와 while () 사이에 미묘한 차이가 하나 있습니다. continue의 동작을 변경합니다. for () 경우 continue는 조건을 확인하기 전에 증분 ​​단계를 실행하는 반면 while () continue는 조건으로 곧바로 돌아갑니다.
Rup

예, 아주 좋은 지적입니다. 또한 사람들이 잊어 버린 것은 그것이 내려올 때 모든 루프가 GOTO 문으로 컴파일된다는 것입니다.
Armstrongest

이것이 while 루프가 더 자주 무한 루프 버그로 이어지는 이유라고 생각합니다. 증가 단계는 어딘가에서 계속해서 건너 뛸 수 있습니다.
Michael Mathews

@Michael : 네, 매우 사실입니다. for루프는 아마도 편리하고 생산적인 방법으로 도입되었을 것입니다.
Armstrongest

@Rup 아주 좋은 지적입니다. 나는 항상 한동안 통사론 적 설탕으로 간주했지만, 계속되는 행동은 그것이 사실이 아니라는 것을 의미합니다.
JeremyP

4

필요에 가장 잘 맞는 루프를 사용해야합니다. 예를 들면 :

분명히 그러한 상황에서 "for"는 "while"보다 더 좋아 보입니다. 그리고 "do while"은 루프의 상태가 확인되기 전에 이미 일부 작업을 수행해야 할 때 사용됩니다.

내 하찮은 영어 실력에 죄송하다는 말씀을 드리고 싶습니다).


4

내가 본 while/ for루프에 대한 일반적인 오해 중 하나 는 효율성이 다르다는 것입니다.While루프와 for루프는 똑같이 효율적 입니다. 고등학교의 컴퓨터 교사가 숫자를 늘려야 할 때 for 루프가 반복에 더 효율적이라고 말했습니다. 그것은 사실이 아닙니다.

For 루프는 단순히 구문 적으로 설탕 while 루프이며 반복 코드를 더 빠르게 작성합니다.

컴파일러가 코드를 가져와 컴파일 할 때 컴퓨터가 더 낮은 수준 (어셈블리)에서 이해하고 실행하기 쉬운 형식으로 변환합니다. 이 번역 과정에서 구문 whilefor구문 사이의 미묘한 차이 가 사라지고 정확히 동일 해집니다.


"For 회 돌이는 단순히 구문 상 당이있는 while 회 돌이입니다": 위의 주석 중 하나에서 이미 지적했듯이 이것은 엄격하게 정확하지 않습니다. A는 내부에 계속 A (루프 식 무시하지 않습니다에 대한 예에서 나는 ++ for (i = 0 i < limit ; i++).
JeremyP

3

for 고정 된 반복은 인덱스를 사용하거나이 방식을 변형 좋습니다.

whiledo... while 마다 점검해야하는 조건이있을 때하는 구조가 사용 (떨어져 일부 인덱스 모두 건설에서가, 위 참조). 조건 검사의 첫 번째 실행이 수행 될 때 차이가 있습니다.

두 구조 중 하나를 사용할 수 있지만 사용 사례에 따라 장점과 단점이 있습니다.


3

얼마 전에 For 루프가 일반적으로 while 루프보다 더 많은 기계 명령어를 생성한다는 것을 알았습니다. 그러나 내 관찰을 반영하는 예제를 자세히 살펴보면 그 차이는 2 ~ 3 개의 기계 명령으로 크게 고려할 가치가 없습니다.

또한 WHILE 루프의 이니셜 라이저는 코드에 베이킹하여 제거 할 수 있습니다. 예 :

정적 수정자는 초기 값을 코드에 구워서 하나를 저장합니다 (드럼 롤). MOV 명령을 합니다. 더 중요한 것은 변수를 정적으로 표시하면 스택 프레임 밖으로 이동합니다. 변수 정렬이 허용되면 MOV 명령어와 해당 피연산자가 정수, 부울 또는 문자 값 (ANSI 또는 유니 코드)보다 더 많은 공간을 차지하므로 약간 더 작은 코드도 생성 할 수 있습니다.

그러나 변수가 8 바이트 경계로 정렬되는 경우 공통 기본 설정, 코드에 구워진 int, bool 또는 TCHAR은 MOV 명령어와 동일한 바이트 수를 사용합니다.


2

그들은 그들이하는 일에서 모두 동일합니다. 이들 중 하나를 사용하여 동일한 작업을 수행 할 수 있습니다. 그러나 가독성, 유용성, 편의성 등을 위해 다릅니다.


2

while과 do-while의 차이점은 while이 루프 조건을 확인하고 이것이 참이면 본문이 실행되고 조건이 다시 확인된다는 것입니다. do-while은 본문 실행 후 조건을 확인하므로 do-while은 본문이 적어도 한 번 실행됩니다.

물론 do-while 및 vv로 while 루프를 작성할 수 있지만 일반적으로 코드 복제가 필요합니다.


2

의 한 가지 특징은 do while완료하려면 잠시 후에 세미콜론이 필요하다는 것입니다. 매크로의 영향을 제한하면서 여러 문을 한 번만 실행하기 위해 매크로 정의에서 자주 사용됩니다. 블록으로 정의 된 매크로의 경우 일부 구문 분석 오류가 발생할 수 있습니다.

다른 설명 중 하나


1
그것은 끔찍하게 hackish하지만 큰 이유는 do-while존재 하지 않습니다
Michael Mrozek

아니요, 저는 그런 말을 한 적이 없습니다.하지만 그것은 do-while에 대해 정말 특별한 사용법 중 하나입니다.
LB40

@Michael 예 그것은 해킹이지만 여러 문장을 포함하는 매크로가 모든 구문 컨텍스트에서 예상대로 완전히 작동하도록 만드는 정말 일반적으로 사용되는 것입니다.
JeremyP 2010-06-02

내가 아는 @JeremyP, 나도 그것을 사용하지만에 대한 실제 사용 사례 않다 do-while가 그냥 블록을 생성하는 일이 있기 때문에 사용되는, 여전히 끝에 세미콜론을 필요로
마이클 Mrozek

나는 단지 do-while의 특정 사용법을 지적하고 싶었습니다. 질문의 일부는 차이점이 무엇인지였습니다. 그게 하나의 차이점입니다. (하지만 동의합니다. hackish)
LB40

2

For 루프 (적어도 C99를 고려하면)는 증가 된 변수의 범위를 제한하기 때문에 while 루프보다 우수합니다.

Do while 루프는 조건이 일부 입력에 종속 될 때 유용합니다. 세 가지 루프 유형 중 가장 드물게 사용됩니다.


2

for와 while 사이 : while 초기화 나 업데이트 문이 필요하지 않으므로 더 멋지고 우아하게 보일 수 있습니다. for문이 하나 둘 또는 모두 누락 될 수 있으므로 루프 전에 초기화, 루핑 조건 및 "업데이트"가 필요한 경우 가장 유연하고 분명합니다. 루프 조건 (루프 시작 부분에서 테스트 됨) 만 필요하면 while더 우아합니다.

for / while과 do-while 사이 : do-while조건에서 루프의 끝에서 평가됩니다. 루프를 한 번 이상 실행해야하는 경우 더 편리합니다.


2

WHILE은 더 유연합니다. FOR는 적용되는 경우에 더 간결합니다.

FOR는 어떤 종류의 카운터가있는 for 루프에 좋습니다.

물론 다른 사람들이 지적했듯이 WHILE을 사용하여 동일한 작업을 수행 할 수 있지만 이제 초기화, 테스트 및 증가가 세 줄로 나뉩니다. 루프의 몸체가 큰 경우 넓게 분리 된 세 줄이 가능합니다. 이것은 독자가 당신이하고있는 것을보기 어렵게 만듭니다. 결국 "++ n"은 FOR의 매우 일반적인 세 ​​번째 부분이지만 이것이 유일한 가능성은 아닙니다. "n + = increment"또는 좀 더 복잡한 표현을 쓰는 루프를 많이 작성했습니다.

FOR는 물론 카운터 이외의 것들과도 잘 작동합니다. 처럼

기타.

그러나 FOR는 "루프를 통한 다음 시간"논리가 더 복잡해지면 중단됩니다. 중히 여기다:

즉, 처리 중 발생하는 조건에 따라 진행 과정이 다를 수있는 경우 FOR 문은 실용적이지 않습니다. 예, 때로는 충분히 복잡한 표현식, 삼항? : 연산자 등을 사용하여 작동하도록 만들 수 있지만 일반적으로 코드를 읽기보다는 읽기 어렵게 만듭니다.

실제로, 대부분의 루프는 배열이나 어떤 종류의 구조를 단계별로 실행합니다.이 경우 FOR 루프를 사용합니다. 또는 데이터베이스에서 파일 또는 결과 집합을 읽는 중입니다.이 경우 WHILE 루프 ( "while (! eof ())"또는 이와 비슷한 종류)를 사용합니다.


for 헤더가 길어지면 세미콜론 뒤에 줄을 나눕니다. 이것은 for 대신 while에 대한 논쟁이 아닙니다.
klutt

@klutt 중첩 된 삼항 연산자와 6 개 수준의 괄호 또는 비슷한 복잡성을 포함하는 길고 관련된 표현의 문제는 그 줄이 편집기 창에 맞지 ​​않는 너무 길다는 것이 아니라 읽고 이해하기 어려워진다는 것입니다.
Jay

사실이지만 어떤 종류의 루프를 선택하는지와는 관련이 없습니다.
klutt

@klutt 물론입니다. "다음"작업에 여러 조건이있는 복잡한 논리가 포함 된 경우 FOR 루프에 쉽게 배치 할 수 없습니다. 중첩 된 삼진 또는 일부가 포함 된 복잡한 표현식을 가져야하거나 FOR 문에서 다음 항목을 가져 와서 루프 본문에 넣어야합니다. 어느 시점에서 WHILE 루프를 작성하는 것이 좋습니다.
Jay

2

do-while루프를 제외하고는 거의 동일 합니다. for당신이있을 때 루프는 좋은 counter변수의 종류. 그것은 명백합니다. while루프는 아래와 같이 플래그가 확인되는 경우에 의미가 있습니다.


0

whilefor문은 모두 프로그래밍에서 루핑에 사용할 수 있습니다. while루프 또는 for루프 사용 여부는 프로그래머에 따라 다릅니다 . 일부는 while루프를 사용하는 것이 편안 하고 일부는for 루프가 있습니다.

원하는 루프를 사용하십시오. 그러나 do...while루프는 C 프로그래밍에서 다소 까다로울 수 있습니다 .


1
while, do whilefor루프 간에는 일관된 차이점이 있습니다. 상위 답변을 살펴보면 찾을 수 있습니다.
Avio

0

/ * while 루프

5 달러

초콜릿 1 개 = 1 달러

내 돈 = 0 달러 * /

무한한 돈

더 나은 이해를 위해이 비디오를 방문하십시오 https://www.youtube.com/watch?v=eqDv2wxDMJ8&t=25s

/ * for 루프

5 달러

* /

더 나은 이해를 위해 https://www.youtube.com/watch?v=_vdvyzzp-R4&t=25s 를 방문 하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.