cin에 관한 간단하지만 알아두면 좋은 정보 정리
0. std::cin은 std::istream의 객체이다
1. cin은 cin 객체를 반환한다
operator »는 target variable을 stream에서 읽을 수 있다면 데이터를 읽는다.
만약 stream의 즉각적인 내용이 target variable의 타입으로 변환할 수 없다면, stream은 invalid로 마크하고 target variable을 left untouched한다.
(대충 넘긴다는 내용 같음)
성공/실패 여부와 상관 없이, 반환 값은 stream의 reference이다.
따라서 cin » a » b » c; 와 같은 식이 있어도 cin » a 가 cin 객체를 return하고, 이후 cin » b 로 반복된다.
2. if문과 while문에서 사용할 수 있을까
stream reference를 void* 포인터로 변환하는 operator void*() (C++11 이전) 과
stream reference를 boolean로 변환하는 명시적인 operator bool() (C++11).
만약 stream이 valid하다면, null이 아닌 포인터 (C++11 이전)과 true (C++11)를 반환하고
stream이 invalid하면, null 포인터 (C++11 이전)과 false를 (C++11)를 반환한다.
if문은 boolean, integer 또는 포인터와 같은 값이 필요하지만 std::cin » x의 결과는 istream의 reference이다.
그러나, istream 클래스는 if문에서도 쓸 수 있도록 istream reference를 변환하는 conversion operator가 있다.
따라서 if (std::cin » x)와 같은 식도 정상적으로 작동한다.
3. scanf와 같이 형식을 지정할 수 있을까?
다음은 백준 10953 문제이다.
문제
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
예제 입력1
5
1,1
2,3
3,4
9,8
5,2
#include <iostream>
using namespace std;
int main() {
int A, B, T;
char t;
cin >> T;
while (T--) {
cin >> A >> t >> B;
cout << A+B << "\n";
}
}
위와 같이 형식에 맞는 변수를 순서대로 입력받으면 가능하다.
출처
if (cin » x) - Why can you use that condition?
cin의 반환형은 무엇인가요?