我的功能有这个问题.
在main函数中我有这个result(param, param)函数,它有2个函数作为参数.
result(name(), score());
Run Code Online (Sandbox Code Playgroud)
但是,当代码执行时,score()函数首先执行而不是函数执行name().为什么会这样呢?
(还有一个问题是由score()函数首先执行而不是函数执行的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;
}
Run Code Online (Sandbox Code Playgroud)
在这一行:
result(name(), score());
Run Code Online (Sandbox Code Playgroud)
未定义函数参数的评估顺序.碰巧这是您的特定编译器(和编译器标志)的评估顺序.如果您希望按特定顺序执行这些功能,那么您首先需要按所需顺序调用它们:
string s = name();
int t = score();
result(s, t);
Run Code Online (Sandbox Code Playgroud)
这不是随机的,它没有说明.
这意味着编译器可以自由地执行它想要的操作.在这里,编译器决定,这是最好的总是打电话score()之前name(),并没有充分的理由就不会改变主意.也许另一个编译器会决定别的东西,也许它取决于月亮的阶段,你无法分辨,你不应该试图猜测会发生什么.
未指定意味着您不能指望它以任何特定方式运行,您不能依赖它.
| 归档时间: |
|
| 查看次数: |
101 次 |
| 最近记录: |