Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否有更好的方法重写此代码段?_C++_If Statement - Fatal编程技术网

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将对其进行优化,并且(对于像这样的布尔表达式,它可以很容易地评估所有可能性)将选择最有效的编译方法。可能,实际上是等价的,两者将产生相同的编译代码。