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