提问者:小点点

C++函数参数求值顺序


如果我们有三个函数(foo,bar和baz),它们是这样组成的。。。

foo(bar(), baz())

C++标准是否保证bar会在BAZ之前被评估?


共3个答案

匿名用户

不,没有这样的保证。根据C++标准,它是未指定的。

BjarneStroustrup在“C++编程语言”第三版第6.2.2节中也明确指出了这一点,并给出了一些推理:

在没有对表达式求值顺序的限制的情况下,可以生成更好的代码

虽然从技术上讲,这指的是同一节的前一部分,表示表达式各部分求值的顺序也未指定,即。

int x = f(2) + g(3);   // unspecified whether f() or g() is called first

匿名用户

从[5.2.2]函数调用,

参数的求值顺序未指定。参数表达式求值的所有副作用在输入函数之前生效。

因此,不能保证bar()会在baz()之前运行,只能保证bar()baz()会在foo之前调用。

还从[5]表达式中注意到:

除非有说明[例如&的特殊规则],个别运算符的操作数和个别表达式的子表达式的求值顺序,以及副作用发生的顺序均未指定。

因此,即使您询问bar()是否将在foo(bar()+baz())中的bar()之前运行,仍未指定顺序。

匿名用户

bar()和baz()没有指定的顺序--标准唯一规定的是,在调用foo()之前,它们都将被计算。摘自C++标准第5.2.2/8节:

参数的求值顺序未指定。

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(c++|函数|参数|求值|顺序)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?