c/c++语言开发共享C / C ++ – 函数调用中参数的计算


可能重复:
function参数评估顺序

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

f(g(), h()); 

其中g() 首先被评估,然后是h()

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

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

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

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

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

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

    见1.9程序执行:

    抽象机器的某些其他方面和操作在本国际标准中描述为未指定的( 例如,对函数的参数的评估顺序 )。 在可能的情况下,本国际标准定义了一组允许的行为。

    和8.3.6默认参数,9:

    […]每次调用函数时都会计算默认参数。 函数参数的评估顺序未指定。 因此,函数的参数不应在默认参数中使用,即使它们未被评估。 […]

    不,这不安全 – 如果您需要有保证的评估顺序,例如因为副作用,那么您将需要执行以下操作:

     foo = g(); bar = h(); f(foo, bar); 

    不,没有具体说明相互之间的论证评估顺序。 您唯一的保证是它们不会彼此同时执行。

    不可以。在这种情况下,标准没有定义评估顺序,每个编译器都可以做任何想做的事情。 我认为他们中的大多数(特别是gcc )首先评估最正确的。

      以上就是c/c++开发分享C / C ++ – 函数调用中参数的计算相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/522478.html

      (0)
      上一篇 2020年12月10日
      下一篇 2020年12月10日

      精彩推荐