第3章 运算符、表达式和语句

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
12
运算符和表达式
提示: 提示: • 赋值运算符的左操作数必须是一个存放数据的空间,是其值允许 改变的变量或表达式,被称为“左值”。 例如:int a,b=1; a=10; (a=20+b)=30; • C++中,赋值表达式运行后,结果就是左操作数。即表达式 a=20+b除改变了变量a的值,它的结果仍然是变量a本身。 • 赋值运算符“=”不是数学上的等号。 例如,n=n+1; 在数学上不成立,但在计算机高级语言中表示将n的值加1后 再赋值给n的含义。 • 多重赋值是合法的。 例如,x=y=z=178.9; • 复合赋值运算符是把其右边的<表达式>作为一个整体来进行运算 的。 13 例如,x+=10+y; 等价于x+= (10+y);
ห้องสมุดไป่ตู้17
运算符和表达式
3.1.4 逻辑运算符和逻辑表达式 C++提供了3种逻辑运算符,逻辑运算的结果是 逻辑型。逻辑运算符及其表达式如表3-4所示。假设 已经声明了变量: int m=100,n=0; bool a=true,b=false;
18
运算符和表达式
【例3-4】写出判断1个字符变量ch是否为数字字符0——9 的逻辑表达式。 解: ch>='0' && ch<='9' 或者 ch>=48 && ch<=57 【例3-5】判断一元二次方程ax2+bx+c=0是否有两个实根。 解: 如果b*b-4*a*c>0&&a!=0成立,则一元二次方程 ax2+bx+c=0有两个实根; 否则一元二次方程ax2+bx+c=0无两个实根。
3
运算符和表达式
• 表达式是由运算符将常量、变量、函数等连接起来的
式子,一个合法的C++表达式经过运算应有一个某种 类型的确定的值。使用不同的运算符可以构成不同类 型的表达式,如算术表达式、赋值表达式、关系表达 式、逻辑表达式等等。 • 在对一个由多种运算符构成的表达式求值时,运算顺 序由运算符的优先级确定,按优先级由高到低的顺序 进行运算。C++运算符的优先级分为17个等级。C++支 持的运算符及其优先级和结合性详见与本教材配套的 《上机实习指导与习题集》一书的附录C,附录C中表 示优先级的数值越小,优先级越高。
8
运算符和表达式
提示: 提示: • 使用已经定义好的数学函数,如求平方根函数sqrt, 需要在程序中包含头文件cmath。常见库函数见《上 机实习指导与习题集》一书中附录E。 • 注意高级语言中算术表达式和一般算术表达式写法的 区别。 例如,b2–4ac要写成b*b–4*a*c,不能省略表示乘 法的运算符*。 • 可以通过一对圆括号( )改变运算优先级顺序。 例如,(-b+sqrt(b*b–4.0*a*c))/(2*a); “(-b+sqrt(b*b–4.0*a*c))/(2*a)”中使用的是4.0, 而不是4,是将(b*b–4.0*a*c)的数据类型由自动转 换为double型,才能够正确调用sqrt函数。
5
运算符和表达式
3.1.1 算术运算符和算术表达式 C++语言中支持的算术运算符及其表达式如表31所示。假设已经声明了变量: int m=10,n=2; double x=3.5,y=4.3;
6
运算符和表达式
提示: 提示: • 两个整数相除,商为整数,小数部分全部舍去,不进 行四舍五入。 例如,1/3的结果为0,5/3结果为1。 • 求余运算要求两个操作数都必须是整型。 例如,10%3的余数是1,-10%3的余数是-1。 C++中的算术运算符与数学运算的概念和运算方法基 本相同,其中单目运算符的优先级最高,其次是乘、除 和求余,最后是加、减。在算术运算符中,除单目运算 符的结合性是右结合以外,其他双目运算符的结合性都 是从左到右。
14
运算符和表达式
15
运算符和表达式
提示: 提示: • 前4种关系运算符的优先级相同且比后面两种运算符 的优先级高。 • 在C++中,通常将“真”表示为1,将“假”表示为0, 而任何非0的数都被认为是“真”,0被认为是“假”。 • 千万不要把赋值运算符“=”当作关系运算符“==” 使用。
16
运算符和表达式
11
运算符和表达式
3.1.2 赋值运算符和赋值表达式 • 赋值运算符“=”是一个双目运算符。赋值表达式的 一般形式为: 变量名>=<表达式> >=<表达式 <变量名>=<表达式> 它首先计算赋值运算符右面<表达式>的值,然 后将值赋给左面的变量。赋值表达式后面加分号便构 成赋值语句,赋值语句具有计算和赋值双重功能。 除了赋值运算符“=”外,C++还提供了10种复合赋值 运算符,如表3-2所示。 • 赋值运算符和复合赋值运算符的优先级都相同,仅比 逗号运算符的优先级高。它们的结合性都是从右到左。
9
运算符和表达式
【例3-2】比较算术运算符++和--放在变量前面(称为前缀)和 放在变量后面(称为后缀)有什么不同。 解: (1)增1运算符“++”和减1运算符“--”如果仅用于使某个变 量的值增1或减1,则前缀和后缀的作用是一样的。 例如: int i=10,j=10; i++; j--; 等价于: int i=10,j=10; ++i; --j; 即i++与++i都是使i的值增1;j--与--j都是使j的值减1。
运算符和表达式
3.1.5 位运算符及其表达式 在开发系统软件时,经常要将两个操作数按二 进制位进行运算,这些操作就是通过位运算符来实现 的。C++提供了6种位运算符,运算符及其表达式如表 3-5所示。假设已经声明了变量a和b,它们在内存中 的二进制形式分别是10010101和01101101。
22
24
运算符和表达式
【例3-7】编写程序求用户输入的两个整数中的较小者。 #include<iostream> using namespace std; int main() { int x,y,min; cout<<"请输入两个整数:"<<endl; cin>>x>>y; min= x<y?x:y; cout<<"较小的整数是:"; cout<<min<<endl; return 0; } 25
运算符和表达式
表3-5 位运算符及其表达式 功 能 运算符 & 含 义 按位与 将两个操作数对应的每个二进制位 分别进行与运算 将两个操作数对应的每个二进制位 分别进行或运算 表达式举例 a&b a|b 运算结果 00000101 11111101
|
按位或
^
两个操作数对应的每个二进制位分 按位异或 别进行异或运算:两位相异为1, 相同为0 左移位 将左操作数的各二进制位向左移动 由右操作数指定的位数。 将左操作数的各二进制位向右移动 由右操作数指定的位数。 将二进制数的每一位取反 按位取反
4
运算符和表达式
• 运算符的结合性是指运算符和操作数的结合方式,有
两种:即左结合性和右结合性。当优先级相同的运算 符相邻时,其运算顺序由运算符的结合性来决定。左 结合性是指按从左到右的顺序进行运算。例如,表达 式x+y-z中的减号和加号都是左结合性,按从左至右 的顺序是先加后减。右结合性是指按从右向左的顺序 进行运算。例如,在表达式x=y=z=100中,赋值运算 符“=”是右结合性,按照从右向左的顺序进行赋值, 即z=100、y=z、x=y。从《上机实习指导与习题集》 一书的附录C中可以看出,只有单目运算符、条件运 算符和赋值运算符是右结合性,其余运算符都是左结 合性。
10
运算符和表达式
(2)当它们与其他运算符同时出现在表达式中时,前缀与后缀 两种用法是不同的。 例如: int a=10, b; b=++a-5; // a先增1变成11,再减去5 cout<<a<<' '<<b<<endl; // a的值为11,b的值为6 而: int a=10, b; b=a++-5; // a先减去5得5,将5赋给b,然后a再增1 cout<<a<<' '<<b<<endl; // a的值为11,b的值为5 注意,对于表达式“a+++b”,C++编译器会解释为: (a++)+b
a^b
11111000
<< >> ~
23
b<<2 b>>2 ~a
10110100 00011011 01101010
右移位
运算符和表达式
3.1.6 条件运算符及其表达式 条件运算符“? :”是C++中唯一一个三目运算符, 由条件运算符构成的表达式的形式为: 表达式1 表达式2 表达式3 表达式1 ? 表达式2 : 表达式3 条件运算符的运算规则是: (1)先计算表达式1的值; (2)如果表达式1的值非0,则计算表达式2的值,表达 式2的值为整个条件表达式的值; (3)如果表达式1的值为0,则计算表达式3的值,表达 式3的值为整个条件表达式的值。
19
运算符和表达式
【例3-6】已知a、b、c的值均为0,逻辑表达式(a+=1) && (b+=1) || (c+=2)的值是什么?逻辑表达式求值后a、b、 c的值又是多少? 解:整个逻辑表达式的为真,a,b,c的值依次为是1,1,0。 解释:在C++中,对表达式进行最少的运算。如果逻辑表 达式的值已经能够确定了,就不再继续进行下面的计算。 由于赋值运算“a+=1”和“b+=1”的结果都是真, 所以两者的逻辑与“&&”也是真,此时已经能够确定整 个逻辑表达式的值为真,就不需要再进行下面的“c+=2” 和“||”运算了。
【例3-3】假设a不等于0,判断一元二次方程 ax2+bx+c=0是否有实根。 解: • 如果b*b–4*a*c>=0成立,则一元二次方程 ax2+bx+c=0有实根; • 否则一元二次方程ax2+bx+c=0无实根。 由于算术运算符的优先级高于关系运算符,对 于表达式b*b–4*a*c>=0,首先计算算术表达式b*b– 4*a*c的值;然后再进行判断该值是否>=0的关系运算。
7
运算符和表达式
【例3-1】求一元二次方程2x2+7x-5=0的两个实数解。 #include<iostream> #include<cmath> using namespace std; int main() { int a=2,b=7,c=-5; double x1,x2; x1=(-b+sqrt(b*b-4.0*a*c))/2*a; x2=(-b-sqrt(b*b-4.0*a*c))/2*a; cout<<"方程的两个实数解是:"; cout<<x1<<' '<<x2<<endl; return 0; }
运算符和表达式
3.1.3 关系运算符和关系表达式 关系运算符是双目运算符,用来比较两个操作数 的大小或是否相等的关系。关系运算符的运算结果是 逻辑型,如果关系成立,则结果为真(true),否则 为假(false)。C++语言中支持的主要关系运算符及 其表达式如表3-3所示。假设已经声明了变量: int m=10,n=2;
第3章 运算符、表达式和语句
南开大学非计算机专业理工科 面向对象程序设计课程
课程内容安排( 课时) 课程内容安排(4课时)
• 运算符和表达式 • 类型转换 • 语句 • 小结 • 学习指导
2
运算符和表达式
3.1 运算符和表达式 • 运算符是编译器能够识别的具有运算含义的符号。 运算符是编译器能够识别的具有运算含义的符号 是编译器能够识别的具有运算含义的符号。 根据需要操作数的不同,可将运算符分为三类: 根据需要操作数的不同,可将运算符分为三类:单 目运算符(一个操作数)、双目运算法( )、双目运算法 目运算符(一个操作数)、双目运算法(两个操作 和三目运算符(三个操作数)。C++中包含了 )。C++中包含了C 数)和三目运算符(三个操作数)。C++中包含了C 语言的运算符和表达式,还增加了一些新的运算符: 语言的运算符和表达式,还增加了一些新的运算符: :: 作用域运算符 new 动态分配内存单元运算符 delete 回收动态分配的内存单元运算符 *和->* 成员指针选择运算符
20
回答问题时间
请思考并回答: 请思考并回答: 1.将下列数学公式写成C++表达式。
G m
1
m
2
2
r
1 vt + at2 2
sinαcosβ +sinβ cosα 2.写出表示下列情况的C++表达式: • 成绩取值在0和100之间的整数。 • 如果门是开着,就将门关上;如果门是关闭的,就将门打开。 • 一扇需要两把钥匙才能够打开的门是否能够打开。 • 一扇需要两把钥匙中的任何一把都能够打开的门是否能够打开。 • 点(x, y)位于直角坐标系第2象限内。 • 一元二次方程ax2+bx+c=0有2个实根。 21 • x和y中至少有一个是7的倍数。
相关文档
最新文档