C에서 왼쪽에서 오른쪽으로 인쇄하는 미스터리 공개
다음 C 코드의 동작은 수수께끼입니다.
myQueue.enqueue('a'); myQueue.enqueue('b'); cout << myQueue.dequeue() << myQueue.dequeue();
놀랍게도 예상된 "ab" 대신 "ba"가 콘솔에 인쇄됩니다. 왜 이런 일이 발생하는 걸까요?
이 수수께끼를 풀기 위해서는 과부하된 << 연산자. C에서는 << 연산자는 임의 개수의 인수를 취하고 ostream 객체에 대한 참조를 반환합니다. 이 경우 cout은 ostream 객체입니다.
<< C 표준에서는 보장되지 않습니다. 이는 컴파일러가 인수를 순서에 관계없이 평가하는 것을 포함하여 임의의 순서로 인수를 자유롭게 평가할 수 있음을 의미합니다.
이 예에서 코드는 다음 형식의 표현식으로 컴파일됩니다.
cout << ( (myQueue.dequeue()) << (myQueue.dequeue()) );
컴파일러는 각 대기열 제거 호출 주위와 재귀 호출 결과 주위에 괄호를 삽입합니다. 두 번째 dequeue 호출의 결과는 첫 번째 dequeue 호출을 둘러싼 괄호 안에 삽입됩니다.
동작을 이해하는 열쇠는 << 연산자는 오른쪽에서 왼쪽 순서로 평가됩니다. 따라서 다음은 위의 코드와 동일합니다.
( (myQueue.dequeue()) << (myQueue.dequeue()) ) << cout;
이 순서대로 두 번째 대기열 제거 호출이 먼저 평가되어 'b'가 생성됩니다. 이 호출의 결과는 << cout에 대한 참조를 반환하는 연산자입니다. 그런 다음 첫 번째 대기열 제거 호출이 평가되어 'a'가 되며, 이는 이전 <<에 의해 반환된 참조로 전달됩니다.
코드가 "ab" 대신 "ba"를 인쇄하는 이유를 설명합니다. << 연산자는 먼저 'b'를 인쇄한 다음 'a'를 인쇄합니다.
일관되게 왼쪽에서 오른쪽으로 인쇄하려면 다음과 같이 괄호를 사용하여 평가 순서를 명시적으로 제어해야 합니다.
cout << (myQueue.dequeue()) << ' ' << (myQueue.dequeue());
위 내용은 이 C 코드는 왜 'ab' 대신 'ba'를 인쇄합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!