[C++] cin에 관한 간단한 사실

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의 반환형은 무엇인가요?