條件運算子?:
在許多程式語言中,條件運算子(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)