条件运算符
这里的条件运算符是指C系列语言(C/C++, Java, C# ... )中的三目运算符 ? : ,其语法形式如下:
<表达式1> ? <表达式2> : <表达式3>
表达式1 为布尔表达式,若其值为真则返回表达式2,若其值为假则返回表达式3。
条件运算符在大多数语言中为右结合,但在PHP中为左结合。在嵌套使用时需注意。
条件运算符的常规用例
条件运算符通常用于以下两种情形:
- 初始化(initialization)
// C++
const std::string s = b ? "foo" : "bar";
// Java
final String s = b ? "foo" : "bar";
// Swift
let s: String = b ? "foo" : "bar";
- 情况选择(case selectors)
// 根据头字母选择交通工具
vehicle = arg == 'B' ? bus :
arg == 'A' ? airplane :
arg == 'T' ? train :
arg == 'C' ? car :
arg == 'H' ? horse :
feet;
// 判断是否为闰年
isLeapYear =
yyyy % 400 == 0 ? 1 :
yyyy % 100 == 0 ? 0 :
yyyy % 4 == 0 ? 1 : 0;
条件运算符与 if 语句
条件运算符通常用于替代 if 语句来进行有条件的计算和赋值。
条件运算符和 if 语句两者的区别在于前者是表达式而后者是语句。
条件运算符是表达式,有声明式编程的特点,功能简单纯粹:
- 条件运算符通常用于计算,较少用于产生副作用。
- 使用条件运算符必须同时提供条件为真时的值和条件为假时的值。
- 使用条件运算符可以直接返回值,也可将运算结果赋给一个变量。
- 使用条件运算符进行赋值时变量的声明和赋值可以同时进行。
用于赋值的变量可声明为只读类型。
代码相对简洁(只需1行代码),不过有无法加断点调试的缺点。 - 条件运算符本质上属于缩写,?相当于后置的 if, 而 :则相当于 else。
由于使用符号来指代语义,相对于同等功能的 if 语句来说条件运算符的可读性略低。
if 语句是语句,有命令式编程的特点,功能不纯粹:
- if 语句可以用于计算,也可用于产生副作用。
- if 语句用于计算时无法强制约定同时计算条件为真时的值和条件为假时的值。
- if 语句无法直接返回值,即便不需要赋值,也只能先将运算结果存放在一个临时变量中。
- 使用 if 语句进行赋值时变量的声明和赋值无法同时进行,必须先声明变量然后在 if 语句中赋值。
用于赋值的变量无法声明为只读类型。(把 if 语句的处理放在函数中也可以做到,不过代价太高昂)
代码相对冗长(需要5行至9行代码),不过有可以加断点调试的优点。 - if 语句使用关键字 if 以及 else 来指代语义,其可读性要好于条件运算符。
使用条件运算符代替 if 语句的理由
技术性理由
- 进行赋值时变量的声明和赋值可以同时进行。
- 减少临时变量的使用。
- 消除冗余代码。
- 减少不必要的缩进以及代码块。
非技术性理由
- 酷(cool):使用条件运算符的代码更酷。
- 聪明(clever):使用条件运算符的程序员显得更聪明。