2017-05-16 11 views
-2

어떻게 컴파일러는 다음과 같은 경우를 구분하지 않습니다 : 적절한 브라켓없이 cout을 가진 < <가 항상 것으로 보인다 컴파일러 자체가 가정 대부분의 경우에CPP의 오류가있는 << 연산자

cout << a; //Case 1 :prints a 

cout << a << b; // Case 2 :prints both a and b 

cout << (a << b); // Case 3 :Left shifts a by b bits and prints shifted a 

cout << a&b; // Case 4 :Throws an ERROR 

을 입력 스트림에 삽입. 그러나 이것이 마지막 경우에 실패하는 이유는 무엇입니까? IMO : 비트에 대한 대답을 적절하게 제공해야합니다. b. 브라켓 팅을하면 다음과 같이 정확합니다.

cout<< (a&b); //gives correct output of bitwise and a , b. 

왜 4 번째 경우에 오류가 발생합니까?

+4

C++ 연산자 우선 순위에 대한 [참조] (http://en.cppreference.com/w/cpp/language/operator_precedence)를보십시오. – George

+1

이는 연산자 우선 순위 때문일 것입니다. 또한 왼쪽과 오른쪽 인수를 받아들이는'<<'와 같은 2 진 연산자의 개념이 있습니다. 'cout'의 경우,'cout'을 리턴하여 계속 진행할 수 있습니다. 당신이 연산자의 우선 순위를 잘못했을 때 ... – AndyG

+1

나는 매우 잘 알고있다. <<보다 큰 우선 순위를 가지고있다. 그러나 왜 <<는 _insertion_ 연산자이고 4 번째의 경우에는 왼쪽으로 쉬프트가 아닌가? @George – Akash

답변

4

<< 체인의 평가는 왼쪽에서 오른쪽으로 진행됩니다. cout << a 표현 cout를 반환하기 때문에 따라서,

cout << a << b; 

(cout << a) << b; 

과 동일합니다, 당신은 출력 스트림에서 모두 ab와 끝까지.

괄호로 순서를 변경하면 <<의 의미가 왼쪽으로 이동합니다.

두 번째 <<&으로 바꾸면 이제 precedence이 시작되기 때문에 상황이 변경됩니다. &

cout << a & b; 

이 발현 좌측 입력 스트림과 오른쪽의 정수를 취 오퍼레이터 &을 필요

(cout << a) & b; 

으로 해석하므로, <<보다 낮은 우선 순위를 갖는다. 이러한 연산자가 존재하지 않으므로 컴파일러에서 오류를보고합니다.

괄호를 사용하여 다시 계산 순서를 지정하면 컴파일러에서 <<을 출력 스트림과 정수에 적용하여 (a&b)을 계산하고 출력 스트림에 씁니다.

+0

감사합니다. 사실상, 왼쪽의 시프트와 같은 경우에 cout이 먼저 바인딩되고 어떻게 동작하는지 명확하지 않습니다. Idk는 사람들이 연산자 우선 순위에 대해 생각하는 이유를 왜 떨어 뜨 렸는지 – Akash