Bjarne Stroustrup의 코드에 있는 std::string의 연결 표현식이 정의되지 않은 동작을 나타냅니까?
Bjarne Stroustrup의 "The C 프로그래밍 언어" 4판 , 코드 조각은 std::string의 대체 메소드를 사용한 연결을 예시합니다:
<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.find 함수 호출은 첫 번째 s.replace 호출 전후에 평가되어 결과 문자열의 길이를 변경하고 후속 find 호출 결과에 영향을 줍니다.
질문의 예는 다음을 보여줍니다. 다른 컴파일러(clang, gcc)로 평가할 때 다양한 평가 순서로 인해 다른 결과가 얻어집니다.
세부정보
함수 인수에는 지정되지 않은 평가 순서가 있으며, 반면 함수 호출 연결은 각 함수 호출에 대해 왼쪽에서 오른쪽으로 평가 순서를 도입하며, 각 호출의 인수는 특정 함수 호출과 관련하여
앞서만 순서가 지정됩니다.
예제에서, 이러한 불확정성은 s.replace(0, 4, "")와 관련하여 s.find("even") 및 s.find(" don't")를 평가할 때 발생합니다.
Step 1: s.replace(0, 4, "") // A Step 2: s.find("even") // B Step 3: s.replace(B, 4, "only") // C Step 4: s.find("don't") // D Step 5: s.replace(D, 6, "") // E
A가 B보다 먼저 순서가 지정되고 B가 다시 C보다 먼저 순서가 지정되는 반면
순서 관계는 없습니다.A에 대해 B와 D 사이. 결과적으로 D는 A 이전이나 이후에 평가될 수 있으며, 선택한 순서에 따라 다른 결과로 이어집니다.
C 17 변경 사항위 내용은 정의되지 않은 동작이 Bjarne Stroustrup의 코드에 있는 std::string 연결에 숨어 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!