函数未按提供的顺序执行
Functions not executing in order provided
我的函数有这个问题。
在主函数中我有这个 result(param, param)
函数,它将 2 个函数作为参数。
result(name(), score());
然而,当代码执行时,score()
函数首先执行,而不是 name()
函数。为什么会这样。
(另外一个由 score() 函数首先执行而不是 name()
函数引起的问题是我读取了 \n
并且完全跳过了 name()
函数.但是我知道如何解决我只需要知道为什么不先执行 name()
函数。。
我在这里找到了这个:http://en.cppreference.com/w/cpp/language/eval_order。
Order of evaluation of the operands of any C++ operator, including the order of evaluation of function arguments in a function-call expression, and the order of evaluation of the subexpressions within any expression is unspecified (except where noted below). The compiler will evaluate them in any order, and may choose another order when the same expression is evaluated again.
There is no concept of left-to-right or right-to-left evaluation in C++, which is not to be confused with left-to-right and right-to-left associativity of operators: the expression f1() + f2() + f3()
is parsed as (f1() + f2()) + f3()
due to left-to-right associativity of operator+, but the function call to f3 may be evaluated first, last, or between f1()
or f2()
at run time.**
但是我的程序总是先执行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;
}
这一行:
result(name(), score());
未定义函数参数的求值顺序。碰巧这是您的特定编译器(和编译器标志)的评估顺序。如果您希望函数以特定顺序执行,那么您需要先按要求的顺序调用它们:
string s = name();
int t = score();
result(s, t);
不是随机的,是未指定的。
这意味着编译器可以自由地做它想做的事。
这里编译器决定最好总是在 name()
之前调用 score()
,并且不会在没有充分理由的情况下改变主意。
也许另一个编译器会做出其他决定,也许这取决于月相,你无法判断,也不应该试图猜测会发生什么。
未指定意味着您不能期望它以任何特定方式运行,您不能依赖它。
我的函数有这个问题。
在主函数中我有这个 result(param, param)
函数,它将 2 个函数作为参数。
result(name(), score());
然而,当代码执行时,score()
函数首先执行,而不是 name()
函数。为什么会这样。
(另外一个由 score() 函数首先执行而不是 name()
函数引起的问题是我读取了 \n
并且完全跳过了 name()
函数.但是我知道如何解决我只需要知道为什么不先执行 name()
函数。。
我在这里找到了这个:http://en.cppreference.com/w/cpp/language/eval_order。
Order of evaluation of the operands of any C++ operator, including the order of evaluation of function arguments in a function-call expression, and the order of evaluation of the subexpressions within any expression is unspecified (except where noted below). The compiler will evaluate them in any order, and may choose another order when the same expression is evaluated again.
There is no concept of left-to-right or right-to-left evaluation in C++, which is not to be confused with left-to-right and right-to-left associativity of operators: the expression
f1() + f2() + f3()
is parsed as(f1() + f2()) + f3()
due to left-to-right associativity of operator+, but the function call to f3 may be evaluated first, last, or betweenf1()
orf2()
at run time.**
但是我的程序总是先执行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;
}
这一行:
result(name(), score());
未定义函数参数的求值顺序。碰巧这是您的特定编译器(和编译器标志)的评估顺序。如果您希望函数以特定顺序执行,那么您需要先按要求的顺序调用它们:
string s = name();
int t = score();
result(s, t);
不是随机的,是未指定的。
这意味着编译器可以自由地做它想做的事。
这里编译器决定最好总是在 name()
之前调用 score()
,并且不会在没有充分理由的情况下改变主意。
也许另一个编译器会做出其他决定,也许这取决于月相,你无法判断,也不应该试图猜测会发生什么。
未指定意味着您不能期望它以任何特定方式运行,您不能依赖它。