未按顺序执行的功能

时间:2015-01-06 21:54:50

标签: c++ function

我的功能存在这个问题。

在main函数中我有result(param, param)函数,它将2个函数作为参数。

result(name(), score());

但是,当代码执行时,score()函数首先执行,而不是name()函数。为什么会这样。

(首先执行的score()函数而不是name()函数产生的另一个问题是我得到\n读取并且name()函数被完全跳过。但是我知道如何解决这个问题我只需要知道为什么不首先执行name()函数。)。

我在这里找到了这个:http://en.cppreference.com/w/cpp/language/eval_order

  

任何C ++运算符的操作数的评估顺序,包括函数调用表达式中函数参数的评估顺序,以及任何表达式中子表达式的评估顺序都是未指定的(除非另有说明)。编译器将以任何顺序对它们进行评估,并且可以在再次评估相同的表达式时选择另一个顺序。

     

在C ++中没有从左到右或从右到左评估的概念,不要混淆运算符的从左到右和从右到左的关联:表达式{{1由于operator +的从左到右的关联性,解析为f1() + f2() + f3(),但是在运行时可以在(f1() + f2()) + f3()f1()之前或之间评估对f3的函数调用。**

但我的程序总是首先执行f2()函数。在它上面说它是随机的所以我至少应该先执行score()函数有时候正确吗?

完整代码可供参考。

name()

2 个答案:

答案 0 :(得分:8)

在这一行:

result(name(), score());

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

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

答案 1 :(得分:5)

这不是随机的,没有说明。

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

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