可以说我有一个名为box1
,box2
的实例,并运行下面的代码。
if(box1->getSize() > box2->copyBox(box1)->getSize())
getSize()
返回box的大小,copyBox(box)
将box1的数据复制到box2而不是地址。代码以什么顺序发生?
我想
box1->getSize()
:返回box1
的大小box2->copyBox(box1)
:box2
现在与box1
共享相同的地址,因为它们是同一实例box2->getSize()
:返回box2
的大小>
运算符:比较box1
和box2
的大小我找不到VS2017调试器的订单。谁能告诉我一种使用调试器查找订单的方法,或者至少在此示例中是什么?谢谢。
最佳答案
没有。copyBox
无法更改box2
的地址。getSize(10)
不在您要分解的上面的表达式中。
无法保证>
的lhs和rhs的评估顺序。
给定exprA > exprB
,编译器可以首先评估exprB
或exprA
。在C++ 17之前,它甚至可以evojiate exprB
的一部分,暂停,执行exprA
的par,然后继续exprB
;这在C++ 17中可能已经更改(它在某些类似的上下文中确实发生过,并且我在这里不确定)。
它必须先评估exprA
和exprB
,再评估>
。
存在这种未指定的执行顺序,以允许不同的编译器以不同的方式解决问题。它使您可以自由地进行优化,既可以在给定的表达式中进行优化,也可以在编译器如何处理底层细节(如调用约定)方面进行优化。