2010-12-06 5 views
1

C++ 코드를 컴파일하고 실행할 때 실제로 일어나는 일을 이해하려고 노력하고 있습니다. 그러나 cout << "output"; 라인은 약간 혼란 스럽습니다.C++에서`cout << "output";`을 실행하면 어떻게 될까요?

는 I는 <<는, 조작자가 비트 leftshift 연산자 것을 알고 y = x << 6을 실행하는 6 비트가 왼쪽으로 시프트 x 기인 y에 값을 할당 할 것이다.

는 또한 '< <'스트림에 대하여, 상기 삽입 연산자 것을 알고 cout << "output";을 실행하는 오브젝트 cout에 문자열을 삽입 output있다.

는 내가 알고 싶은 것은이 <<의 오버로딩의 예입니다, 또는 여부 cout 정말 문자열 output이 차지하는 비트 수에 해당하는 값으로 왼쪽으로 이동되는 경우. output이 실제로 <<의 오버로드를 통해 cout에 삽입되는 경우 할당 연산자 = 대신 비트 연산자가 사용 된 이유는 더 직관적일까요?

질문 : cout << "output"은 터미널 화면에 "출력"이라는 단어를 어떻게 표시합니까?

+4

"나는 왼쪽으로"Hello world "시간을 이동하고 거기에서 멈추는 'cout'을 보았습니다." –

+0

'= '오버로드가 더 직관적이라고 생각하는 이유를 이해할 수 없습니다. –

+0

cout 및 iostream은 표준 C++ 라이브러리보다 선행하며 매우 일반적인 용도로 사용되었습니다. 몇 가지 사소한 차이점과 함께 붙어 있습니다. 일반적으로 연산자를 오버로드하여 의도 한 것과 같은 일반적인 의미를 부여합니다. – CashCow

답변

7

즉, < < 연산자는 (매우 일반적인 C++ 기능) 인 입니다.
다른 메서드와 마찬가지로 연산자가 오버로드 될 수 있으며 Martin York의 답변에서 암시하는 것처럼 연산자는 피연산자와 연산자 식을 구문 분석 할 때 컴파일러에서 호출하는 메서드에 불과합니다.

정수형 등의 피연산자에 적용 할 때 < <에는 "일반"비트 연산자의 의미가 있으며, 스트림에 적용 할 때 "printf와 유사한"의미론을 갖습니다.

cout은 ostream의 개체입니다. 자세한 내용은 해당 내용을 참조하십시오. ostream::operator<<

사실상 ostream :: operator < 은 두 번째 인수의 가능한 유형 (오른쪽)에 대해 여러 번 오버로드됩니다. 이렇게하면 다양한 형식의 스트림을 제공하고 형식을 지정하지 않아도됩니다. 이 연산자는 여러 체인을 허용하는 ostream을 반환합니다. < <. 이것을 생각

cout << "Found " << nbOfCats << " cats in the " << barnName << "barn."; 

쉽게 될 :

< <가 ostream에 오퍼레이터 선택되었다 이유는 그들이 출력에 나타나는 바와 같이 동일한 순서로 광고 코드 것들을 나타내는 허용된다 읽기보다 오류 발생 가능성이 적습니다.

printf("Found %ld cats in the %s barn.", nbOfCats, barnName); 
+0

나는 printf가 더 읽기 쉽다고 주장한다. '<< "구문은 PHP 등에서 문자열 연결 연산자를 사용하는 것과 너무 흡사합니다 :'echo"blah ". $ var."blah ". $ var2' – erjiang

+0

@erjiang : 나는 당신에게 동의합니다. 내가 생각하는 맛의 물질. << 문자 시퀀스의 선택과 스트림 API의 일반적인 디자인에 대한 역사적인 관점 만 제공했습니다. – mjv

1

이 경우 비트 연산자가 실제로 사용되지 않기 때문에 혼란 스럽습니다. 그들은 < <이 코드에서보기 좋고보기에 좋기 때문에 연산자 오버로드를 사용했습니다.

0

"output"이라는 단어가 터미널 화면에 표시되지 않으면 먼저 버퍼에 넣습니다. 버퍼가 플러시되면 터미널 화면에 단어가 표시됩니다.

2

예, 오버로드입니다. 그것은 함께 입력 >>으로 (기억하기 쉬운) 니모닉 값 (따라서 첨가 괄호없이 인자로 표현 대부분의 종류의 수) 낮은 우선 순위를 가지고 있기 때문에

<< 연산자의 출력을 위해 사용되었다.

세부 사항은 실제로 매우 복잡합니다. C++에 대한 새로운 이견을 때때로 좌절시키는 한가지는 <<의 오버로드 중 일부가 프리 스탠딩 함수이고 일부 비 정적 멤버 함수라는 점입니다. 예 : 임시 ostringstream 개체를 구성한 다음 <<을 사용하면 임시 개체를 정규식 참조 오버로드에 대한 공식 참조 (const) 인수에 바인딩 할 수 없으므로이 호출은 멤버 함수 오버로드로만 해결할 수 있습니다. 그것이 왜 그런 식으로, 나는 아무도 모른다는 것을, 아마도 나쁜 역사를 알 것입니다. 나는 그것의 일부가 C++ 0x에서 수정되었다는 것을 기억하는 것 같다. 그러나 나는 확실하지 않다. (중요하다면 그것을 체크하라.) .

건배 & HTH,

+0

+1은'>>'과 우선 순위를 언급합니다. –

0

스트림 : 이것은 문법 설탕이 방법 호출을위한

std::cout << std::string("Plop"); 

:

std::ostream& operator<<(std::ostream& str, std::string const& data) 
{ 
    // Do Stuff 
    return str; 
} 

을합니까 물건이하는 방법의 일이에 의해 정의되지 않은 표준 그것은 다만 작동합니다.

그러나 아마 그냥 수행합니다

2는 출력 스트림에 대한 파일 설명이다
write(2, data.c_str(), data.length()); 

. 출력 스트림은 OS에 의해 애플리케이션에 연결되므로 애플리케이션이이 스트림에 쓸 때 OS는 데이터를 읽을 수 있습니다. OS가 데이터로 수행하는 작업은 상황에 전적으로 달려 있습니다.

그러나 명령 줄에서 응용 프로그램을 시작한 경우 응용 프로그램에서 터미널로 연결된 스트림이 연결되었을 것입니다. 터미널의 책임은 해당 터미널의 책임입니다 (무시하고 인쇄하십시오) 터미널 응용 프로그램에 완전히 의존합니다.

+0

Nit pick 경고 :-) "Plop"은'std :: string' 임시 생성을 강제로하지 않고'const char *'override와 일치 할 것입니다. std :: string으로 실행하면, std :: ostream :: write()는 :: write를 호출 할 수 있지만, 쓰기 예제는'str.write (data.c_str(), data.length());' 너는 설명한다. –

+0

나는 C :: write (fd, buffer, size)를 호출했다. 니트 픽은 다르게 받아 들였다. –

관련 문제