<分区>
Possible Duplicate:
order of evaluation of function parameters
在 C/C++ 中使用以下构造是否安全?
f(g(), h());
g()
预计将先 求值,然后是h()
。
是否所有编译器在所有架构上都表现出相同的行为?
<分区>
Possible Duplicate:
order of evaluation of function parameters
在 C/C++ 中使用以下构造是否安全?
f(g(), h());
g()
预计将先 求值,然后是h()
。
是否所有编译器在所有架构上都表现出相同的行为?
最佳答案
不!无法保证它们的执行顺序。只有 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 )
所以它确实因不同的编译器而异。
很久以后的编辑:事实证明,对于使用初始化列表语法(花括号 {}
)的构造函数,求值顺序是保证(即使它是对不采用 std::initializer_list
的构造函数的调用。See this question。
关于c++ - C/C++ - 计算函数调用中的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9116036/