>백엔드 개발 >C++ >STL 메소드 체이닝은 C에서 평가 순서를 유지합니까?

STL 메소드 체이닝은 C에서 평가 순서를 유지합니까?

Patricia Arquette
Patricia Arquette원래의
2024-10-24 03:28:01584검색

Does STL Method Chaining Preserve Evaluation Order in C  ?

C에서 STL 메서드를 연결하면 평가 순서가 유지되나요?

Bjarne Stroustrup의 "The C 프로그래밍 언어" 4판에서 다음 코드 조각 메소드 체이닝의 예:

<code class="cpp">void f2() {
  std::string s = "but I have heard it works even if you don't believe in it";
  s.replace(0, 4, "").replace(s.find("even"), 4, "only").replace(s.find(" don't"), 6, "");
  assert(s == "I have heard it works only if you believe in it");
}</code>

이 코드는 문을 왼쪽에서 오른쪽으로 평가하여 문자열 s를 점진적으로 변경합니다. 그러나 이 표현식의 동작은 사용된 컴파일러에 따라 모호합니다.

  • Clang: 평가는 예상 순서를 따르며 결과적으로 s는 "다음과 같은 경우에만 작동한다고 들었습니다." 당신은 그것을 믿습니다".
  • GCC: 평가 순서를 예측할 수 없으므로 s가 잘못된 값을 취하게 됩니다.
  • Visual Studio: GCC와 유사하게 평가가 모호하여 종종 동일한 잘못된 결과가 생성됩니다.

Unveiling the Unspecified Behavior

코드가 불확정으로 인해 지정되지 않은 동작을 나타냅니다. 정의되지 않은 동작을 호출하지 않음에도 불구하고 하위 표현식의 평가 순서입니다. 문제의 핵심은 연결된 함수 호출 내의 함수 인수 평가 순서에 있습니다.

특히 다음 하위 표현식의 경우:

  • s.find("even")
  • s.find(" 하지 마세요")

다음 항목에 대한 평가 순서는 불확실합니다.

  • s.replace(0, 4 , "")

이는 찾기 호출을 바꾸기 호출 전후에 평가하여 s의 길이에 영향을 미치고 결과적으로 찾기 호출의 결과를 변경할 수 있음을 의미합니다.

사용자 정의 찾기 기능을 사용한 그림

이러한 모호성을 보여주기 위해 코드의 수정된 버전은 각 하위 표현식 평가에서 검색 문자열의 위치를 ​​보고하는 사용자 정의 my_find 함수를 사용합니다.

<code class="cpp">std::string::size_type my_find(std::string s, const char *cs) {
  std::string::size_type pos = s.find(cs);
  std::cout << "position " << cs << " found: " << pos << std::endl;
  return pos;
}</code>

이 코드를 다른 컴파일러로 실행하면 평가 순서에 따라 다른 결과가 나타납니다.

  • Clang: my_find는 평가되기 전에 "짝수"로 평가됩니다. "don't"의 경우 올바른 출력이 발생합니다.
  • GCC: my_find는 "even"으로 평가되기 전에 "don't"로 평가되어 잘못된 결과가 발생합니다. .

C 17 변경 사항

C 17 표준(p0145r3)에서는 이러한 모호성을 해결하기 위해 표현식 평가 순서 규칙을 개선했습니다. 다음과 같이 후위 표현식 및 해당 표현식 목록의 평가 순서를 강화합니다.

  • 후위 표현식은 표현식 목록의 각 표현식과 기본 인수 앞에 순서가 지정됩니다.

이렇게 하면 체인 메서드 호출이 예상 순서대로 평가되어 C 17에서 정의되지 않은 동작이 해결됩니다.

위 내용은 STL 메소드 체이닝은 C에서 평가 순서를 유지합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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