2012-02-02 4 views
0

가능한 중복의 인수의 평가 :
order of evaluation of function parametersC/C++ 함수 호출

는 C/C에서 다음과 같은 구조를 사용하는 것이 안전한가요 ++? g() 예상되는

f(g(), h()); 

h() 후, 제을 평가한다.

모든 컴파일러가 모든 아키텍처에서 동일한 동작을 보이나요?

+2

, 내가 중복 마커 ... – PlasmaHH

+0

들으하지만 무엇을 선택하는 어느 결정할 수 없습니다 실제 컴파일러에 대해? 그들은 어떤 순서로 사용합니까? – psihodelia

+1

@ psihodelia : 나는 모든 명령을 사용하는 것을 보았다. – PlasmaHH

답변

8

NO! f() 전에 g()와 h() 둘 다 수행됩니다. 보기 : http://www.gotw.ca/gotw/056.htm 업데이트 된 C++ 11 버전이 있다고 생각합니다.

편집 : C++ 11 버전 http://herbsutter.com/gotw/_102/

편집 2 : 당신이 정말로 특정 컴파일러가 무엇을 알고 싶다면,이 시도 : http://www.agner.org/optimize/calling_conventions.pdf 7 절은 조금 이상 비록 (16 페이지)이 관련 될 수있다 내 머리,하지만 예를 들어, __cdecl 호출 규칙은 인수가 오른쪽에서 왼쪽으로 전달됨을 의미합니다. (적어도 그 방식으로 저장 됨) __fastcall의 경우 "처음 두 DWORD 또는 그보다 작은 인수는 ECX 및 EDX 레지스터로 전달되고 다른 모든 인수는 오른쪽으로 전달됩니다 왼쪽으로. " (http://msdn.microsoft.com/en-us/library/6xa169sk%28v=vs.71%29.aspx)

그래서 다른 컴파일러에 따라 다릅니다.

훨씬 나중에 편집 : 그것은이 std::initializer_list을하지 않는 생성자를 호출하는 경우에도 (이니셜리스트 구문 (중괄호 {})를 사용하여 생성자에 대한 평가 의 순서가 보장 밝혀 . See this question.

0

아니, 서로에 대해 인수의 평가 순서는 지정되지 않습니다. 당신이 가진 유일한 보증은 그들이 서로 동시에 실행되지 않을 것입니다.

+1

[해당 보증은 어디에서 제공됩니까?] (0120-555-003) –

0

번호 표준은이 경우 평가 순서를 정의하지 않으며 각 컴파일러는 원하는대로 수행 할 수 있습니다. 나는 그들 중 대부분이 (그리고 특별히 gcc) 가장 먼저 평가한다고 생각한다.

+0

최적화 플래그에 따라 달라질 수 있습니다. (및 대상 하드웨어). –

1

1.9 프로그램 실행 참조 :

다른 특정 양태 및 추상 머신의 동작은 불특정 같이이 표준에 기재되어있다 (예 을 함수 인자의 평가를 위해). 가능한 경우이 국제 표준은 허용 가능한 행동 집합을 정의합니다.

및 8.3.6 기본 인자 9 :

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

1

아니오, 보장되지 않은 평가 순서가 필요한 경우, 예. 때문에 부작용, 당신은 같은 것을 할 필요가있을 것이다 :

이 질문은 여기 자주 이렇게 요청합니다
foo = g(); 
bar = h(); 
f(foo, bar);