>백엔드 개발 >C++ >'cout'의 출력은 무엇입니까

'cout'의 출력은 무엇입니까

DDD
DDD원래의
2024-12-09 16:39:10877검색

What is the Output of

"cout << a << a"의 수수께끼: 정의되지 않은 행동의 정체를 밝히다

최근 촉발된 당황스러운 인터뷰 질문 토론: 다음에 대한 올바른 출력은 무엇입니까

int a = 0;
cout << a++ << a;

자신있게 '01'을 선택한 지원자도 있었고, 행동이 정의되지 않았다는 이유로 처음에는 놀랐다는 답변도 있었습니다.

문제의 핵심은 평가에 있습니다. 명령문의 순서와 부작용. 이를 이해하기 위해 이를 동등한 함수 호출로 확장해 보겠습니다.

std::operator<<(std::operator<<(std::cout, a++), a);

C는 이전 평가의 부작용이 시퀀스 지점에서 수행되도록 보장합니다. 그러나 인수 평가 사이에는 시퀀스 포인트가 없으므로 인수 평가 순서가 불확실합니다. a가 a보다 먼저 평가될 수도 있고 그 반대일 수도 있습니다.

평가 순서의 이러한 모호함은 문의 동작을 정의되지 않은 상태로 만듭니다. 그러나 a와 a의 경우 전자의 결과가 후자의 인수로 사용되므로 출력은 평가 순서에 따라 달라집니다.

C 17 업데이트: Clarity Amidst the 모호함

C 17에서는 규칙이 진화했습니다. 시프트 연산자에 관한 특정 설명이 도입되어 왼쪽 피연산자의 평가 및 부작용이 오른쪽 피연산자보다 먼저 발생해야 한다고 규정했습니다.

In a shift operator expression E1<>E2, every value computation and side-effect of E1 is sequenced before every value computation and side effect of E2.

이 명령에 따라 "a < a"는 이전에 정의되지 않은 동작을 해결하기 위해 C 17에서 "01" 출력을 생성해야 합니다.

이러한 의미 체계의 개선은 명확성과 일관성을 보장합니다. 관용적 C 관행에 맞춰 시프트 연산자가 포함된 표현식을 평가합니다.

위 내용은 'cout'의 출력은 무엇입니까의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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