2013-05-16 37 views
9

我想这是一个关于语言理论的问题。为什么第一个声明在主要法律上,第二个声明不是?难道他们不评估是同一件事吗?Java:不是一个声明

public class Main { 
     public static void main(String[] args) { 
       foo(); 
       0; 
     } 
     public static int foo(){ 
       return 0; 
     } 
} 
+0

因为这是一个原始的原始图像,而不是一个声明。 – greedybuddha

+0

阅读:http://docs.oracle.com/javase/specs/jls/se7/jls7.pdf特别是关于陈述的章节。 – user643011

回答

14

Java限制在所谓的“表达式语句”中允许的表达式类型。只允许有潜在副作用的有意义的表达。它不允许使用语义上无意义的语句,如0;a + b;。他们只是从语言语法中排除。

foo()这样的函数调用可以并且通常会产生副作用,所以它不是无意义的语句。编译器没有深入检查foo()的主体来检查它是否确实做了任何事情。调用函数可能有副作用,所以它在语法上是有效的。

这反映了C/C++和Java之间的哲学差异。 Java禁止各种构造导致死或无意义的代码。

return; 
foo(); // unreachable statement 

C和C++对这一切都相对放任自流。写任何你想要的;他们没有时间照顾你。


Java Language Specification, §14.8 Expression Statements引用:

某些类型的表达式可以通过以下 用分号用作语句。

ExpressionStatement: 
    StatementExpression ; 

StatementExpression: 
    Assignment 
    PreIncrementExpression 
    PreDecrementExpression 
    PostIncrementExpression 
    PostDecrementExpression 
    MethodInvocation 
    ClassInstanceCreationExpression 

表达式语句通过评估表达式来执行;如果 表达式有一个值,则该值将被丢弃。

当且仅当 对表达式的评估正常完成时,表达式语句的执行才会正常完成。

与C和C++不同,Java编程语言只允许某些 表达式形式用作表达式语句。需要注意的是 Java编程语言不允许“转换为void” - 无效 不是一个类型 - 所以写一个表达式 声明如传统的C伎俩:

(void)... ; // incorrect! 

不起作用。另一方面,Java编程语言允许在表达式语句 中使用所有最有用的表达式类型,并且它不需要用作表达式 语句的方法调用来调用void方法,所以这种技巧几乎不会需要 。如果需要技巧,可以使用赋值语句(§15.26) 或局部变量声明语句(§14.4)来代替。