zoukankan      html  css  js  c++  java
  • 三目运算符转型问题

    class C {
    public static void main(String[] args) {
    int i = 10; //int型变量i = 10
    System.out.println(i < 8 ? 1.0 : 1); //输出三目运算i < 8 ? 1.0 : 1的返回值
    //三木运算符返回的是冒号右边的值,也就是1,但是转型为double了,所以输出1.0
    }
    }

    关于三木运算转型问题,看下面的:
    一、案例编号:

    U02C09

    二、案例名称:

    使用条件运算符的阵痛

    三、关键词:

    条件运算符、三目运算符、三元运算符、类型转换

    四、案例情景描述:

    条件运算符有三个操作数。它的形式是:boolean-exp?exp1:exp2。它首先计算boolean表达式的值,如果为true那么整个表达式的值就是表达式exp1的值,如果boolean表达式的值为false,那么整个表达式的值就是exp2的值。

    int k=(2>3)?23:45;因为boolean表达式2>3为false,所以k的值是45。

    上述都是关于条件运算符值的确定,那么条件运算符值的类型又是怎么确定的呢?看下述代码:

    (1)
    char x=‘A’; //line1
    int i=0; //line2
    System.out.println(true?x:0); //line3
    System.out.println(true?x:1111111110); //line4
    System.out.println(false?i:x); //line5

    (2)
    /*
    *假设Test是已经定义的某个类
    */
    Test t=flase?new Object():new Test();

    五、案例理论分析:

    1、我们先看第一个代码片段:三个输出语句会输出什么结果呢?

    你也行会认为输出结果是:
    'A'
    'A'
    'A'

    当你运行一下这段代码,它的真正结果是:
    'A'
    65
    65

    为什么会有这样的结果呢?实质上这就是条件运算符对于运算结果类型的限制:

    (1)如果表达式1和表达式2具有相同的类型,那么整个条件运算符结果的类型就是这个类型。

    (2)如果一个表达式的类型是T,T是byte或short或char,另一个表达式的类型是int类型的常量表达式,而且这个常量表达式的值是可以用类型T表示的(也就是说,常量表达式的值是在类型T的取值范围之内),那么整个条件运算符结果的类型就是T。

    (3)除以上情况外,如果表达式1和表达式2的类型不同,那么将进行类型提升,整个条件运算符结果的类型就是提升后的类型。

    System.out.println(true?x:0); //line3。表达式1是char类型,表达式2是int类型的常量表达式,而且这个常量表达式的值0可以用char类型来表示,因此整个条件运算符结果的类型就应当是char类型,所以输出的结果就是'A'。

    System.out.println(true?x:1111111110); //line4。表达式1是char类型,表达式2是int类型的常量表达式,但是这个常量表达式的值已经超出了char类型的取值范围,因此要进行类型提升,把char类型提升为int类型,整个条件运算符结果的类型就是int类型了,所以输出的结果是65(字符A的ASCII码)。

    System.out.println(false?i:x); //line5。表达式1是int类型的变量,表达式2是char类型的变量,没有常量表达式。因此要进行类型提升,把char类型提升为int类型,整个条件运算符结果的类型就是int类型。所以输出结果就是65。

    2、我们再看第二个代码片段,它的结果是在编译阶段引发错误。为什么?

    Test t=flase?new Object():new Test();我们看到表达式1是Object类型,表达式2是Test类型。没有常量表达式,类型不同,因此要进行类型提升的。要把Test类型提升为Object类型,因此整个条件运算符结果的类型应当是Object类型。当在赋值的时候要把Object类型赋值给Test类型的变量,当然会引发编译错误。

  • 相关阅读:
    JavaScript系列:《JavaScript高级程序设计》,chapter2, 在html中使用JavaScript
    Java系列:JVM指令详解(下)(zz)
    Java系列:JVM指令详解(上)(zz)
    Java系列:关于Java中的桥接方法
    REST: C#调用REST API (zz)
    Activiti系列:为什么Activiti 5.18 的REST的api总是返回404错误
    timeSeries db之:使用Metrics监控应用程序的性能 (zz)
    Java系列:国际化(zz)
    通过数据库方式访问excel 2007及其以后(xlsx)文件的连接字符串
    java系列:《java核心技术 卷1》学习笔记,chapter 11 调试技巧
  • 原文地址:https://www.cnblogs.com/dyc-cfc/p/4116385.html
Copyright © 2011-2022 走看看