C和C 中三目表示式的運算

2021-06-29 02:37:04 字數 983 閱讀 2583

在c++primer plus 第六版162頁中有乙個三目表示式的問題

const

char x[2]=;

const

char*y="quillstone";

for(int i=0;i<3;i++)

這個令人費解的表示式列印了3個字串如下:

jason qillstone at your service

但是書中對於這個複雜的三目表示式並沒有給出明確的解釋。

在c語言標準中規定:條件表示式(三目運算子)的結合性是右結合,即自右向左結合。

舉乙個簡單的例子:

int i = -2;

int n = ++i == 0 ? 99 : i == -1 ? 11 : 22;

問題是:n的值是多少?

這個表示式等價於

int n = (++i == 0 ? 99 : i == -1) ? 11 : 22;

執行結果是 n = 11。

在多數情況下,c語言對表示式中各子表示式的求值次序並沒有嚴格規定;其次,即使是求值次序確定的場合,也是要先確定了表示式的語義結構,在獲得確定的語義之後才談得上「求值次序」。

把第乙個例子拆分來看:

((i<2)?這裡的問號?編譯器通過向右結合開始尋找相匹配的:號。

((i<2)?!i?這裡是第二個?也是最後乙個?向右結合遇到的第乙個:號開始與其匹配。第乙個問號也與第二個:相匹配。(這裡應用到了堆疊的相關知識)

即((i<2)?!i?x[i]:y:x[1])的執行順序為

((i<2)?(!i?x[i]:y):x[1])

c語言規定:條件表示式首先對條件部分求值,若條件部分為真,則對問號之後冒號之前的部分求值,並將求得的結果作為整個表示式的結果值,否則對冒號之後的部分求值並作為結果值。

總結起來,如果優先順序相同的時候再考慮結核性。

參考文章:【說說c語言運算子的「優先順序」與「結合性」】

三目表示式

對於有些選擇分支結構,可以使用簡單的條件運算子來代替.如 if a可以用下面的條件運算子來處理 min a?a b 其中 a 是乙個 條件表示式 它是這樣執行的 如果a 條件運算子由兩個符號組成 和 要求有3個操作物件,所以也叫它三目運算子,它是c語言中唯一的三目運算子.它的一般形式為 表示式1?表...

C 運算子和表示式

歡迎購買我的專欄 1.高階c 學習 2.網路 c 提供了許多運算子。其中許多都受到內建型別的支援,可用於對這些型別的值執行基本操作。c 中有算術運算子 比較運算子 布林邏輯運算子 位運算子和移位運算子 相等運算子 在下面的 中,表示式的示例位於賦值的右側 int a,b,c a 7 b a c b ...

三目運算的優先順序( 表示式)

今天寫乙個ios的外掛程式,高度總是出問題,檢查語句感覺沒有什麼問題。cgfloat height adaptation4ios iphonescreencontent height systemutils isios7 20 0 realsearchbar.frame.size.height 但是...