屌丝 c++语言程序设计 第三章 运算符和表达式

【学习目标】
  熟练掌握C++各种运算符的使用方法。能熟练运用运算符组成需要的表达式。正确使用操作数的类型转换和运算符的优先级顺序和结合性。
【重点和难点】
  自增、自减运算符的运用;各个运算符的优先级顺序及其结合性;操作数的类型转换。
【学习方法指导】
  要在学习中注意区分运算符、表达式和语句的不同;不同类型的操作数赋值时,尽量进行显式转换,隐式转换容易犯错误;优先级和结合性也容易犯错误,一般说来,表达式中加上圆括号,比较保险,这也可以提高程序的可读性。
【知识点】
  算术运算符;自增、自减运算符;关系运算符;逻辑运算符;位运算符
  赋值运算符;求字节数运算符;逗号表达式;短路表达式;显式类型转换;隐式类型转换;优先级与结合性


第一节 c++运算符

所谓运算符就是指运算的符号,例如加运算符(+)、乘运算符(*)、取地址运算符(&)等。表达式与运算符密不可分,它由运算符与操作数组合而成,并由运算符指定对操作数要进行的运算,一个表达式的运算结果是一个值。本章中,我们将介绍C++语言基本的运算符、表达式,各种运算符的优先级、结合性,以及不同数据类型的值之间的转换。

C++语言中的运算符是可以让C++语言编译器能够识别的具有运算意义的符号。编译器把这些符号及其组成的表达式翻译成相应的机器代码,就可以由计算机运行得出正确的结果。
  其实,就象我们日常生活当中许多东西的名字,如冰箱、电视机等分别代表不同功能的电器设备一样,运算符就是代表C++语言中的各个运算功能的名字,这些名字是由制定C++语言规范的人员确定的。下面给出由运算符组成的表达式的例子:
  下面是几个表达式例子。如:
   100+200-300*200+1000/20+100%10
   a || b && c || d
   a = b + c + d*e
   a += b++
   c -= d--
  只要是按C++语法写出的表达式,编译器就能够解释其中的运算符和由运算符、操作数组成的表达式的意义。

第二节 优先级和结合性

当不同的运算符混合运算时,运算顺序是根据运算符的优先级而定的,优先级高的运算符先运算,优先级低的运算符后运算。在一个表达式中,如果各运算符有相同的优先级,运算顺序是从左向右,还是从右向左,是由运算符的结合性确定的。所谓结合性是指运算符可以和左边的表达式结合,也可以与右边的表达式结合。C++运算符的优先级和结合性参见表3-14。
  在表3-14中,"单"表示是单目运算符,"双" 表示是双目运算符,"三" 表示是三目运算符。表中有一些运算符,我们还没有介绍,以后我们会在有关的内容中学习。


表格表3-14 C++运算符的优先级和结合性
 
优先级运算符种类结合性
最高
: :(全局)     
从右到左
最高
: :(类域)     
从左到右
.
( )(括号及函数调用)- >..[ ]
从左到右
.
+
-
++
--
!
~
*
&
new
delete
sizeof
(类型)
从右到左
.
- > *. *    
从左到右
.
+/%    
从左到右
.
+     
从左到右
.
<<>>     
从左到右
.
<< =>> =  
从左到右
.
= =! =    
从左到右
.
&     
从左到右
.
^     
从左到右
.
|     
从左到右
.
& &     
从左到右
.
| |     
从左到右
.
? :     
从左到右
.
=     
从右到左
最低
,     
从左到右

  每种运算符都有一个优先级,优先级是用来标志运算符在表达式中的运算顺序的。优先级高的先做运算,优先级低的后做运算,优先级相同的右结合性决定计算顺序。
  大多数运算符都是按从左到右计算,只有三类运算符的结合性是从右到左。他们是:单目、三目和赋值。这一点一定要记住。


第三节 类型转换

