有没有理由写:
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
不会停止功能吗?
答案 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)
他们都是一回事。第一个片段更可取。