三元运算符的正确表示方法是(三元运算)

作为程序员,你用过三元运算没?我们见的最多的三元运算其实就是一个问号加一个冒号组成,表现为"条件表达式 ? 表达式1 : 表达式2"。也就是,当条件表达式结果为true的时候,三元运算返回表达式1计算后的值,反之为false的时候,三元运算返回表达式2计算后的值。当然了,条件表达式、表达式1、表达式2本身均可以嵌套其它多层三元运算逻辑,也可以是带有返回值的函数,等等。

有人说三元运算的效率没有直接写if语句高,很多写代码将近十年的程序员,也不知道如何正确的去验证这个说法。比如有的程序员就写个demo模拟三元运算和if语句同时执行相同判断,造一百万条数据,判断结果的时间到底谁大谁小,甚至由自己的测试时间结果,给出大多数情况下三元运算更快的结论。

其实三元运算你也可以看作像是编程语言的“语法糖”,是编程语言给与程序员的一种相对简洁的语法方式来完成本来需要若干行更长的代码才能完成的工作。因此,要验证比较三元运算和if语句的运行效率,我们需要深入具体的某个编程语言,具体分析。如果是C、C 之类编译成机器码然后执行的语言,我们可以分析三元运算和if语句的汇编结果;如果是Java类的字节码执行的语言,我们需要去深入分析java编译成字节码后的结果;如果是javascript、Python类的解释器执行的语言,我们需要去分析解释后的结果。依此类推。

下面,我们以分析C、C 语言的三元运算为目标,以gcc编译器为例,分析一下。

三元运算符的正确表示方法是(三元运算)(1)

图左边t.c源程序是用if语句,a的值是1000,如果a的值大于100则return 10,否则return20;图右边t2.c是等价的使用三元运算的源程序。

我们用

gcc -S t.c -o t.s gcc -S t2.c -o t2.s

分别用-S选项将t.c和t2.c编译成汇编语句,如下图:

三元运算符的正确表示方法是(三元运算)(2)

左右两边分别是t.s和t2.s,可以看出三元运算和if语句经过汇编后的语句是一模一样的,除了语句的标号两次编译的选择不同而已,完全不影响实际运行。

因此,有些人用一些所谓的性能测试代码草率的得出结论三元运算和if语句效率孰优孰劣的结论,是一些不准确且片面的结论,既受测试环境的影响,也局限于测试代码的不全面。本文的结论从一个小例子出发,利用编译后的汇编代码分析比较,至少证明了在gcc编译器下两者是一样的。当然,不同的编译器,不同的优化选项,甚至在不同类型的语言如Java的虚拟机字节码、Python的解释器执行等,实际效率差别还需要大家使用本文的思路亲自进行分析验证。

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页