C/C++ - 评估函数调用中的参数

psi*_*lia 0 c c++ multiplatform semantics

可能重复:
功能参数的评估顺序

在C/C++中使用以下结构是否安全?

f(g(), h());
Run Code Online (Sandbox Code Playgroud)

其中g()预期要被评估第一,然后h().

所有编译器都在所有体系结构上显示相同的行为吗?

BoB*_*ish 8

没有!无法保证这些命令的执行顺序.只有g()和h()都在f()之前执行.看到这个:http://www.gotw.ca/gotw/056.htm 我认为有一个更新的C++ 11版本,我来看看.

编辑:C++ 11版http://herbsutter.com/gotw/_102/

编辑2:如果你真的想知道具体的编译器是做什么的,试试这个:http://www.agner.org/optimize/calling_conventions.pdf 第7节(第16页)可能是相关的,虽然它有点过头,但是例如__cdecl调用约定意味着参数从右向左传递(至少以那种方式存储),而对于__fastcall"前两个DWORD或更小的参数在ECX和EDX寄存器中传递;所有其他参数从右向左传递. " (http://msdn.microsoft.com/en-us/library/6xa169sk%28v=vs.71%29.aspx)

因此对于不同的编译器而言确实有所不同

很久以后编辑:事实证明,对于使用初始化列表语法(花括号{})的构造函数,可以保证评估顺序(即使它是对不带a的构造函数的调用std::initializer_list.请参阅此问题.