1.Imagine condition if (obj.is_x() || obj.is_y() || obj.is_z())
如果obj.is_y()
返回true,那么obj.is_z()
和obj.is_x()
会被调用和评估吗?
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;
}
答案 0 :(得分:7)
不,由于short-circuiting,它不会。
是的,该代码看起来很糟糕。不是因为它不正确,而是因为你将一个非常长的条件填充到单个if
语句中。尝试重构代码以使其更清晰。
答案 1 :(得分:1)
你的代码绝对没问题。我希望看到这些奇怪数字来自的评论,这就是全部。
如所建议的那样将它变成十几个琐碎的函数并没有任何帮助。它实际上使得阅读代码变得更加困难,因为它会分散在许多代码行中。是的,这很复杂。但是由于这个问题很复杂,并且试图将复杂性分散开来并不能帮助我。
您的实际问题:在||中b,首先评估a。如果为真,则不评估b,结果为真。如果a为假,则还会对b进行求值,结果为真或假,具体取决于b的结果。
优化编译器可以在完成评估之前开始评估b,如果它可以证明b的评估没有副作用,并且如果它认为(主要是由于硬件中的并行性)它平均更快尽可能并行地评估,即使有些事情在没有必要时进行评估。但是这在代码的结果中并不明显,只会使代码更快。