C++ 条件评估是否优化?这是坏代码吗?

C++ 条件评估是否优化?这是坏代码吗?,c++,optimization,conditional-statements,logical-operators,evaluation,C++,Optimization,Conditional Statements,Logical Operators,Evaluation,1.想象条件if(obj.is_x()| | obj.is_y()| | obj.is_z()) 如果obj.is_y()返回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.想象条件
if(obj.is_x()| | obj.is_y()| | obj.is_z())

如果
obj.is_y()
返回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;
}
bool isbn13\u前缀\u有效(常量字符串和前缀)
{
无符号num=stoi(前缀);
if(num==978 | | num==979)返回1;//超普通值
如果(num>=0&&num=600&&num=80&&num=950&&num=9900&&num=99900&&num
  • 不,不会的,因为

  • 是的,这段代码看起来很糟糕。不是因为它不正确,而是因为你在一个
    if
    语句中塞进了一个非常长的条件。试着重构你的代码,让它更干净


  • 你的代码非常好。我想看看这些奇怪的数字是从哪里来的,仅此而已

    将它转换成十几个简单的函数并没有任何帮助。这实际上会使阅读代码变得更加困难,因为它会分散在许多行代码中。是的,它是复杂的。但这是因为问题很复杂,试图分散复杂性一点帮助也没有

    你的实际问题是:在a | | b中,首先计算a。如果a为真,则不计算b,结果为真。如果a为假,则也计算b,结果为真或假,取决于b的结果


    优化编译器可以在完成对a的评估之前开始评估b,前提是它可以证明对b的评估没有副作用,并且它相信这一点(主要是由于硬件中的并行性)平均而言,尽可能多地并行计算会更快,即使有些事情是在不必要的情况下计算的。但这在代码的结果中并不明显,只会使代码更快。

    您至少应该对这些值使用符号常量。然后,您应该考虑将每个条件重构为一个单独的条件具有自解释名称的le方法。
    if(num==978 | | num==979)返回1;//超级普通的else如果
    去掉else,它是多余的。最后一个条件与
    num==999
    相同。容易出错,难以理解,没有直观意义,太长。@UweAllner:如果你想通过说明你写的代码行数来打动你的老板,这是个好建议。如果你写的代码行数太多,那就不是个好建议你希望完成一项工作。最好是添加一条注释,说明该规范要求提供这些奇怪的值列表。完成工作是一回事;能够在一周后阅读自己的代码是另一回事。我的老板不在乎代码行数;他和我只对可读和可维护的代码感兴趣。一个好的编译器只会优化代码无论如何,通过内联小方法来编写代码。