返回值周围的括号 - 为什么?

15

我经常看到像这样的代码(C、C++,有时候是Java):

return (value);

我并没有看到这些括号的任何好处。所以我的问题是,程序员是否假设return是一种带有返回值作为参数的函数,还是真的存在这些括号有意义的情况?

我知道类似的问题已经在这里被问过了,但那只涉及ANSI C。我想知道是否存在C++或Java特定的方面还未在那里得到回答。


1
return 是一个语句,而 _括号_(“方括号”用于 [])是无用的。从语法上讲,它们是表达式的一部分,而不是语句的一部分。现代编码风格通常不鼓励使用它们。 - too honest for this site
这样的括号会抑制从值类型到函数返回类型的转换警告吗?我知道有些其他警告,比如在条件语句中的赋值,可以通过额外的括号来抑制。 - Sqeaky
3
在C++14中有一个有趣的案例,其中return语句中的括号可以改变其含义:https://dev59.com/Tm445IYBdhLWcg3wpL1_。 - Christian Hackl
1
可能是[return (a) vs. return a]的重复问题。(https://dev59.com/y2sz5IYBdhLWcg3wYGkz) - Raedwald
1
@FrankPuffer,C、C++和JAVA是非常不同的编程语言。你必须针对每种语言提出这个问题才能得到正确的答案。你可以看到Haris试图通过一次性写三个答案来解决这个问题。但在sx指标方面,这并不完美。 - Jonas Stein
显示剩余5条评论
4个回答

25

关于C

当有一个表达式且想要返回该表达式的值时,需要将括号放置在表达式周围。 即使如此,也不一定需要使用括号。 完全可以像下面这样书写:

return x + y;

程序员有时会这样编写return (x + y);以使代码更易读。

因此,加括号是一种观点和实践问题。


关于C++

有一个古怪的情况需要注意加括号。引用自这个问题。

int var1 = 42;
decltype(auto) func1() { return var1; } // return type is int, same as decltype(var1)
decltype(auto) func1() { return(var1); } // return type is int&, same as decltype((var1))

你可以看到返回的值不同,这是由于括号造成的。您可以查看此答案以了解详细信息。


就Java而言,括号不会产生任何差异。

编码约定建议使用

return x + y;

要了解更多,请阅读此答案


注意:我对Java和C++并不是很了解。我的有关Java和C++的所有内容都来自其他答案。我这样做是为了整合这三种语言的不同惯例。


总结:所以,加括号是观点和实践问题。太好了! - Elbert Villarreal
4
为了让它更易读。不确定,因为它看起来像一个函数调用,可能会误导。 - Frank Puffer
4
@FrankPuffer,不,它并没有。 - SergeyA
1
这个问题显然是个恶意提问。一开始看起来像是提问者需要了解return语句以及为什么需要括号的相关知识,但后来他并不认同回答或评论。在阅读完他所有的评论后,我删除了我的回答。 - Michi
1
@Michi:刚注意到这个评论,已经过了很长时间。在发布这个问题时,我基本上知道除了一些非常晦涩的情况外,这些括号是不需要的。但我仍然想更好地理解为什么程序员在使用它们,无论是出于技术还是其他类型的原因。这难道不是完全合法的吗?例如,我想知道如果在代码审查中遇到这种结构应该如何反应。这里的答案和评论为我提供了一些有用的信息。 - Frank Puffer
显示剩余2条评论

5

从技术上讲,给 return 提供的表达式不需要加括号。这只是个人口味问题。

然而,如果return表达式使用布尔运算符,我通常会加括号。因为这样的运算符通常会被视为 whileif 的一部分,这样更清楚地表明你想要做一些与该值有关的事情,而不仅仅是跳转,这是我的看法。

int out_of_range(int x)
{
    return ((x < 1) || (x > 10));
}

4

主要是遗留问题。《K&R C程序设计语言》(1978年)使用括号显示返回值。可能有一些旧的C编译器需要这样做,但我不确定。


0

首先,这不是强制性的,而且您将在返回表达式而不是值时看到它的重要性。但是如果您不使用括号,那么您的代码可能不太容易阅读(特别是在复杂表达式的情况下),并可能会引起混淆。另外,请注意它不是一个函数(因为括号不是强制性的)。可以注意到 return 0; 在 main() 主体末尾处的情况。

在这里可以注意到,与 0 不使用括号,这证明了它不是函数。因此,括号用于使编译器更易读懂和理解代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接