Java 中的“不是声明”

问题描述 投票:0回答:3

我认为这更多的是关于语言理论的问题。为什么 main 中的第一个语句合法,而第二个语句则不合法?他们不认为是同一件事吗?

public class Main {
        public static void main(String[] args) {
                foo();
                0;
        }
        public static int foo(){
                return 0;
        }
}
java semantics
3个回答
22
投票

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 节)来代替。


0
投票

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

例如:

public class Main {

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

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

0
投票

嘿,我也有同样的问题,在搞乱了代码之后,我相信 java 不知道如何处理 0;作为一个声明。 Java 要求你指定如何处理你所写的内容,这就是为什么你需要一个 return 语句。返回为命令 while 0;就在……那里。我只是出于实用性,我的答案没有任何语法或文章来支持我,所以如果有人能找到一些东西来反驳或证明我,请随意说任何话

© www.soinside.com 2019 - 2024. All rights reserved.