三目运算符,听起来仿佛挺高大上,其实上并没有。只不过是一个压代码的好东西罢了
三目运算符的表达形式一般为表达式A?表达式B:表达式C
,它所表达的意思就是if (表达式A) 表达式B; else 表达式C
。
上面的两个式子其实是一个意思,当然,三目运算符还有更广泛的应用。
比如说下面这个并查集的路径压缩板子:
void GetRoot(int x) {
if (f[x] == x) return x;
else f[x] = GetRoot(x);
return f[x];
}
非常经典,ifelse结构明显可以使用三目运算符压缩代码。为了让代码更短,我们先对源代码修改一下
void GetRoot(int x) {
if (f[x] == x) return x;
else return f[x] = GetRoot(x);
}
上面的代码把后两句压到了一起,现在就可以很显然地使用它来压缩代码了。
void GetRoot(int x) {
return f[x] == x ? x : f[x] = GetRoot(x);
}
怎么样?是不是很简洁?,充分体现了并查集的简洁性,比较可惜的是它使用了递归,所以无法用#define
把它压缩成一行了。
另外再举个相似的例子,就是 ,普通的 应该很好写:
int max(int x, int y) {
if (x > y)
return x;
else return y;
}
这个就很显然了吧。缩的版本的 如下:
void max(int x, int y) {
return x > y ? x : y;
}
或者更短(这是我最常用的版本)
#define max(x, y) ((x) > (y) ? (x) : (y))
三目运算符经常嵌套在一个什么东西里面(反正我经常这么玩)。
比如说求个最短路径,最后问你s到t有没有路径,如果有,输出最短路径,如果没有输出-1.
朴素的算法很好像,开始给 赋值成 ,跑一遍单源最短路径算法。在结尾上加上这几句即可:
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]);
这就是所谓嵌套,理解起来也不难。
总而言之,三目运算符是一个相当好用的东西,反正我在写平衡树时使用了无数三目运算符,而且写三目运算符一点都不繁琐,而且相当易懂。总之压代码非常方便就对了