条件评估是否优化?这个代码坏了吗

Is condition evaluation optimized ? Is this code bad?

本文关键字:代码 坏了 评估 是否 优化 条件      更新时间:2023-10-16

1.想象条件if (obj.is_x() || obj.is_y() || obj.is_z())
如果obj.is_x()返回true,是否会调用和评估obj.is_y()obj.is_z()

2.(总的来说)这是个坏主意吗?这个代码看起来不好吗?

bool isbn13_prefix_valid (const string& prefix)
{
    unsigned num = stoi(prefix);
    if (num == 978 || num == 979) return 1;  //super common ones
        else if (   num >= 0 && num <= 5 || num == 7 || num >= 600 && num <= 649
                || num >= 80 && num <= 94 || num >= 950 && num <= 989
                || num >= 9900 && num <= 9989 || num >= 99900 && num <= 99999)
            return 1;
    return 0;
}
  1. 不,不会,因为短路。

  2. 是的,那个代码看起来很糟糕。不是因为它不正确,而是因为您将一个超长的条件填充到单个if语句中。尝试重构代码以使其更干净。

您的代码非常好。我想看看这些奇怪数字的来源,仅此而已。

把它变成已经提出的十几个琐碎的函数是毫无帮助的。实际上,这会使读取代码变得更加困难,因为它会分散在许多行代码中。是的,它很复杂。但这是因为问题很复杂,试图分散复杂性也于事无补。

您的实际问题:在a||b中,首先评估a。如果它是真的,那么不计算b,并且结果是真的。如果a为假,则b也被评估,结果为真或假,这取决于b的结果。

如果优化编译器能够证明对b的评估没有副作用,并且它认为(主要是由于硬件中的并行性)平均而言,尽可能多地并行评估会更快,即使有些事情是在不必要的时候评估的,那么它可能会在完成对a的评估之前就开始对b进行评估。但这在代码的结果中是不可注意的,只会使代码更快。