在 ANSI C 代码中,我经常可以看到围绕单个返回值的括号。
像这样:-
int foo(int x) {
if (x)
return (-1);
else
return (0);
}
为什么在这些情况下在返回值周围使用 () ?有任何想法吗?我看不出有什么理由。
在 ANSI C 代码中,我经常可以看到围绕单个返回值的括号。
像这样:-
int foo(int x) {
if (x)
return (-1);
else
return (0);
}
为什么在这些情况下在返回值周围使用 () ?有任何想法吗?我看不出有什么理由。
真的没有理由......这只是旧惯例。
为了节省空间,程序员通常会在返回行而不是自己的行中进行最终数学运算,并且括号确保大部分都在那里,以便更容易看到它是返回的单个语句,如下所示:
return (x+i*2);
代替
int y = x+i*2;
return y;
括号变成了一种习惯,并且卡住了。
一个实际但不太可能的动机是,如果你在值周围加上括号,你可以将 return 定义为一个宏,然后插入一些日志代码来观察你的所有返回。
在最初的 C 规范中,需要在返回值周围加上括号。 虽然现代 C 编译器和 ANSI C 标准不需要它们,但括号的存在不会影响返回值,并且程序员有时仍然出于习惯、不熟悉标准而将它们包括在内,以与需要它们的风格约定保持一致,或者可能是为了向后兼容。
I should add, for people that are thinking about C++: This question is about C and C is not C++; these are two different languages with different standards, capabilities, levels of difficulty, and different styles of usage that emerge -- whatever they have in common, it is wise to treat them as two totally separate things. For a similar question that covers C++, see Are parentheses around the result significant in a return statement?.
我个人的风格是,如果有复杂的表达,就用括号;例如,
return (a + b);
但如果表达式是一个简单的术语,则不要使用它们
return a;
我不能说我为什么要那样做;只是我很久以前捡到的东西。
顺便说一句,我认为让它看起来像一个函数调用,像这样:
return(a); // ugh
非常丑陋,而且是错误的。
有几个原因:
如果/而/对于/等。都是必须有括号的控制关键字。因此,总是将它们归还似乎很自然。
sizeof 是唯一可以包含或不包含它们的其他关键字,除了在某些情况下您必须使用括号。所以更容易养成总是使用括号的习惯。对于 sizeof,这意味着一个逻辑:如果可以,总是这样做。
case/goto 是您从不使用括号的唯一关键字。...人们倾向于将这些视为特殊情况(并且喜欢它们以从其他控制关键字中脱颖而出,尤其是 goto)。
在您的示例中返回 -1 时,我认为使用括号更易读,因为减号更明显:
return 1
或者
return -1
或者
return (-1)
也许这是习惯——毕竟,给我们带来 Unix 和 C 的人来自 Multics 项目。Multics 是用 PL/I 编写的,在 PL/I 中,括号是强制性的。
与使用括号的情况一样,我认为这只是为了便于阅读(例如,Ruby 支持方法调用不带括号括住参数,但最近的书籍和文章建议不这样做)。
我曾与至少一位认为 return是某种特殊类型的函数调用的程序员合作过,当他看到我的代码在没有括号的情况下编译时感到很惊讶。
return 语句中的括号向编译器表明您打算将此值返回到堆栈而不是内存中。
在过去,这是严格执行的(通常),但今天大多数编译器仅将其作为提示。
这是我经常做的事情,因为错误可能会破坏通过内存引用返回的任何内容,但通常不会影响在堆栈上返回的变量。
将堆栈用于瞬态变量还可以减少内存使用,并且通常会使函数调用/返回更快,因为这就是堆栈的设计目的,即瞬态数据/变量。
C/C++
在 return 语句中使用括号表明对语法的掌握不足。就这么简单。但这并不像把所有东西都放在花括号里那么糟糕:
int foo(int x) {
if (x) {
return (-1);
}
else {
return (0);
}
}
很多程序员都是这样做的。如果你们中的一个人读到这个,也许你可能想解释一下。