我的AP计算机科学教科书指出add()
接口中的List
方法始终返回true
,但是当调用此方法时,不必分配其返回类型。
我假设该值被丢弃,因为在这种情况下它没有分配给任何东西。这就引出了一个问题,在哪种情况下是价值"被抛弃"。例如,以下内容无法编译。
为什么第二个片段在基本上留下与第一个片段相同的值时无法编译? (list.add()
返回true
,(1 < 2)
返回true
)。
答案 0 :(得分:6)
可以忽略返回值。不完整的表达仍然不完整。你可以把它分配给一个变量(并且永远不要再引用它) - 这会“扔掉”这个值(eclipse会警告你,但这不是错误) -
// This is legal, note that a is never referenced after assignment.
public static void main(String[] args) {
boolean a = (1 < 2);
}
答案 1 :(得分:5)
代码块可以包含语句,但不能包含表达式。 Section 14.2 of the JLS定义了块内部的内容,并且不允许表达式。
块:
- {[BlockStatements]}
BlockStatements:
- BlockStatement {BlockStatement}
块语句:
LocalVariableDeclarationStatement
ClassDeclaration
<强>声明强>
(强调我的)
一个可能的语句是方法调用,因此返回值未被赋值的方法调用是一个语句,但表达式本身不是语句。
Section 14.5 of the JLS将语句定义为以下之一:
声明: - StatementWithoutTrailingSubstatement
LabeledStatement
IfThenStatement
IfThenElseStatement
WhileStatement
ForStatement
StatementNoShortIf:
StatementWithoutTrailingSubstatement
LabeledStatementNoShortIf
IfThenElseStatementNoShortIf
WhileStatementNoShortIf
ForStatementNoShortIf
StatementWithoutTrailingSubstatement:
阻止
EmptyStatement
<强> ExpressionStatement 强>
AssertStatement
SwitchStatement
DoStatement
BreakStatement
ContinueStatement
ReturnStatement
SynchronizedStatement
投掷声明
TryStatement
(强调我的)
Section 14.8 of the JLS定义了一个&#34;表达式语句&#34;:
ExpressionStatement:
StatementExpression;
StatementExpression:
作业
PreIncrementExpression
PreDecrementExpression
PostIncrementExpression
PostDecrementExpression
<强>的MethodInvocation 强>
ClassInstanceCreationExpression
(强调我的)
表达式本身不是表达式语句或语句。
答案 2 :(得分:0)
<强> EDITED 强>
调用返回值的方法具有意义,因为它不仅仅是返回值。在给定的示例方法中,将项添加到集合并返回它引用,因此可以进一步处理。
第二个例子是给你一个错误,因为没有将它的结果赋给变量它没有意义。它比dead code
更糟糕。
理论上,第二个陈述不可能是一个错误,但为什么有人会想写这样的&#34;陈述&#34;?
表达式,字面上给出任何东西只是一个处理器消费者,一个错误,不应该在任何程序期间中使用。
(1<2);
可以很容易地转换为字节码,而且还可以转换为处理器指令,例如
PUSH EAX;
PUSH EBX;
PUSHF;
MOV EAX, 1;
MOV EBX, 2;
CMP EAX,EBX;
POPF;
POP EBX;
POP EAX;
甚至更简单
PUSHF;
CMP 1,2;
POPF;
只有上面代码会改变的是增加寄存器指向内存中的下一个代码(以及其他几个代码)。那么为什么有人会执行这样的线?
答案 3 :(得分:0)
生成的编译错误与java语法有关。 Java语法声明java函数的主体包含语句序列。根据这个语法语句可以是任何赋值,方法调用,条件结构,循环等。但是&lt; b是一个逻辑表达式,不能作为语句假设。所以这是关于表达式和语句之间的区别,而不是抛出值。