我正在寻找一种更有效的方法来编写这些 if 条件:
a = huge_term >= b ? huge_term : c
或者
(a = huge_term) >= b ? a : a = c
第二个很短,但变量a
出现了 3 次。我需要将结果存储在变量中。你会怎么写?
我正在寻找一种更有效的方法来编写这些 if 条件:
a = huge_term >= b ? huge_term : c
或者
(a = huge_term) >= b ? a : a = c
第二个很短,但变量a
出现了 3 次。我需要将结果存储在变量中。你会怎么写?
我建议使用中间变量并将逻辑分解为自己的函数。一般来说,每当我发现这样的条件逻辑时,它就会一次又一次地出现在我的项目中,因此从长远来看,重构它可以节省时间。
Type processInput(const Type input)
{
auto result = input;
if ( input < b )
{
result = c;
}
return result;
}
int main()
{
const auto input = huge_term;
const auto result = processInput(input);
}
您的第一种方法是可以的,但表达式的额外复杂性会使其不可读,使用它可能会更好if
。
第二种“方法”既不可读又低效——存在冗余计算。不要那样做。
变量出现多次肯定比大表达式好。
无论哪种方式,它都可能不会产生效率差异,但从程序组织的角度来看,最好不要重复大块代码。
如果huge_term
编译器可以将其识别为公共子表达式,其值在两次评估之间不会发生变化,则可以通过 CSE(公共子表达式消除)将其消除。但仅仅因为编译器可以减少它并不意味着它不是一个令人头疼的维护问题。
变量出现多少次几乎没有什么可担心的,特别是如果它有助于减少大表达式的重复。也就是说,除非变量是易失性内存位置,如 I/O 端口。如果分配到a
是一个外部可见的效果,那么这两个版本没有相同的语义。