如果"if"是函数中的最后一个控制语句并且它的块总是执行"return",那么我应该使用"else"吗?

If "if" is the last control statement in function and its block always executes "return", then should I use "else"?

考虑这段代码(用 C 编写以演示问题):

int foo1(int a)
{
    if(a)
         return 33;
    return 22;
}

int foo2(int a)
{
    if(a)
         return 33;
    else
         return 22;
}

如您所见,foo1(int a)foo2(int a) 的作用完全相同。 foo1(int a) 更短,但我觉得 foo2(int a) 更符合逻辑(这只是我的印象)。哪一个更好?将 elseif 一起使用是否很好,这是函数代码中的最后一个控制语句,它的块始终执行 return?

我对 C 不了解,但至少在 C# 中,惯例是省略任何 if 立即 return 的条件的 else。原因是 else 已经隐含了,所以显式添加它不仅是多余的,而且增加了后续代码的嵌套级别,从而使代码更难阅读。以下面的代码为例。

public int Test()
{
    if (condition)
        return 0;
    else
    {
        var ex1 = doCmd1();
        var ex2 = doCmd2();
        var result = ex1 + ex2;
        return result;
    }
    Console.WriteLine("Here I'm printing before returning");
    return -1;
}

如果您只看一眼这段代码,您可能会认为该方法可以通过三种方式退出。然而,事实并非如此——它只能通过两种方式退出。 if-else 之外的所有内容都是完全无法访问的。现在,这是相同的代码,但没有额外的 else:

public int Test()
{
    if (condition)
        return 0;

    var ex1 = doCmd1();
    var ex2 = doCmd2();
    var result = ex1 + ex2;
    Console.WriteLine("Here I'm printing before returning");
    return result;
}

这样阅读起来更清晰,并且可以快速确定操作的结果。

我认为 foo1 更胜一筹。行数

    return 22;
}

因为函数的结尾胜过任何其他可读性问题。

foo2应该认为FAPP写成

int foo2(int a)
{
    if(a){
         return 33;
    } else {
         return 22;
    }
}

return 22; 行之前添加大约 20 行代码,它是模糊错误和阻碍可读性的来源。