2015-01-06 2 views
-2

У меня есть эта проблема с моими функциями.Функции, не выполняемые в указанном порядке

в основной функции у меня есть эта функция result(param, param), которая принимает 2 функции в качестве параметров.

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() из-налево-направо ассоциативности оператора +, но вызов функции f3 может быть оценен первым, последним, или между f1() или f2() во время выполнения. **

но моя программа всегда выполняет 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 ++ [вызывает оценку() сначала] (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(), и он не изменит свое решение без веской причины. Возможно, другой компилятор решил бы что-то другое, может быть, это зависит от фазы луны, вы не можете сказать, и вы не должны пытаться угадать, что произойдет.

Unspecified означает, что вы не можете ожидать, что он будет вести себя каким-либо определенным образом, вы не можете положиться на него.

Смежные вопросы