为了好玩,我试图取代:
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
有人可以对这些错误消息有所了解吗?他们对我没有多大意义。
答案 0 :(得分:7)
正如@qqilihq在评论中所说,试着做
boolean temp = set1.add(x) || set2.add(x);
或更尴尬:
if(set1.add(x) || set2.add(x));
答案 1 :(得分:5)
根据文档,以分号结尾的java语句是:
Assignment expressions
Any use of ++ or --
Method invocations
Object creation expressions
你写的不是statement
它是expression
。 Here您可以找到有关语句和表达式的更多信息。这么简单但值得一看。
答案 2 :(得分:3)
答案有很多,但我同意Bohemian's answer最直接的简化(尽管它不使用||
)是这样的:
if ( !set1.add(x) ) set2.add(x);
但这并不能解释错误消息。 Mustafa Genç comes closer on this,但我认为在这里查看语言规范是值得的。 exp1 || exp2
是一个表达式,这里的问题是你试图在期望语句的上下文中使用它。根据{{3}},通过附加分号可以在需要语句的地方使用某些表达式:
14.8. Expression Statements
某些类型的表达式可以通过以下方式用作语句 他们用分号。
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节)。
这种方法是14.8. Expression Statements中首次使用的方法:
boolean temp = set1.add(x) || set2.add(x);
答案 3 :(得分:1)
我会:
if (!set1.add(x))
set2.add(x);
答案 4 :(得分:0)
声明
boolean temp = set1.add(x) || set2.add(x);
任何变化都是危险的。你几乎不知道那里发生了什么。请注意,如果第一个表达式为true
,则右表达式不会被评估。也就是说,只有当它还没有包含在set1中时,才会尝试将它添加到set2。
编辑:现在,再次阅读这个问题,似乎这正是你的意图。所以我认为MustafaGenç的anser https://stackoverflow.com/a/21755051与此相关
通常,您应该清楚地写下您想要做的事情
boolean wasNotContainedInSet1 = set1.add(x);
boolean wasNotContainedInSet2 = set2.add(x);
boolean wasNotContainedInAnySet =
wasNotContainedInSet1 | wasNotContainedInSet2;
或
boolean wasNotContainedInSet1 = set1.add(x);
if (!wasNotContainedInSet1) {
set2.add(x);
}
或其他......