三目运算符:
我们写一个小程序的时候,写道cout<<X;在输出内容之后我们想要追加一个空格或者换行符,最终输出哪一个需要看condition Q是否满足,满足则输出空格否则输出换行符。那么如果正常的程序我们会怎么写呢?如果不知道三目运算符那么你们大概率会这么写:
Cout<<X;
if (Q) cout<<" ";
else cout<<"\n";
这写法固然没有错误,但是大家有没有想过,我只是想要判断一下却要写这么多内容,会不会有点冗杂呢?答案是肯定的,幸运的是三目运算符为这提供了便利。如果用三目运算符那上面那三行的内容可以简写为下面这短短的一行:
Cout<<X<< Q ? ' ':\n;
上面这一行都是什么呢,Q之前的自不必说,后面的Q是条件,如果Q为真,那么?后面的语句就会被执行,为假那么:后面的语句会被执行。
OR逻辑运算符和AND逻辑运算符中的短路求值法
OR用 || 两个竖杠表示,AND用&&表示。在我们写程序的时候经常需要判断多个条件都满足之后才执行下面的语句。比如有condition Q,E。我们要求其中有一个条件满足就执行程序,我们可以这么写:
Bool flag = false;
If ( Q ) flag = true;
If ( E ) flag = true;
If ( flag ) {
执行语句;
}
大家会发现还是上面不用三目运算符的那个问题,太冗长了,那怎么解决呢?用OR逻辑运算符。用了之后程序会变成什么样子呢?
If (Q || E){
执行语句;
}
wow,有没有感觉很神奇,这就是OR逻辑运算符所带来的便利。同样的,我们要求Q和E同时满足的时候我们才执行语句,那么不用AND逻辑运算符则需要这么写:
Bool flag = false;
If (Q != true) flag = false;
If (E != true) flag = false;
If (flag){
执行语句;
}
如果用了AND逻辑运算符,则会变成这样:
If (Q && E){
执行语句;
}
这样就简洁了很多。
标题中我们提到了短路求值法。什么是短路求值法呢?简单来说就是:如果前面的条件已经不满足了,那么后面的条件就不进行判断了。
就好比我们要看网课,条件是什么呢?首先你需要有电脑,电脑需要有电力供应,需要有网络等等,我们假设只有这三个条件,我们从前一次判断,用AND逻辑运算符将他们联结在一起。我们在判断你是否有电脑的时候就判断出,你没电脑,那么你想一想后面的条件还有必要判断吗?完全没有!既然这样我们索性就不进行判断了,还节约了时间。
除了节约时间,短路求值法还减少了我们程序出错的可能性。想一下这样一个情景,我们设置了一个大小为20的bool类型数组a,我们判断一个变量n是否小于20,如果小于我们想看看数组a在n这个位置是否为真,如果为真才执行下面的语句。我们用AND运算符就可以上述操作:
If (n <= 20 && a[n] == true){
执行语句;
}
这段代码之所以要先判断n是否小于20,原因在于我们要确保我们不会出现非法访问的情况,因为非法访问一个位置内存,那里面存储的值我们是不知道的,这会给我们的程序带来意想不到的结果,如果没有短路求值法,每个条件都判断一次,那可能就会出现大问题。
运算符的优先级
如果我们在一个语句中有多个运算符,那么他们的执行肯定会有一个先后次序,那就牵扯到运算符优先级的问题。比如说我们想要求 4 * 5 + 2 ,计算机给出的结果是22而不是28,是因为乘法的运算优先级要大于加法的优先级。
具体的次序下表会显示,从上到下优先级依次变低,如果在同一行,那么在语句靠前的运算符优先级更高。
逻辑运算符 NOT
算术运算符 (*,/,%)
算术运算符 (+,-)
关系运算符 (<=,>=,<,>)
关系运算符 (==,!=)
逻辑运算符 AND
逻辑运算符 OR
赋值运算符 =
如果我们就是想要先让优先级较低的运算符优先运算,再让优先级高的运算,我们可以用括号来改变运算符的优先级。还是上面的例子 4 * 5 + 2 ,如果我们的本意是想先让5和2想加在和4相乘,那我们就可以用括号把5 + 2括起来——4 * (5 + 2),这样优先级就会改变,结果就会是28.