三目運算子,聽起來彷彿挺高大上,其實上並沒有。只不過是乙個壓**的好東西罷了
三目運算子的表達形式一般為表示式a?表示式b:表示式c
,它所表達的意思就是if (表示式a) 表示式b; else 表示式c
。
上面的兩個式子其實是乙個意思,當然,三目運算子還有更廣泛的應用。
比如說下面這個並查集的路徑壓縮板子:
void getroot(int x)
非常經典,ifelse結構明顯可以使用三目運算子壓縮**。為了讓**更短,我們先對源**修改一下
void getroot(int x)
上面的**把後兩句壓到了一起,現在就可以很顯然地使用它來壓縮**了。
void getroot(int x)
怎麼樣?是不是很簡潔?,充分體現了並查集的簡潔性,比較可惜的是它使用了遞迴,所以無法用#define
把它壓縮成一行了。
另外再舉個相似的例子,就是ma
x() max
()
,普通的ma
x() max
()
應該很好寫:
int
max(int x, int y)
這個就很顯然了吧。縮的版本的ma
x() max
()
如下:
void
max(int x, int y)
或者更短(這是我最常用的版本)
#define max(x, y) ((x) > (y) ? (x) : (y))
三目運算子經常巢狀在乙個什麼東西裡面(反正我經常這麼玩)。
比如說求個最短路徑,最後問你s到t有沒有路徑,如果有,輸出最短路徑,如果沒有輸出-1.
樸素的演算法很好像,開始給di
std is
t[
]賦值成
∞ ∞
,跑一遍單源最短路徑演算法。在結尾上加上這幾句即可:
if (dist[t] == infty) printf("-1");
else
printf("%d\n", dist[t]);
典型的ifelse結構,用三目運算子縮寫如下:
dist[t] == infty ? printf("-1") : printf("%d\n", dist[t]);
看到這可能有些人會問為什麼三目運算子可以單獨存在,其實仔細想想這才是最正常的。
上面的東西還可以再縮一下:
printf("%d\n", dist[t] == infty ? -1 : dist[t]);
這就是所謂巢狀,理解起來也不難。
總而言之,三目運算子是乙個相當好用的東西,反正我在寫平衡樹時使用了無數三目運算子,而且寫三目運算子一點都不繁瑣,而且相當易懂。總之壓**非常方便就對了
三目運算子
1 概念 根據不同的條件,執行不同的操作 返回不同的值。條件1?值1 或操作1 如果滿足條件 1,就返回值 1或執行操作1 條件2?值2 或操作2 否則,如果滿足條件 2,就返回值 2或執行操作2 總結 表示式 閏年 平年 多種條件 條件 1?值1 條件2?值 值3例子 1 輸入星期四 就輸出 班級...
三目運算子
單目運算子 3 雙目運算子 3 4 三目運算子 格式 表達關係式 表示式1 表示式2 如果條件為true,運算後的結果是表示式1 如果條件為false,運算後的結果是表示式2 比較表示式 結果是乙個boolean型別 執行流程 根據比較表示式的計算返回乙個true或者false。如果是true,就把...
三目運算子
1.用控制台輸入3個整數,必須使用三目運算子使其顯示出最大值。int a,b,c console.writeline 請輸入第1個數 a int.parse console.readline console.writeline 請輸入第2個數 b int.parse console.readline...