假设我有一个名为box1
,box2
的实例并运行下面的代码。
if(box1->getSize() > box2->copyBox(box1)->getSize())
getSize()
返回框的大小,copyBox(box)
将box1的数据复制到box2而不是地址。
代码以什么顺序发生? 我想
box1->getSize()
:返回box1
的大小box2->copyBox(box1)
:box2
现在与box1
共享相同的地址,就像他们在同一个实例中一样box2->getSize()
:返回box2
的大小>
运算符:box1
的大小与box2
进行比较我无法找到VS2017调试器的订单。任何人都可以告诉我一种方法来查找调试器的订单或至少在这个例子中的订单是什么?感谢。
答案 0 :(得分:4)
没有
copyBox
无法更改box2
的地址。
getSize(10)
不在您正在分解的上述表达式中。
无法保证>
的lhs和rhs的评估顺序。
鉴于exprA > exprB
,编译器可以先评估exprB
或exprA
。在C ++ 17之前,它甚至可以唤醒exprB
的一部分,暂停,做exprA
,exprB
中的继续;这可能在C ++ 17中有所改变(它在某些类似的情况下也有所改变,我在这里不确定)。
必须在exprA
之前评估exprB
和>
。
这个未指定的执行顺序的存在是为了允许不同的编译器以不同的方式解决问题。它允许在给定表达式中以及编译器如何处理调用约定等低级细节时自由优化。