82

在 ANSI C 代码中,我经常可以看到围绕单个返回值的括号。

像这样:-

int foo(int x) {
  if (x)
    return (-1);
  else
    return (0);
}

为什么在这些情况下在返回值周围使用 () ?有任何想法吗?我看不出有什么理由。

4

11 回答 11

60

真的没有理由......这只是旧惯例。

为了节省空间,程序员通常会在返回行而不是自己的行中进行最终数学运算,并且括号确保大部分都在那里,以便更容易看到它是返回的单个语句,如下所示:

return (x+i*2);

代替

int y = x+i*2;
return y;

括号变成了一种习惯,并且卡住了。

于 2008-10-02T11:56:37.710 回答
55

一个实际但不太可能的动机是,如果你在值周围加上括号,你可以将 return 定义为一个宏,然后插入一些日志代码来观察你的所有返回。

于 2008-10-02T19:26:01.797 回答
26

在最初的 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?.

于 2017-10-21T20:32:30.863 回答
23

我个人的风格是,如果有复杂的表达,就用括号;例如,

return (a + b);

但如果表达式是一个简单的术语,则不要使用它们

return a;

我不能说我为什么要那样做;只是我很久以前捡到的东西。

顺便说一句,我认为让它看起来像一个函数调用,像这样:

return(a);  // ugh

非常丑陋,而且是错误的。

于 2008-10-02T12:24:06.427 回答
13

有几个原因:

  1. 如果/而/对于/等。都是必须有括号的控制关键字。因此,总是将它们归还似乎很自然。

  2. sizeof 是唯一可以包含或不包含它们的其他关键字,除了在某些情况下您必须使用括号。所以更容易养成总是使用括号的习惯。对于 sizeof,这意味着一个逻辑:如果可以,总是这样做。

  3. case/goto 是您从不使用括号的唯一关键字。...人们倾向于将这些视为特殊情况(并且喜欢它们以从其他控制关键字中脱颖而出,尤其是 goto)。

于 2008-10-02T14:35:21.107 回答
8

在您的示例中返回 -1 时,我认为使用括号更易读,因为减号更明显:

return 1

或者

return -1

或者

return (-1)
于 2008-10-08T13:31:22.103 回答
4

也许这是习惯——毕竟,给我们带来 Unix 和 C 的人来自 Multics 项目。Multics 是用 PL/I 编写的,在 PL/I 中,括号是强制性的。

于 2014-04-25T16:29:01.023 回答
2

与使用括号的情况一样,我认为这只是为了便于阅读(例如,Ruby 支持方法调用不带括号括住参数,但最近的书籍和文章建议不这样做)。

于 2008-10-02T11:55:46.073 回答
2

我曾与至少一位认为 return某种特殊类型的函数调用的程序员合作过,当他看到我的代码在没有括号的情况下编译时感到很惊讶。

于 2008-10-02T20:26:53.710 回答
-4

return 语句中的括号向编译器表明您打算将此值返回到堆栈而不是内存中。

在过去,这是严格执行的(通常),但今天大多数编译器仅将其作为提示。

这是我经常做的事情,因为错误可能会破坏通过内存引用返回的任何内容,但通常不会影响在堆栈上返回的变量。

将堆栈用于瞬态变量还可以减少内存使用,并且通常会使函数调用/返回更快,因为这就是堆栈的设计目的,即瞬态数据/变量。

于 2016-03-26T06:33:42.770 回答
-5

C/C++在 return 语句中使用括号表明对语法的掌握不足。就这么简单。但这并不像把所有东西都放在花括号里那么糟糕:

int foo(int x) {
  if (x) {
    return (-1);
  }
  else {
    return (0);
  }
}

很多程序员都是这样做的。如果你们中的一个人读到这个,也许你可能想解释一下。

于 2011-01-21T19:09:49.367 回答