2017-11-18 20 views
2

가 여기에 오버로드 >> 연산자 함수입니다 : 키보드 또는 다른 소스로부터 입력이 s를 입력 할 때까지 터미널이나 콘솔이 대기하므로 내 이해에if (! (is >> s))가 의미하는 것은 무엇입니까?

std::istream& operator>>(std::istream& is, std::vector<int>& v){ 
    string s; 
    if (! (is >> s)) 
    return is; 
    ... 
    return is; 
} 

, if(! (is >> s)) 아무 의미가 없습니다. 따라서 if()의 조건 값은 궁극적으로 false이됩니다. 누가 도와 드릴까요?

+0

"문자열이 읽을 수없는 경우"로 읽어야합니다. –

+0

코드가 너무 빽빽합니다. 그것은 두 부분으로 작성되어야합니다 :'is >> s; if (! is) ...'. –

답변

3

is >> sis 문자열에서 s 문자열을 읽으려고합니다.

istreams operator>>()is에 대한 참조를 반환합니다.

스트림이 유효하지 않은 상태인지 테스트합니다. 특히 스트림의 badbit 또는 failbit이 설정된 경우 true을 반환합니다.

그래서

if (! (is >> s)) 
    return is; 

스트림 실패에서 문자열을 읽는 경우 함수가 바로 반환 즉

is >> s; 
if (is.fail()) return is; // is.fail() returns true if failbit or badbit are set 

기능적으로 동일하다. 이는 스트림의 끝까지 도달하는 것과 구별됩니다.

+0

나는이 게시물을 철저히 얇게하고 있지만 다른 것들도 나에게 유익하다. 고마워! :) – Finley

2

istream은 콘솔 일 필요는 없습니다. 문자열 스트림이 될 수 있습니다. 게다가, '사용자 입력 대기'는 애플리케이션 코드에서 볼 수 없습니다. 입력 스트림이 가득 차있을 때 잠 들어 있습니다 (운영 체제, 기본 라이브러리 등 ...)

아무리해도 입력 스트림에 데이터가 전혀없는 경우이 조건이 충족됩니다. 한 줄에 많은 일을하고있는

std::string s; // empty! 
std::stringstream ss(s); 

std::vector<std::string> strings; 
ss >> strings; // should be empty! 
-1

! (is >> s) 

당신은의 InputStream을하고 조건 경우

1

에의의 TEH 결과를 평가하고, 객체들에 할당하는 데 사용할 무슨 뜻인지 이해 하시려면 if (!(is >> s))은 무엇을 의미하는지 이해해야한다는 것을 의미합니다. if (is >> s).

isstd::istream이므로 >> 연산자는 std::istream을 반환합니다. 따라서 is >> sstd::istream이며 if 안에는 true 또는 false의 논리 값을 생성해야합니다. This Q&A은 다른 버전의 C++에서 어떻게 수행되는지 설명합니다. 기본적으로 std::istream은 작업이 성공하면 true 조건으로 평가됩니다.

은 이제 is >> s의 의미를 알고, 당신은 부정을 추가하는 것은 의미가 있음을 뒤집 알아낼 수 있습니다 is에 실패 인 s에서 읽을 경우에만 !(is >> s) 사실이 될 것입니다. 문자열의 경우 읽기 실패는 스트림의 끝에 도달했기 때문에 스트림이 유효하지 않은 상태임을 의미합니다.