条件运算符

维基百科,自由的百科全书
跳转至: 导航搜索

在许多程序设计语言中, 条件运算符(conditional operator, ?:)是一个基本的条件语句. 条件运算符最初起源于BCPL程序设计语言.

用法[编辑]

?: 的一般形式为

<表达式1> ? <表达式2> : <表达式3> 

其中表达式1为布尔表达式, 或真或为假. 若表达式1为真, 则返回表达式2的值作为整个条件表达式的值. 若条件为假, 则返回表达式3的值. 例如

max = (a > b) ? a : b ;

的执行结果就是将 a 和 b 中最大值赋给 max.

Actionscript 3[编辑]

condition ? value_if_true : value_if_false

C 语言变种[编辑]

GNU 允许C 语言省略条件表达式中的表达式2省略, 此时表示表达式2与表达式1相同.例如

a = x ? : y;

等价于

a = x ? x : y;

但是如果 x 是一个表达式, 仅求值一次. C#提供了类似的特性

a = x ?? y;

与"x?:y"的用法不同, ??只判断 x 是否为null, 而不是判断真假.

C++[编辑]

在C++中, 由于C++明确区分初始化赋值,有时使用if-else的条件赋值语句并不可行. 在这种情形下总是可能使用函数调用, 但是这样做会显得很笨重而且不简洁. 例如, 如果你想要根据条件传递不同的值作为构造函数的参数, 单纯使用if-else语句根本不可能; 在这种情况下, 可以使用条件赋值表达式, 或函数调用. 注意有些类型允许初始化, 但不允许赋值, 或者赋值运算与构造函数不全相同. 对于引用类型后者为真, 例如:

#include <iostream>
#include <fstream>
#include <string>
 
using namespace std;
 
int main(int argc, char** argv)
{
    string name;
    ofstream fout;
    if (argc > 1 && argv[1])
    {
        name = argv[1];
        fout.open(name.c_str(), ios::out | ios::app);
    }
 
    ostream& sout = name.empty() ? cout : fout;
}

在这种情况下, 用if-else语句替换条件运算符( ? :)变得不可能. (虽然可以用包含 if-else 语句的 函数调用替换?: ).

进一步, 三目运算符能够作为一个可以被赋值的左值. 例如

0: #include <iostream>
1: int main () {
2:    int a=0, b=0;
3:
4:    const bool cond = ...;
5:    (cond ? a : b) = 1;
6:    std::cout << "a=" << a << ','
7:              << "b=" << b << '\n';
8:}

在此例中, 如果第5行的布尔变量 cond 为真, 值1会赋给变量a, 否则赋值给b.

Python[编辑]

Python 程序设计语言使用一种不同的语法处理条件表达式:

value_when_true if condition else value_when_false

这一特性在Python 2.5 以前的版本并不可用.

Common Lisp[编辑]

Common Lisp 中利用条件表达式赋值:

(setf result (if (> a b) x y))

等价于:

(if (> a b)
  (setf result x)
  (setf result y))