我的功能存在这个问题。
在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()
答案 0 :(得分:8)
在这一行:
result(name(), score());
未定义函数参数的评估顺序。碰巧这是您的特定编译器(和编译器标志)的评估顺序。如果您希望按特定顺序执行这些功能,那么您首先需要按所需顺序调用它们:
string s = name();
int t = score();
result(s, t);
答案 1 :(得分:5)
这不是随机的,没有说明。
这意味着编译器可以自由地执行它想要的操作。
在这里,编译器决定最好始终在score()
之前调用name()
,并且在没有充分理由的情况下不会改变主意。
也许另一个编译器会决定别的东西,也许它取决于月亮的阶段,你无法分辨,你不应该试图猜测会发生什么。
未指定意味着您不能指望它以任何特定方式行事,您不能依赖它。