三目运算类型取值原则(避坑)

在云笔记无意翻到这个N年前的小笔记,挺有意思的。PO一下



三目运算语法:

源于某次帮团队成员看NPE问题的梳理:

String result = 100 < a ? "可以" : null ;

or

int pos = 10;
Integer up = null;
Integer v = 100 < a ? pos : up;    《《《《 运行结果是什么?NPE哦

1、三目运算第二部分和第三部分类型一样,那么返回结果的类型也一样


2、三目运算第二部分和第三部分,其中一个是原始类型T,一个是原始类型的装箱。那么返回结果的类型是原始类型T。即对象会做自动拆箱。


3、三目运算的第二部分和第三部分,其中一个是null,另外一个是对象。那么返回结果的类型是对象的类型。

为什么?

一、三目运算符

对于条件表达式 b ? x : y,先计算条件b,然后进行判断。如果b的值为true,计算x的值,运算结果为x的值;否则,计算y的值,运算结果为y的值。
一个条件表达式从不会既计算x,又计算y。条件运算符是右结合的,也就是说,从右向左分组计算。例如,a?b:c?d:e将按a?b:(c?d:e)执行。

二、自动装箱与自动拆箱

基本数据类型的自动装箱(autoboxing)、拆箱(unboxing)是自J2SE 5.0开始提供的功能。
一般我们要创建一个类的对象实例的时候,我们会这样: Class a = new Class(parameters); 当我们创建一个Integer对象时,却可以这样: Integer i = 100;(注意:和 int i = 100;是有区别的 ) 实际上,执行上面那句代码的时候,系统为我们执行了: Integer i = Integer.valueOf(100); 这里暂且不讨论这个原理是怎么实现的(何时拆箱、何时装箱),也略过普通数据类型和对象类型的区别。
我们可以理解为,当我们自己写的代码符合装(拆)箱规范的时候,编译器就会自动帮我们拆(装)箱。那么,这种不被程序员控制的自动拆(装)箱会不会存在什么问题呢?

三、问题回顾

首先,通过你已有的经验看一下下面这段代码。如果你得到的结果和后文分析的结果一致(并且你知道原理),那么请忽略本文。


                
### 三目运算符的基础用法 三目运算符是一种简洁的条件判断语法,通常用于在两种可能的结果之间进行选择。其基本形式为 `condition ? expr1 : expr2` 或者在 Python 中表现为 `expr1 if condition else expr2`。 #### C/C++中的三目运算符 在 C/C++ 编程语言中,三目运算符的形式如下: ```c result = (condition) ? value_if_true : value_if_false; ``` 当 `condition` 的布尔值为真时,返回 `value_if_true`;否则返回 `value_if_false`[^2]。 例如,在下面的例子中,变量 `c` 被赋予较大的那个数: ```c int a = 7, b = 6; int c = (a > b) ? a : b; // 结果:c = 7 ``` #### Python中的三目运算符 Python 使用了一种稍微不同的语法来实现类似的逻辑操作: ```python result = expr1 if condition else expr2 ``` 如果 `condition` 为真,则返回 `expr1`;否则返回 `expr2`[^4]。 例如,以下代码片段展示了如何比较两个数字并获取较大值: ```python a, b = 7, 6 max_value = a if a > b else b print(max_value) # 输出:7 ``` ### 嵌套使用三目运算符 三目运算符还可以嵌套使用,从而构建更复杂的表达式。然而,这种做法可能会降低代码可读性,因此应谨慎使用。 #### C/C++中的嵌套示例 以下是 C/C++ 中的一个嵌套例子,它通过多重条件判断找到四个整数中的最大值: ```c #include<stdio.h> void main() { int a = 1, b = 2, c = 3, d = 4; printf("%d\n", ((a > b) ? a : b) > ((c > d) ? c : d) ? ((a > b) ? a : b) : ((c > d) ? c : d)); } // 输出:4 ``` 这里的关键在于理解括号的作用以及每一步的选择过程[^5]。 #### Python中的嵌套示例 同样地,在 Python 中也可以实现这样的功能,不过推荐采用分步写法以提高清晰度: ```python lst = [111, 222, 333] ret = lst[0] if lst[0] > lst[1] else lst[1] if lst[1] > lst[2] else lst[2] print(ret) # 输出:333 ``` 此段代码依次对比列表中的三个元素大小,并最终选出最大的那一个。 另外一种方式则是利用额外的小括号明确优先级关系: ```python ret5 = (lst[0] if lst[0] < lst[1] else lst[1]) if lst[1] < lst[2] else lst[2] print(ret5) # 输出取决于具体数值情况 ``` ### 特殊情形下的优化考虑 有时为了防止重复计算或者副作用影响,可以省略中间部分的操作项。比如对于宏定义参数可能存在不确定性的场景下尤为适用[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值