C語言中文網 目錄

C語言條件運算符(?:)

條件運算符(conditional operator)有時候也稱為三元運算符(ternary operator,或者trinary operator),因為它是唯一需要 3 個操作數的運算符

條件 ? 表達式1 : 表達式2


條件運算操作會首先計算條件,然后根據條件的計算結果,再決定要計算兩個表達式中的哪一個。

在計算完條件之后,有一個序列點。如果結果不等于 0(換句話說,如果條件計算結果為 true),則只有第二個操作數(也就是表達式 1)會被計算,并且表達式 1 的值就是整個表達式的結果。

另一方面,如果結果為 0(如果條件計算結果為 false),那么只有第三個操作數(也就是表達式 2)會被計算,并且表達式 2 的值就是整個表達式的結果。以這種方式,條件運算符代表了在程序流中的條件式跳轉,因此,有時候可以與 if-else 語句相互替代

下面是常見的例子,找出兩個數中的最大者:
inline int iMax(int a, int b) { return a >= b ? a : b; }

函數 iMax()可以用 if-else 語句改寫:
inline int iMax(int a, int b)
{ if ( a >= b ) return a; else return b; }

條件運算符具有相當低的優先級,只有賦值和逗號運算符的優先級比它低。因此,下面的語句不需要括號:
distance = x < y ? y - x : x - y;

條件運算符的第一個操作數是條件,必須是標量類型,也就是算術類型或指針類型。第二個和第三個操作數分別是表達式 1 和表達式 2,必須滿足下面條件之一:

(1) 兩個可選表達式都具有算術類型,在這種情況下,整個運算的最終結果類型,是后面兩個操作數進行尋常算術轉換的類型。

(2) 兩個可選操作數都有相同的結構或聯合類型,或者 void 類型。整個運算的最終結果類型也屬于與這兩個操作數一樣的類型。

(3) 兩個可選操作數都是指針,并且符合下面的一個條件:
     兩個指針屬于相同類型。整個運算的結果也屬于相同的類型。
     其中一個操作數是空指針常量。整個運算的結果屬于另一個操作數類型。
     其中一個操作數是對象指針,另一個是指向 void 指針。整個運算的結果屬于 void* 類型。

兩個指針可以指向具有不同限定符的類型。在這種情況下,整個運算的結果是一個指針,其所指的對象類型同時具備兩個可選操作數的類型限定符。例如,假設下面的指針以已定義:
const int *cintPtr;             // 聲明指針
volatile int *vintPtr;
void *voidPtr;

不管變量 flag 值是多少,下表中第一列所列舉的各表達式具有其第二列所描述的類型:
表達式 類型
flag ? cintPtr : vintPtr volatile  const  int*
flag ? cintPtr : NULL const  int*
flag ? cintPtr : voidPtr const  void*

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo