2016-12-03 9 views
0

이것은 내 read_double 함수입니다. 왜 내가! flush_buff()을 확인해야합니까? 아니면 그 효과는 무엇입니까? 나는 어떻게 든 그것을 이해할 수 없다. flush_buff()를 작성한 다음 DBL_MIN을 리턴 할 수 없습니까?부정! my_function()은 어떻게 C에서 내 함수에 영향을 줍니까?

double read_double(void) { 
    double x; 
    int c, status; 

    printf("Insert double: "); 
    status = scanf("%lf", &x); 
    if (status == EOF || (c = getchar()) == EOF) { 
     return DBL_MIN; 
    } 
    if (status != 1 || c != '\n' || x < DBL_MIN) { 
     if (!flush_buff()) { /*What is the purpose of this?*/ 
      return DBL_MIN; 
     } 
     return DBL_MAX; 
    } 
    return x; 
} 

flush_buff 기능 :이 줄 바꿈 (\n) 또는 파일 (EOF)의 한쪽 끝을 만날 때까지

int flush_buff(void) { 
    int c; 
    while ((c = getchar()) != '\n' && c != EOF) {} 
    return c != EOF; 
} 
+2

BTW'x> DBL_MAX'는 결코 참이되지 않습니다. – BLUEPIXY

답변

1

flush_buff() 기능은 표준 입력에서 문자를 가져옵니다. 줄 바꿈을 발견하면 (EOF이 아님) "true"값 (1과 동일)을 반환합니다.

!flush_buff() 구문은이 반환 값을 무효화하므로 flush_buff()이 줄 바꿈으로 중지되면 false (0)가되고, 파일 끝에 도달하면 true (1)이됩니다. 부동 소수점 값이 성공적으로 읽은 경우 게시 된 코드에서

, status의 값이 1이 될 것이다, 0 입력 스트림이 모든 입력을 제공하지 않고 종료하면 부동 소수점 값이 성공적으로 읽거나 EOF 수없는 경우.

statusEOF이 아닌 경우 추가 문자 c이 입력에서 읽습니다. 이것이 개행 문자가 아니거나 제공된 숫자가 0이 아닌 양의 부동 소수점 숫자 범위 밖에 있으면 입력이 유효하지 않은 것으로 처리됩니다.

이 시점에서 프로그래머는 어떤 이유로 든 입력 파일이 현재 줄에서 끝나면 DBL_MIN을 반환하고 현재 줄은 줄 바꿈 문자로 끝나는 경우 DBL_MAX을 반환해야한다고 결정했습니다. 이것에 대한 추론은 불분명하다.

1

! 연산자는 논리 NOT 연산자입니다. 부울로 해석되는 피연산자를 사용하고 반대 값을 제공합니다. 여기서 0은 거짓이고 0이 아닌 값은 참입니다.

이 경우 flush_buff 함수는 읽은 마지막 문자가 이 아니고 EOF 인 경우 1 (즉, true)을 반환합니다. 따라서 표현식 !flush_buf()은 함수가 false를 반환하면 true로 평가됩니다. 즉, 마지막 문자 인 EOF 인 경우입니다.