在我的C++中(让我们说这是gcc),我执行以下操作:

bool prevCurve;
bool curveInside;
bool prevCurveIn
if (!(prevCurve && curveInside == prevCurveIn)){
...
}

编译器会像这样优化它:
bool prevCurve;
bool curveInside;
bool prevCurveIn
if (!prevCurve || curveInside != prevCurveIn){
...
}

最佳答案

否。计算此表达式时:

if (!(prevCurve && curveInside == prevCurveIn)){

该标准要求在评估表达式的其余部分之前,必须对prevCurve进行全面评估,包括任何副作用。运算符“&&”引入一个序列点。在等效情况下:
if (!prevCurve || curveInside != prevCurveIn){

运算符||还引入了一个序列点。

从理论上讲,在两种情况下,编译器可能会生成相同的代码,但是即使这样做,也不是最优的。除了基于其他考虑因素进行优化的可能性外,每种情况下的代码都将执行相似的指令序列,并获得完全相同的结果。该标准要求是这样。

关于c++ - C++如果语句重新排序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23031659/

10-15 22:28