三目运算符转型问题

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类型的变量,当然会引发编译错误。

时间: 2024-10-07 04:33:46

三目运算符转型问题的相关文章

Java自动装/拆箱下,三目运算符的潜规则

最近发现了一个很诡异的NullPointerException,在下面这个方法抛出,一开始怎么都没想明白,dSrc即使为null,那直接赋值给distinct也没问题啊. private Doubledistinct; private void setParam(Double dSrc, boolean flag) { this.distinct = (flag) ? dSrc : 0d; } 最后才发现是Java自动拆箱的潜规则,下面我们来看看其所以然. 自动装箱/拆箱 在JDK1.5引入自动

微软要做用云量挖掘机,以技术驱动数字化转型快公司

今年7月,首次更名为"Inspire"的微软WPC全球合作伙伴大会上,微软宣布将所有与合作伙伴相关的角色都重新整合为一个新的部门:统一商业合作伙伴部门(One Commercial Partner),并进行了一整套的组织和流程改组,以适应云计算时代的用户需求与"用云量"规律. 2017年9月12日,微软大中华区副总裁.全球渠道事业部总经理.商业客户事业部总经理包嘉峰与媒体分享了这两个月微软商业合作伙伴部转型以来,微软自身所发生的变化以及为客户所带来的价值.根据包嘉峰

java 和 c++ 的三目运算符的区别

以前很少用java,就知道java和c++差不多. 今天就踩了一个坑. 不吐糟,直接进正文. 看这种写法,把较小的数加1. int a = 5, b = 6; b > a ? (a = 1) : b++; 众所周知,c++这样写是没问题的. 但是java就不行! $ javac Solution.java Solution.java:14: error: not a statement b > a ? a++ : b++; ^ 1 error 上网查了资料才知道, java的表达式规定只有以下

开发人员转型到管理者必须学会的7件事

技术工程师的晋升之路 技术工程师的晋升之路大体上可以分为两个方向,一是在技术方向上作为Individual Contributor(IC)继续深造,二是以管理者的身份管理工程师团队.IC这条路比较单纯,能走多远主要取决于个人的技术实力与经验.与IC相比,转型为管理者可以说是一种颠覆性的变化.管理者的工作不再是以个人或项目的成功作为主要目标,而是专注于整个团队的成功.这种目标的变化将直接改变管理者的心态与工作方式,以及与他人的互动方式.可以说,向管理者的转型是一个具有更大挑战性的选择. David

一店千面 苏宁转型难在复杂求简

近日,苏宁通过PPTV视频节目<亮剑818>发布"百日会战"总攻令,宣布将从8月份开始发起"百日会战".看到这条消息,我"泪流满面",重点当然不是"百日会战",而是苏宁终于在花大价钱购买PPTV以后,总算真正用上了一次.事实上,近年来苏宁明显感受到来自天猫.京东.易迅等电商的压力,迫切地寻求转型.不断寻求突破机遇,接连将触手伸到多个领域,但结果却都是赔了夫人又折兵. 7月底,苏宁发布2014上半年业绩快报,在201

为什么媒体集体唱衰迪信通转型

7月8日在国内有着21年历史的移动通讯连锁迪信通将在港交所挂牌上市.此前迪信通,曾经两度谋求海内外市场上市,一次是2005年前后准备香港上市最后因特殊原因取消筹备,另一次是2011年国内A股IPO失败.虽然此次在香港因获得虚拟运营商牌照终于成挂牌上市,但国内众多媒体都对曾经号称业界"手机连锁之王" 的迪信通转型并不看好,甚至出现了集体唱衰.其关键原因就是迪信通核心业务因持续盈利能力不足.毛利依赖率高,转型不明.且不管是实体连锁还是电商业务等在业内竞争都十分激烈,摆在其眼前,不管是对内还

企业信息化互联网转型“生死劫”

文/冯强 虽然大学专业是计算机软件,其实最有兴趣也学得最好的却是"模电.数电,汇编.单片机原理",当年要不是手续太麻烦就转到无线电系了.从初中开始,俺对无线电就相当着迷,理所当然的毕业进了厂(当年还不是公司),彩电装调维修实习一年后,彩电工艺技术搞了五年.如果不是因为专业原因,被一纸调令弄去搞编程,可能就和企业信息化没什么交集了. 企业信息化搞了N年,在90年代"不上ERP等死,上ERP找死"的时期,经历了ERP从选型,立项,上线,实施的全过程,而且亲自参与杀死了自

js中三目运算符和&amp;&amp; || 符的个人浅见

这两天看到别人写的代码,感觉很牛逼,如下,大神请忽视 $(".lgn").on("click", function() { var a = {}; a.loginType = $(this).data("logintype"); a.loginType == wx_utils.LOGIN_TYPE.WX ? (a.username = $("#username").val(), a.password = $("#pa

Java表达式转型规则

Java表达式转型规则由低到高转换: 1.所有的byte,short,char型的值将被提升为int型: 2.如果有一个操作数是long型,计算结果是long型: 3.如果有一个操作数是float型,计算结果是float型: 4.如果有一个操作数是double型,计算结果是double型: 5.被fianl修饰的变量不会自动改变类型,当2个final修饰相操作时,结果会根据左边变量的类型而转化.