Java三元运算符的困惑

3
这是我的代码。
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

如果我将“<”更改为“>”,则为

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++中可以正常工作。


你能先把你的代码拆分成非三元if语句吗?我向你保证这个三元操作在Java中是可行的,但你写的这段代码并不是Java代码。 - Blake Yarbrough
这并不是三元运算符特有的。在Java中,与C不同的是,您不能将表达式放在需要语句的位置。 - Holger
1
这段代码在C++中运行良好,这是因为C++对语句表达式更加宽松。而Java只允许直接和复合赋值表达式用作语句。 - Sergey Kalinichenko
我很确定这个二分查找甚至在C++中也无法正常工作。 - Nathan Hughes
4个回答

11
编译器很难解析您的表达式,因为它被用作语句表达式。
由于三目运算符是一种表达式,因此不应将其用作语句的替代品。既然您想使用条件控制赋值(即语句),您应该使用常规的if语句。
if (key < a[mid]) {
    hi = mid;
} else {
    lo = (mid + 1);
)

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


1

Java中的三元运算符仅以以下方式工作:

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

这个操作会把 ab 中较大的值赋给变量
以下操作是不被允许的:

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

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


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


1
在这种情况下,您应该使用 if 语句。
if(key > a[mid])
    hi = mid;
else
    lo = mid + 1;

这是因为三元运算符用于设置变量。例如:

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

大致上是这样的。


0

来自文档

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

第一个表达式必须是布尔类型或Boolean类型,否则会出现编译时错误。

第二个或第三个操作数表达式是调用void方法的情况下,将会出现编译时错误。

换句话说,条件运算符不能用于像这样的操作*:

key < a[mid] ? foobar1() : foobar2();
  • 虽然可以使用反射来解决问题,但归根结底,代码的简洁性并不能胜过可读性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接