Java三元运算符混淆

时间:2015-06-19 17:54:39

标签: java

这是我的代码

public class BinarySearch {
    public static int binsearch(int key, int[] a)
    {
        int lo = 0;
        int hi = a.length - 1;
        while (lo < hi)
        {
            int mid = (lo + hi) >> 1;
            key < a[mid] ? hi = mid : lo = (mid + 1);
        }
        return lo--;

    }
}

编译时遇到错误

Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
    Syntax error on tokens, Expression expected instead
    Syntax error on token "]", delete this token
    Syntax error, insert "]" to complete Expression

如果我改变'&lt;'到'&gt;'如

key > a[mid] ? hi = mid : lo = (mid + 1);

得到了完全不同的错误:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    Syntax error on token ">", -> expected

我对java中的三元运算符使用感到困惑。 毕竟,这段代码在c ++中运行良好

4 个答案:

答案 0 :(得分:11)

编译器很难解析表达式,因为它像statement-expression一样使用。

由于三元运算符是表达式,因此不应使用 * 代替语句。由于您希望使用条件控制赋值(这是一个语句),因此您应该使用常规if

if (key < a[mid]) {
    hi = mid;
} else {
    lo = (mid + 1);
)

* 实际上,Java不允许将三元表达式用作语句。您可以通过将表达式包装在赋值或初始化中来解决此问题(请参阅demo),但这会导致代码难以阅读和理解,因此应该避免使用。

答案 1 :(得分:1)

java中的三元运算符只能这样工作:

x=(a>b?a:b);

此操作会放置较大的ab
这是不允许的:

a>b?x=a:x=b;

它可能看起来很相似,但java中的三元运算符分支只能包含值,而不是分配


编辑:
在您的情况下,我建议使用if语句

答案 2 :(得分:1)

在这种情况下,您应该使用if语句。

if(key > a[mid])
    hi = mid;
else
    lo = mid + 1;

这是因为在您设置变量时使用三元运算符。例如:

foo = (firstVariable > secondVariable) ? 1 : 0;

(沿着这些方向)。

答案 3 :(得分:0)

来自documentation

  

条件运算符有三个操作数表达式。 出现在第一个和第二个表达式之间,出现在第二个和第三个表达式之间。

     

第一个表达式必须是boolean或Boolean类型,否则会发生编译时错误。

     

第二个或第三个操作数表达式是void方法的调用是编译时错误。

换句话说,条件运算符不能用于执行类似* *

的操作
key < a[mid] ? foobar1() : foobar2();
  • 有一种使用反射的解决方法,但在一天结束时,代码简洁并不能胜过可读性。