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编程语言允许在expressions语句中使用所有最有用的类型的表达式,并且它不需要用作表达式语句的方法调用来调用void方法,因此几乎不需要这种技巧。如果需要技巧,则可以改用赋值语句(第15.26节)或局部变量声明(第14.4节)。



