未按顺序执行的功能

Joh*_*son -2 c++ function

我的功能有这个问题.

在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)

Pau*_*l R 8

在这一行:

result(name(), score());
Run Code Online (Sandbox Code Playgroud)

未定义函数参数的评估顺序.碰巧这是您的特定编译器(和编译器标志)的评估顺序.如果您希望按特定顺序执行这些功能,那么您首先需要按所需顺序调用它们:

string s = name();
int t = score();
result(s, t);
Run Code Online (Sandbox Code Playgroud)

  • 碰巧这是您的特定编译器(和编译器标志)的评估顺序 - 它可能与不同的编译器(甚至只是不同的优化设置)不同. (3认同)
  • 你必须接受,如果你将函数作为参数传递,那么评估的顺序是未指定的,即你不能依赖它.对于大多数函数调用(即编写良好的代码,没有副作用)这没关系,但在您的示例中,它显然很重要. (3认同)

tux*_*ux3 5

这不是随机的,它没有说明.

这意味着编译器可以自由地执行它想要的操作.在这里,编译器决定,这是最好的总是打电话score()之前name(),并没有充分的理由就不会改变主意.也许另一个编译器会决定别的东西,也许它取决于月亮的阶段,你无法分辨,你不应该试图猜测会发生什么.

未指定意味着您不能指望它以任何特定方式运行,您不能依赖它.