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를 점진적으로 변경합니다. 그러나 이 표현식의 동작은 사용된 컴파일러에 따라 모호합니다.
Unveiling the Unspecified Behavior
코드가 불확정으로 인해 지정되지 않은 동작을 나타냅니다. 정의되지 않은 동작을 호출하지 않음에도 불구하고 하위 표현식의 평가 순서입니다. 문제의 핵심은 연결된 함수 호출 내의 함수 인수 평가 순서에 있습니다.
특히 다음 하위 표현식의 경우:
다음 항목에 대한 평가 순서는 불확실합니다.
이는 찾기 호출을 바꾸기 호출 전후에 평가하여 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>
이 코드를 다른 컴파일러로 실행하면 평가 순서에 따라 다른 결과가 나타납니다.
C 17 변경 사항
C 17 표준(p0145r3)에서는 이러한 모호성을 해결하기 위해 표현식 평가 순서 규칙을 개선했습니다. 다음과 같이 후위 표현식 및 해당 표현식 목록의 평가 순서를 강화합니다.
이렇게 하면 체인 메서드 호출이 예상 순서대로 평가되어 C 17에서 정의되지 않은 동작이 해결됩니다.
위 내용은 STL 메소드 체이닝은 C에서 평가 순서를 유지합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!