【问题标题】:Are braces required for one-line functions? [closed]单行函数需要大括号吗? [关闭]
【发布时间】:2015-04-14 11:33:07
【问题描述】:

我知道单行块不需要大括号,比如if语句等,但是单行函数需要大括号吗?

例如:

public int foo(int bar) 
    return bar;

public int foo(int bar) 
{
    return bar;
}

这两个是否同样有效,还是第一个例子不是?

我正在寻找与 C 系列和类似语言(C、C++、C#、Java 等)相关的答案。

【问题讨论】:

  • 为什么不编译看看呢?
  • 当然,这是语法。我们需要大括号
  • 是的,方法体在大括号内。
  • 答案是。对于你提到的所有语言(至少 C、C++、Java)
  • 在 C# 6 中,利用 lambda 语法的表达式主体方法不需要它们。

标签: java c# c++ c coding-style


【解决方案1】:

当您阅读答案时,您可能会知道问题的答案 -这是语法,您无法避免。但我会更进一步,解释为什么会这样?

当您为任何语言设计编译器时,您必须处理scope 和变量的生命周期。像 在C

int p=2015;
int foo()
{ ~~~~~~~~~~~~~~~~~~~~~~~>
    int p=2014;          |
    printf("\n %d ",p);  |  This is the local scope 
    return p;            |
} ~~~~~~~~~~~~~~~~~~~~~~~>

输出:2014 年

现在按照规则,我们总是在局部范围内寻找变量,然后逐渐向外范围。

总而言之,您必须了解应该在哪里打开新范围。这就是'{'大括号的作用。我们可以说,当编译器看到一个“{”时,显然一个作用域开始了,当它遇到一个“}”时它结束了。这将帮助我们存储和操作标识符(嗯 :-) 它是我们这样做的符号表)。

现在,如果标准支持您所说的内容会发生什么-- :-( 前面的问题

int x=100;
int y=200;
int foo(int x)
 return x+y;-~~~~~~~~~~~> which x :-( the one that I have got as a parameter or the global one.

int main()
{
   int x=2;
   printf("%d\n",foo(x));
}

所以这就是问题所在。希望这会有所帮助。

如果你用正确的语法运行它

int foo(int x)
{
 return x+y;
}

答案将是..哦!你运行它!这个想法会很清楚。

C 语法的一部分(Courtesy-Lysator)

function_definition
    : declaration_specifiers declarator declaration_list compound_statement
    | declaration_specifiers declarator compound_statement
    | declarator declaration_list compound_statement
    | declarator compound_statement
compound_statement
    : '{' '}'
    | '{' statement_list '}'
    | '{' declaration_list '}'
    | '{' declaration_list statement_list '}'
    ;

【讨论】:

    【解决方案2】:

    在 Java 中,编译器需要大括号来检测方法声明之后的行作为方法代码的一部分。

    【讨论】:

      【解决方案3】:

      是的,函数定义需要大括号。它们是语言的一部分,不是可选的。

      【讨论】:

        【解决方案4】:

        对于函数来说是必要的,但是对于不同的条件循环,一行不需要大括号。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-09-26
          • 2013-03-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-12-03
          相关资源
          最近更新 更多