2010-06-22 4 views
1

이것은 do while 루프를 사용하는 아래에 표시된 작은 코드입니다. 나는이 코드를 실행할 때 실제로 예기치 않은 동작을 이해하지 못한다. 아래에 표시된 코드는 do while 루프 조건을 사용하고 while 문은 while 문을 처음 실행하면 조건이 맞으면 나올거야.하지만이 코드를 실행하면 결코 루프에서 빠져 나오지 않고 영원히 계속됩니다. 아무도 왜 그 일이 일어나는 지 말해 줄 수 있습니까?do while 루프를 사용하는 코드의 유용성

  unsigned int A = 5; 
      int B = 0; 
      main() 
      { 
       do 
       { 
        A = A + 5; 
        B = B - 1; 
       }while(B > A); 

      printf("hello\n"); 
      } 

이제 "안녕하세요"가 인쇄되지 않습니다. 사전 매디

답변

-1

은 나를 위해 "hello"를 출력합니다. 잠시 (글쎄, 두 번째 또는 두) 걸립니다. 이에 수정

...

void main() 
{ 
    unsigned int A = 5; 
    unsigned int loop = 0; 
    int B = 0; 
    do 
    { 
     A = A + 5; 
     B = B - 1; 
     loop++; 
    }while(B > A); 

    printf("hello %d %d %d\n", B, A, loop); 
} 

인쇄 아웃 : -

hello -715827882 -715827881 715827882 
+0

많은 분들께 감사드립니다. 예상보다 오랜 시간이 걸렸지 만, 결국에는 "인사"가 인쇄되었습니다. – maddy

1

에서

덕분에 당신은 음수 부호없는 INT를 비교하고 있습니다. A를 서명 된 int로 변환 해보십시오.

1

서명 된 서명과 서명되지 않은 서명을 비교하면 혼동을 줄 수 있습니다. AB을 같은 유형으로 설정해야합니다.

4

다른 답변이 말하는 것처럼, 나쁜 생각을 서명하고 서명되지 않은 값입니다 비교 (GCC는 그것에 대해 경고합니다 주어진 경우 오른쪽 플래그). "무한 루프"에 걸린 이유는 부호가있는 값 B이 비교 목적으로 서명되지 않은 것으로 처리되기 때문입니다. 처음으로 while(B > A)에 도착하면 B은 -1 (0부터 시작하여 한 번 감소)입니다. 부호없는 것으로 처리하면 가장 큰 정수가되므로 비교가 참입니다. 그것은 오랜 시간 동안 사실로 남아 있으므로 루프는 끝나지 않는 것처럼 보입니다. 결국 A을 증가시키고 B을 감소 시키면 서로가 통과하여 루프가 종료되지만 예상보다 오래 걸릴 것입니다.

+0

@ 마이클 ... 솔루션 주셔서 감사하지만, 조금 혼란스러워하는 이유는 서명 된 숫자 -1이 가장 큰 정수가되는 방법으로 변환되었을 때입니다. 변환은 어떤 방식으로 수행됩니까? – maddy

+0

@maddy - 2 보수 연산에서 부호있는 값 -1은 모두 1의 비트 패턴을가집니다. 해당 비트 패턴을 부호없는 것으로 해석하면 표현할 수있는 가장 큰 값이됩니다. –

+0

@maddy 일반적으로 음수는 [2의 보수]라는 형식으로 저장됩니다 (http://en.wikipedia.org/wiki/Two's_complement). 이 형식 -1은 0xFFFFFFFF (32 비트 시스템에서)로 저장됩니다. 서명되지 않은 숫자는 가능한 가장 큰 숫자입니다 –

0

부호가 서명되지 않은 것으로 비교됩니다. 그러나 결국 "안녕"을 볼 것입니다. A와 B가 모두 오버플로되어 B> A가 거짓이되도록합니다.

+0

그들은 정상적으로 서로를 통과 할 수 있습니다 (B는 MAX_UINT에서 감소하고 A는 0에서 증가 함) –

관련 문제