一 单元知识
1.关系运算符:在C++中提供了六种关系运算符,包括>(大于)、<(小于)、>=(大于或等于)、<=(小于或等于)、==(等于)、!=(不等于)
2.关系表达式:由关系运算符连接起来的表达式称为关系表达式。关系表达式的结果是一个逻辑值“真”或“假”。“真”表示这个关系成立,用非0值(通常用1)表示;“假”表示这个关系不成立,用0表示。
关系运算符 | 含义 | 应用举例 | 表达式结果 |
== | 等于 | 1==2 | 0 |
!= | 不等于 | 1!=2 | 1 |
< | 小于 | 1<2 | 1 |
> | 大于 | 1>2 | 0 |
<= | 小于或等于 | 1<=2 | 1 |
>= | 大于或等于 | 1>=2 | 0 |
关系运算符的注意事项:
(1)“等于”与“赋值”的区别:
“==”表示关系运算“等于”,例如a==5,表示判断变量a与5是否相等,结果为一个逻辑值,a的值保持不变。
“=”表示“赋值”操作,例如a=5,表示将常量5赋值给变量a,a的值发生变化。
(2)实型数据(浮点数)的关系运算
整型数据的关系运算按照数值大小进行比较,字符型数据按照ASCII码值大小进行比较。实型数据(浮点数)在计算机中是近似存储的,直接比较大小会出现问题。比如:0.666666是否等于0.666667呢?这个结果不一定,若要求误差在0.001范围内,则相等;若要求在0.00000001范围内,则不等。所以,在C++中,一般用两个数值的差与要求的精度进行比较,判断它们是否相等,或者判断一个数是否等于0。例如:float const zero=1e-3;判断fabs(x-y)<zero或者fabs(x)<zero。 注:(fabs(a)表示a的绝对值)
3.
算术运算符 | *、/、% | ↓ 由 ↓ 高 ↓ 到 ↓ 低 |
+、- | ||
关系运算符 | <、>、<=、>= | |
==、!= | ||
赋值运算符 | = |
4.逻辑运算符:C++提供了&&(逻辑与)、||(逻辑或)、! (逻辑非)三种逻辑运算符。其中&&和||是双目运算符,而! 是单目运算符。
5.逻辑表达式:由逻辑运算符连接起来的表达式,称为逻辑表达式,其运算结果也是一个逻辑值“真”或“假”。
A | !A | A | !A |
0 | 1 | 1 | 0 |
A | B | A&&B | A | B | A&&B |
0 | 0 | 0 | 1 | 0 | 0 |
0 | 1 | 0 | 1 | 1 | 1 |
A | B | A||B | A | B | A||B |
0 | 0 | 0 | 1 | 0 | 1 |
0 | 1 | 1 | 1 | 1 | 1 |
优先级 | 运算符 | 结合性 | 优先级 | 运算符 | 结合性 |
1 | () | 从左到右 | 6 | ==、 != | 从左到右 |
2 | !、+(正)、-(负)、++、-- | 从右到左 | 7 | && | 从左到右 |
3 | *、/、% | 从左到右 | 8 | || | 从左到右 |
4 | +(加)、-(减) | 从左到右 | 9 | =、+=、-=、*=、/=、%= | 从左到右 |
5 | <、<=、>、>= | 从左到右 |
例如要表达0<a<10,而在计算机中只能写成a>0&&a<10
要表达x是英文字母。 字符可以按照ASCII码值来比较大小 x>='a'&&x<='z'||x>='A'&&x<='Z'。
逻辑表达式的注意事项:
(3)逻辑表达式是“短路计算” 在逻辑表达式的计算过程中,一旦能够确定整个表达式的值,就会立刻停止计算。例如,对于“A&&B”,如果已经计算出表达式A为假,那么整个表达式的值肯定为假,于是表达式B就不需要再计算下去了。同理,对于“A||B”,如果已经计算出表达式A为真,那么整个表达式必定为真,于是表达式B也不必计算下去了。
#include<iostream>
using namespace std;
int main() {
int a, b, c, d;
a=2;b=3;c=0;
d=(a>b) &&(c=4) ;
cout<<d<<" "<<c<<endl;
return 0;
}
因为“a>b”不成立,按照逻辑表达式“短路计算”的原则,可以确定d为0,而且不会去执行“c=4”的赋值运算,所以c的值还是0。程序输出“0 0”。
判断某一年份x是否是“闰年”的表达式 (x%400==0)||((x%4==0)&&(x%100!=0))
6. if语句的两种格式
第一种格式:
if(表达式)
语句1;
else
语句2;
表示如果“表达式”的值为真(条件成立),那么执行“语句1”;否则,执行“语句2”。
第二种格式:
if(表达式)
语句;
表示如果“表达式”的值为真(条件成立),那么执行“语句”;否则,什么也没做(else及其后面省略)。
比较以下两种情况
#include<iostream>
using namespace std;
int main() {
int n;
cin>>n;
if(n<=5)
cout<<n*300<<endl;
else
cout<<n*280<<endl;
return 0;
}
#include<iostream>
using namespace std;
int main() {
int n, ans;
cin>>n;
ans=n*300;
if(n>5)
ans=n*280;
cout<<ans<<endl;
return 0;
}
7. 复合语句
如数据交换:交换a,b的值需要用到“c=a; a=b; b=c;”三个语句,此时需要用花括号“{ }”将这3条语句包括起来,这些括起来的语句组合称为“复合语句” 。
8. if语句的嵌套
在分支结构中经常会遇到这样的情况:如果条件1成立,就去做A事情,否则去做B事情,但是,在做A事情(或者B事情)时,还要根据条件2是否成立,决定是做A1(或者B1)这件子事情,还是去做A2(或者B2)这件子事情。在程序设计中,把这种情况称为分支结构的“嵌套”,一般用来解决三种及以上的分支情况。
9. 程序中的else子句总是与离它最近的前面一个if子句配对。
10. 条件表达式
条件表达式的格式
<表达式1>?<表达式2>:<表达式3>
其运算规则为:首先计算表达式1的值,若表达式1的值为真(非0),则只计算表达式2,并将其结果作为整个表达式的值;否则,只计算表达式3,并将其结果作为整个表达式的值。
11. switch语句
switch语句的一般格式为:
switch(表达式){
case 常量表达式1:语句组1;[break;]
case 常量表达式2:语句组2;[break;]
…
case 常量表达式n:语句组n;[break;]
[default:语句组n+1]
}
执行过程为:先计算表达式的值,然后从前往后依次与case子句中所列出的各个常量表达式的值进行比较,若表达式的值与常量中的值相等,就开始进入相应的case后面的语句组执行,遇到后续的case也不再进行判断(默认匹配),直至遇到break语句或switch语句结束。default表示表达式与所有常量表达式的值都不匹配,那么就执行其后面的语句组,通常将default放在最后。如果表达式与各分支常量表达式的值都不匹配时,不需要执行任何语句,则default可以省略。
switch语句注意事项
1)switch后面的表达式,取值只能是整型、字符型、布尔型或枚举型。case后面的常量表达式,其值类型要与switch后面表达式的类型一致。
2)任意两个case后的表达式值必须各不相同,否则将引起歧义。
3)语句组可以是一条语句,也可以是一个复合语句。
4)多个case语句可以共用一组程序。
12. 产生a~b之间的随机整数可以表示为a+rand( )%(b-a+1)。
二 学习感悟
本单元我们了关系运算符,关系运算式,逻辑运算符,逻辑运算式;学习了分支结构(if语句)和选择结构(switch语句);学习了复合语句和嵌套;学习了条件表达式。比起上一单元的顺序结构,本单元学习的新知识能够解决更多更复杂的问题,尤其是一些关于不同情况要进行不同处理的问题。
对于关系运算符和逻辑运算符我们要做到会辨认和清楚运算符的优先级;对于关系运算式和逻辑运算式我们要做到会看,明白它想表达啥意思;在变量是连续变化时建议使用if语句,在变量是是离散变化时建议使用switch语句,当选择情况明确只有两种时建议使用条件表达式。当if语句和switch语句都能使用且分类情况较少时使用switch语句,因为switch语句较if语句更稳定。但当情况较多时还是使用if语句更加方便。