繁体   English   中英

Java三元运算符混淆

[英]Java ternary operator confusion

这是我的代码

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 ++中运行良好

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

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

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

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

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

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

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

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

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


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

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

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

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

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

(沿着这些方向的东西)。

文档

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM