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

Sha*_*gde -6 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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

Nay*_*uki 5

你需要在表达式周围加上括号:

if ( (i ^ j) > max )
Run Code Online (Sandbox Code Playgroud)

根据Java的运算符优先级表,XOR运算符的^优先级低于不等运算符>.

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


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