C++运算符与表达式

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

在使用完毕new申请的内存空间后,用户需要释放该内存空间。如果用户只申请内 存空间,并不释放,会占用大量的内存空间,使系统运行速度变慢,甚至会造成系统崩 溃。因此,在使用完申请的内存空间后,用户需要使用delete释放申请的内存空间。下 面代码删除以上申请的内存空间。 delete p; delete p1; delete p2; 使用new和delete需要注意一下几点: 用new申请的内存空间,必须用delete释放 对于已分配内存空间的指针,只能用delete释放一次;否则,系统会出现错误。 delete释放的内存空间,必须是new分配内存空间的首地址 要访问new所开辟的结构体空间,无法直接通过变量名进行,只能通过赋值的指针进 行访问.
运算符与表达式
运算符(operator)也称为操作符,对程序中的数据进行运算。参与运算的数据称为操 作数(operand)。 变量、字面常量等通过运算符组合成表达式,一个表达式也能作为操作数来构成更复 杂的表达式。 表达式(expression)是构成程序语句的基本要素。
对于运算符,应注意以下几方面。 (1) 运算符的功能和语义。 (2) 运算符的操作数。每个运算符对其操作数的个数、类型和值都有一定限制。 (3) 运算符的优先级(precedence)。每个运算符都有确定的优先级。 (4) 运算符的结合性(associativity)。
0,b=a==2
1
关系运算符的优先级为(括弧中运算符的优先级相同):(>、>=、<、<=)高于(==、!=)。 关系运算符的优先级比算术运算符低,但比赋值运算符(=)高。如: int a = 5, b = 3, c = 6, d; d = a > b == c; //等价于d = ((a > b) == c); d的值为0 d = a == b < c; //等价于d = (a ==( b < c)); d的值为0 d = a > b <= c; //等价于d = ((a > b) <= c); d的值为1 可以使用()来改变运算符的计算次序。 由于浮点数在计算机内进行运算和存储时会产生误差,因此在比较两个浮点数时,建议不要直 接比较两数是否相等。例如,执行下面语句: double d1 = 3.3333, d2 = 4.4444; if(d1 + d2 == 7.7777) cout<<"相等"<<endl; else { cout<<"不等"<<endl; cout<<d1 + d2<<endl; }
1.5 位运算符 位运算是指对字节内部的二进制位进行移位或逻辑运算。 位运算是通过位运算符来完成的。 位运算的操作数必须是char、short、或int值,而且结果也是char、short或int值。 除了按位求反~是单目运算符,其余位运算都是双目运算符。 C++提供了两类位运算:移位运算和按位逻辑运算。 1.5.1. 移位运算符 移位运算符的格式为: operand << n 将操作数operand向左移动n个二进制位,右边补0,可能改变符号。 operand >> n 将操作数operand向右移动n个二进制位,保持符号不变。 其中,n为整数。注意移位运算并不改变operand本身的值。例如: 比如 2<<2; 值变成8; 对于移位运算,注意以下几点: (1)不要尝试对float或double数据进行移位运算,编译会出错。 (2)移动位数n应不大于左操作数的位数,如int移位应不大于32。如果n大于左操作数位数, 实际移动位数要自动按字长取模:n%(sizeof(int))。例如,i<<33就是i左移1位。 (3)左移位<<与cout<<可能混淆,右移位>>与cin>>可能混淆,可用括号消除这些错误,例 如cout<<(k<<3)
C++语言中包含了丰富的运算符,主要有算数运算符、关系运算符、逻辑运算符、 赋值运算符和位运算符。下面逐一介绍这些常用的运算符。 1.1 算数运算符 算数运算符主要用于算数运算。
运算符 +、+、% *、/ ++/--
说明 正负号 加,减 取余 乘,除 自增和自减运算符
示例 x=y+z,x=y-z x=y%z x=y*z,x=y/z
下面3种方式都可以正常申请内存空间。 //定义一个整型指针 Int *p; //定义一个未初始化的int型变量 p=new int; //定义一个指针变量,并初始化该内存区域内容为12 Int *p1=new int(12); //定义一个指针变量,指向10个整型变量区域。该区域与数组类似,可以像访问数组一 样访问该区域 Int *p2=new int[10];
关系运算的结果是一个表示“真”或“假”的逻辑值,即一个bool值。当关系成 立时,其运算结果为真;当关系不成立时,结果为假。但C/C++语言中没有逻辑 型,关系运算的结果要用一个int值表示,0即为假,1即为真。
例如: a>2 0 ,
a>b+c
0
a=2 b=3 c=4 , a==2 1,a==‘a’ 0,a>‘a’
1.5.2 位逻辑运算符 按位逻辑运算有4个:求反~、与&、或|、异或^。 (1)按位求反“~”运算符是一个单目运算符,对操作数逐位取反,得到反码。若二进制位为0,则取 反后为1;若二进制位为1,则取反后为0。 例如:short int m = ~0xc3 //结果为0xff3c 运算符具有比较高的优先级,高于一般的算术运算符。而其它按位逻辑运算符的优先级则比较低。 (2)按位逻辑与“&”对两个操作数逐位进行运算。若对应位都为1,则该位结果为1,否则为0。 例如:0xc3 0000 0000 1100 0011 0x6e 0000 0000 0110 1110 0x42 0000 0000 0100 0010 short int a=0xc3 & 0x6e //结果为0x42 (3)按位逻辑或“|”对两个操作数逐位进行运算。若对应位都为0,则该位结果为0,否则为1。 例如: short int b = 0x12 | 0x3d //结果为0x3f
条件语句中用“==”来判断浮点数是否相等,结果 是不等,但d1+d2输出结果却是7.7777。两个实型数 即便输出结果完全一样,其内部值也可能不一样。判 断两个实数是否相等的正确方法是:判断两个实数之 差的绝对值是否小于一个给定的允许误差数,如判断 d1是否等于d2时,应改为:
fabs(d1 +d2-7.7777) <= 1e-6 其中,fabs()是计算绝对值的一个库函数,使用时 要包含头文件math.h。
1.3 逻辑运算符 对逻辑值进行运算的运算符就是逻辑运算符。C++语言提供了3个逻辑运算符,用于表示 操作数之间的逻辑关系,它们是!(逻辑非)、&&(逻辑与)、||(逻辑或)。逻辑运算的结果 仍然是逻辑值。
逻辑非(!)是单目运算符,它对操作数进行取反运算。当操作数为非0(逻辑真)时,!运 算后结果为0(逻辑假)。反之,若操作数为0(逻辑假),!运算后结果为1(逻辑真) 逻辑运算符 !a a&&b a||b 名称 求反 逻辑与 逻辑或 效果 TRUE,如果a不为TRUE TRUE,如果a与b都为 TRUE TRUE,如果a或b任一为 TRUE
逻辑运算符的运算优先级为:! 高于 && 高于||。注意,!的优先级具有较高优先级, 甚至高于算术运算符。而&&和||的优先级则比算术运算符和关系运算符低。
因C++将逻辑值保存为整数值,这样使得逻辑值可参与所有的运算,而且逻辑运算符可 作用于所有类型的值,而没有语法错误提示。这是C/C++语法不严密之处。读者应注 意避免。
赋值运算符 = += -= *= /= &= |= a=a+3;与a+=3;有没有区别?
名称 赋值 赋值与和 赋值与减 赋值与乘 赋值与除 赋值位与 赋值位或
效果 x=10 x+=10(等于x=x+10) x-=10 x*=10 x/=10 x&=0x02 x|=0x02
答案是有的,对于a=a+1,表达式a被计算了两次,对于复合运算符a+=1,表达式a 仅计算了一次。一般的来说,这种区别对于程序的运行没有多大影响,但是当表达 式作为函数的返回值时,函数就被调用了两次,而且如果使用普通的赋值运算符, 也会加大程序的开销,使效率降低。
b2=?
对大多数运算符来说,布尔类型的运算对象将被提升为int型。如上所示,布尔变量 b的值为真,参与运算时将被提升成整数值1,对它求负的结果是-1,将-1再转回布 尔值并将其作为b2的初始值,显然这个初始值不等于0,转换成布尔值后应该为1,。 所以,b2的值是真!(false可以代表0,但true有很多种,并非只有1)
++和—有前置方式和后置方式。前置方式使操作数增1(或减1),新值参与表达式 的运算;后置方式是在操作数参与表达式运算后其值增1(或减1)。 例如: ++i,--i//在使用i之前,先使i的值加1,减1 i++,i--//在使用i之后,使i的值加1,减1 一元负号运算符对运算对象值取值取负后,返回其(提升后的)副本: Int i=1024; Int k=-i;//k是-1024 bool b=true; bool b2=-b;
1.2 关系运算符
关系运算符主要用于关系比较运算。 关系运算符
a==b a!=b a<b a>b a<=b a>=b
名称
等于 不等于 小于 大于 小于等于 大于等于
效果
TRUE,如果a等于b TRUE,如果a不等于b TRUE,如果a小于b TRUE,如果a大于b TRUE,如果a小于或者等 于b TRUE,如果a大于或者等 于b
位运算符 ~a a&b a|b a^b << >>
名称 按位反 按位与 按位或 按位异或 左移 右移
来自百度文库
效果 1,如果a不为1 1,如果a与b都为1 1,如果a或b都不为1 1,如果a和b不相同
1.6 new和delete new和delete是c++新增的运算符,实现存储的动态分配和释放功能。new可以用 于动态申请内存空间,为各种数据类型分配内存。用户可以使用new申请一段内存空间, 如数组、结构体或整型变量等。new运算符返回系统分配的内存空间的首地址,需要相 应类型的指针保存该地址。
(4)按位逻辑异或“^”也是对两个操作数逐位进行运算。异或运算的规则是,若对应位不同,则 该位结果为1,否则为0。例如: short int c = 0x5a ^ 0x26 //结果为0x7c 按位逻辑异或有一个特点,如果a ^ b = c,那么c ^ b = a。b将a转换为c,也能将c再复原 为a。显然,两个相等的值异或运算,结果为0。不相等的两个值异或运算结果不为0。
注意: 对于除,若两个操作数都是整数,结果为整数(商部分)。 1/2=0 5/2=2 %通常称为取模运算,两个操作数必须都是整型数,结果为余数,余数的符号与左边数的符 号等同。 3%2=1 -3%2=-1 3%-2=1 -3%-2=-1 8%4=0
在算术运算中需要注意溢出问题。 两个整数做加法、减法或乘法运算时,即便结果溢出也不是错误。 例如:short s1 = 32765; s1 = s1 + 3; //结果是否超过short的最大值? cout<<s1<<endl; //输出-32768,而不是32768。 实际上,观察二进制数据,这两个值是一样的。
1.4 赋值运算符 赋值运算就是将一个表达式的值赋给一个变量。 C++语言提供了两类赋值运算符:基本赋值运算符和复合赋值运算符。 基本赋值运算符为“=”,复合赋值运算符有多种形式:+=、-=、*=、/=、%=、<<=、 >>=、&=、^=、|=。 (1) 赋值运算符都是双目运算符,从右向左进行。例如,sum1=sum2=0相当于 sum1=(sum2=0),先执行sum2=0,后执行sum1=sum2。 (2) 要求赋值运算符左操作数必须是左值,左值能存储值。 例如: x=3+5 //正确,x是左值 x-3=5 //语法错误,x-3不是左值 (3) 复合赋值运算符是将算术运算或位运算与赋值相结合,同一个变量即参加运算,也是被赋 值的变量,出现在赋值运算符的两边。复合赋值运算符是一个整体,中间不能用空格隔开。例 如: a *= 6 //相当于a = a*6 a %= 6 //相当于a = a%6 a += 3 + 6 //相当于a = a+(3+6) 初学者容易犯的一个错误就是混淆“=”运算符和“==”运算符。分析下面代码: int a = 5, b = 3; int d = a == b; //d的值为0
相关文档
最新文档