这是我的代码
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 ++中运行良好
答案 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);
此操作会放置较大的a
和b
这是不允许的:
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)
条件运算符有三个操作数表达式。 ?出现在第一个和第二个表达式之间,:出现在第二个和第三个表达式之间。
第一个表达式必须是boolean或Boolean类型,否则会发生编译时错误。
第二个或第三个操作数表达式是void方法的调用是编译时错误。
换句话说,条件运算符不能用于执行类似* *
的操作key < a[mid] ? foobar1() : foobar2();