这不是多余的吗?

时间:2013-09-09 00:18:05

标签: c if-statement

有没有理由写:

double pop(void)
{
    if (sp > 0)
        return val[--sp];
    else {
        printf("error: stack empty\n");
        return 0.0;
    }
}

而不是:

double pop(void)
{
    if (sp > 0)
        return val[--sp];

    printf("error: stack empty\n");
    return 0.0;
}

除了风格? return不会停止功能吗?

7 个答案:

答案 0 :(得分:10)

正如其他人所说,它们是等价的,但通常的习惯是执行在“常规案例”中流经函数的末尾,而特殊情况则早期出现(这源于其他情况,否则,在没有例外的语言中,对于具有许多错误检查的代码,您将获得一百万个嵌套大括号。)

所以,我可能会改变这种情况并写下:

double pop(void)
{
    // First parameters/preconditions/... checks
    if (sp <= 0)
    {
        // Exceptional case, get out early
        printf("error: stack empty\n");
        return 0.;
    }
    // We get here if everything is ok - regular case
    return val[--sp];
}

顺便说一句,在使用此签名编写泛型堆栈函数时,如果堆栈下溢,可能会返回比0.更重要的东西 - 可能是NaN或类似的东西(如果平台支持)。

答案 1 :(得分:3)

他们都是一回事。第二个片段更容易阅读,因为它具有较少的词法结构,并且if条件较短。否则,他们都有同样的担忧困难。

根据您可能需要前者或后者的上下文。这一切都取决于您希望代码传达的语义。

例如,如果其中一个分支是例外情况(递归函数的错误或基本情况),则使用后面的表单。但是如果两种情况都具有相同的语义(替代几乎相同的出现/意义的机会),那么你将使用前一段代码。

因此,你会写

int factorial (int x)
{
    if (x <= 1)
        return 1;
    return x * factorial (x - 1);
}

int act_on_contents_of_file(char *fname)
{
    FILE *f = fopen(fname, "r");
    if (f == NULL) { /* error opening */
        perror(...);
        return -1;
    }
    ....
    return 0;
}

虽然你会写

int collatz(int x)
{
    if (x % 2 == 0)
        return collatz(x / 2);
    else
        return collatz(3 * x + 1);
}

答案 2 :(得分:2)

它们是等价的。第一个版本强调只有两个条件,但第二个版本实现了相同的结果。

printf()应该是fprintf(),将错误报告给stderr,而不是stdout;这就是错误通道的用途。

答案 3 :(得分:2)

它们在您的示例中是等效的,并且两者都将编译为相同的二进制文件。区别只是味道。第一个例子很清楚,如果if为假,则会执行一个条件。

第二个只有这个缺点:没有读取if子句的主体,特别是如果它很长,你不能确定何时调用最后一个代码而不研究正文的整个内容(考虑嵌套作用域)一些分支在其他返回时不返回)。

答案 4 :(得分:2)

首选代码段是您获得最多代码付款的代码段。这意味着您的商店应该有编程标准,并且应该在这些标准中讨论这样的例子。

答案 5 :(得分:1)

他们都是一回事。在不知道你正在编写的代码的上下文的情况下,两个片段都不比另一个更好。

答案 6 :(得分:-1)

他们都是一回事。第一个片段更可取。