C 프로그래밍에서 대?
이 C 세 루프는 다음과 같습니다 for
, while
그리고 do-while
. 그들 사이의 차이점은 무엇입니까?
예를 들어 거의 모든 while
진술이 진술로 대체 될 수있는 것 같습니다 for
. 그렇다면 어떤 이점이 while
있습니까?
동안 루프는 항상 먼저 조건을 평가합니다.
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'는 'for (part1; part2; part3)'의 'part3'표현식을 평가합니다. 반대로 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 문을 여러 개 사용할 수 있습니다"라고 말하는 것과 같습니다. 사실이지만 변수에서 값 집합을 확인하는 것이 일반적인 패턴이라면 언어 기능이 있으면 편리하고 읽기가 훨씬 쉽습니다. 하기 위해서
특정 반복 횟수가 아니라 조건이 참인 동안 루프를 실행하려면 다른 사람이 이해하기가 훨씬 쉽습니다.
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(int i = 0; i < 10; i++)
{
print(i);
}
//or
int i = 0;
while(i < 10)
{
print(i);
i++;
}
분명히 그러한 상황에서는 "for"가 "while"보다 더 좋아 보입니다. 그리고 "do while"은 루프의 상태를 확인하기 전에 이미 일부 작업을 수행해야 할 때 사용됩니다.
내 하찮은 영어 실력에 죄송하다는 말씀을 드리고 싶습니다).
내가 본 while
/ for
루프에 대한 일반적인 오해 중 하나 는 효율성이 다르다는 것입니다. While
루프와 for
루프는 똑같이 효율적 입니다. 고등학교의 컴퓨터 교사가 숫자를 늘려야 할 때 for 루프가 반복에 더 효율적이라고 말했습니다. 그것은 사실이 아닙니다.
For
루프는 단순히 구문 적으로 설탕 while
루프이며 반복 코드를 더 빠르게 작성합니다.
컴파일러가 코드를 가져와 컴파일 할 때 컴퓨터가 더 낮은 수준 (어셈블리)에서 이해하고 실행하기 쉬운 형식으로 변환합니다. 이 번역 과정에서 구문 while
과 for
구문 사이의 미묘한 차이 가 사라지고 완전히 동일 해집니다.
A는 for
고정 된 반복은 인덱스를 사용하거나이 방식을 변형 좋습니다.
while
과 do... while
마다 점검해야하는 조건이있을 때하는 구조가 사용 (떨어져 일부 인덱스 모두 건설에서가, 위 참조). 조건 검사를 처음 실행할 때 차이가 있습니다.
두 구조 중 하나를 사용할 수 있지만 사용 사례에 따라 장점과 단점이 있습니다.
얼마 전에 For 루프가 일반적으로 while 루프보다 더 많은 기계 명령어를 생성한다는 것을 알았습니다. 그러나 내 관찰을 반영하는 예제를 자세히 살펴보면 그 차이는 2 ~ 3 개의 기계 명령으로 크게 고려할 가치가 없습니다.
또한 WHILE 루프의 이니셜 라이저는 코드에 베이킹하여 제거 할 수 있습니다. 예 :
static int intStartWith = 100;
정적 수정자는 초기 값을 코드에 굽고 하나의 MOV 명령을 저장 (드럼 롤) 합니다. 더 중요한 것은 변수를 정적으로 표시하면 스택 프레임 외부로 이동합니다. 변수 정렬이 허용되면 MOV 명령어와 해당 피연산자가 정수, 부울 또는 문자 값 (ANSI 또는 유니 코드)보다 더 많은 공간을 차지하므로 약간 더 작은 코드도 생성 할 수 있습니다.
그러나 변수가 8 바이트 경계로 정렬되는 경우 공통 기본 설정, 코드에 구워진 int, bool 또는 TCHAR은 MOV 명령어와 동일한 바이트 수를 사용합니다.
그들은 그들이하는 일에서 모두 동일합니다. 이들 중 하나를 사용하여 동일한 작업을 수행 할 수 있습니다. 그러나 가독성, 유용성, 편의성 등을 위해 다릅니다.
while과 do-while의 차이점은 while이 루프 조건을 확인하고 이것이 참이면 본문이 실행되고 조건이 다시 확인된다는 것입니다. do-while은 본문 실행 후 조건을 확인하므로 do-while은 본문이 적어도 한 번 실행됩니다.
물론 while 루프를 do-while 및 vv로 작성할 수 있지만 일반적으로 코드 복제가 필요합니다.
의 한 가지 특징은 do while
완료하려면 잠시 후에 세미콜론이 필요하다는 것입니다. 매크로의 영향을 제한하면서 여러 명령문을 한 번만 실행하기 위해 매크로 정의에서 자주 사용됩니다. 블록으로 정의 된 매크로의 경우 일부 구문 분석 오류가 발생할 수 있습니다.
For 루프 (적어도 C99를 고려할 때)는 증가 된 변수의 범위를 제한하기 때문에 while 루프보다 우수합니다.
Do while 루프는 조건이 일부 입력에 종속 될 때 유용합니다. 세 가지 루프 유형 중 가장 드물게 사용됩니다.
for와 while 사이 : while
초기화 나 업데이트 문이 필요하지 않으므로 더 멋지고 우아하게 보일 수 있습니다. for
문이 하나 둘 또는 모두 누락 될 수 있으므로 루프 전에 초기화, 루핑 조건 및 "업데이트"가 필요한 경우 가장 유연하고 분명합니다. 루프 조건 (루프 시작 부분에서 테스트 됨) 만 필요하면 while
더 우아합니다.
for / while과 do-while 사이 : do-while
조건에서 루프의 끝에서 평가됩니다. 루프를 한 번 이상 실행해야하는 경우 더 편리합니다.
WHILE은 더 유연합니다. FOR는 적용되는 경우에 더 간결합니다.
FOR is great for loops which have a counter of some kind, like
for (int n=0; n<max; ++n)
You can accomplish the same thing with a WHILE, of course, as others have pointed out, but now the initialization, test, and increment are broken across three lines. Possibly three widely-separated lines if the body of the loop is large. This makes it harder for the reader to see what you're doing. After all, while "++n" is a very common third piece of the FOR, it's certainly not the only possibility. I've written many loops where I write "n+=increment" or some more complex expression.
FOR can also work nicely with things other than a counter, of course. Like
for (int n=getFirstElementFromList(); listHasMoreElements(); n=getNextElementFromList())
Etc.
But FOR breaks down when the "next time through the loop" logic gets more complicated. Consider:
initializeList();
while (listHasMoreElements())
{
n=getCurrentElement();
int status=processElement(n);
if (status>0)
{
skipElements(status);
advanceElementPointer();
}
else
{
n=-status;
findElement(n);
}
}
That is, if the process of advancing may be different depending on conditions encountered while processing, a FOR statement is impractical. Yes, sometimes you could make it work with a complicated enough expressions, use of the ternary ?: operator, etc, but that usually makes the code less readable rather than more readable.
In practice, most of my loops are either stepping through an array or structure of some kind, in which case I use a FOR loop; or are reading a file or a result set from a database, in which case I use a WHILE loop ("while (!eof())" or something of that sort).
They are pretty much same except for do-while
loop. The for
loop is good when you have a counter
kind of variable. It makes it obvious. while
loop makes sense in cases where a flag is being checked as show below :
while (!done) {
if (some condtion)
done = true;
}
while
and for
statements can both be used for looping in programming. It will depend on the programmer as to whether the while
loop or for
loop is used. Some are comfortable using while
loop and some are with for
loop.
Use any loop you like. However, the do...while
loop can be somewhat tricky in C programming.
/* while loop
5 bucks
1 chocolate = 1 bucks
while my money is greater than 1 bucks
select chocolate
pay 1 bucks to the shopkeeper
money = money - 1
end
come to home and cant go to while shop because my money = 0 bucks */
#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;
}
infinite money
while( codition ){ // condition will always true ....infinite loop
statement(s)
}
please visit this video for better understanding https://www.youtube.com/watch?v=eqDv2wxDMJ8&t=25s
/* for loop
5 bucks
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;
}
For better understanding please visit https://www.youtube.com/watch?v=_vdvyzzp-R4&t=25s
참고URL : https://stackoverflow.com/questions/2950931/for-vs-while-in-c-programming
'programing' 카테고리의 다른 글
SQL 네트워크 인터페이스, 오류 : 50-로컬 데이터베이스 런타임 오류가 발생했습니다. (0) | 2020.10.20 |
---|---|
PHP에서 대시를 CamelCase로 변환 (0) | 2020.10.20 |
바탕 화면 바로 가기에서 명령 프롬프트 명령 실행 (0) | 2020.10.20 |
JObject로 즉석에서 JSON 만들기 (0) | 2020.10.20 |
PHP에서 XMLReader를 사용하는 방법? (0) | 2020.10.20 |