【Tools】c++的三目运算符

三目运算符,听起来仿佛挺高大上,其实上并没有。只不过是一个压代码的好东西罢了

三目运算符的表达形式一般为表达式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把它压缩成一行了。

另外再举个相似的例子,就是 m a x ( ) ,普通的 m a x ( ) 应该很好写:

int max(int x, int y) {
    if (x > y)
        return x;
    else return y;
}

这个就很显然了吧。缩的版本的 m a x ( ) 如下:

void max(int x, int y) {
    return x > y ? x : y;
}

或者更短(这是我最常用的版本)

#define max(x, y) ((x) > (y) ? (x) : (y))

三目运算符经常嵌套在一个什么东西里面(反正我经常这么玩)。

比如说求个最短路径,最后问你s到t有没有路径,如果有,输出最短路径,如果没有输出-1.

朴素的算法很好像,开始给 d i s 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]);

这就是所谓嵌套,理解起来也不难。


总而言之,三目运算符是一个相当好用的东西,反正我在写平衡树时使用了无数三目运算符,而且写三目运算符一点都不繁琐,而且相当易懂。总之压代码非常方便就对了

猜你喜欢

转载自blog.csdn.net/diogenes_/article/details/80543145
今日推荐