三目运算符 订阅
三目运算符,又称条件运算符,是计算机语言(c,c++,java等)的重要组成部分。它是唯一有3个操作数的运算符,有时又称为三元运算符。一般来说,三目运算符的结合性是右结合的。 展开全文
三目运算符,又称条件运算符,是计算机语言(c,c++,java等)的重要组成部分。它是唯一有3个操作数的运算符,有时又称为三元运算符。一般来说,三目运算符的结合性是右结合的。
信息
属    于
计算机语言
分    类
C语言,php,JAVA,javascript,C#
中文名
三目运算符
运算符数量
3
三目运算符定义
对于条件表达式b ? x : y,先计算条件b,然后进行判断。如果b的值为true,计算x的值,运算结果为x的值;否则,计算y的值,运算结果为y的值。一个条件表达式绝不会既计算x,又计算y。条件运算符是右结合的,也就是说,从右向左分组计算。例如,a ? b : c ? d : e将按a ? b : (c ? d : e)执行。 [1]  ? : ; "?"运算符的含义是:先求表达式1的值,如果为真,则执行表达式2,并返回表达式2的结果;如果表达式1的值为假,则执行表达式3,并返回表达式3的结果。可以理解为条件 ? 结果1 : 结果2 里面的?号是格式要求。也可以理解为条件是否成立,条件成立为结果1,否则为结果2。注意:在C语言中,结果1 和 结果2的类型必须一致。a ? b : c简单理解方式为:
收起全文
精华内容
下载资源
问答
  • 三目运算符
    2022-08-03 17:13:55

    三目运算符:

    格式

    (关系表达式)?表达式1:表达式2; 如果条件为true,运算后的结果是表达式1; 如果条件为false,运算后的结果是表达式2;

    执行流程:

    • 首先判断关系表达式中的结果,
    • 如果说判断关系表达式的结果为true,执行冒号前面的表达式1
    • 如果说判断关系表达式的结果为false,执行冒号后面的表达式2

    注意事项:

    • 关系表达式的小括号不能省略
    • 如果后面的表达式只是一个值或者一个变量,小括号可以省略
    • 如果后面的表达式需要进行一些运算,小括号不能省略 。(关系表达式)?(表达式1):(表达式2);

    程序示例

    public class OptSanMuDemo {
    public static void main(String[] args) {
    boolean b = (1>3)?(true):(false);
    System.out.println(b);                // 1<3,所以表达式1>3false,输出后面的false。
    
    int x = 10;
    int i = (x++ == 11)?(x++):x;
    System.out.println(i);               // 10!=11 所以false ,输出x=10
    System.out.println(x);             //输出x=11(自增1)
    
    int x1 = 13;
    
    //三目运算表达式的结果数据类型由表达式中最高的数据类型接收
    double i2 = (x1++ == 12)?x1:((x1*1.0)/2);
    System.out.println(i2);
    System.out.println(x1);
    }
    }

    例题

    需求1:获取两个数中较大的数据

    需求2:获取三个数中较大的数

    需求3:比较两个整数是否相同

    public class OptTest1 {
    public static void main(String[] args) {
    int a = 10;
    int b = 20;
    int c = 40;
    
    //三目运算符 需求1
    int result = (a > b) ? a : b;
    System.out.println(result);
    
    //三目运算符 需求2
    int max = (result > c) ? result : c;
    System.out.println("三个数中最大值为:" + max);
    
    int x = 11;
    int y = 12;
    //三目运算符 需求3
    boolean res2 = (x == y) ? true : false;
    System.out.println("x与y进行比较:" + res2);
    
    
    }
    }

    思考题:

    以下结果是如何产生的?

    //自增与三目运算符
    public class SanMuTest {
        public static void main(String[] args) {
            int x = 10 ;
            int y = 10 ;
            int z = 10 ;
            int i = (x++ == 10) ? y++ : z;
            System.out.println(x);  //11
            System.out.println(y);  //11
            System.out.println(z);  //10
            System.out.println(i);  //10
        }
    }
    /*
    执行流程:
    首先将x的值与10进行比较,结果为true,然后 x++ ➡ x=11
    又因为三目运算符的表达式结果为true的时候执行 :左边的表达式1。
    所以 int i = (x++ == 10) ? y++ : z ; ➡➡ int i = y++ ;
    自增在后,先赋值后自增。所以 i=10 ,y=11 ;z没有变化。
    */
    更多相关内容
  • 随后代码写完了,准备优化一下代码,将此段改成了三目运算符的写法   代码如下: n = n >= (count-1) ? n=0 : n++ 结果完全不同 随后研究了一下这两者的区别,总结为一句话:三目运算有返回值,if else没有返回值...
  • 今天小编就为大家分享一篇关于Java利用三目运算符比较三个数字的大小,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
  • 今天小编就为大家分享一篇在vue中v-bind使用三目运算符绑定class的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • C/C++系列语言中,if-else语句是最主要的条件分支语句,本文主要谈了结合短路法和逗号表达式,代替if和三目运算符
  • 大家都知道在oc中可以使用三目运算符来进行条件的判断,这相对于if else 来说更加的简洁,下面这篇文章主要给大家介绍了关于iOS中奇妙的三目运算符的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考...
  • java代码-加深三目运算符练习。
  • c++三目运算符

    2019-04-18 15:58:35
    c++三目运算符?: 语句的使用,介绍了对分数分级方式使用时的简便之处,可以节约代码书写量
  • 对于三目运算符(ternary operator),python可以用conditional expressions来替代 如对于x<5>>>def switch(choice): return dict(enumerate(range(4)))[choice]
  • 三目运算符

    2022-02-17 10:26:38
    4️⃣当基本数据类型和对象数据类型相遇时,三目运算符默认返回结果为基本数据类型。 public static void main(String[] args) { int a = 1, b = 2; // 触发隐式类型转换,int 类型 9 转为 9.0D System.out.println...
     public static void main(String[] args) {
            int a = 1, b = 2;
            System.out.println(a == b ? 9.9 : 9);
            System.out.println(a == b ? 'a' : 98);
            System.out.println(a == b ? 'a' : Integer.MAX_VALUE);
            System.out.println(a == b ? 'a' : b);
            System.out.println(a != b ? 'a' : b);
    
            Map<String, Long> map = new HashMap<>();
            map.put("b", 1L);
            System.out.println(map == null ? -1L : map.get("a"));
    }
    

    结果如下:

    9.0
    b
    2147483647
    2
    97
    Exception in thread "main" java.lang.NullPointerException
    	at com.xxp.aopDemo.uuu.Test.main(Test.java:18)
    Process finished with exit code 1
    

    说明:
    在使用三目运算符时,尽量保证两个返回值的类型一致,不然会触发类型转换,转换规则如下:
    1️⃣如果返回值 X 和返回值 Y 是同种类型,那么返回类型毫无疑问就是该类型。
    2️⃣如果两个返回值 X 和 Y 的类型不同,那么返回值类型为它们俩最接近的父类。

    // String 和 Boolean 都实现了 Serializable 接口
     Serializable serializable = a == b ? "true" : Boolean.FALSE;
     // 所有类都继承了 Object 类
     Object o = a == b ? new ArrayList<>() : new TernaryOperatorDemo();
    

    3️⃣对于基本数据类型,其中一个返回值 X 类型为 byte、short 或者 char,另一个返回值 Y 类型为 int。如果在编译期就能判断出 Y 的取值范围在 X 的取值范围之内,则返回类型为 X 的类型,反之则为 Y 的类型。如果返回值 X 类型不为以上几种,则会触发隐式类型转换
    4️⃣当基本数据类型和对象数据类型相遇时,三目运算符默认返回结果为基本数据类型。

    public static void main(String[] args) {
        int a = 1, b = 2;
        // 触发隐式类型转换,int 类型 9 转为 9.0D
        System.out.println(a == b ? 9.9 : 9);
        // 编译期判断,98 在 char 之内,转为 b
        System.out.println(a == b ? 'a' : 98);
        // 编译期判断,超出char范围,统一转 int
        System.out.println(a == b ? 'a' : Integer.MAX_VALUE);
        // 编译期时无法判断 b 的取值,触发隐式类型转换,统一转 int
        System.out.println(a == b ? 'a' : b);
        System.out.println(a != b ? 'a' : b);
    
        Map<String, Long> map = new HashMap<>();
        map.put("b", 1L);
        // 基本数据类型和对象数据类型相遇时,默认转为基本数据类型
        // map.get("a") 返回 null,转为基本数据类型时,报空指针异常
        System.out.println(map == null ? -1L : map.get("a"));
    }
    
    展开全文
  • C语言中的三目运算符

    2018-06-04 15:17:58
    三目运算符的实例 。
  • Java三目运算符中的坑

    2021-03-05 15:41:16
    使用三目运算符重构业务代码,测试的时候发生了 NPE 的问题。重构代码非常简单,代码如下:// 方法返回参数类型为 Integer// private Integer code;SimpleObj simpleObj = new SimpleObj();// 其他业务逻辑if ...

    使用三目运算符重构业务代码,测试的时候发生了 NPE 的问题。

    重构代码非常简单,代码如下:

    // 方法返回参数类型为 Integer

    // private Integer code;

    SimpleObj simpleObj = new SimpleObj();

    // 其他业务逻辑

    if (simpleObj == null) {

    return -1;

    } else {

    return simpleObj.getCode();

    }

    这段 if 判断使用三目运算符重构了一把,代码如下:

    // 方法返回参数类型为 Integer

    SimpleObj simpleObj = new SimpleObj();

    // 其他业务逻辑

    return simpleObj == null ? -1 : simpleObj.getCode();

    测试的时候,第四行代码抛出了空指针,这里代码很简单,显然只有 simpleObj#getCode才有可能发生 NPE 问题。

    但是我明明为 simpleObj做过判空判断,simpleObj 对象肯定不是 null,那么只有 simpleObj#getCode 返回为 null。但是我的代码并没有对这个方法返回值做任何操作,为何会触发 NPE?

    难道是又是自动拆箱导致的 NPE 问题?

    在解答这个问题之前,我们首先复习一下三目运算符。

    三目运算符

    三目运算符,官方英文名称:Conditional Operator ? :,中文直译条件表达式,本文不纠结名称,统一使用三目运算符。

    三目运算符的基本用法非常简单,它由三个操作数的运算符构成,形式为:

    ?:`

    三目运算符的计算从左往右计算,首先需要计算计算表达式 1 ,其结果类型必须为 Boolean 或 boolean,否则发生编译错误。

    当表达式 1 的结果为 true,将会执行表达式 2,否则将会执行表达式 3。

    表达式 2 与表达式 3 最后的类型必须得有返回结果,即不能为是 void,若为 void ,编译时将会报错。

    最后需要注意的是,表达式 2 与表达式 3 不会被同时执行,两者只有一个会被执行。

    踩坑案例

    了解完三目运算符的基本原理,我们简化一下开头例子,复现一下三目运算符使用过程的一些坑。假设我们的例子简化成如下:

    boolean flag = true; //设置成true,保证表达式 2 被执行

    int simpleInt = 66;

    Integer nullInteger = null;

    案例 1

    第一个案例我们根据如下计算 result 的值。

    int result = flag ? nullInteger : simpleInt;

    这个案例为开头的例子的简化版本,运算上述代码,将会发生 NPE 的。

    为什么会发发生 NPE 呢?

    这里可以给大家一个小技巧,当我们从代码上没办法找到答案时,我们可以试试查看一下编译之后字节码,或许是 Java 编译之后增加某些东西,从而导致问题。

    使用 javap -s -c class 查看 class 文件字节码,如下:

    0c8542fcc5b3

    可以看到字节码中加入一个拆箱操作,而这个拆箱只有可能发生在 nullInteger。

    那么为什么 Java 编译器在编译时会对表达式进行拆箱?难道所有数字类型的包装类型都会进行拆箱吗?

    三目运算符表达式发生自动拆箱,其实官方在 「The Java Language Specification(简称:JLS)」15.25 节[1]中做出一些规定,部分内容如下:

    JDK7 规范

    If the second and third operands have the same type (which may be the null type), then that is the type of the conditional expression.

    If one of the second and third operands is of primitive type T, and the type of the other is the result of applying boxing conversion (§5.1.7) to T, then the type of the conditional expression is T.

    用大白话讲,如果表达式 2 与表达式 3 类型相同,那么这个不用任何转换,三目运算符表达式结果当然与表达式 2,3 类型一致。

    当表达 2 或表达式 3 其中任一一个是基本数据类型,比如 int,而另一个表达式类型为包装类型,比如 Integer,那么三目运算符表达式结果类型将会为基本数据类型,即int。

    ps:有没有疑问?为什么不规定最后结果类型都为包装类那?

    这是 Java 语言层面一种规范,但是这个规范如果强制让程序员执行,想必平常使用三目运算符将会比较麻烦。所以面对这种情况, Java 在编译器在编译过程加入自动拆箱进制。

    所以上述代码可以等同于下述代码:

    int result = flag ? nullInteger.intValue() : simpleInt;

    如果我们一开始的代码如上所示,那么这里错误点其实就很明显了。

    案例 2

    接下来我们在第一个案例基础上修改一下:

    boolean flag = true; //设置成true,保证表达式 2 被执行

    int simpleInt = 66;

    Integer nullInteger = null;

    Integer objInteger = Integer.valueOf(88);

    int result = flag ? nullInteger : objInteger;

    运行上述代码,依然会发生 NPE 的问题。当然这次问题发生点与上一个案例不一样,但是错误原因却是一样,还是因为自动拆箱机制导致。

    这一次表达式 2 与表达式 3 都为包装类 Integer,所以三目运算符的最后结果类型也会是Integer。

    但是由于 result是 int 基本数据类型,好家伙,数据类型不一致,编译器将会对三目运算符的结果进行自动拆箱。由于结果为 null,自动拆箱将报错了。

    上述代码等同为:

    int result = (flag ? nullInteger : objInteger).intValue();

    案例 3

    我们再稍微改造一下案例 1 的例子,如下所示:

    boolean flag = true; //设置成true,保证表达式 2 被执行

    int simpleInt = 66;

    Integer nullInteger = null;

    Integer result = flag ? nullInteger : simpleInt;

    案例 3 与案例 1 右边部分完全相同,只不过左边部分的类型不一样,一个为基本数据类型int,一个为 Integer。

    按照案例 1 的分析,这个也会发生 NPE 问题,原因与案例 1 一样。

    这个之所以拿出来,其实想说下,上述三目运算符的结果为 int 类型,而左边类型为 Integer,所以这里将会发生自动装箱操作,将 int类型转化为 Integer。

    上述代码等同为:

    Integer result = Integer.valueOf(flag ? nullInteger.intValue() : simpleInt);

    案例 4

    最后一个案例,与上面案例都不一样,代码如下:

    boolean flag = true; //设置成true,保证表达式 2 被执行

    Integer nullInteger = null;

    Long objLong = Long.valueOf(88l);

    Object result = flag ? nullInteger : objLong;`

    运行上述代码,依然将会发生 NPE 的问题。

    这个案例表达式 2 与表达式 3 类型不一样,一个为 Integer,一个为 Long,但是这两个类型都是 Number的子类。

    面对上述情况,JLS 规定:

    Otherwise, binary numeric promotion (§5.6.2[2]) is applied to the operand types, and the type of the conditional expression is the promoted type of the second and third operands.

    Note that binary numeric promotion performs value set conversion (§5.1.13[3]) and may perform unboxing conversion (§5.1.8[4]).

    大白话讲,当表达式 2 与表达式 3 类型不一致,但是都为数字类型时,低范围类型将会自动转为高范围数据类型,即向上转型。这个过程将会发生自动拆箱。

    Java 中向上转型并不需要添加任何转化,但是向下转换必须强制添加类型转换。

    上述代码转化比较麻烦,我们先从字节码上来看:

    0c8542fcc5b3

    第一步,将 nullInteger拆箱。

    第二步,将上一步的值转为 long 类型,即 (long)nullInteger.intValue()。

    第三步,由于表达式 2 变成了基本数据类型,表达式 3 为包装类型,根据案例 1 讲到的规则,包装类型需要转为基本数据类型,所以表达式 3 发生了拆箱。

    第四步,由于三目运算符最后的结果类型为基本数据类型:long,但是左边类型为 Object,这里就需要把 long 类型装箱转为包装类型。

    所以最后代码等同于:

    Object result = Long.valueOf(flag ? (long)nullInteger.intValue() : objLong.longValue());

    总结

    看完上述四个案例,想必大家应该会有种感受,没想到这么简单的三目运算符,既然暗藏这么多「杀机」。

    不过大家也不用过度害怕,不使用三目运算符。只要我们在开发过程重点注意包装类型的自动拆箱问题就好了,另外也要注意三目运算符的计算结果再赋值的时候自动拆箱引发的 NPE 的问题。

    最好大家在开发过程中,都遵守一定的规范,即保持表达式 2 与表达式 3 的类型一致,不让 Java 编译器有自动拆箱的机会。

    建议大家没事经常看下阿里出品的『Java 开发手册』,在最新的「泰山版」就增加三目运算符的这一节规范。

    0c8542fcc5b3

    最后一定要做好的单元测试,不要惯性思维,觉得这么简单的一个东西,看起来根本不可能出错的。

    展开全文
  • Python三目运算符

    2022-06-09 09:09:13
    这是一种类似于Java编程语言中三目运算符? : 的写法。而python则是用 if else 关键字来实现。 则上述例子max = a if a > b else b的含义是: 如果 a > b 成立,就把 a 作为整个表达式的值,并赋给变量 max; 如果 ...

    Python三目运算符(三元运算符)

    假设现在有两个数字,我们希望获得其中较大的一个,那么可以使用 if else 语句,例如:

    if a > b:
            max = a
        else:
            max = b
    

    但是 Python 提供了一种更加简洁的写法,如下所示:

    max = a if a>b else max = b# exp1 if contion else exp2 
    
    这是一种类似于Java编程语言中三目运算符? : 的写法。而python则是用 if else 关键字来实现。

    使用 if else 实现三目运算符(条件运算符)的语法如下:

    exp1 if contion else exp2
    condition 是判断条件,exp1 和 exp2 是两个表达式。
    如果condition 成立(结果为真),就执行 exp1,结果就输出exp1;如果 condition 不成立(结果为假),就执行
    exp2,结果就输出exp2。

    则上述例子max = a if a > b else b的含义是:
    • 如果 a > b 成立,就把 a 作为整个表达式的值,并赋给变量 max;
    • 如果 a > b 不成立,就把 b 作为整个表达式的值,并赋给变量 max。

    三目运算符的嵌套

    Python 三目运算符支持嵌套形式。在嵌套时需要注意 if 和 else 的配对,例如:

     a if a > b else c if c > d else d
    # 应该理解为if else的嵌套循环
    a if a > b else ( c if c > d else d )
    

    例子:

    #使用 Python 三目运算符判断两个数字的关系
    a = int( input("Input  a: ") )
    b = int( input("Input  b: ") )
    print("a大于b") if a > b else ( print("a小于b") if a < b else print("a等于b") )
    #可能的运行结果:
    Input a: 90
    Input b: 100
    a小于b
    

    这是一个嵌套的三目运算符。
    先对 condition(a > b )判断,如果该表达式为 True,就返回第一个表达式print(“a大于b”),否则将继续执行 else 后面的内容: ( print(“a小于b”) if a < b else print(“a等于b”) ) 进入该表达式后,先判断 condition(a < b )是否成立,如果 a < b 的结果为True,将执行 print(“a小于b”),否则执行 print(“a等于b”)。

    展开全文
  • Java三目运算符

    千次阅读 2022-04-20 19:25:22
    条件分支语句就是根据条件不同,选择执行不同代码的结构,Java中共有三种声明条件分支语句的语法,分别为: if 语句 三目运算符 switch语句 案例:判断输入的数值是奇数还是偶数,if 语句非常简单: System.out....
  • 一.C 语言三目运算符简介 二.C 语言三目运算符实战 1.使用三目运算符 2.使用 if / else 条件判断 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 一.C 语言三目运算符简介 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 48,978
精华内容 19,591
关键字:

三目运算符