运算符 ^ 对于参数类型 int,boolean 是未定义的

the operator ^ is undefined for argument type(s) int,boolean

我正在解决 Hackerrank 问题 'Maximizing xor'。 (https://www.hackerrank.com/challenges/maximizing-xor)

我已经使用 'if' 语句来检查 i xor j 是否大于 'max',如代码所示。

static int maxXor(int l, int r) {
    int max=0;
    for(int i=l;i<r;i++)
        for(int j=l;j<r;j++)
        {
            if(i^j>max)/*error part*/
            max=i^j;
        }
    return max;
}

但为什么会出现此错误?

the operator ^ is undefined for argument type(s) int,boolean'

您需要在表达式两边加上括号:

if ( (i ^ j) > max )

根据 Java's operator precedence table,异或运算符 ^ 的优先级低于不等运算符 >.

因此,您的 i ^ j > max 的原始书面表达将被解释为 i ^ (j > max)。但是这里的类型不正确:iint,而 (j > max)boolean。这就是您遇到编译器错误的原因。


附带说明一下,如果您在 C/C++ 中编译此代码,它本来可以编译,但会 运行 产生奇怪的结果。这是因为在 C/C++ 中,相同的运算符优先级规则适用于这种情况,但 bool 将转换为 0 或 1 的 int,然后异或将继续.这将是危险和错误的。 Java 编译器阻止您对 intboolean 进行异或,这将是一个无意义的操作。

看看 Java 运算符优先级:http://bmanolov.free.fr/javaoperators.php。如您所见,整数比较 (<, >) 比 xor 具有更高的优先级。所以你的陈述在 java 中被解释为

if ( i ^ (j>max))

因此您必须手动在语句中添加括号

if ( (i^j) > max)

为了达到你想要的比较。