C 스트림에서 실패 처리 동작은 스트림 유형과 언어 버전에 따라 다릅니다. 이러한 불일치는 stringstream을 사용하여 단어를 정수 변수로 읽을 때 관찰되는 예기치 않은 동작으로 예시됩니다.
전통적으로 Stroustrup의 TC PL(3판)에 명시된 대로 입력 작업이 실패하면 대상 변수는 그대로 유지되어야 합니다. 특정 데이터 유형에서는 변경되지 않습니다. 그러나 stringstream에서 유형 불일치가 발생하면 변수 값이 수정되어 인용된 인용문과 모순됩니다.
이러한 불일치의 이유는 C 11에서 구현된 변경에 있습니다. C 11 이전에는 stringstream이 scanf 스타일 구문 분석을 사용하여 숫자를 추출했습니다. C 11에서는 이 메서드가 실패 시 대상을 수정하는 std::strtoll과 같은 호출 함수로 대체되었습니다.
결과적으로 구문 분석 전략의 변경으로 인해 다른 실패 동작이 발생했습니다. C 11 이전에는 목표가 수정되지 않은 상태로 유지되었지만 C 11 이상에서는 실패 시 목표가 0으로 설정됩니다.
이 이론을 검증하려면 다음과 같은 참고 자료를 참조하세요. 답변에 제공된 것. 이 참조에서는 C 11 이전에는 추출 실패로 인해 값이 수정되지 않은 채 남아 있고 오류 비트가 설정되었다고 설명합니다. 그러나 C 11 이상에서는 실패로 인해 대상 값이 0이 되고 실패 비트가 설정됩니다.
또한 참조에는 입력 연산자가 do_get 함수를 활용하는 num_get 로케일 패싯에 의존한다고 명시되어 있습니다. . C 11에서는 std::strtoll 및 유사한 함수를 사용하도록 do_get이 수정되어 관찰된 동작 변경이 발생했습니다.
위 내용은 C Stringstream의 실패 처리가 C 11 이전과 이후에 다른 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!