2015-01-06 2 views
-2

내 기능에이 문제가 있습니다.순서대로 실행되지 않는 기능이 제공되었습니다.

주요 기능 나는 2 개의 기능을 매개 변수로 취하는이 result(param, param) 기능이 있습니다.

result(name(), score()); 

그러나 코드는 제 기능 score() 아닌 name() 함수를 실행할 때 실행. 왜 그런 일이 일어나는가?

처음이 아닌 name() 기능을 수행 점수() 함수에서 발생

(또 다른 문제는 내가하지만 난 그냥 알 필요가 있음을 해결하는 방법을 알고있다. \n 읽기와 name() 기능은 모두 건너 얻을 수 있다는 것입니다 먼저 name() 함수가 실행되지 않습니다.).

여기 발견 : http://en.cppreference.com/w/cpp/language/eval_order. 함수 호출 발현 함수 인자의 평가 순서 및 표현식 내의 표현식의 평가 순서 포함한 C++ 연산자의 피연산자의 평가

순서는 아래에 언급 된 경우를 제외하고 (지정되지). 컴파일러는 임의의 순서로 평가하고 동일한 표현식이 다시 평가 될 때 다른 순서를 선택할 수 있습니다.

C++에서 왼쪽에서 오른쪽 또는 오른쪽에서 왼쪽으로 평가하는 개념이 없습니다. 연산자의 왼쪽에서 오른쪽 및 오른쪽에서 왼쪽으로의 연결성과 혼동해서는 안됩니다. f1() + f2() + f3() 표현식은 다음과 같습니다. 인해 (f1() + f2()) + f3()로 분석 연산자 +의 연관성에 왼쪽에서 오른쪽,하지만,하지만 내 프로그램은 항상을 실행 f1() 또는 런타임에 f2() 사이. **

F3에 함수 호출이 먼저 평가, 또는 할 수있다 score() 기능을 먼저 수행하십시오. 그리고 위에는 무작위이므로 최소한 name() 함수를 처음에는 올바르게 실행시켜야합니다.

전체 코드는 여기를 참조하십시오. 이 라인

#include <iostream> 
#include <string> 

using namespace std; 

string name() 
{ 
    string fname; 
    cout << "Please type your full name: "; 
    getline(cin, fname); 
    return fname; 
} 

int score() 
{ 
    int points; 
    cout << "Please type your score: "; 
    cin >> points; 
    return points; 
} 

void result(string fname, int points) 
{ 
    cout << "Ok " << fname << ", your score of " << points << " is "; 
    if (points > 100) 
    { 
     cout << "Impossible"; 
    } 
    else if (points == 100) 
    { 
     cout << "Perfect!!!"; 
    } 
    else if (points >= 85 && points < 100) 
    { 
     cout << "Amazing!!"; 
    } 
    else if (points >= 70 && points < 85) 
    { 
     cout << "Good!"; 
    } 
    else if (points >= 50 && points < 70) 
    { 
     cout << "Ok."; 
    } 
    else if (points < 50) 
    { 
     cout << "Bad..."; 
    } 
    else 
    { 
     cout << "Incorrect input"; 
    } 
} 
int main() 
{ 
    result(name(), score()); 
    return 0; 
} 
+1

coliru에서 clang ++ [http://coliru.stacked-crooked.com/a/8491dfe97dc3a688]와 g ++ [calls first()를 먼저 호출] (http : //coliru.stacked-crooked) .com/a/e63c6a5157fedb98) – Cubbi

답변

8

:

result(name(), score()); 

함수 인수에 대한 평가 순서는 정의되지 않는다. 이것은 특정 컴파일러 (및 컴파일러 플래그)를 사용한 평가 순서입니다. 이 기능은 특정 순서로 실행하려는 경우 먼저 필요한 순서대로 호출하는 네드 것이다 :

string s = name(); 
int t = score(); 
result(s, t); 
+0

그래, 그게 내가 위의 참조를 게시 한 이유입니다. 그런데 왜 두 번째 함수가 항상 먼저 실행됩니까? – Johnson

+3

이것은 특정 컴파일러 (및 컴파일러 플래그)의 평가 순서이므로 다른 컴파일러와 다를 수 있습니다 (또는 다른 최적화 설정으로도 가능함). –

+0

함수 실행 순서는 컴파일러가 평가하거나 코드를 내보내는 가장 쉬운 방법을 기반으로 할 수 있습니다. 간혹 컴파일러에서 오른쪽에서 왼쪽으로 매개 변수를 평가하는 것이 더 간단합니다. –

5

그것은, 그것은 지정하지 임의의 것.

이는 컴파일러가 원하는 것을 자유롭게 할 수 있음을 의미합니다. 여기서 컴파일러는 항상 score()name() 전에 호출하는 것이 가장 좋으며, 정당한 이유없이 마음을 바꾸지 않을 것이라고 결정했습니다. 아마도 다른 컴파일러가 뭔가 다른 것을 결정했을 것입니다. 어쩌면 달의 위상에 달려 있습니다. 말할 수 없으며 일어날 일을 추측하려고하지 않아도됩니다.

지정되지 않은 것은 특정 방식으로 작동한다고 기대할 수 없다는 뜻입니다.

관련 문제