C語言高階剖析 18 三目運算子和逗號表示式

2021-09-29 11:17:30 字數 1987 閱讀 5556

三目運算子 (a ? b : c) 可以作為邏輯運算的載體

規則:當 a 的值為真時,返回 b 的值,否則返回 c 的值

下面看一下例子,初識三目運算子?

例子:三目運算子初探

編譯器報錯,不能操作左值,其實編譯器返回變數的值,不會返回變數本身。

(a < b ? a : b) = 3 ==> 1 = 3,這是不合法的

// 18-1.c

#include

intmain()

c = a < b ? a : b;

相當於:

if(a < b) c = a;

else c = b;

三目運算子(a ? b : c)的返回型別:

下面看乙個例子,檢視三目運算子的返回型別

// 18-2.c

#include

intmain()

我們先來分析一下:

1、變數 c 和 s 的較高型別是 int,所以 c ? c : s 返回型別為 int,大小為 4位元組。

2、變數 i 為 int 型別,i 4位元組;變數 d 為 double,8位元組空間,i ? i : d 返回型別為 double,大小為 8 位元組

3、p 為 char 型別的指標,不能 double 型別轉換到同一型別,編輯將報錯。

真的是這樣嗎?我們編譯一下:

編譯器提示,d 和 p 型別不匹配,和我們分析的一樣。注釋第 11 行,再次編譯:

結果和我們分析的完全一致。

下面看乙個逗號表示式的示例:

最後我們來做乙個題:一行**實現 strlen

// 18-4.c

#include

#include

intmystrlen

(const

char

* s)

intmain()

利用逗號表示式將 assert(s) 和 (*s ? mystrlen(s+1)+1 : 0) 連線起來,成為乙個表示式,為什麼需要 assert(s) 呢,因為如果 s 為空,對 s 解引用會出錯。

1、三目運算子返回變數的值,而不是變數本身

2、三目運算子通過隱式型別轉換規則確定返回值型別

3、逗號表示式按照從左向右的順序計算每個子表示式的值,其值等於最後乙個子表示式的值

C語言 條件運算子 三目運算子

1 if a b else max a b a b 無論a b是否滿足,都向同乙個變數賦值 條件運算子優先於賦值運算子,所以先求解條件表示式,再將它的值賦值給max 2 a b printf d n a printf d n b 注意此處表示式後面沒有 a b a 100 b 200 表示式2和表示...

C語言 三目運算子(條件運算子)

今天在看c語言的時候看到了下面的 廢話少說,直接上 include intmain inta,b,c intmax 執行結果如下 please enter three integer numbers 34 67 12max is 67 這個例子很簡單,其中運用了三目運算子 m a b?a b 如果在...

C語言 三目運算子(條件運算子)

今天在看c語言的時候看到了下面的 廢話少說,直接上 include int main inta,b,c intmax 執行結果如下 please enter three integer numbers 34 6712 max is67 這個例子很簡單,其中運用了三目運算子 m a b?a b 如果在...