>백엔드 개발 >C++ >이 C 코드는 왜 'ab' 대신 'ba'를 인쇄합니까?

이 C 코드는 왜 'ab' 대신 'ba'를 인쇄합니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-31 16:01:10917검색

Why Does This C   Code Print

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.