这里我们穿插讲一下C++里面的三元运算符。三元运算符其实很简单,就是?与:两个符号的结合,本质上只是一个if else语法的语法糖。这个符号可以让我们根据一个条件来赋值。
我们举一个简单的例子来体现一下三元运算符的用法:
int s_speed = 1;
int s_level = 2;
if (s_level > 5)
s_speed = 10;
else
s_speed = 5;
我们在这里用了if else语句来给s_speed变量赋值,根据s_level的高低,s_speed会有不同的值。看起来是一个非常简单的逻辑。那么如果我们用三元运算符应该怎么改写?
s_speed = s_level > 5 ? 10 : 5;
可以看到,我们把一个四行才能描述清楚的代码改写成了只需要一行就可以表示。这个逻辑也很清楚,?前面是一个判断,判断s_level和5之间的大小关系,如果是true的话,取:前面的值;如果是false的话,取:后面的值。这样的话我们就用一行表示了一整个if else。
对于可读性这个角度,这个写法其实是见仁见智的,因为如果习惯了这种写法,有可能就会觉得这样无所谓。但是对于不习惯的,可能会觉得破坏了可读性。
对于性能上来讲,如果是使用string类型的话,采用三元运算符通常会比if else更快一些。如下所示,如果我们根据条件来判断一个string类型的变量应该赋予什么值:
std::string name;
if (s_level > 5)
name = "Cherno";
else
name = "Unknown";
我们可以看到,我们需要先创建一个空字符串,然后再覆盖掉它。
但是如果我们使用三元运算符,我们会得到这样的代码:
std::string name = s_level > 5 ? "Cherno" : "Unknown";
可以省去一个建立空字符串再覆盖的过程,会速度更快。而且三元运算符返回值有一个优化的算法,所以也会更快一些。
当然,三元运算符还可以扩展,可以从只有一个判断条件扩展到多个判断条件,而且也会有对应的多个结果:
s_speed = s_level > 5 ? s_level > 10 ? 15 : 10 : 5;
这样的话多个问号放在一起,如果我们两个条件都满足,会执行第一个结果;如果第一个满足第二个不满足,会执行第二个结果;如果两个都不满足,会执行第三个结果。
甚至我们一个判断条件里面还可以有好几个条件,我们可以用与或这种运算符号链接起来:
s_speed = s_level > 5 && s_level < 100 ? s_level > 10 ? 15 : 10 : 5;
但是这样写太疯狂了!所以我们通常不会这么写。