Java中的“not a statement”

k5hmc34c  于 2023-04-04  发布在  Java
关注(0)|答案(2)|浏览(558)

我想这更多的是一个关于语言理论的问题,为什么第一个语句在main法律的中是合法的,而第二个不是?它们不是评估为同一个东西吗?

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

gojuced71#

Java限制了所谓的“表达式语句”中允许的表达式类型。只允许有潜在副作用的有意义的表达式。它不允许语义上无意义的语句,如0;a + b;。它们只是被排除在语言语法之外。
foo()这样的函数调用可以,而且通常会有副作用,所以它不是一个无意义的语句。编译器不会深入检查foo()的主体来检查它是否真的做了任何事情。调用一个函数可能有副作用,所以它在语法上是有效的。
这反映了C/C++和Java之间的哲学差异。Java禁止各种导致死亡或无意义代码的构造。

return;
foo();    // unreachable statement

C和C++相对来说是自由放任的,你想写什么就写什么;他们没时间照顾你
引用自Java语言规范,§14.8表达式语句:
某些类型的表达式可以用作语句,在它们后面加上分号。

ExpressionStatement:
    StatementExpression ;

StatementExpression:
    Assignment
    PreIncrementExpression
    PreDecrementExpression
    PostIncrementExpression
    PostDecrementExpression
    MethodInvocation
    ClassInstanceCreationExpression

通过对表达式求值来执行表达式语句;如果表达式具有值,则丢弃该值。
当且仅当表达式的求值正常完成时,表达式语句的执行才正常完成。
与C和C++不同,Java编程语言只允许某些形式的表达式用作表达式语句。请注意,Java编程语言不允许“转换为void”- void不是类型-因此编写表达式语句的传统C技巧如下:

(void)... ;  // incorrect!

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

hmmo2u0o

hmmo2u0o2#

在第一个语句中,你实际上是在调用一个函数,而第二个语句没有给予任何值。如果你想处理返回值,你需要调用一个返回类型的变量
例如:

public class Main {

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

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

相关问题