2017-12-24 44 views
1

다음 프로그램은 Google 자습서에서 나온 것으로 10 진수를 입력 할 때를 제외하고는 매우 간단합니다. 이 숫자가 아닌 경우왜 (! (cin >> int)) 첫 번째 반복에서 10 진수를 받아들이지 만 다른 것들은 받아 들일 수없는 이유는 무엇입니까?

Enter a number (-1 = quit): 5 
You entered 5 
Enter a number (-1 = quit): 

:

Enter a number (-1 = quit): p 
You entered a non-numeric. Exiting... 
All done. 

그리고 그것이 정확하게 설명하는 방법은, 입력이 INT (되지 -1)가 출력하는 경우

#include <iostream> 
using namespace std; 

int main() { 
    int input_var = 0; 
    do { 
    cout << "Enter a number (-1 = quit): "; 

    if (!(cin >> input_var)) { 
     cout << "You entered a non-numeric. Exiting..." << endl; 
     break; 
    } 

    if (input_var != -1) { 
     cout << "You entered " << input_var << endl; 
    } 

    } while (input_var != -1); 

    cout << "All done." << endl; 
    return 0; 
} 

작동하려면 10 진수 인 경우 :

Enter a number (-1 = quit): 5.9 
You entered 5 
Enter a number (-1 = quit): You entered a non-numeric. Exiting... 
All done. 

double 또는 floatint에 할당하고이 경우에는 잘린 소수를 출력하고 cinfalse이 아니지만 입력을 받아들이지 않는 두 번째 반복에서는 C++가 어떻게 동작하는지 압니다.

처음부터 받아 들일 수 없거나 단지 소수점 이하를 자른 것이고 입력이 int 인 것처럼 동일한 동작을했는지는 알 수 있습니다.하지만 왜 처음 루프와 다르게 동작합니까? 두 번째 루프?

+0

iostream 입력의 좋은 기본값은 ''헤더의'getline'을 사용하는 것입니다. –

+0

'십진수'란 무엇입니까? 10 진수 라니? 그것이 그것이 실제로 의미하는 유일한 것이기 때문입니다. – EJP

+0

@EJP 또한 "소수점으로 표현 된 정수가 아닌 값"을 의미합니다. 그것은 내 질문에 태그 "십진수"의 정의의 일부입니다. 애매한 점 죄송합니다. – ZeroAG

답변

4

나는 당신이 intdouble 또는 float을 할당하고,이 경우는 잘린 진수를 출력하면 C++이 작동하는 방법을 알고있다.

실제로 여기서 무슨 일이 일어나고있는 것은 아닙니다. int에는 float 또는 double 값이 할당되어 있지 않습니다. 입력의 정수를 5.9으로 만들려고하면 5 비트를 성공적으로 가져 와서 중지하고 입력 스트림에 .9을 남깁니다. 입력 스트림에서 전체 5.9을 추출하지 말고 input_var에 넣기 위해 정수로 자릅니다.

다음, 다음 반복에, 그것은 .9를 찾아 당신이 p를 입력 할 때와 같은 유효한 정수가 아닌, 그리고 그에 따라 역할을 것을 이해한다.

극심한 구체적으로, C++ 14 부 22.4.2.1 num_get() 덮여 있지만, 하부 선은 설명의 스테이지 3이다

스테이지 (2)에 축적 된 문자의 시퀀스 (필드)가 전환된다

헤더에 선언 된 함수 중 하나의 규칙에 따라 숫자 값으로 변환합니다. <cstdlib> :

부호있는 정수 값의 경우 strtoll입니다.

내가 이후 strtoll 작품뿐만 아니라 ISO C99의 꽤 많은 부분 단계별로 요구하는 방식에 너무 많은 세부 사항에 가지 않을 것이다.숫자가 허용되는 문자가 정수이고, 문자가 . 인 경우는 나타나지 않는 섹션 6.4.4 Constants에서 끝납니다.

0
cin >> input_var; 

이 연산자는 >>이며이 연산자는 cin을 반환합니다. 그러나이 cin이 if 또는 while과 같은 조건문에 전달되면 cin에서 true 또는 false 값을 계산하기 위해 istreat의 특수 함수가 호출됩니다. 이 함수는 cin이 접하는 지 확인하고 EOR을 수신하는지 아니면 수신할지 결정합니다. >>은 과부하 연산자이고, 귀하의 경우에는 연산자가 정수 값으로 호출된다는 점을 기억하십시오. 그러나 비 정수 값 (귀하의 경우 double)을 입력하면 false를 감지하고 false를 반환합니다. 당신의 input_var 유형에서 더블 더블 그러나 cinint 변수의 소수점 이하 숫자를 자르지 않는 한 당신이 cin 그것을 정수를 평가 입력 할 때

비록 결과는 반대 방향으로 생산할 수없는, 즉 .