具有多个 if 或具有"big"返回的函数?
Function with multiple if or with a "big" return?
我想知道这两种解决方案中的一种是否比另一种更好:
版本1:
bool myFunction()
{
if (A)
return false;
if (B)
return false;
if (C)
return false;
if (D)
return false;
return true;
}
版本2 :
bool myFunction()
{
return (!A && !B && !C && !D);
}
我猜版本 2 的效率可能有点低,因为我们可能必须计算整个布尔表达式才能知道它是真的还是假的。在第一个版本中,如果 A 为 false,则返回 false,而不计算 B、C 或 D。但我发现第二个版本更具可读性。
那么最好的方法是什么呢?
谢谢。
在第一个版本中,如果 A 为 false,则返回 false,而不计算 B、C 或 D。
第二个版本也是如此。&&
运算符短路 - 如果第一个操作数false
,则不会计算第二个操作数。
但是,我要么从第二个版本中删除括号:
return !A && !B && !C && !D;
或将其反转为:
return !(A || B || C || D);
。取决于你觉得哪个更容易阅读。我个人更喜欢尽可能少地否定。(||
也会短路,所以它们的效率是等效的。
请注意,原则上不要避免多个 return 语句 - 很多时候使用多个 return 语句会提供更具可读性的代码。尽可能使用最具可读性的代码,并且只有在证明最易读的方法没有达到您需要的效果时才担心效率。在这种情况下,这些方法同样有效,因此无论如何这都不是问题。
这取决于。他们都做同样的事情。
如果你的函数真的只返回变量和逻辑运算的简单组合,那就去return !A && !B && !C && !D;
(括号是不必要的(。
但是,如果您正在执行长而复杂的计算,则:
-
考虑重构您的代码,以便一个函数实际上不会完成 4 个函数的工作;
-
如果其他所有操作都失败,请插入多个返回语句。没那么糟糕。不惜一切代价强制实施单个退出点是一种愚蠢的编码约定。在某些情况下,允许多个返回语句确实可以使代码可读(特别是错误处理(。
来自 ISO/IEC 9899:
6.5.13 逻辑 AND 运算符
四与按位二进制 & 运算符不同,&&&运算符保证从左到右的求值;在计算第一个操作数之后有一个序列点。如果第一个操作数的比较等于 0,则不计算第二个操作数。
而这个用于 c++ 的:
从 N1905=05-0165
5.14 逻辑 AND 运算符
1 &&&运算符从左到右分组。操作数都隐式转换为 bool 类型(条款 4(。结果如果两个操作数都为真,则为 true,否则为假。与&不同,&&保证从左到右的评估:第二个如果第一个操作数为假,则不计算操作数。
因此,在这两种情况下,它都不必计算整个表达式
- 从函数返回const char*数组
- 检查函数返回类型是否与STL容器类型值相同
- 从 c 或 cpp 系列子函数返回到主函数
- 从函数返回任意简单类型的数据
- 警告:在函数返回类型 [-Wignore 限定符] 时忽略类型限定符
- 从 C++ 中的函数返回数组地址问题
- VirtDisk.h QueryChangesVirtualDisk() 函数返回 RangeCount 为 0
- 为什么glGetSubroutineIndex为不同的函数返回相同的值?
- 在 c++ 中将函数返回类型指定为模板参数
- 从封装在对象中的函数 C++ 返回时为空的列表
- 为什么向量内部的指针在从函数返回时会发生变化?
- 函数返回的 rvalue 引用(表达式)是 xvalue - 但没有标识?
- 程序中的布尔函数返回输入的范围无论如何都是无效的
- 寿命延长从函数返回引用
- 程序不向函数返回值
- 字符串函数返回奇怪的值
- 类的大问题,以及从空函数c++返回
- 为什么在尝试测量函数返回所需的时间时,我的运行时编号是错误的?
- C++二叉搜索树模板从函数返回节点
- NVCC 错误:string_view.h:constexpr 函数返回是非常量