用disjunction替换if语句

时间:2014-02-13 12:51:04

标签: java grammar boolean-logic short-circuiting

为了好玩,我试图取代:

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

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

5 个答案:

答案 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它是expressionHere您可以找到有关语句和表达式的更多信息。这么简单但值得一看。

答案 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);    
}

或其他......