【问题标题】:Parentheses around return values - why?返回值周围的括号 - 为什么?
【发布时间】:2016-06-04 06:44:58
【问题描述】:

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

return (value);

我看不出这些括号有什么好处。所以我的问题是,程序员是否假设return 是某种以返回值作为参数的函数,还是真的存在这些括号有意义的情况?

我了解here 已经提出了类似的问题,但这仅与 ANSI C 有关。我想知道是否有 C++ 或 Java 特有的方面尚未得到解答。

【问题讨论】:

  • return 是一个语句,括号(“括号”用于[])是无用的。从语法上讲,它们是表达式的一部分,而不是语句的一部分。现代编码风格通常不鼓励使用它们。
  • @WillBriggs:嗯,在语法上确实如此。这可能与代码分析非常相关。
  • 在 C++14 中有一个有趣的例子,return 括号改变了含义:stackoverflow.com/questions/4762662/…
  • return (a) vs. return a的可能重复
  • @FrankPuffer C、C++ 和 JAVA 是非常不同的语言。您必须针对每种语言提出这个问题才能得到正确的答案。你看到哈里斯试图通过一次写 3 个答案来解决这个问题。但这在 sx 指标中并不完美。

标签: java c++ c


【解决方案1】:

关于C

括号放在有表达式的地方,并且希望返回值是表达式的值。 即使这样也不需要括号。完全可以这样写

return x + y;

程序员确实将其设为 return (x + y); 以使其更具可读性。

所以,加括号是一个见仁见智的问题。


关于 C++

有一种神秘的情况,括号很重要。引用this问题

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))

您可以看到返回的值不同,这是由于括号。可以通过this的回答详细了解。


对于 java,括号没有任何区别。

编码约定建议使用

return x + y;

要了解更多信息,请阅读this 答案。


注意: 我对 java 和 C++ 了解不多。我的答案中关于 java 和 C++ 的所有内容均取自其他答案。我这样做是为了巩固这三种语言的不同约定。

【讨论】:

  • 总结:“所以,放置括号是一个意见和实践问题。”。太好了!!
  • “使其更具可读性” - 不确定,它也可能会产生误导,因为它看起来像一个函数调用。
  • @FrankPuffer,不,它没有。
  • 这个问题绝对是一个巨魔。起初,OP,看起来他需要阅读有关 return 声明以及为什么需要括号以及在哪里需要括号,但后来他只是不同意答案/评论。在我阅读了他所有的 cmets 后,我删除了我的答案。
  • @Michi:很久才注意到这个评论。在发布这个问题时,我非常清楚除了一些非常深奥的情况外,不需要这些括号。尽管如此,我还是想更好地理解程序员为什么使用它们,无论是出于技术原因还是其他类型的原因。这不是完全合法的吗?例如,我想知道如果在代码审查中遇到这种结构,我该如何反应。这里的答案和 cmets 为我提供了一些有用的信息。
【解决方案2】:

从技术上讲,没有理由给return 的表达式加上括号。这真的是品味问题。

也就是说,如果return 表达式使用布尔运算符,我通常会用括号括起来。由于此类运算符通常被视为 whileif 的一部分,因此在我看来,除了跳跃之外,您还想用该值做一些事情。

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

【讨论】:

    【解决方案3】:

    主要是遗产。 K&R C Programming Language (1978) 使用括号显示返回。一些旧的 C 编译器可能需要这个,但我不确定。

    【讨论】:

      【解决方案4】:

      这首先不是强制性的,您会看到它在返回表达式而不是值中的重要性。但是,如果您不使用括号,您的代码可能不会那么容易阅读(尤其是在复杂表达式的情况下)并且可能会造成混乱。此外,可能会注意到它不是一个函数(因为括号不是强制性的)。您可能会注意到 main() 主体末尾的return 0; 的大小写。 值得注意的是,没有括号与 0 一起使用,这证明它不是一个函数。 因此,括号用于使代码对编译器更具可读性和可理解性。

      【讨论】:

        猜你喜欢
        • 2021-07-24
        • 2016-04-21
        • 2012-02-08
        • 2015-11-01
        • 1970-01-01
        • 2021-12-13
        • 2016-04-30
        • 2012-07-29
        • 2012-08-01
        相关资源
        最近更新 更多