3.3 类型转换
  C++中,一种数据类型能够被转化为另一种数据类型。例如3-3:
  从上面实例我们可以看到:类型标识符能被用于类型运算符。类型运算符是单目运算符,并位于其操作数的左边的圆括号里,称之显式类型转换,或强制类型转换。显式类型转换的一般形式为:
  (类型名)(表达式)
  需要注意的是: (int)(x+y)是将(x+y)转换为int 型,而(int)x+y是将x转换为int型后再与y相加。显式类型转换只是得到一个所需类型的中间变量,原来变量的类型并不发生变化。

例题例3-3
 (int) 3.14 // 3.14 转换成整型数3
(long) 3.14 // 3.14转换成长整型数3L
(double) 2 // 2转换成双精度数2.0
(char) 122 // 122转换成Unicode码为122的字符
(unsigned short) 3.14 // 3.14转换成无符号整型数3
  如果类型标识符仅为一个单词,显式类型转换的形式也可以写成:类型表示符(表达式)。例如:
    int(3.14) // 等价于(int) 3.14
  在一般情况下,各种数据都按默认类型参与运算, 当两个不同的数据类型(整型、字符型、实型)进行运算时,数据将进行自动类型转换,转换后再参与运算。
  例:指出下面每个语句的执行结果。
例题例3-4
 char ch='c';
int a,b=13;
float x=2.0;
double y;
a=ch+5; //a=104,a先转化为int型,再参与运算。
x=b/2/x; //x=3.0,先作整除运算,然后再转换成double与x运算。
x=b/x/2; //x=3.25,b先转换成float型与x做除法,同时2也转化成float型,然后做除法运算。
y=x/b; //x=0.153846153846154,x和b分别转化成double然后做除法运算。
  又例如:
例题例3-5
 double d = 1; // d 的值1.0
int i = 10.5; // i的值10
i = i + d; // 等价于: i = int(double(i) + d)
  上例中,表达式i = i + d的变量i与d的类型不同,使得i首先被转换为double型(提升),再与d相加,其结果为一double型数。由于该double型数与赋值语句左边i的类型不匹配,所以在它被赋给i之前,再被转换为int型(下降)。
  上面的自动类型转换也称为隐式转换。

第四节 表达式

3.4.1表达式的种类
  表达式是由运算符和操作数组成的式子。运算符可以是前面讲过的那些。操作数包含了常量、变量、函数和其他一些命名的标识符。最见大的表达式是常量和变量。
  C++中由于运算符很丰富,因此表达式的种类也很多。常见的表达式有如下六种:
  已知int a;
  ·算术表达式。例如,a+5.2/3.0-9%5
  ·关系表达式。例如,'m'>='x'
  ·逻辑表达式。例如,!a && 8 | | 7
  ·条件表达式。例如,a>4 ? ++a:--a
  ·赋值表达式。例如,a=7
  ·逗号表达式。例如,a+5,a=7,a+=4

注意:
  1、在表达式中,连续出现两个运算符时,最好用空格符分隔。如:
    a+++b; (注意:在visual c++中这种写法是错误的,编译将不能通过)
  系统将默认为是a++ +b,因系统将按尽量取大的原则来分割多个运算符。如果想执行a加++b,则应写成
    a+ ++b;
  2、在写表达式中,有时记不清楚运算符的优先级时,可使用括号来确定运算符组合。


 


【本章小结】
  介绍了C++基本的各种运算符构成(算术运算符、关系运算符、逻辑运算符、位运算符、条件运算符、赋值运算符、逗号运算符几其它运算符)以及它们的优先级和结合性。同时介绍了由运算符组成的各种表达式、表达式中操作数类型的显式及隐式转换。
  自增、自减运算符,前缀式先将操作数增1(或减1),然后取操作数的新值参与表达式的运算。后缀是先将操作数增1(或减1)之前的值参与表达式的运算,到表达式的值被引用之后再做加1(或减1)运算。
  关系运算符两边的数值结果必须是类型相同的。
  在实现优先级与实际需要不相符时,需要使用括号来改变。
  参加运算的两个操作数类型不同时,C++将自动作隐式类型转换,但有时要作强制类形转换。
  表达式和语句的一个重要区别是:表达式具有值,而语句是没有值的并且语句末尾要加分号。

