我认为这更多的是关于语言理论的问题。为什么 main 中的第一个语句合法,而第二个语句则不合法?他们不认为是同一件事吗?
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
表达式语句是通过计算表达式来执行的;如果 表达式有一个值,该值被丢弃。
表达式语句的执行正常完成当且仅当 如果表达式的求值正常完成。
与 C 和 C++ 不同,Java 编程语言仅允许某些 用作表达式语句的表达式形式。注意 Java 编程语言不允许“强制转换为 void” - void 不是类型 - 所以编写表达式的传统 C 技巧 声明如:
(void)... ; // incorrect!
不起作用。另一方面,Java 编程语言允许 表达式语句中所有最有用的表达式类型, 并且它不需要用作表达式的方法调用 语句来调用 void 方法,所以这样的技巧几乎从来没有 需要。如果需要技巧,可以使用赋值语句(§15.26) 或者可以使用局部变量声明语句(第 14.4 节)来代替。
在第一个语句中,您实际上正在调用一个函数,而第二个语句没有给出任何值。如果要处理返回值,则需要调用返回类型的变量
例如:
public class Main {
public static void main(String[] args) {
int n = foo();
//do whatever you want with return
}
public static int foo() {
return 0;
}
}
嘿,我也有同样的问题,在搞乱了代码之后,我相信 java 不知道如何处理 0;作为一个声明。 Java 要求你指定如何处理你所写的内容,这就是为什么你需要一个 return 语句。返回为命令 while 0;就在……那里。我只是出于实用性,我的答案没有任何语法或文章来支持我,所以如果有人能找到一些东西来反驳或证明我,请随意说任何话