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

时间:2016-07-11 17:59:20

标签: java operator-precedence boolean-operations

我正在解决Hackerrank问题'最大化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;
}

但为什么我会收到此错误?

  

对于参数类型int,boolean'

,运算符^未定义

2 个答案:

答案 0 :(得分:5)

您需要在表达式周围添加括号:

if ( (i ^ j) > max )

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

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

作为旁注,如果你用C / C ++编译了这段代码,那么它就会被编译,但它会以奇怪的结果运行。这是因为在C / C ++中,在这种情况下适用相同的运算符优先级规则,但bool将转换为0或1的int,然后XOR将继续。这本来是危险和错误的。 Java编译器阻止您使用intboolean进行异或操作,这将是一个无意义的操作。

答案 1 :(得分:3)

查看Java运算符优先级:http://bmanolov.free.fr/javaoperators.php。如您所见,整数比较(&lt;,&gt;)的优先级高于xor。所以你的语句在java中被解释为

if ( i ^ (j>max))

因此,您必须手动将语句添加到语句

if ( (i^j) > max)

以达到您想要的比较。