2013-07-05 1 views
4

f(x)+(g(y))은 먼저 g(y)으로 전화를 걸 수 있습니까? 많은 경우 표현식의 순서가 정의되지 않았지만이 경우 괄호는 작동합니까?"(f (x)) + g (y)"는 C++에서 f (x)를 먼저 호출 할 수 있습니까?

+0

가능한 중복 http://stackoverflow.com/questions/9437683/order-of-expression -evaluation-in-c) – devnull

+0

http://stackoverflow.com/a/9439459/2235132 – devnull

+0

닫기가 아니라면 위의 링크에서 표준의 관련 부분을 적어도 인용 할 수 있습니까? – devnull

답변

24

우선 순위를 무시하기위한 괄호가 있습니다. 그것들은 평가 순서에 영향을 미치지 않습니다.

+0

.... 그럼 안돼? – musefan

+0

여기에 참조를 추가하고 싶습니다. http://en.cppreference.com/w/cpp/language/eval_order – DRC

+1

@musefan 아니요. 작업이 완료된 순서는 다음에 대한 매개 변수의 순서와 아무 관계가 없습니다. 이러한 작업 자체가 평가됩니다. '(a() + b()) + c()'를'a() + (b() + c())'와 비교하면, 괄호는 추가 순서를 바꾼다. *'a()','b()','c()'를 원하는 순서대로 사용할 수 있습니다. –

12

엄마, 두 줄을보세요!

auto r = g(y); 
f(x) + r; 

이 두 함수 호출 사이 sequence point 모든 중요한 소개합니다. 그것을 할 다른 방법이있을 수 있지만,이 방법은 간단하고 명백한 것 같습니다. 괄호는 시퀀스 포인트를 도입하지 않으므로 해결책이 아닙니다.

+1

이것은 실제로 질문 된 질문에 대답하지 않습니다. –

+0

당신이 옳았 기 때문에 설명을하고 링크를 포함 시켰습니다. 위키 피 디아에서 C++의 시퀀스 포인트가 부족한이 정확한 사례를 보여줍니다. –

+0

'auto && r = g (y);'가 아닌가? 그렇지 않으면 어떤 유형의'g '가 반환되는지에 따라 추가 복사본을 만들 수 있습니다. –

2

아니요. + 연산자가 재정의되지 않는 한 왼쪽에서 오른쪽으로 계산됩니다. 연산자의 우선 순위에 영향을 미칠 수 있다고해도 반드시 fg이 같은 순서로 평가 된 것은 아닙니다. 당신이 g 전에 평가 될 f이 필요하면, 당신은 항상 수행 할 수 있습니다

auto resultOfF = f(x); 
auto resultOfG = g(x); 
resultOfF + resultOfG; 
[C에서 식 평가의 주문 (의
+0

고마워요 @rubenvb! 내 C++은 약간 녹슬 었어. 나는'자동'에 대해 몰랐다 ... –

+0

. 그것은 C++ 11 기능이지만, 특히 정확하게이 경우에는 편리합니다 :) – rubenvb