在我的Java书中,它说“表达式是一种可以传递返回值的语句”。这与我的传统理解不同。我以为表达式会返回值。Not可以返回值。
这是来自Sams在21天内自学Java。
发布于 2011-10-27 10:41:36
数学表达式总是返回一些东西,但Java表达式不一定要返回。Java规范定义了what exactly is meant by the term expression in the Java language。另一个不同之处在于,在Java中,表达式可能并且经常会有副作用。副作用是指除了返回值之外发生的任何事情。
引用Java语言规范:
程序中的大部分工作都是通过对表达式求值来完成的,或者是计算表达式的副作用,比如赋值给变量,或者是计算表达式的值,这些值可以用作较大表达式中的参数或操作数,或者影响语句中的执行顺序,或者两者兼而有之。
例如,system.out.println("Hello World");不返回值,但它确实将Hello World输出到输出流。这个输出数据的过程是调用println的副作用。相比之下,Functional languages试图最大限度地减少对副作用的依赖,并更紧密地坚持表达式的数学定义。
同样,下面是一个表达式的BNF grammar:
Primary:
PrimaryNoNewArray
ArrayCreationExpression
PrimaryNoNewArray:
Literal
Type . class
void . class
this
ClassName.this
( Expression )
ClassInstanceCreationExpression
FieldAccess
MethodInvocation
ArrayAccess可以看到,表达式是PrimaryNoNewArray的扩展,也就是Primary ( MethodInvocation )的扩展。
发布于 2011-10-27 10:38:20
你的理解是不完整的。在Java中,表达式可以返回值,也可以由于异常而终止。在其他支持异常的语言中也会出现类似的情况,更普遍的情况是。(例如,在C语言中,除以零会导致当前表达式求值终止,而不返回值。)
另一种解释是(根据JLS),像System.err.println("hello")这样的方法调用表达式可以向其上下文传递一个概念上的void值,这实际上意味着它没有传递任何值。
我不认为第二种解释是合理的。我们从一个指定为传递空值的“表达式”开始。然后我们争论说,由于void值实际上不是一个值,所以表达式没有提供任何东西。最后,我们说它是一个没有价值的表达式。
这个例子的一个更简单的解释是,提供"void“的”表达式“实际上不是直观意义上的表达式。当然,在Java语言中,您不能在需要非空传递表达式的情况下使用空传递MethodInvocation表达式。并且您不能将非void传递的表达式用作语句。
或者,我们可以坚持使用JLS处理,并说"void“值实际上是一个值……即使你永远不能用它做任何事。通过这个参数,System.err.println("Hi")毕竟返回了一个值。
发布于 2011-10-27 10:38:58
方法public void foo();不返回任何内容,因此表达式foo()也不返回任何内容。但如果方法是public int foo(),那么它就会。因此,它可以返回一些东西,但不一定要返回。From the Java spec
当且仅当表达式是调用不返回值的方法的方法调用,即声明为
的方法时,表达式才不表示任何内容。这样的表达式只能用作表达式语句,因为表达式可能出现的每个其他上下文都需要该表达式来表示某些东西。作为方法调用的表达式语句也可以调用产生结果的方法;在这种情况下,该方法返回的值将被悄悄丢弃。
https://stackoverflow.com/questions/7911161
复制相似问题