Java:不是一个语句

Java:不是一个语句,java,semantics,Java,Semantics,我想这更像是一个关于语言理论的问题。为什么第一个陈述主要是合法的,而第二个不是?他们的评价不是一样吗 public class Main { public static void main(String[] args) { foo(); 0; } public static int foo(){ return 0; } } Java限制

我想这更像是一个关于语言理论的问题。为什么第一个陈述主要是合法的,而第二个不是?他们的评价不是一样吗

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

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

foo()
这样的函数调用可能而且通常会产生副作用,因此它不是一个无意义的语句。编译器不会深入检查
foo()
的主体,以检查它是否实际执行了任何操作。调用函数可能会产生副作用,因此它在语法上是有效的

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

return;
foo();    // unreachable statement
<> C++和C++是相对自由放任的。想写什么就写什么;他们没有时间照顾你


引述:

某些类型的表达式可用作下列语句 用分号表示

ExpressionStatement:
    StatementExpression ;

StatementExpression:
    Assignment
    PreIncrementExpression
    PreDecrementExpression
    PostIncrementExpression
    PostDecrementExpression
    MethodInvocation
    ClassInstanceCreationExpression
通过计算表达式执行表达式语句;如果 表达式有一个值,该值将被丢弃

expression语句的执行通常在以下情况下完成 如果表达式的计算正常完成

<> P>与C和C++不同,java编程语言只允许某些 用作表达式语句的表达式的形式。注意 Java编程语言不允许“强制转换为void”-void 不是类型-因此传统的C编写表达式的技巧 声明,例如:

(void)... ;  // incorrect!
不起作用。另一方面,Java编程语言允许 表达式语句中所有最有用的表达式, 而且它不需要将方法调用用作表达式 语句调用一个void方法,所以这样的技巧几乎永远不会出现 需要。如果需要技巧,可使用赋值语句(§15.26) 或者可以使用局部变量声明语句(§14.4)


在第一条语句中,您实际上是在调用函数,而第二条语句没有给出任何值。如果要处理返回值,则需要为返回类型调用一个变量

例如:


因为它是一个原始的原语,不是一个语句。请阅读以下内容:特别是关于语句的章节。这个答案并没有解决这个问题。这个问题是关于如何以任何方式修复代码。问题是关于解释为什么一件事是then语言允许的,但另一件类似的事会产生编译错误。@Lii我已经修改了我的答案位。
public class Main {

    public static void main(String[] args) {
        int n = foo();
    
         //do whatever you want with return 
    }

    public static int foo() {
        return 0;
    }
}