围绕返回值的括号

时间:2008-10-02 11:52:25

标签: c syntax coding-style

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

像这样: -

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

为什么在这些情况下使用()围绕返回值?有任何想法吗?我没有理由这样做。

11 个答案:

答案 0 :(得分:56)

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

为了节省空间,程序员经常在返回行中进行最后的数学运算,而不是在它自己的行上,并且parens确保大多数情况下更容易看到它是返回的单个语句,如下所示:

return (x+i*2);

而不是

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

括号成了一种习惯而且卡住了。

答案 1 :(得分:47)

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

答案 2 :(得分:23)

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

return (a + b);

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

return a;

我不能说我为什么这样做;就是我很久以前买的东西。

顺便说一句,我认为让它看起来像一个函数调用,如下所示:

return(a);  // ugh

令人难以置信的丑陋而又错误。

答案 3 :(得分:14)

In the original C specification, parentheses were required around the return value.虽然现代C编译器和ANSI C标准不需要它们,但是括号的存在不会影响返回值,程序员有时仍会将它们排除在习惯之外,不熟悉标准,以保持一致性具有需要它们的风格约定,或者可能是为了向后兼容。

我应该补充一点,对于那些正在考虑C ++的人来说:这个问题是关于C而C不是C ++;这些是两种不同的语言,具有不同的标准,能力,难度和不同的使用方式 - 无论它们有什么共同点,将它们视为两个完全独立的东西是明智的。有关涵盖C ++的类似问题,请参阅Are parentheses around the result significant in a return statement?

答案 4 :(得分:13)

有几个原因:

  1. 如果/当/对/等。是必须具有parens的所有控制关键字。因此,总是把它们归还给它们似乎很自然。

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

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

答案 5 :(得分:8)

当你在例子中返回-1时,我认为用括号更可读,因为减号更明显:

return 1

return -1

return (-1)

答案 6 :(得分:4)

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

答案 7 :(得分:2)

通常情况下使用括号时,我认为这仅仅是为了可读性(例如,Ruby支持没有括号的方法调用,但最近的书和文章建议不这样做。)

答案 8 :(得分:2)

我和至少一位认为返回某种特殊功能调用的程序员合作过,当他看到我的代码没有填充时,我感到很惊讶。

答案 9 :(得分:-4)

返回语句中的括号表示您希望在堆栈而不是内存中返回此值。

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

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

使用堆栈作为瞬态变量也会减少内存使用量,并且通常会使函数调用/返回更快,因为堆栈的设计目的是瞬态数据/变量。

答案 10 :(得分:-5)

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

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

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