이 C 세 루프는 다음과 같습니다 for
, while
그리고 do-while
. 그들 사이의 차이점은 무엇입니까?
예를 들어 거의 모든 while
진술이 진술로 대체 될 수있는 것 같습니다 for
. 그렇다면 어떤 이점이 while
있습니까?
이 C 세 루프는 다음과 같습니다 for
, while
그리고 do-while
. 그들 사이의 차이점은 무엇입니까?
예를 들어 거의 모든 while
진술이 진술로 대체 될 수있는 것 같습니다 for
. 그렇다면 어떤 이점이 while
있습니까?
loop
보다 명령 (뺄셈, 비교 및 단일 명령에 점프), 그 컴파일 while
에 loop
지시? 현재 컴파일러 for
는 loop
명령어로 컴파일 됩니까?
답변:
동안 루프는 항상 먼저 조건을 평가합니다.
while (condition) {
//gets executed after condition is checked
}
A는 루프 동안 / 할 항상에서 코드를 실행할 do{}
첫 번째 블록을 다음 조건을 평가합니다.
do {
//gets executed at least once
} while (condition);
루프는 당신이 카운터 변수, 체크 상태, 한 줄에 모든 카운터를 증가하는 방법을 개시 할 수 있습니다.
for (int x = 0; x < 100; x++) {
//executed until x >= 100
}
하루가 끝나면 모두 여전히 루프이지만 실행 방법에 대한 유연성을 제공합니다.
다음은 문제를 해결하는 데 도움이 될 수있는 서로 다른 유형의 루프를 사용 하는 이유에 대한 훌륭한 설명입니다 . 감사합니다 clyfe
사이의 주요 차이점
for
의와while
의는 화용론의 문제이다 : 우리가 일반적으로 사용for
반복 알려진 수있을 때, 사용의while
구조 할 때 사전에 알려져 있지에서 반복 횟수.while
대do ... while
문제는 두 번째 시작 한 번에 명령을 실행, 어용으로도, 그리고 나중에 그냥 동안 간단한처럼 동작합니다.
For 루프는 간결하기 때문에 특히 좋습니다. 이 for 루프의 경우 :
for (int x = 0; x < 100; x++) {
//executed until x >= 100
}
while 루프로 작성하려면 다음을 수행해야합니다.
int count = 0;
while (count < 100) {
//do stuff
count++;
}
이 경우 따라 count++;
잡아야 할 것이 더 많으며 논리에서 손실 될 수 있습니다. 이것은 위치에 따라 번거로울 수 있습니다.count
증가 와 루프의 논리 전후에 증가해야하는지 여부 있습니다. for
루프를 사용하면 카운터 변수는 항상 루프의 다음 반복 전에 증가하여 코드에 일부 균일 성을 추가합니다.
완성도를 위해 이야기 break
하고continue
여기에서 루프 처리를 수행 할 때 유용하게 사용되는 진술 .
break 는 현재 루프를 즉시 종료하고 더 이상 반복이 실행되지 않습니다.
//will only run "do stuff" twice
for (int x = 0; x < 100; x++) {
if (x == 2) {
break;
}
//do stuff
}
continue 는 현재 반복 을 종료 하고 다음 반복 으로 이동합니다.
//will run "do stuff" until x >= 100 except for when x = 2
for (int x = 0; x < 100; x++) {
if (x == 2) {
continue;
}
//do stuff
}
for 루프에서 유의 continue
평가 part3
의 표현 for (part1; part2; part3)
; 반대로 while 루프에서는 루프 조건을 재평가하기 위해 점프합니다.
for's
과는 while's
우리가 일반적으로 사용 어용의 문제이다 for
있을 때 반복 알려진 번호 , 사용의 while
구조 할 때 사전에 알려져 있지에서 반복 횟수 . while
대 do ... while
문제는 두 번째 지침 실행, 어용으로도 한 번 시작시, 그리고 나중에 그냥 간단한처럼 작동합니다 while
.
속도와 성능에 대한 강한 우려가있는 경우 가장 좋은 방법은 어셈블리 수준에서 컴파일러가 생성 한 코드를 확인하는 것입니다.
예를 들어, 다음 코드는 "do-while"이 조금 더 빠르다는 것을 보여줍니다. 이것은 "jmp"명령어가 "do-while"루프에서 사용되지 않기 때문입니다.
BTW,이 특정 예에서 최악의 경우는 "for"루프에 의해 제공됩니다. :))
int main(int argc, char* argv[])
{
int i;
char x[100];
// "FOR" LOOP:
for (i=0; i<100; i++ )
{
x[i] = 0;
}
// "WHILE" LOOP:
i = 0;
while (i<100 )
{
x[i++] = 0;
}
// "DO-WHILE" LOOP:
i = 0;
do
{
x[i++] = 0;
}
while (i<100);
return 0;
}
// "FOR"루프 :
010013C8 mov dword ptr [ebp-0Ch],0
010013CF jmp wmain+3Ah (10013DAh)
for (i=0; i<100; i++ )
{
x[i] = 0;
010013D1 mov eax,dword ptr [ebp-0Ch] <<< UPDATE i
010013D4 add eax,1
010013D7 mov dword ptr [ebp-0Ch],eax
010013DA cmp dword ptr [ebp-0Ch],64h <<< TEST
010013DE jge wmain+4Ah (10013EAh) <<< COND JUMP
010013E0 mov eax,dword ptr [ebp-0Ch] <<< DO THE JOB..
010013E3 mov byte ptr [ebp+eax-78h],0
010013E8 jmp wmain+31h (10013D1h) <<< UNCOND JUMP
}
// "WHILE"루프 :
i = 0;
010013EA mov dword ptr [ebp-0Ch],0
while (i<100 )
{
x[i++] = 0;
010013F1 cmp dword ptr [ebp-0Ch],64h <<< TEST
010013F5 jge wmain+6Ah (100140Ah) <<< COND JUMP
010013F7 mov eax,dword ptr [ebp-0Ch] <<< DO THE JOB..
010013FA mov byte ptr [ebp+eax-78h],0
010013FF mov ecx,dword ptr [ebp-0Ch] <<< UPDATE i
01001402 add ecx,1
01001405 mov dword ptr [ebp-0Ch],ecx
01001408 jmp wmain+51h (10013F1h) <<< UNCOND JUMP
}
// "DO-WHILE"루프 :
i = 0;
. 0100140A mov dword ptr [ebp-0Ch],0
do
{
x[i++] = 0;
01001411 mov eax,dword ptr [ebp-0Ch] <<< DO THE JOB..
01001414 mov byte ptr [ebp+eax-78h],0
01001419 mov ecx,dword ptr [ebp-0Ch] <<< UPDATE i
0100141C add ecx,1
0100141F mov dword ptr [ebp-0Ch],ecx
01001422 cmp dword ptr [ebp-0Ch],64h <<< TEST
01001426 jl wmain+71h (1001411h) <<< COND JUMP
}
while (i<100);
가독성을 위해
그것들은 모두 상호 교환 가능합니다. 당신은 하나의 유형을 선택하고 영원히 사용할 수 있지만 일반적으로 주어진 작업에 대해 하나가 더 편리합니다. "왜 스위치가 있고 if 문을 여러 개 사용할 수 있습니다"라고 말하는 것과 같습니다. 사실이지만 변수에서 값 집합을 확인하는 것이 일반적인 패턴이라면 언어 기능이 있으면 편리하고 읽기가 훨씬 쉽습니다. 하기 위해서
do {if(!cond) break; /* do stuff */ } while(cond);
. 추악하고 반복적이지만, 변형이 존재하는 이유에 대한 내 요점입니다. :)
/* do stuff */
경우 일부 cond
거짓
특정 반복 횟수가 아니라 조건이 참인 동안 루프를 실행하려면 다른 사람이 이해하기가 훨씬 쉽습니다.
while (cond_true)
다음과 같은 것보다 :
for (; cond_true ; )
for
루프는 본질적으로 멋진 while
루프 라는 것을 기억하십시오 . 그들은 같은 것입니다.
while <some condition is true> {
// do some stuff
// possibly do something to change the condition
}
for ( some var, <some condition is true>; increment var ) {
}
for 루프의 장점은 실수로 무한 루프를 수행하는 것이 더 어렵다는 것입니다. 또는 일반적으로 초기 문에 루프 var를 배치하기 때문에 하나를 수행 할 때 더 분명합니다.
while
당신이 표준 증분 패턴을 수행하지 않을 때 루프는 더 분명하다. 예를 들면 :
int x = 1;
while( x != 10 ) {
if ( some condition )
x = 10;
else
x += 5;
}
for
루프는 아마도 편리하고 생산적인 방법으로 도입되었을 것입니다.
내가 본 while
/ for
루프에 대한 일반적인 오해 중 하나 는 효율성이 다르다는 것입니다.While
루프와 for
루프는 똑같이 효율적 입니다. 고등학교의 컴퓨터 교사가 숫자를 늘려야 할 때 for 루프가 반복에 더 효율적이라고 말했습니다. 그것은 사실이 아닙니다.
For
루프는 단순히 구문 적으로 설탕 while
루프이며 반복 코드를 더 빠르게 작성합니다.
컴파일러가 코드를 가져와 컴파일 할 때 컴퓨터가 더 낮은 수준 (어셈블리)에서 이해하고 실행하기 쉬운 형식으로 변환합니다. 이 번역 과정에서 구문 while
과 for
구문 사이의 미묘한 차이 가 사라지고 정확히 동일 해집니다.
for (i = 0 i < limit ; i++)
.
얼마 전에 For 루프가 일반적으로 while 루프보다 더 많은 기계 명령어를 생성한다는 것을 알았습니다. 그러나 내 관찰을 반영하는 예제를 자세히 살펴보면 그 차이는 2 ~ 3 개의 기계 명령으로 크게 고려할 가치가 없습니다.
또한 WHILE 루프의 이니셜 라이저는 코드에 베이킹하여 제거 할 수 있습니다. 예 :
static int intStartWith = 100;
정적 수정자는 초기 값을 코드에 구워서 하나를 저장합니다 (드럼 롤). MOV 명령을 합니다. 더 중요한 것은 변수를 정적으로 표시하면 스택 프레임 밖으로 이동합니다. 변수 정렬이 허용되면 MOV 명령어와 해당 피연산자가 정수, 부울 또는 문자 값 (ANSI 또는 유니 코드)보다 더 많은 공간을 차지하므로 약간 더 작은 코드도 생성 할 수 있습니다.
그러나 변수가 8 바이트 경계로 정렬되는 경우 공통 기본 설정, 코드에 구워진 int, bool 또는 TCHAR은 MOV 명령어와 동일한 바이트 수를 사용합니다.
의 한 가지 특징은 do while
완료하려면 잠시 후에 세미콜론이 필요하다는 것입니다. 매크로의 영향을 제한하면서 여러 문을 한 번만 실행하기 위해 매크로 정의에서 자주 사용됩니다. 블록으로 정의 된 매크로의 경우 일부 구문 분석 오류가 발생할 수 있습니다.
do-while
존재 하지 않습니다
do-while
가 그냥 블록을 생성하는 일이 있기 때문에 사용되는, 여전히 끝에 세미콜론을 필요로
For 루프 (적어도 C99를 고려하면)는 증가 된 변수의 범위를 제한하기 때문에 while 루프보다 우수합니다.
Do while 루프는 조건이 일부 입력에 종속 될 때 유용합니다. 세 가지 루프 유형 중 가장 드물게 사용됩니다.
for와 while 사이 : while
초기화 나 업데이트 문이 필요하지 않으므로 더 멋지고 우아하게 보일 수 있습니다. for
문이 하나 둘 또는 모두 누락 될 수 있으므로 루프 전에 초기화, 루핑 조건 및 "업데이트"가 필요한 경우 가장 유연하고 분명합니다. 루프 조건 (루프 시작 부분에서 테스트 됨) 만 필요하면 while
더 우아합니다.
for / while과 do-while 사이 : do-while
조건에서 루프의 끝에서 평가됩니다. 루프를 한 번 이상 실행해야하는 경우 더 편리합니다.
WHILE은 더 유연합니다. FOR는 적용되는 경우에 더 간결합니다.
FOR는 어떤 종류의 카운터가있는 for 루프에 좋습니다.
for (int n=0; n<max; ++n)
물론 다른 사람들이 지적했듯이 WHILE을 사용하여 동일한 작업을 수행 할 수 있지만 이제 초기화, 테스트 및 증가가 세 줄로 나뉩니다. 루프의 몸체가 큰 경우 넓게 분리 된 세 줄이 가능합니다. 이것은 독자가 당신이하고있는 것을보기 어렵게 만듭니다. 결국 "++ n"은 FOR의 매우 일반적인 세 번째 부분이지만 이것이 유일한 가능성은 아닙니다. "n + = increment"또는 좀 더 복잡한 표현을 쓰는 루프를 많이 작성했습니다.
FOR는 물론 카운터 이외의 것들과도 잘 작동합니다. 처럼
for (int n=getFirstElementFromList(); listHasMoreElements(); n=getNextElementFromList())
기타.
그러나 FOR는 "루프를 통한 다음 시간"논리가 더 복잡해지면 중단됩니다. 중히 여기다:
initializeList();
while (listHasMoreElements())
{
n=getCurrentElement();
int status=processElement(n);
if (status>0)
{
skipElements(status);
advanceElementPointer();
}
else
{
n=-status;
findElement(n);
}
}
즉, 처리 중 발생하는 조건에 따라 진행 과정이 다를 수있는 경우 FOR 문은 실용적이지 않습니다. 예, 때로는 충분히 복잡한 표현식, 삼항? : 연산자 등을 사용하여 작동하도록 만들 수 있지만 일반적으로 코드를 읽기보다는 읽기 어렵게 만듭니다.
실제로, 대부분의 루프는 배열이나 어떤 종류의 구조를 단계별로 실행합니다.이 경우 FOR 루프를 사용합니다. 또는 데이터베이스에서 파일 또는 결과 집합을 읽는 중입니다.이 경우 WHILE 루프 ( "while (! eof ())"또는 이와 비슷한 종류)를 사용합니다.
do-while
루프를 제외하고는 거의 동일 합니다. for
당신이있을 때 루프는 좋은 counter
변수의 종류. 그것은 명백합니다. while
루프는 아래와 같이 플래그가 확인되는 경우에 의미가 있습니다.
while (!done) {
if (some condtion)
done = true;
}
while
및 for
문은 모두 프로그래밍에서 루핑에 사용할 수 있습니다. while
루프 또는 for
루프 사용 여부는 프로그래머에 따라 다릅니다 . 일부는 while
루프를 사용하는 것이 편안 하고 일부는for
루프가 있습니다.
원하는 루프를 사용하십시오. 그러나 do...while
루프는 C 프로그래밍에서 다소 까다로울 수 있습니다 .
/ * while 루프
5 달러
초콜릿 1 개 = 1 달러
while my money is greater than 1 bucks
select chocolate
pay 1 bucks to the shopkeeper
money = money - 1
end
내 돈 = 0 달러 * /
#include<stdio.h>
int main(){
int money = 5;
while( money >= 1){
printf("inside the shopk and selecting chocolate\n");
printf("after selecting chocolate paying 1 bucks\n");
money = money - 1 ;
printf("my remaining moeny = %d\n", money);
printf("\n\n");
}
printf("dont have money cant go inside the shop, money = %d", money);
return 0;
}
무한한 돈
while( codition ){ // condition will always true ....infinite loop
statement(s)
}
더 나은 이해를 위해이 비디오를 방문하십시오 https://www.youtube.com/watch?v=eqDv2wxDMJ8&t=25s
/ * for 루프
5 달러
for my money is greater than equal to 1 bucks 0 money >= 1
select chocolate
pay 1 bucks to the shopkeeper
money = money - 1 1-1 => 0
end
* /
#include<stdio.h>
int main(){
int money = 5;
for( ; money >= 1; ){ 0>=1 false
printf("select chocolate \n");
printf("paying 1 bucks to the shopkeeper\n");
money = money - 1; 1-1 = 0
printf(" remaining money =%d\n", money);
printf("\n\n");
}
return 0;
}
더 나은 이해를 위해 https://www.youtube.com/watch?v=_vdvyzzp-R4&t=25s 를 방문 하십시오.
GOTO
루프를 잊었습니다 . 사람들은 그것을 루프로 생각하지 않지만 모든 루프는 본질적으로 조건부 GOTO 루프로 컴파일됩니다.