函数定义中的嵌套括号

时间:2014-10-03 20:46:01

标签: java

我正在学习java,我正在制作的第一个程序是Hello World。我能够打印它然后我试着玩它。据我说,下面的程序不应该编译,但它正在编译和打印Hello World。

class Hello { 

    // main: generate some output

    public static void main(String args[]){
    System.out.print(("Hello World"));
  }
} 

但是如果我用main方法做同样的事情,它会在编译时给我多个错误。

class Hello {

    // main: generate some output

    public static void main((String args[])){
      System.out.print((("Hello World")));
    }
}

以下是第二个程序的一些编译错误:

Hello.java:5: error: ';' expected
        public static void main((String args[])){
                                             ^
Hello.java:6: error: illegal start of type
      System.out.print((("Hello World")));
        ^
Hello.java:6: error: ';' expected
      System.out.print((("Hello World")));

有人可以解释为什么第一个程序编译成功而第二个程序错误吗?

4 个答案:

答案 0 :(得分:4)

表达式的语法允许嵌套的parantheses。

方法标题的语法不是。方法标识符之后是单个parantheses括起来的形式参数列表。

来自Java language specification, section 8.4, Method Declarations

MethodDeclaration:
    MethodHeader MethodBody

MethodHeader:
    MethodModifiersopt TypeParametersopt Result MethodDeclarator Throwsopt

MethodDeclarator:
    Identifier ( FormalParameterList[optional] )

答案 1 :(得分:3)

每次编写具有值的表达式时,都可以将表达式的一部分放在括号中。所以你可以说

(a + b) * c

告诉编译器在乘法之前进行加法。为了简单起见,规则允许您将括号放在表达式中的任何位置(好吧,不是任何地方,而是表达值的表达式的任何部分),即使它们不是必要。所以你可以说

a + (b * c)

(((a + b))) * c

(((a)) + (b)) * (c)

System.out.println(("Hello world"));

因为"Hello world"是带有值的表达式。

但这仅适用于 表达式,因为需要添加括号的能力。在语法的其他地方,括号用于除表达式之外的其他内容(例如参数名称列表),语法不允许使用额外的括号。请注意,这意味着您可以说

max = Math.max((a),(b));

不是

max = Math.max((a,b));

因为(a,b)不是具有单个值的表达式。

答案 2 :(得分:0)

通过尝试添加所有这些额外的括号,您正在弄乱如何声明方法。方法声明不允许,因此您的代码无法编译。

在代码中,您正在评估事物而不是定义它们 - 额外的括号在那里评估很好,因此它不会影响代码的行为。

答案 3 :(得分:0)

这只是语法错误。在Java中,这是纠正你的课程的正确方法。

class Hello { 

// main: generate some output

public static void main(String args[]){
System.out.print(("Hello World"));
} 
} 

在第二个上添加了无法编译的括号。语法错误。