program story

C ++ 함수 매개 변수의 평가 순서

inputbox 2020. 10. 10. 10:01
반응형

C ++ 함수 매개 변수의 평가 순서


이렇게 구성된 세 가지 함수 (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 ()에 대해 지정된 순서가 없습니다. 표준이 말하는 유일한 것은 foo ()가 호출되기 전에 둘 다 평가된다는 것입니다. C ++ 표준, 섹션 5.2.2 / 8에서 :

인수 평가 순서는 지정되지 않습니다.


[5.2.2] 함수 호출부터

인수 평가 순서는 지정되지 않습니다. 인수 표현식 평가의 모든 부작용은 함수가 입력되기 전에 적용됩니다.

따라서, 보장은 없습니다 bar()전에 실행 baz()것만, bar()그리고 baz()전에 호출됩니다 foo.

또한 [5] 표현식에서 다음 사항에 유의하십시오.

언급 된 경우를 제외하고 [예 : &&and에 대한 특수 규칙 ||], 개별 연산자의 피연산자 및 개별 표현식의 하위 표현식 평가 순서 및 부작용이 발생하는 순서는 지정되지 않습니다.

따라서 bar()에서 이전 baz()실행 할지 여부 묻는 경우에도 foo(bar() + baz())순서는 여전히 지정되지 않습니다.


C ++ 17은 C ++ 17까지 지정되지 않은 연산자에 대한 평가 순서를 지정합니다. C ++ 17에 의해 도입 된 평가 순서 보장은 무엇입니까? 질문을 참조하십시오 . 하지만 당신의 표정에 주목하세요

foo(bar(), baz())

아직 지정되지 않은 평가 순서가 있습니다.


C ++ 11에서 관련 텍스트는 8.3.6 Default arguments / 9 (Emphasis mine) 에서 찾을 수 있습니다.

기본 인수는 함수가 호출 될 때마다 평가됩니다. 함수 인수의 평가 순서는 지정되지 않습니다 . 결과적으로, 함수의 매개 변수는 평가되지 않더라도 기본 인수에 사용되지 않습니다.

동일한 설명이 C ++ 14 표준에서도 사용되며 동일한 섹션 아래 에 있습니다 .


다른 사람들이 이미 지적했듯이 표준은이 특정 시나리오에 대한 평가 순서에 대한 지침을 제공하지 않습니다. 이 평가 순서는 컴파일러에게 맡겨지고 컴파일러는 보증 할 수 있습니다.

C ++ 표준은 실제로 컴파일러에게 어셈블리 / 머신 코드 구성을 지시하는 언어라는 점을 기억하는 것이 중요합니다. 표준은 방정식의 한 부분 일뿐입니다. 표준이 모호하거나 구현이 특별히 정의 된 경우 컴파일러를 사용하여 C ++ 명령어를 실제 기계 언어로 변환하는 방법을 이해해야합니다.

따라서 평가 순서가 요구 사항이거나 적어도 중요하고 컴파일러 간 호환이 요구 사항이 아닌 경우 컴파일러가 궁극적으로이를 어떻게 결합할지 조사하면 궁극적으로 답이있을 수 있습니다. 컴파일러는 향후 방법론을 변경할 수 있습니다.

참고 URL : https://stackoverflow.com/questions/2934904/order-of-evaluation-in-c-function-parameters

반응형