【问题标题】:Parenthesis surrounding return values in CC中返回值的括号
【发布时间】:2010-09-14 18:46:31
【问题描述】:

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

像这样:-

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

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

【问题讨论】:

  • 这样看起来像一个函数调用 ;-)。
  • 但是,return 不是函数调用,除非您是 Schemer。 :-P
  • Tooony:我想知道为什么人们也会为 sizeof 加上不必要的括号!
  • 虽然经常为习惯提供事后的人体工程学理由,但值得研究具有返回语句的现代语言并询问是否存在相同的约定。 AFAIK 的答案是一个响亮的 NO。 User10392 的回答很有趣,因为它提供了源自习惯的特定于 C 的好处。

标签: c syntax coding-style


【解决方案1】:

在使用括号时通常是这样,我认为这只是为了便于阅读(例如,Ruby 支持不使用括号括住参数的方法调用,但最近的书籍和文章建议不这样做)。

【讨论】:

    【解决方案2】:

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

    为了节省空间,程序员通常会在返回行而不是自己的行中进行最终数学运算,并且括号确保大部分都在那里,以便更容易看到它是返回的单个语句,如下所示:

    return (x+i*2);
    

    而不是

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

    括号变成了一种习惯,并且卡住了。

    【讨论】:

    • 当我这样返回数学时,我倾向于这样做。我不知道,这就像我担心该方法会在数学完成评估之前返回或什么o.O
    • 很高兴不仅仅是我认为这是不必要的。 ;-) 设置优先级的括号是可以理解的,但恕我直言,像上面这样的 return 语句应该分为多个语句。提高可读性并且不易出错。敢于对香肠符号说不! ;-)
    • 节省空间?请解释。 return x+i*2; 肯定更短吗?
    • “括号确保大部分都在那里,以便更容易看到它是返回的单个语句” - 这甚至应该是什么意思?除了语法,你不能返回语句,而且它比没有括号使用更多的空间。
    • @MarcLehmann 我不知道它应该是什么意思,也不知道它是如何获得如此高的投票和接受的。添加括号对我来说看起来很丑(如果我是国王,我什至可能会因为if 等而摆脱它们)。至于make it easier to see that it is a single statement that is returned,首先,这是一个表达式,而不是“陈述”——以及什么——人们认为return 是一个贪婪的运算符,return x+i*2 可能会返回x 并丢弃其余的部分?如果是这样,哇。还是这个答案真的在考虑可能跨越多行的长表达式?无论哪种方式,它都完全错过了自己的观点。
    【解决方案3】:

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

    return (a + b);
    

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

    return a;
    

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

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

    return(a);  // ugh
    

    非常丑陋,而且是错误的。

    【讨论】:

    • 主观 - 我认为空间看起来更糟(这同样但相反主观)。
    • 还有return (a);return a ;
    【解决方案4】:

    有几个原因:

    1. 如果/而/对于/等。都是必须有括号的控制关键字。因此,总是将它们归还似乎很自然。

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

    3. case/goto 是唯一从不使用括号的关键字。 ...人们倾向于将这些视为特殊情况(并希望它们都能从其他控制关键字中脱颖而出,尤其是 goto)。

    【讨论】:

      【解决方案5】:

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

      【讨论】:

      • 哇!不太可能,但这是我听说过的唯一动机,它不等于“哦,好吧,有人可能认为它可能看起来更好或更一致”,但这些动机似乎都没有对我很有吸引力。谢谢你的理智!
      • 有趣的观察。在我的实验中,我注意到为 return 定义的宏似乎允许没有括号的宏参数,但为另一个名称(例如 square)定义的宏不允许。我想我这次已经凝视了深渊……
      • ...希望没有人调用函数或使用增量运算符或在其返回语句中有任何其他副作用。
      • 这是一个强有力的论据,不使用括号作为返回语句
      • @polynomial_donut - 如果您的退货语句中有表达式,则可能会发生与宏相关的正常问题,例如多重评估。
      【解决方案6】:

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

      【讨论】:

      • 在过去,在某些情况下,它是由一个相当特殊的函数 cret 在汇编程序级别实现的。现在,这是一个笼统的声明;我应该找一个参考。它在 Comer 的 XINU 书中 - 您可以通过普渡大学的 Google 搜索找到。
      【解决方案7】:

      在您的示例中返回 -1 时,我认为括号更易读,因为减号更明显:

      return 1
      

      return -1
      

      return (-1)
      

      【讨论】:

        【解决方案8】:

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

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

        很多程序员都这样做。如果你们中的一个人读到了这篇文章,也许你想解释一下。

        【讨论】:

        • 通常,大括号用于减少在以后的代码编辑中引入错误的可能性。这个问题的第一个答案给出了一个例子:programmers.stackexchange.com/questions/16528/…
        • 另外,总是使用大括号使代码更加自动合并友好。否则,您更有可能遇到必须手动处理的冲突。
        • 由于缺少花括号而引入的错误数不胜数。我同意它们对于一行来说是丑陋的,但是当你用宏替换函数调用时——有时由于特殊约束而发生这种情况——或者当重构程序以用更长的表达式集替换单行表达式时,错误可能不会立即显现并且仅在那些不能自动测试的特殊情况下发生。花括号也是一些公司的硬编码要求(我在一家军事承包公司有这个要求),即使是 1 班轮也是如此。
        • MISRA 明确禁止删除那些“额外”的大括号。
        【解决方案9】:

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

        【讨论】:

          【解决方案10】:

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

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

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

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

          【讨论】:

          • 如果确实有编译器可以做到这一点,最好展示一个编译器为每种情况生成的程序集示例
          【解决方案11】:

          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?

          【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-02-11
          • 2011-04-23
          • 1970-01-01
          • 2013-05-18
          • 2016-06-04
          • 2019-04-05
          • 2021-07-21
          • 1970-01-01
          相关资源
          最近更新 更多