Java最令人着迷的就是三元运算符,运算符经常用于代替如下形式的if-else语句:
if(condition) var = expression1; else var = expression2;
这里,赋给var的值由控制if的condition表达式的结果来决定。
叫三元运算符,因为他需要三个操作数,其基本形式如下所示:
Exp1 ? Exp2 : Exp3;
其中,exp1是一个boolean表达式,exp2和exp3是void以外的任何类型的表达式。exp2和exp3的类型必须一致(或兼容)。注意冒号的用法与位置。
表达式的值确定过程如下所示:计算Exp1。如果Exp1为真,那么计算Exp2,而且他的值会成为整个表达式的值。如果exp1为假,那么计算exp3,并把其值作为表达式的值。考虑下面这个把val的绝对值赋给absval的示例:
absval = val < 0 ? -val : val ;
这里,如果val大于等于0,就把val的值赋给absval。如果val为负数,就把该值得负数(产生的正值)赋给absval。使用if-else结构编写的相同功能的代码如下所示:
if(val < 0) absval = -val; else absval = val;
下面是运算符的另一个示例.该程序除以两个数,但不允许被0除:
public static void main(String args[]) { int result; for(int i = -5;i<6;i++) { result = i != 0 ? 100/i : 0; if(i!=0) System.out.println("100 / "+i+" is "+result); } }
输出:
100 / -5 is -20 100 / -4 is -25 100 / -3 is -33 100 / -2 is -50 100 / -1 is -100 100 / 1 is 100 100 / 2 is 50 100 / 3 is 33 100 / 4 is 25 100 / 5 is 20
请特别注意程序中的这一行:
result = i != 0 ? 100/i : 0;
这里,把100除以i的结果赋给result,然而,除法不能在i为0时发生,当i为0时,就把0占位符赋值给result.
实际上不必把?生成的值赋给某些变量,例如,可以把该值作为调用某个方法的实参,或者,如果表达式都是boolean类型,那么可以把?作为循环或if语句的条件表达式,例如,下面对上述程序进行了重写,以使其效率更高:
public static void main(String args[]) { for(int i = -5;i<6;i++) { if(i != 0 ? true : false) System.out.println("100 / "+i+" is "+100/i); } }