在比较字符的java中的二进制OR运算符

时间:2013-03-05 16:48:57

标签: java logic

我坚持简单的事情,基本上我想验证以下

public class CharTest
{
    public static void main(String [] args)
    {
        char myChar = '(';
        if (myChar != '(' | ')' )
        {
            System.out.println("Fault");
        }
        System.out.println("No Fault");
    }
}

但我一直在

CharTest.java:6:错误:二元运算符'|'的错误操作数类型                 if(myChar!='('|')')                                   ^   第一种类型:布尔值   第二种:char 1错误

我尝试过使用|以及||如何实现我正在寻找的OR功能?

6 个答案:

答案 0 :(得分:5)

Java在if语句中使用defined syntax。具有多个RHS操作数的表达式违反了语法,因此编译器会抱怨。逻辑运算符不是按位运算符,而是由于它提供的short circuit evaluation而优先使用。

双方都带有否定表达式的逻辑OR将始终为真。请改用&&

if (myChar != '(' && myChar != ')' )

答案 1 :(得分:4)

原因

可以在boolean|booleannumber|number上使用二元运算符。在您的情况下,从!= have higher priority then |

开始
myChar != '(' | ')'

等于

( myChar!='(' ) | ')'

给你

    boolean     | character

但即使您将其写为myChar !=( '(' | ')' )二进制,或者将'(' | ')'计算为),因为

'(' ->     101000
')' ->     101001
 OR        ------
'('|')'->  101001 -> `)`

因此(条件将会丢失。

解决方案

您可能希望使用基于De Morgan's law的此表单:!(a OR b)==!a AND!b

myChar != '(' & myChar != ')' 

甚至是短路and以提高性能

myChar != '(' && myChar != ')'

这样,如果myChar != '('将返回false,则整个条件估计为false,因为false and anything始终为false。

答案 2 :(得分:1)

您应该使用以下

if (myChar != '(' && myChar != ')' )

您必须将比较分开并使用逻辑&&和运算符。

See an example on logical operators

根据De Morgan's law,您必须使用and运算符来实现您想要的功能。否则它会接受一切。并且将强制您不想要任何一个角色。

答案 3 :(得分:1)

你不能说“不等于这个字符或这个字符”。 Java使您可以单独比较每个字符。

if (myChar != '(' && myChar != ')')

注意你想要&&,因为(1)“not(A或B)”与“(不是A)和(不是B)”相同,而(2)我们关心布尔值值,而不是位(使&看起来很奇怪)。

答案 4 :(得分:0)

你应该这样做

(myChar != '(' && myChar!= ')')

|不是一个逻辑运算符Bitwise inclusive OR

按位|运算符执行按位包含OR运算。

答案 5 :(得分:0)

我认为运营商“|”返回true或false,无法根据字符值验证。

以下内容应该有效:

if (!((myChar==')')||(myChar=='(')) ){
    System.out.println("Fault");
}