c++ - C/C++ - 计算函数调用中的参数

标签 c++ c semantics multiplatform

<分区>

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/

相关文章:

c++ - 没有括号时,输入结尾处的预期 '}'

c++ - 以编程方式提取 .deb 包

C:解引用指向不完整类型单链表的指针

c++ - 使用 pThreads 在线程之间共享 3D 数组

C++ new 后跟类

jquery - 使用 Jquery 查找父 div 的 id

c++ - 强制实例化模板类中的静态成员

c - 查找数组中恰好出现一次的两个元素

java - Java Cup 的条件 if 语句语法 - 语义

c++ - 使用模板链表类复制构造函数错误