JR 精品文章 - 使用条件运算符的阵痛
AD: jr (at) javaresearch.org


首页 | 动态 | 文章 | FAQ  | 新闻 | 下载 | 代码 | 工作 | 调查 | 术语 | 站点 | 图书 | 论坛 | 帮助 | 全部  

TOP | 交流 | 软件 | 专栏 | 开源 | 译/著 | 源码 | API  | 推荐 | FTP  | 积分 | 统计 | 搜索 | Blog | 我们  
首页 » 研究文集 » J2SE综合 评论此文章 发表评论     开始监控此文章 开始监控   加入收藏夹  加入收藏夹
使用条件运算符的阵痛
deadspace 原创   更新:2007-03-01 09:16:26  版本: 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类型的变量,当然会引发编译错误。


版权声明   给作者写信
本篇文章对您是否有帮助?  投票:         投票结果:     11       0
作者其它文章: 作者全部文章
评论人:karies 发表时间: Sun Mar 25 13:24:35 CST 2007
如果我没有记错的话,应该在java puzzle上看过这个困惑的??

这个文章共有 1 条评论
主题: 语言之争、框架之战 上一篇文章
返回文章列表 返回〔J2SE综合〕
下一篇文章 主题: 你知道什么是缄默溢出吗


文字广告链接
        自主、快速定制基于JAVA的B/S业务系统          重量级企业在线自定义WEB报表平台
        Excel制表、零代码发布、打印、图表结合——快逸报表,免费、稳定、功能强大的java工具
        技术圈: 关于Java、dotNet、PHP、Ruby、奇客、Web2.0等更多资讯博客精选文章

关于 JR  |  版权声明  |  联系我们 

©2002-2006 JR 版权所有 沪ICP备05019622号