C++学习笔记(6)——C++运算符和表达式

C++程序是由各式各样的语句组成的,而语句又是由表达式转化而来的。C++表达式是任何值或任何有效值与运算符的组合。本篇笔记总结C++程序的基本构成元素之一——表达式以及构成它所需的运算符。

一、表达式

需要明确任何值或任何有效值与运算符的组合都是表达式。同理,每个表达式都有值。例如:10本身就是一个值为10的表达式;10+10是一个值为20的表达式;x=20也是表达式,其中的赋值运算符(左值)使得这个表达式的值为20,也就是说你可以把这个表达式赋值给新的变量:y = (x=20).y的值也将会是20.当然,由各种运算符和值的组合都将是表达式,这里不再一一列举。

在表达式后加上分号“;”,表达式则成为了语句。所有的表达式都可以成为语句,但不一定有意义。比如:a=10; 是有意义的,它将a的值赋值为10;而a+10;它也是语句,但不一定有意义,程序运行时会计算和,但并没有应用结果,有的编译器甚至会跳过这种语句不进行编译。

但反过来,将语句去掉分号不一定是表达式,比如声明语句,返回语句,for循环语句等等去掉分号后都不是表达式,因为它们没有值。

下面对C++表达式中涉及到的运算符进行总结。

二、算术运算符

算术运算符包括基本算术运算符和自增自减运算符,由算术运算符、操作数和括号组成的表达式称为算术表达式。基本算术运算符有:+(加),-(减或负号),*(乘),/(除),%(求余)。其中"-"作为负号时为一元运算符,作为减号时为二元运算符。优先级跟我们数学里的是一样的,先乘除,后加减。"%"是求余运算,它的操作数必须是整数,比如a%b是要计算a除以b后的余数,它的优先级与"/"相同,这里要注意的是,"/"用于两个整数相除时,结果含有小数的话小数部分会舍掉,比如2/3的结果是0。如果"/"用于两个浮点数相除时,小数部分将被保留。另外,在应用是要注意除数不能为“0”,最好在除法应用之前对除数进行判断。

C++的自增运算符"++"和自减运算符"--"都是一元运算符,这两个运算符都有前置和后置两种形式,比如i++是后置,--j是前置。无论是前置还是后置都是将操作数的值增1或减1后再存到操作数内存中的位置。但前置和后置的表达式值计算则不同。简单来讲就是a++使用a的当前值计算表达式,然后将a的值加1;而++b的意思是先将b的值加1,然后再用新的值来计算表达式。如果i的原值是2,则i++这个表达式的结果是2(每个表达式都有值),i的值则变为3,。如果j的原值也是2,则--j这个表达式的结果是1,j的值也变为1。需要说明一点是C++在处理前置变量的函数是直接将变量加1,然后返回其值。而处理后置变量的函数是先创建一个变量的副本,将副本加1,然后返回副本的值。因此,前置版本的效率比后置版本高。但C++的内置类型和一些现代编译器将不会由影响。

三. 赋值运算符

最简单的赋值运算符就是"=",带有赋值运算符的表达式被称为赋值表达式。例如n=n+2就是一个赋值表达式,赋值表达式的作用就是把等号右边表达式的值赋给等号左边的对象。赋值表达式的类型是等号左边对象的类型,它的结果值也是等号左边对象被赋值后的值(左值表达式),赋值运算符的结合性是自右向左。什么叫自右向左呢?请看这个例子:a=b=c=1这个表达式会先从右边算起,即先算c=1,c的值变为1这个表达式的值也是1,然后这个表达式就变成了a=b=1,再计算b=1,同样b也变为1,b=1这个表达式的值也变成1,所以a也就变成了1。

除了"="外,赋值运算符还有+=,-=,*=,/=,%=,<<=,>>=,&=,^=,|=。其中前五个是赋值运算符和算术运算符组成的,后五个是赋值运算符和位运算符组成的,这些运算符被叫做组合赋值运算符。这几个赋值运算符的优先级跟"="相同,结合性也是自右向左。L(左操作数)组合赋值运算符 R(右操作数)的意思是L = L 对应的算术运算符或位运算符 R,如,L += R; 即L=L+R。

