用析取符替换if语句

fredoverflow

只是为了好玩,我试图替换:

if (set1.add(x) == false)
{
    set2.add(x);
}

和:

set1.add(x) || set2.add(x);

但是,Eclipse抱怨:

Syntax error on token "||", invalid AssignmentOperator
The left-hand side of an assignment must be a variable

任何人都可以对这些错误消息有所了解吗?他们对我来说没有多大意义。

约书亚·泰勒(Joshua Taylor)

到目前为止,有很多答案,但我同意波希米亚的答案,最简单的简化方法是(虽然不使用||):

if ( !set1.add(x) ) set2.add(x);

但这并不能解释错误消息。MustafaGenç在这方面做得比较接近,但是我认为值得在这里查看语言规范。exp1 || exp2是一个表达式,这里的问题是您试图在需要声明的上下文中使用它。根据14.8。表达式语句,可以在通过附加分号来期望语句的地方使用某些类型的表达式:

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节)。

这种方法是Reik Val的答案中第一个被截断方法:

boolean temp = set1.add(x) || set2.add(x);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章