课后习题

一:选择题
1.以下符号中不能作为标识符的是:
a._256
b.void
c.scanf
d.Struct
2.下面不能正确表示a*b/(c*d)的表达式是:
a.(a*b)/c*d
b.a*b/(c*d)
c.a/c/d*b
d.a*b/c/d
3.下列运算符中,运算对象必须是整型的是:
a./
b.%=
c.=
d.&
4.若x,y,z均被定义为整数,则下列表达式终能正确表达代数式1/(x*y*z)的是:
a.1/x*y*z
b.1.0/(x*y*z)
c.1/(x*y*z)
d.1/x/y/(float)z
5.已知a,b均被定义为double型,则表达式:b=1,a=b+5/2的值为:
a.1
b.3
c.3.0
d.3.5
6.如有int a=11;则表达式(a++*1/3)的值是
a.0
b.3
c.4
d.12
7.在下列运算符中,优先级最低的是:
a.||
b.!=
c.<
d.+
8.表达式9!=10的值为:
a.非零值
b.true
c.0
d.1
9.能正确表示x>=3或者x<1的关系表达式是:
a.x>=3 or x<1
b.x>=3|x<1
c.x>=3||x<1
d.x> =3||x<1
10.下列运算符中优先级最高的是:
a.!
b.%
c.-=
d.&&
二:填空题
1.若a为double性的变量,表达式a=1,a+5,a++的值为 。
2.表达式7.5+1/2+45%10= 。
3.与! (x>2)等价的表达式是 。
4.表达式于语句的重要区别是 。
5.赋值运算符的结合性是由 至 。
6.x *= y+8等价于x= 。
7.给出下列程序的输出结果 。
 #include <iostream.h>
 void main()
 {
  int a=3,b=6;
  int c=a^b<<2;
  cout<<c<<endl;
 }
8. 给出下列程序的输出结果 。
 #include <iostream.h>
 void main()
 {
  int x=5;
  int y=2+(x+=x++,x+8,++x);
  cout<<y<<endl;
 }
9. 给出下列程序的输出结果 。
 #include <iostream.h>
 void main()
 {
  int a=7,b=4;
  float x,y=27.2,z=3.4;
  x=a/2+b*y/z+1/3;
  cout<<x<<endl;
 }
10. 给出下列程序的输出结果 。
 #include <iostream.h>
 void main()
 {
  int a=-1,b=4,k;
  k=(a++<=0)&&!(b--<=0);
  cout<<k<<a<<b<<endl;
 }
三:编程及简答题
1.x=2, y=3, z= 4时,计算下面表达式的值A1、A2
A1 = x + y +2/2+z和 A2=x+(y+2)/(2-z)


2.述算术运算符的组成


3.下列运算符从高到底进行排序:‘+’、‘*’、‘&&’、 ‘&’、 ‘>’、 ‘>=’、 ‘*=’。

4.述下列运算符各能代表几种意义:‘-’、‘&’、‘*’。


5.下列运算符的结合性如何:‘+’、‘&’、‘=’、‘||’。


6.计算下列表达式的值:
i.1/2 + 5/2 + 7/6
ii.1/2. + 5/2. + 3.
iii.1/2 + 5./2 + 2
iv.(unsigned char) 500 + 200
v.(unsigned char) (500 + 200)
vi.(unsigned int)(unsingned char)750


7.编程实现:由键盘输入两个整数,然后输出最大者。


8.int a=5, b=0; 问下面表达式运算后a和b的值是多少?
(1) ! a && a+b && a++
(2) !a||a++||b++


9.有变量说明
int a=4,b;
指出下面表达式运算后a和b的结果?
b+=b=++a;


10. 编程实现:测试你机器的 int,float,double,long,char 各类型变量存储的字节数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值