围绕返回值的括号

Too*_*ony 67 c syntax coding-style

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

像这样:-

int foo(int x) {
  if (x)
    return (-1);
  else
    return (0);
}
Run Code Online (Sandbox Code Playgroud)

为什么在这些情况下使用返回值周围的?有任何想法吗?我认为没有理由.

Ada*_*ile 56

真的没有理由......这只是旧约.

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

return (x+i*2);
Run Code Online (Sandbox Code Playgroud)

代替

int y = x+i*2;
return y;
Run Code Online (Sandbox Code Playgroud)

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

  • 当我像这样返回数学时,我倾向于这样做.我不知道,这就像我担心这个方法会在数学完成评估之前返回,或者是oO (8认同)
  • 为了节省空间?请解释.当然`返回x + i*2;`更短? (8认同)
  • 很抱歉恢复这样一个旧的答案,但实际上*是*有原因的。在 C 的早期,在它被标准化之前,语法需要括号。请参阅http://cm.bell-labs.com/cm/cs/who/dmr/cman.ps。 (4认同)
  • 很高兴不只是我认为这是不必要的.;-)用于设置优先级的括号是可以理解的,但恕我直言,如上所述的返回语句应分为多个语句.提高可读性并且不容易出错.不敢对香肠表示法说不!;-) (2认同)
  • "parens确保主要是为了让它更容易被看出它是一个单一的声明被返回" - 这甚至应该是什么意思?除了语法之外,你不能返回语句,它使用的空间比没有语句的空间大. (2认同)
  • @MarcLehmann我不知道这是什么意思,或者它如何得到如此高的投票和接受。给我加上括号对我来说看起来很丑陋(如果我是国王,我什至可以为了`if`等删除它们)。至于“让我们更容易看到它是一个返回的语句”,首先,这是一个_expression_,而不是一个“语句”-还有什么-人们认为`return`是一个贪婪的运算符,而`return x + i * 2`可能会返回`x`并丢弃其余的?如果是这样,哇。还是这个答案真的在考虑可能跨越多行的长表达式?无论哪种方式,它都完全错过了自己的观点。 (2认同)

use*_*392 47

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

  • 哇!它可能不太可能,但这是我听过的唯一的动机,这个习惯并不等于"哦,好吧,有人可能认为它看起来更好或更一致",其中任何一个看起来都不远对我很有吸引力.谢谢你的理智! (5认同)

Kri*_*son 23

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

return (a + b);
Run Code Online (Sandbox Code Playgroud)

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

return a;
Run Code Online (Sandbox Code Playgroud)

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

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

return(a);  // ugh
Run Code Online (Sandbox Code Playgroud)

难以置信的丑陋和错误.

  • 而且主观 - 我认为空间看起来更糟(这是相同但相反主观的). (10认同)

rak*_*ice 14

在原始C规范中,返回值周围需要括号. 虽然现代C编译器和ANSI C标准不需要它们,但括号的存在不会影响返回值,程序员有时仍会将它们排除在习惯之外,不熟悉标准,以便与需要它们的风格约定保持一致,或者可能是为了向后兼容.

  • 恕我直言,这是唯一合理/令人信服的答案(因为它解释了奇怪习惯的起源)。我来自 [SO: 在 return 语句中,结果周围的括号是否重要?](/sf/answers/1793118701/) 刚刚学习了 C 和 C++ 之间的另一个显着区别...... (2认同)

Jam*_*ill 13

有几个原因:

  1. 如果/当/为/ etc中.是必须具有parens的所有控制关键字.因此,总是把它们放回去似乎很自然.

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

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


Ste*_*aug 8

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

return 1
Run Code Online (Sandbox Code Playgroud)

要么

return -1
Run Code Online (Sandbox Code Playgroud)

要么

return (-1)
Run Code Online (Sandbox Code Playgroud)


小智 6

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