这种情况会以什么顺序发生

时间:2018-03-12 09:11:27

标签: c++ c++14

假设我有一个名为box1box2的实例并运行下面的代码。

if(box1->getSize() > box2->copyBox(box1)->getSize())

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

代码以什么顺序发生? 我想

  1. box1->getSize():返回box1的大小
  2. box2->copyBox(box1)box2现在与box1共享相同的地址,就像他们在同一个实例中一样
  3. box2->getSize():返回box2的大小
  4. >运算符:box1的大小与box2进行比较
  5. 我无法找到VS2017调试器的订单。任何人都可以告诉我一种方法来查找调试器的订单或至少在这个例子中的订单是什么?感谢。

1 个答案:

答案 0 :(得分:4)

没有

copyBox无法更改box2的地址。

getSize(10)不在您正在分解的上述表达式中。

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

鉴于exprA > exprB,编译器可以先评估exprBexprA。在C ++ 17之前,它甚至可以唤醒exprB的一部分,暂停,做exprAexprB中的继续;这可能在C ++ 17中有所改变(它在某些类似的情况下也有所改变,我在这里不确定)。

必须在exprA之前评估exprB>

这个未指定的执行顺序的存在是为了允许不同的编译器以不同的方式解决问题。它允许在给定表达式中以及编译器如何处理调用约定等低级细节时自由优化。