跳至內容

條件運算子?:

本頁使用了標題或全文手工轉換
維基百科,自由的百科全書

在許多程式設計語言中,條件運算子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++明確區分初始化賦值,有時使用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程式設計語言使用一種不同的語法處理條件表達式:

value_when_true if condition else value_when_false

這一特性在Python 2.5以前的版本並不可用。

Common Lisp的每個表達式都有返回值:

(if (> a b) x y)