可以说我有一个名为box1box2的实例,并运行下面的代码。

if(box1->getSize() > box2->copyBox(box1)->getSize())
getSize()返回box的大小,copyBox(box)将box1的数据复制到box2而不是地址。

代码以什么顺序发生?
我想
  • box1->getSize():返回box1的大小
  • box2->copyBox(box1):box2现在与box1共享相同的地址,因为它们是同一实例
  • box2->getSize():返回box2的大小
  • >运算符:比较box1box2的大小

  • 我找不到VS2017调试器的订单。谁能告诉我一种使用调试器查找订单的方法,或者至少在此示例中是什么?谢谢。

    最佳答案

    没有。
    copyBox无法更改box2的地址。
    getSize(10)不在您要分解的上面的表达式中。

    无法保证>的lhs和rhs的评估顺序。

    给定exprA > exprB,编译器可以首先评估exprBexprA。在C++ 17之前,它甚至可以evojiate exprB的一部分,暂停,执行exprA的par,然后继续exprB;这在C++ 17中可能已经更改(它在某些类似的上下文中确实发生过,并且我在这里不确定)。

    它必须先评估exprAexprB,再评估>

    存在这种未指定的执行顺序,以允许不同的编译器以不同的方式解决问题。它使您可以自由地进行优化,既可以在给定的表达式中进行优化,也可以在编译器如何处理底层细节(如调用约定)方面进行优化。

    10-08 11:00