2011-12-07 3 views
2

여기에는 방금 입력 한 정수를 인쇄하는 작은 인위적인 프로그램이 있습니다.while 루프 조건에서 사용되는 std :: cin의 동작 C++

#include <iostream> 
int main(int argc, char *argv[]) 
{ 
    int n; 
    while(std::cin>>n) 
    { 
     std::cout<<"You typed "<<n<<std::endl; 
    } 

    return 0; 
} 

이제 정수를 입력하면 프로그램이 정상적으로 작동합니다. 그러나 10.8과 같은 부동 소수점 숫자를 입력하면 프로그램은 부동 소수점 숫자를 정수로 캐스팅하기 때문에 화면에 10을 표시 한 다음 을 종료합니다. 왜 이런 일이 일어나는 걸까요? 다음은 샘플 터미널 출력입니다.

Desktop: ./a.out 
4 
You typed 4 
-9 
You typed -9 
10.8 
You typed 10 
Desktop: 
+0

코드 형식이 잘못되었습니다. 불규칙한 정렬. – Nawaz

+1

@Nawaz : 전에 GNU 스타일 들여 쓰기를 본 적이 없습니까? – Blastfurnace

답변

5

"입력 한 줄 10"줄 뒤에 ".8"문자가 스트림에 남아 있습니다. 그것을 정수로 읽어들이려고 할 때, 실패하고, 그래서 스트림을 나쁜 상태로 만든다.

스트림이 나쁜 상태이므로 루프 상태가 실패하고 루프에서 벗어납니다.

-

은 (당신이 세부 사항의 수준이 필요하면 문서를 확인 구체적으로는, 나는 생각하지만, 난 그 처리 이후 너무 오래 지났는데 잘 모르겠어요, "나쁜"비트를 설정)

다음과 같이 다시 읽으려고하면 문자 ".8"이 이면서 여전히이 스트림에 남아 있고 을 다시으로 실패합니다. 이는 일반적인 I/O 오류입니다.

+0

당신은 나를 때려 눕히고, 단지 'cin'이 NULL을 돌려주고있다. NULL == 0 그래서'cout'으로 인쇄하지 않고 루프가 종료됩니다. – semisight

+0

낮은 수준의 세부 사항을 파헤쳐 보면 암시 적 변환입니다. 추출 연산자가'cin'을 다시 반환하면'cin'이 암시 적으로'bool' 값으로 변환됩니다. (잘못된 변환 체인은'void *'를 통과합니다 - 당신이 말했던 것처럼 나쁜 것이 있다면'NULL'). – Hurkyl

5

캐스팅이 있어야하지 않습니다.

10.8은 10으로 표시되고 .은 텍스트를 정수로 해석하지 못하게하여 failbit이 설정됩니다. 이렇게하면 루프가 종료됩니다.

10.8을 처리하려면 double을 읽고 캐스팅을하십시오.