programing

C 프로그래밍에서 대?

nasanasas 2020. 10. 20. 07:42
반응형

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구조 할 때 사전에 알려져 있지에서 반복 횟수. whiledo ... 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루프를 사용하면 카운터 변수는 항상 루프의 다음 반복 전에 증가하여 코드에 약간의 균일 성을 추가합니다.


완전성을 위해 루프 처리를 수행 할 때 편리하게 여기에서 breakcontinue진술 에 대해 이야기하는 것이 의미있을 것입니다 .

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 루프이며 반복 코드를 더 빠르게 작성합니다.

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


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

whiledo... 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

반응형