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;
}
-
不,不会,因为短路。
-
是的,那个代码看起来很糟糕。不是因为它不正确,而是因为您将一个超长的条件填充到单个
if
语句中。尝试重构代码以使其更干净。
您的代码非常好。我想看看这些奇怪数字的来源,仅此而已。
把它变成已经提出的十几个琐碎的函数是毫无帮助的。实际上,这会使读取代码变得更加困难,因为它会分散在许多行代码中。是的,它很复杂。但这是因为问题很复杂,试图分散复杂性也于事无补。
您的实际问题:在a||b中,首先评估a。如果它是真的,那么不计算b,并且结果是真的。如果a为假,则b也被评估,结果为真或假,这取决于b的结果。
如果优化编译器能够证明对b的评估没有副作用,并且它认为(主要是由于硬件中的并行性)平均而言,尽可能多地并行评估会更快,即使有些事情是在不必要的时候评估的,那么它可能会在完成对a的评估之前就开始对b进行评估。但这在代码的结果中是不可注意的,只会使代码更快。