C++ 是否有更好的方法重写此代码段?
考虑以下几点:C++ 是否有更好的方法重写此代码段?,c++,if-statement,C++,If Statement,考虑以下几点: if ((a || b) && (c || d)) { if (a && c) {...} else if (b && d) {...} else {...} } else {...} 其中a、b、c和d是导致bool的表达式 从代码中可以清楚地看到,很少有表达式被重新计算。在a)清晰性方面是否有更好的方法?b) 效率?简单的回答:可以在if语句之前将表达式存储在bool变量中 如果表达式不涉及函数调用(因
if ((a || b) && (c || d))
{
if (a && c) {...}
else if (b && d) {...}
else {...}
}
else {...}
其中a
、b
、c
和d
是导致bool
的表达式
从代码中可以清楚地看到,很少有表达式被重新计算。在a)清晰性方面是否有更好的方法?b) 效率?简单的回答:可以在if语句之前将表达式存储在bool变量中
如果表达式不涉及函数调用(因此很明显,它们可能不会在语句之间发生变化),我希望编译器会像这样对其进行优化。简单的回答:可以在If语句之前将表达式存储在bool变量中
如果表达式不涉及函数调用(因此很明显,它们可能不会在语句之间发生变化),我希望编译器能像这样对其进行优化。惊讶:我认为您真的不需要外部
If
语句。请注意,使用逻辑法则,外部if
可以从以下内容重写:
if ((a || b) && (c || d))
到
换句话说,如果(a和&c)
或(b和&d)
为true,则外部if
将始终计算为true,因此可以删除它。相反,您可以这样写:
if (a && c) {...}
else if (b && d) {...}
else if ((a && d) || (b && c)) {...} // your original 'inner' else
else {...} // your original 'outer' else
惊喜:我认为你并不真的需要外部的
if
语句。请注意,使用逻辑法则,外部if
可以从以下内容重写:
if ((a || b) && (c || d))
到
换句话说,如果(a和&c)
或(b和&d)
为true,则外部if
将始终计算为true,因此可以删除它。相反,您可以这样写:
if (a && c) {...}
else if (b && d) {...}
else if ((a && d) || (b && c)) {...} // your original 'inner' else
else {...} // your original 'outer' else
这个问题更适合codereview.stackexchange.com您担心什么?清晰还是高效?@TartanLlama清晰是首要任务。但是我也很想知道效率方面对于效率,我怀疑您在编译的代码中是否会看到任何差异。为了清楚起见,我打算建议@TimBiegeleisen发布的答案。这可能取决于这些表达式是什么。这个问题更适合codereview.stackexchange.com您担心什么?清晰还是高效?@TartanLlama清晰是首要任务。但是我也很想知道效率方面对于效率,我怀疑您在编译的代码中是否会看到任何差异。为了清楚起见,我打算建议@TimBiegeleisen发布的答案。这可能取决于那些表达方式。OP中的版本对我来说似乎更有效。如果
c
和d
的计算结果为false
,该怎么办?在最初的形式中,在这种情况下,在第一次求值之后,整个块将被丢弃,而这里有几个else
语句需要检查…@RHertel您可能写的是效率,但就清晰度而言,我更喜欢我给出的答案。@RHertel不要猜测性能和编译器优化。在证明不是这样之前,上面的东西已经足够快了。@BaummitAugen足够公平了。我知道编译器无论如何都会进行优化。但出于与我提到的相同的原因(这可能对效率并不重要),我还发现原始版本更清晰,因为它从一开始就描述了true
的哪些组合对块的评估有意义。@RHertel,不管您觉得如何,都认为编译器会对其进行优化,并且(对于像这样的布尔表达式,它可以轻松地计算所有可能性)将选择最有效的编译方式。可能,实际上是等效的,两者将产生相同的编译代码。OP中的版本对我来说似乎更有效。如果c
和d
计算为false
?在原始形式中,在第一次计算后,整个块将被丢弃,然而这里有几个else
语句需要检查…@RHertel你可能写的是关于效率的,但就清晰度而言,我更喜欢我给出的答案。@RHertel不要猜测性能和编译器优化。以上内容足够快,除非得到证明。@BaummitAugen足够公平。我理解编译器无论如何都会优化。但出于我提到的可能对效率不重要的相同原因,我还发现原始版本更清晰,因为它从一开始就描述了true
的哪些组合对于块的评估是有意义的。@RHertel,不管你觉得如何,认为mpiler将对其进行优化,并且(对于像这样的布尔表达式,它可以很容易地评估所有可能性)将选择最有效的编译方法。可能,实际上是等价的,两者将产生相同的编译代码。