if-else和三目运算符?:的对比(代码片段)

0neplece 0neplece     2022-12-06     266

关键词:

今天的地铁思考让我想起一个之前学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
    ![](https://img2020.cnblogs.com/blog/1900950/202007/1900950-20200710014429504-750530626.png)
    
    - 3,参数:short,char  表达式类型:int
    ![](https://img2020.cnblogs.com/blog/1900950/202007/1900950-20200710014735763-1827387039.png)
    
    - 4,参数:int,float  表达式类型:float (如果字节数相同,会提升到浮点数)
    ![](https://img2020.cnblogs.com/blog/1900950/202007/1900950-20200710014805770-916117378.png)
    
    
    - 5,参数:int,long   表达式类型:long
    ![](https://img2020.cnblogs.com/blog/1900950/202007/1900950-20200710014944472-1952654095.png)
    
    
    - 6,参数:long,double  表达式类型:double (如果字节数相同,会提升到浮点数)
    ![](https://img2020.cnblogs.com/blog/1900950/202007/1900950-20200710015004272-720659868.png)
    
    - 7,同上的包装类,包装类在运算时自动拆箱,和基本数据类型结果无异
    ![](https://img2020.cnblogs.com/blog/1900950/202007/1900950-20200710015130391-625091652.png)
    
    - 8,更具体一点
    ```
    int number = 1000;
    System.out.println(number<0?10.0:9);
    ```
    console:
    ![](https://img2020.cnblogs.com/blog/1900950/202007/1900950-20200710020252217-1846785275.png)
    

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


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








java使用三元运算符和if-else获取两个和三个数中的最大值(代码片段)

三元运算符格式三元运算符:获取两个数中最大值三元运算符:获取三个数中最大值三元运算符:总代码 //案例1:获取两个数中最大的数 intnum1=78; intnum2=56; intmax1=(num1>num2)?num1:num2; System.out.println("max1="+m... 查看详情

条件语句和三目运算符的区别

...是用条件语句。后来都不用条件判断了,而直接改用三目运算符了。 下面先看一段案例。 #第一种情况如下条件判断$stime=microtime(true);for($i=0;$i<=1000000;$i++) if(1>2) $a=1; else $A=2; $etime=microtime(true);echo‘time:‘ 查看详情

else的特殊用法和三目运算

1,eval()获取原始数据类型例1:str="10"a=eval(str)print(a,type(a)) a得到的结果是整型10,不是字符串10例2:str1="1+3"a=eval(str("str1"))print(a,type(a)) a得到的是1+3的值,而不是1+3这个字符串2,三目运算例如:函数1if条件else函数2if条件... 查看详情

布尔类型和三目运算符

介绍C语言中没有具体的bool类型,在C中使用int型的0和1来代表true和false,但是在C++中对C的布尔类型有了一个增强,增加了一种bool类型,其值为true和false,并且理论上在内存中只占用一个字节,但是C++的编译器在编译到true和false的... 查看详情

if-else代码优化的八种方案(代码片段)

...if(!condition)return;//doSomething优化方案二:使用条件三目运算符使用条件三目运算符可以简化某些if-else,使代码更加简洁,更具有可读性。优化前:intprice;if(condition)price=80;elseprice=100;优化后:intprice=condition?80:100;优化方案三:使用... 查看详情

python和java中的三目运算符(代码片段)

...a;作者:神的孩子在歌唱大家好,我叫智Python三元运算符用于根据条件选择两个值之一。它是if-else语句的一个缩影,它将两个值之一分配给一个变量。Python三元运算符的语法是:[statement_1]if[expression]else[statement_2]... 查看详情

python和java中的三目运算符(代码片段)

...a;作者:神的孩子在歌唱大家好,我叫智Python三元运算符用于根据条件选择两个值之一。它是if-else语句的一个缩影,它将两个值之一分配给一个变量。Python三元运算符的语法是:[statement_1]if[expression]else[statement_2]... 查看详情

javase7基础用if-else解释三目运算符

jdk版本 :jdk-7u72-windows-i586系统    :Windows7编辑器  :Notepad++v7.4.2注意事项:博文内容仅供参考,不可用于其他用途。  代码classDemo{ publicstaticvoidmain(String[]args){ intresult=0; in 查看详情

三元(三目)运算符

三元运算符,它和if-else语句类似,语法如下:判断条件?表达式1:表达式2例如求两个数x、y中的较大者,如果用if…else语句来实现,具体代码如下:intx=0;inty=1;intmax;if(x>y){  max=x;}else{  max=y;}上面的代码运行之后,... 查看详情

1.联系-----条件结构与三目运算符的关系

...我们知道条件结构有三种,但是很少知道条件结构和三目运算符之间的联系第一个问题:知道了又能怎么样呢?  第一:简化代码,代码结构清晰,易懂  第二:优化性能,对代码进行重构,使得程序的运行效率大大提高条... 查看详情

流程控制(代码片段)

一、条件判断和三目运算条件判断if条件表达式:如果条件为真则执行本块代码elif条件表达式:如果上一个条件为假则触发当前判断如果当前条件为真则执行本代码else:如果之前所有条件为假则执行本代码块三目运算的格式:返回... 查看详情

第18课三目运算符和逗号表达式(代码片段)

三目运算符: 在C语言中,三目运算符不能当左值使用。因为三目运算符最终返回的是一个值并不是一个变量。三目运算符作为左值时,相当于2=3,这种赋值,编译器当然会报错。既然三目元算符返回的是一个值,那么有没有... 查看详情

python和java中的三目运算符(代码片段)

...a;作者:神的孩子在歌唱大家好,我叫智Python三元运算符用于根据条件选择两个值之一。它是if-else语句的一个缩影,它将两个值之一分配给一个变量。Python三元运算符的语法是:[statement_1]if[expression]else[statement_2]... 查看详情

if-else代码优化,优雅点好不(代码片段)

...0;return(_income/_duration)*ADJ_FACTOR;优化方案三:使用条件三目运算符优化前intprice;if(condition)price=80;els 查看详情

java三目运算符?:简单使用(代码片段)

Java提供了一个特别的三元运算符(也叫三目运算符)经常用于取代某个类型的if-then-else语句,结构如下。if(a<b)min=a;elsemin=b;条件运算符的符号表示为“?:”,使用该运算符时需要有三个操作数,因此称其为... 查看详情

三目(元)运算符的前台应用,妙用!!!(代码片段)

简单描述:今天看老大提交的代码了,看到页面的时候,有一个地方使我眼前一亮,琢磨了一小下下,觉得真的是很巧妙了,老大NB,老大带我开飞机,^_^,废话不多说了,直接上代码:代码:<trth:each="xxx:$list"><tdth:text="$x... 查看详情

三目运算符(代码片段)

一、三目运算符的基本语法  不同语言的三目运算符的基本语法存在差异,以C语言和Python语言为例。  1、通常一般语言如C语言的语言格式如下:判断条件(返回布尔值)?为真时的结果:为假时的结果  实例:#include<stdio.... 查看详情

三目运算符(代码片段)

三目运算符:    三目语法格式:条件?代码1:代码21classOperator012publicstaticvoidmain(String[]args)3/*4练习:判断10大于205三目语法格式:条件?代码1:代码26*/7/*Strings=10>20?"大于":"不大于";8System.out.println("s="+s);*/9//练习1:判断一个... 查看详情