이렇게 구성된 세 가지 함수 (foo, bar, baz)가 있다면 ...
foo(bar(), baz())
C ++ 표준에 의해 baz 전에 bar가 평가된다는 보장이 있습니까?
답변:
아니요, 그런 보장은 없습니다. C ++ 표준에 따라 지정되지 않았습니다.
Bjarne Stroustrup은 또한 "The C ++ Programming Language"3 판 섹션 6.2.2에서 다음과 같은 몇 가지 이유를 가지고 명시 적으로 언급했습니다.
표현식 평가 순서에 대한 제한없이 더 나은 코드 생성 가능
기술적으로 이것은 표현식의 일부 평가 순서도 지정되지 않은 동일한 섹션의 이전 부분을 참조하지만, 즉
int x = f(2) + g(3); // unspecified whether f() or g() is called first
bar () 및 baz ()에 대해 지정된 순서가 없습니다. Standard가 말하는 유일한 것은 foo ()가 호출되기 전에 둘 다 평가된다는 것입니다. C ++ 표준, 섹션 5.2.2 / 8에서 :
인수 평가 순서는 지정되지 않습니다.
bar
행,의 1 baz
행,의 2 행 bar
등을 실행할 수 없음 ). :-)
[5.2.2] 함수 호출부터
인수 평가 순서는 지정되지 않습니다. 인수 표현식 평가의 모든 부작용은 함수가 입력되기 전에 적용됩니다.
따라서, 보장은 없습니다 bar()
전에 실행 baz()
것만, bar()
그리고 baz()
전에 호출됩니다 foo
.
또한 [5] 표현식에서 다음 사항에 유의하십시오.
언급 된 경우를 제외하고 [예 :
&&
and에 대한 특수 규칙||
], 개별 연산자의 피연산자 및 개별 표현식의 하위 표현식 평가 순서 및 부작용이 발생하는 순서는 지정되지 않습니다.
따라서 bar()
에서 이전 baz()
에 실행 할지 여부 를 묻는 경우에도 foo(bar() + baz())
순서는 여전히 지정되지 않습니다.
&
, &&
보증 좌우로 평가 : 제 오퍼랜드 인 경우 상기 제 피연산자는 평가되지 않는다 false
. "
C ++ 17은 C ++ 17까지 지정되지 않은 연산자에 대한 평가 순서를 지정합니다. C ++ 17에 의해 도입 된 평가 순서 보장은 무엇입니까? 질문을 참조하십시오 . 하지만 당신의 표정에 주목하세요
foo(bar(), baz())
아직 지정되지 않은 평가 순서가 있습니다.
C ++ 11에서 관련 텍스트는 8.3.6 Default arguments / 9 (Emphasis mine) 에서 찾을 수 있습니다.
함수가 호출 될 때마다 기본 인수가 평가됩니다. 함수 인수의 평가 순서는 지정되지 않습니다 . 따라서 함수의 매개 변수는 평가되지 않더라도 기본 인수에 사용되지 않습니다.
다른 사람들이 이미 지적했듯이 표준은이 특정 시나리오에 대한 평가 순서에 대한 지침을 제공하지 않습니다. 이 평가 순서는 컴파일러에게 맡기고 컴파일러는 보증 할 수 있습니다.
C ++ 표준은 실제로 컴파일러에게 어셈블리 / 머신 코드 구성에 대해 지시하는 언어라는 것을 기억하는 것이 중요합니다. 표준은 방정식의 한 부분 일뿐입니다. 표준이 모호하거나 구체적으로 구현이 정의 된 경우 컴파일러를 사용하여 C ++ 명령어를 실제 기계 언어로 변환하는 방법을 이해해야합니다.
따라서 평가 순서가 요구 사항이거나 적어도 중요하고 컴파일러 간 호환이 요구 사항이 아닌 경우 컴파일러가 궁극적으로이를 어떻게 결합할지 조사하면 궁극적으로 답이있을 수 있습니다. 컴파일러는 향후 방법론을 변경할 수 있습니다.