vla*_*ini 3 java ternary-operator
我已经开始学习java了,我对下面的条件表达式很不满:
((1<2)?5:(3<4))
Run Code Online (Sandbox Code Playgroud)
在我发现这个例子的书中,它说这是一个语法错误,因为它无法将数值转换为布尔值.相同页面之后,有一个不同练习的测试,包括这一个.在eclipse中编写和编译后,它给出了输出5.为什么?我已经阅读了关于这个运算符的一些内容,它清楚地表明这两个表达式必须是布尔值或算术,所以这是eclipse的一个问题?
Vih*_*har 13
当他们谈到编译器错误的情况时会是这样的
int a= ((1<2)?5:(3<4));
Run Code Online (Sandbox Code Playgroud)
但是当(3 <4)返回布尔值时,它不能分配给整数变量
但是当你只是这样做时System.out.println(((1<2)?5:(3<4)));,不必将值赋给任何变量,并使用该方法打印输出值System.out.println(Object)
如果你稍微改变表达式并执行: - System.out.println(((1>2)?5:(3<4)))那么它将true作为输出打印
Jon*_*eet 11
条件运算符有三个操作数 - 第一个是条件,第二个和第三个是分开的"分支".评估哪个分支取决于条件是评估为真还是假.
在您的情况下,您有:
1 < 253 < 4现在的问题是这里的两个分支是不同的类型,因此表达式没有有用的原始结果类型.它(令人惊讶的是,IMO)有效,整体表达类型Object- 基本上,两个分支都涉及拳击.所以这:
Object o = 1 < 2 ? 5 : 3 < 4;
Run Code Online (Sandbox Code Playgroud)
相当于:
Object o = 1 < 2 ? (Integer) 5 : (Boolean) (3 < 4);
Run Code Online (Sandbox Code Playgroud)
这是在JLS 15.25中指定的- 你的情况显示在"表15.25-B.条件表达式类型(原始第3操作数,第II部分)"中,它表明当第三个操作数的类型为boolean,第二个类型为int,结果是lub(Integer,Boolean)- 基本上Object.
现在这没关系:
int x = 1 < 2 ? 5 : 4; // Both branches are of type int
Run Code Online (Sandbox Code Playgroud)
这样:
// Very confusing with all these conditions, but valid!
boolean y = 1 < 2 ? 5 < 6 : 3 < 4; // Both branches are of type boolean
Run Code Online (Sandbox Code Playgroud)
...但是您当前的情况有一个类型的分支int,一个类型boolean.