三元运算符

格式

image.png

  • 表达式1和表达式2为同种类型
  • 三元运算符可以嵌套使用

例:m>n ? "m大" :((m=n)? "相等" :"n大");

  • 如果程序既可以使用三元运算符,又可以使用if-else结构,优先选择三元运算符。

原因:简洁、执行效率高。

  • 凡是可以使用三元运算符的地方,都可以改写为if-else。反之,不成立。
  • 三元运算符与if-else的联系与区别:
    1. 三元运算符可简化if-else语句
    2. 三元运算符要求必须返回一个结果。
    3. if后的代码块可有多个语句

三元运算符的返回值

  • 如果返回值1和返回值2都是同种类型,那么三目最终的返回类型就是这种类型
  • 如果返回值1和返回值2不是同种类型,那么三目最终的返回类型是这两种类型的相同最小父类(最接近的父类,如果没有则返回Object,例如Integer和String最终返回的将是Object)。
    • 两个都是变量,按照自动类型转换规则处理成一致的类型
    • 两个都是常量
      • 如果一个是char类型,
        • 另一个是[0~65535](short、byte)之间的整数按char处理;
        • 另一个是其他,按照自动类型转换规则处理成一致的类型;
      • 没有char类型:按照自动类型转换规则处理成一致的类型
    • 一个是变量,一个是常量:
      • 如果变量是char类型,
        • 另一个是[0~65535](short、byte)之间的整数按char处理;
        • 另一个是其他,按照自动类型转换规则处理成一致的类型;
      • 其余按照自动类型转换规则处理成一致的类型
        1. char x = 'a';
        2. System.out.println(true ? 120 : x);//x 120在0~65535(即int型之下)之间,返回值为char型
        3. System.out.println(true ? 'a' : 12L);//97 返回值为long型
        4. System.out.println(true ? 'a' : -1);//97
        5. System.out.println(true ? 'a' : 12.0);//97.0
        6. System.out.println(true ? 'a' : 12);//a

运算符的优先级

运算符有不同的优先级,所谓优先级就是表达式运算中的运算顺序。 只有单目运算符、三元运算符、 赋值运算符是从右向左运算的。

image.png