三. 逗号运算符

逗号也是一个运算符,它的使用形式为:表达式1,表达式2。求这个表达式的值就要先解表达式1,然后解表达式2,最终这个逗号表达式的值是表达式2的值。比如计算a=1*2,a+3,应先计算a=1*2,结果为2,再计算a+3的值,a的值已经变成了2,再加上3为5,这个逗号表达式的最终结果就是5。

但要注意逗号不都是逗号运算符。比如声明语句中的逗号就不是运算符。逗号运算符的优先级是最低的。如a=1,2;的结果是a=1;如果a=(1,2);a的值为2.

四. 关系运算符

关系运算符包括<(小于)、<=(小于等于)、>(大于)、>=(大于等于)、==(等于)、!=(不等于)。前四个的优先级相同,后两个的优先级相同,而且前四个比后两个的优先级高。用关系运算符把两个表达式连起来就是关系表达式,关系表达式的结果类型为bool,值只能是true或false。比如,a>b,a大于b时表达式a>b表达式的值是true,否则就是false。

这里要特别注意赋值运算符和等于运算符的区别。因为习惯了数学表达式的=是等于的意思,在编程中经常会误写。比如if(a=5)本意是a等于5才执行后面的语句,但是实际上a=5这个表达式的值是左值5,也就是说这个if后的语句会一直执行。

五. 逻辑运算符

逻辑运算符包括!(非)、&&(与)、||(或),优先级依次降低。用逻辑运算符将关系表达式连起来就是逻辑表达式,逻辑表达式的结果也是bool类型,值也只能是true或false。"!"是一元运算符,使用形式是!操作数。非运算是对操作数取反。比如!a,a的值是true,则!a的值是false。"&&"是二元运算符,用来求两个操作数的逻辑与,只有两个操作数的值都是true,逻辑与的结果才是true,其他情况下结果都是false。"||"也是二元运算符,用来求两个操作数的逻辑或,只有两个操作数的值都是false时,逻辑或的结果才是false,其他情况下结果都是true。

六. 条件运算符

C++中唯一的一个三元运算符是条件运算符"?"。条件表达式的使用形式是:表达式1?表达式2:表达式3。表达式1是bool类型的,表达式2,3可以是任何类型,并且类型可以不同。明确条件表达式也是表达式,其的值的类型是表达式2和3中较高的类型。条件表达式会先解表达式1,如果表达式1的值是true,则解表达式2,表达式2的值就是条件表达式的值,而如果表达式1的值是false,则解表达式3,其值就是条件表达式的最终结果。比如:(a

七、位运算符

(1)按位与(&)。它是对两个操作数的二进制形式的每一位分别进行逻辑与操作。比如3的二进制形式为00000011,5的二进制形式为00000101,按位与后结果是00000001。

(2)按位或(|)。它对两个操作数的二进制形式的每一位分别进行逻辑或操作。还是比如3和5按位或运算后结果是00000111。

(3)按位异或(^)。它对两个操作数的每一位进行异或,也就是如果对应位相同则运算结果为0,若对应位不同则计算结果为1。例如3和5按位异或后结果为00000110。

(4)按位取反(~)。这是一个一元运算符。它对一个二进制数的每一位求反。比如,3按位取反就是11111100。

(5)移位。包括左移运算(<<)和右移运算(>>),都是二元运算符。移位运算符左边的数是需要移位的数值,右边的数是移动的位数。左移是按指定的位数将一个数的二进制值向左移位,左移后,低位补0,移出的高位舍弃。右移是按照指定的位数将一个数的二进制值向右移位,右移后,移出的低位舍弃,如果是无符号数则高位补0,如果是有符号数,则高位补符号位或0,一般补符号位。比如,char型变量的值是-8,则它在内存中的二进制补码值是11111000,所以a>>2则需要将最右边两个0移出,最左边补两个1,因为符号位是1,则结果为11111110,对其再求补码就得到最终结果-2。

你可能感兴趣的:(C++学习)