0

我被困在一些简单的事情上,基本上我想验证以下内容

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 功能?

4

6 回答 6

5

Java 具有在语句中使用的已定义语法if。具有多个 RHS 操作数的表达式违反了语法,因此编译器会抱怨。与按位运算符相比,逻辑运算符在这里更可取,因为它提供了短路评估

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

if (myChar != '(' && myChar != ')' )
于 2013-03-05T16:52:32.993 回答
4

原因

二元运算符可用于boolean|booleannumber|number。在你的情况下
,因为!=有更高的优先级|

myChar != '(' | ')'

等于

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

这给了你

    boolean     | character

但即使你像这样写myChar !=( '(' | ')' )二进制 OR 也会计算
'(' | ')')因为

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

所以(条件会丢失。

解决方案

您可能希望根据德摩根定律使用这种形式: !(a OR b)== !a AND !b

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

甚至短路and以提高性能

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

这种方式如果myChar != '('将返回假,整个条件将被估计为假,因为
false and anything总是假的。

于 2013-03-05T16:51:19.773 回答
1

您应该使用以下内容

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

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

请参阅有关逻辑运算符的示例

根据德摩根定律,你必须使用and运算符来实现你想做的事情。否则它将接受一切。和将强制您不想要任何一个角色。

于 2013-03-05T16:51:58.557 回答
1

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

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

请注意您要&&在这里,因为(1)“非(A或B)”与“(非A)和(非B)”相同,并且(2)我们关心的是布尔值,而不是位(&看起来这里很奇怪)。

于 2013-03-05T16:53:54.627 回答
0

你应该这样做

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

|不是逻辑运算符,它是 a Bitwise inclusive OR

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

于 2013-03-05T16:52:39.330 回答
0

我认为运算符“|” 返回真或假,这不能针对字符值进行验证。

以下应该有效:

if (!((myChar==')')||(myChar=='(')) ){
    System.out.println("Fault");
}
于 2013-03-05T17:36:15.267 回答