用括号括住C中的返回值


74

在ANSI C代码中,经常可以看到括号将单个返回值括起来。

像这样:-

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


1
看起来像是一个函数调用;-)。
Toon Krijthe,

3
但是,return并不是函数调用,除非您是Schemer。:-P
克里斯·杰斯特·杨

3
Tooony:我想知道为什么人们也为sizeof放置了不必要的括号!
克里斯·杰斯特·杨

虽然经常为这种习惯提供事后工效学证明,但值得一看的是具有返回语句并询问是否存在相同约定的现代语言。AFAIK答案是肯定的。User10392的答案很有趣,因为它提供了来自该习惯的C特定的好处。
AmigoNico

Answers:


60

确实没有理由……这只是古老的惯例。

为了节省空间,程序员通常会在返回行中而不是在返回行中做最后的数学运算,并且确保大多数都位于括号内,以便更轻松地看到返回的是单个语句,如下所示:

代替

圆括号成为一种习惯,并且被卡住了。


8
当我这样返回数学时,我倾向于这样做。我不知道,这就像是我担心该方法将在数学完成评估之前返回还是会发生其他事情
Wes P

2
很高兴不仅仅是我认为这是不必要的。;-)设置优先级的括号是可以理解的,但恕我直言,上述的return语句应分为多个语句。提高可读性,不易出错。敢于拒绝香肠符号!;-)
Tooony

10
节省空间?请解释。当然return x+i*2;短吗?
TonyK,2011年

2
“ parren确保大多数情况下都存在,以便更容易看到它是返回的单个语句”-这甚至意味着什么?除了语法之外,您不能返回语句,并且它使用的空间比没有括号的空间大。
记得莫妮卡2014年

2
@MarcLehmann我不知道这是什么意思,或者它如何得到如此高的投票和接受。给我加上括号对我来说很难看(if如果我是国王,我什至可以取消括号等)。至于make it easier to see that it is a single statement that is returned,首先,这是一个表达式,而不是一个“声明”-还有什么-人们认为这return是一个贪婪的运算符,并且return x+i*2可能会返回x 并丢弃其余的?如果是这样,哇。还是这个答案真的在考虑可能跨越多行的长表达式?无论哪种方式,它都完全错过了自己的观点。
underscore_d

51

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


5
哇!可能并非如此,但这是我所听到的唯一习惯,其动机并不等于“哦,好吧,有人可能认为它看起来更好或更一致”,但没有一个看起来很遥远。吸引我。谢谢您的理智!!
AmigoNico

1
有趣的观察。在我的实验中,我注意到为return定义的宏似乎允许宏参数不带括号,但为其他名称(例如square)定义的宏则不允许。我想这次我已经深深地注视着……
Alain O'Dea 2015年

1
...更好的希望是,然后没有人调用函数或使用增量运算符或在其return语句中具有任何其他副作用。
卡尔·诺鲁姆

1
对于不对返回语句使用括号,这是一个很强的论点
nowox

1
@polynomial_donut-如果在returns语句中有一个表达式,则可能会发生与宏相关的常规问题,例如多次求值。
卡尔·诺鲁姆

23

我的个人风格是在表达式复杂的情况下使用括号;例如,

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

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

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

是非常丑陋,只是错误。


10
主观的-我认为这个空间看起来更糟(这虽然同样但主观相反)。
乔纳森·勒夫勒

还有的return (a);return a ;

20

在原始的C规范中,在返回值周围需要括号。 尽管现代C编译器和ANSI C标准不要求使用它们,但括号的存在并不影响返回值,并且程序员出于出于与需要它们的风格惯例的一致性的习惯,有时仍然出于习惯而不熟悉它们,或可能是为了向后兼容。

对于那些正在考虑C ++的人们,我应该补充一点:这个问题是关于C的,而C不是C ++;这是两种不同的语言,它们具有不同的标准,功能,难度级别以及出现的不同使用方式-无论它们有什么共同之处,将它们视为两个完全独立的事物都是明智的。有关涵盖C ++的类似问题,请参见返回括号中结果的括号是否有意义?


1
恕我直言,这是唯一合理/令人信服的答案(因为它说明了奇怪的习惯可能起源于何处)。我来自SO:返回结果中的括号对return语句有意义吗?刚刚学会了C和C ++之间的另一个显着区别...
Scheff

13

有几个原因:

  1. 如果/同时/为/等 是所有必须具有括号的控制关键字。因此,经常将它们也返回也很自然。

  2. sizeof是唯一可以包含或不包含它们的其他关键字,除了在某些情况下必须使用括号。因此,更容易养成始终使用parens的习惯。对于sizeof,这表示以下逻辑:如果可以,请始终这样做。

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


8

在示例中返回-1时,我认为括号内的内容可读性更好,因为减号更为明显:

要么

要么


4

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


2

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


1
在过去,在某些情况下,它是在汇编器级别由特有的功能cret实现的。现在,这是一个全面的声明;我应该找到参考。它在Comer的XINU书中-您可以通过普渡大学的Google搜索来找到。
乔纳森·勒夫勒

2

通常在使用括号的情况下,我认为这只是为了提高可读性(例如,Ruby支持不带括号的方法调用,将参数括起来,但最近的书籍和文章则建议否则)。


-4

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

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

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

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


1
如果确实有编译器这样做,那么最好显示出每种情况下编译器生成的程序集的示例
rakslice

-5

在return语句中使用括号表明C/C++语法缺乏把握。就这么简单。但这并不像将所有内容都放在花括号中一样糟糕:

太多的程序员这样做。如果你们其中之一读过这本书,也许您想解释一下。


14
通常,使用花括号来减少在以后的代码编辑中引入错误的可能性。第一个回答这个问题给出了一个例子:programmers.stackexchange.com/questions/16528/...
迈克·佩利

3
另外,始终使用花括号可使代码自动更友好地合并。否则,您更有可能遇到必须手动处理的冲突。
hlovdal

5
由于缺少花括号,引入了无数错误。我同意它们对于一行来说很难看,但是当您用宏替换函数调用时(有时由于特殊限制而发生),或者当重构程序以用更长的一组表达式替换一个单行表达式时,错误可能不会立即可见,并且仅在无法自动测试的特殊情况下发生。大括号也是某些公司(我在一家军事承包公司中有)的硬编码要求,即使对于1个班轮也是如此。
郊狼

1
MISRA明确禁止删除那些“额外”的括号。
Toby
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.