[英]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);
此操作放置a
和b
较大的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.