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;
}
}