三目运算符对比三个_if-else和三目运算符 ? : 的对比

今天的地铁思考让我想起一个之前学C语言的时候一直没有验证的事情:既生瑜何生亮?

平时写代码的时候,似乎并没有太多的关注我应该选用什么条件判断语句,感觉判断条件或者两条支路语句复杂就本能地if-else。

遇到一些数值,字符的按条件赋值输出,就感觉if-else与这些简短语句气质不符,于是就用了三目运算符,使代码更简洁舒服。那么为什么有了if-else还要用?:呢,只是为了代码更简洁吗,还是有什么不为人知的秘密[/嘿嘿]

我打算稍稍探寻一下,从两个方面来聊聊:效率和三目运算符的表达式特性

关于执行效率

我在网上一直没有找到可靠的说辞或指南,有的说三目运算符效率高,还有的说一样的,所以我来测测(测试环境可能由于我的电脑性能,给定参数原因,不能得出确切的结论,仅供参考)

- if-else

public static void main(String[] args) {

int num=1000;

System.out.println("if-else 运行时间:");

long totalTime=0L;

for (int i = 1; i <=10 ; i++) {

long startTime = System.nanoTime();

if (num>500&&num%3!=0&&num/10==100){

num=1001;

}else{

num=0;

}

long endTime = System.nanoTime();

long result = endTime - startTime;

totalTime+=result;

System.out.println("第"+i+"次: " + result + " 纳秒");

}

System.out.println("平均时间为:"+totalTime/10+"纳秒");

}

执行结果:

三目运算符 ? :

public static void main(String[] args) {

int num = 1000;

System.out.println("? : 运行时间:");

long totalTime = 0L;

for (int i = 1; i <= 10; i++) {

long startTime = System.nanoTime();

num = num > 500 && num % 3 != 0 && num / 10 == 100 ? 1001 : 0;

long endTime = System.nanoTime();

long result = endTime - startTime;

totalTime += result;

System.out.println("第" + i + "次: " + result + " 纳秒");

}

System.out.println("平均时间为:" + totalTime / 10 + "纳秒");

}

执行结果:

从结论上来看,平均执行时间并没有太大差距,毕竟这里是以纳秒为单位,所以,暂且以为? :仅仅是简化代码的吧

如果哪位大佬有专业的权威的见解,请一定来“拍一拍”我,让我的石头落下。

表达式特性(BNP : binary numeric promotion)

二进制数值提升

- 在三目运算符中的第二和第三表达式的类型依据数值范围大的那个,将一个小数值的类型范围扩大,比如16位提升到32位,32位到64位,直观一点就是short提升到int,int提升到long,不同类型之间也可以提升,但是不一定是往两个其中的一个走,也有short和char,最终表达式是int的情况。

举几个栗子就比较清楚了

1,参数是int和byte,但是整个表达式的类型却是int

2,参数:int,char 表达式类型:int

3,参数:short,char 表达式类型:int

4,参数:int,float 表达式类型:float (如果字节数相同,会提升到浮点数)

5,参数:int,long 表达式类型:long

6,参数:long,double 表达式类型:double (如果字节数相同,会提升到浮点数)

7,同上的包装类,包装类在运算时自动拆箱,和基本数据类型结果无异

8,更具体一点,这里判断执行第三表达式,可因为第二表达式是浮点数,所以输出的9不是int的9而是浮点数的9.0

int number = 1000;

System.out.println(number<0?10.0:9);

console:

这么看来和数据类型的自动类型转换似乎是一致的

总的来看,if-else和三目运算符并没有在今天分出胜负,我们依然可以按照之前的习惯写代码,只是让我们之后写代码的不用再犹豫和纠结用什么好,不用再想起他们俩之间的纠葛。在实际生产环境中按照各自团队规范来就好。这些也是最近才发现的,虽然感觉很少用到,但这不是目的。我们遇到的东西那么多,不会每样都能用到你的程序里,只是为了在下次遇到此类问题Bug时,能够游刃有余,这就是我们程序员鸭,突然感觉这篇文章啥也没做,但是却也不是啥也没做,哈哈奇怪咧。

至此,若有纰漏,望各位不吝赐教

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值