![C++从零开始学(视频教学版)(第2版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/128/29977128/b_29977128.jpg)
4.1 运算符概述
在C++中,运算符用于执行程序代码运算,会针对一个以上的操作数项目进行运算。下面根据运算符的不同使用方式分别介绍运算符的使用。
4.1.1 赋值运算符
赋值语句的作用是把某个常量、变量或表达式的值赋给另一个变量,符号为“=”,赋值运算符是双目运算符。赋值表达式的类型为等号左边对象的类型,其结果值为等号左边对象被赋值后的值,运算的结合性为自右向左。
由运算符连接的表达式格式为:
![](https://epubservercos.yuewen.com/A8BCBE/16499866604816706/epubprivate/OEBPS/Images/Figure-P71_8611.jpg?sign=1739694382-gyHPvgg7caLO4T2T3YyX8XpNJuBoEYjY-0-102d4ce368775877c117371575b2c411)
提示
赋值运算符赋值时,常量一定要放在右边,不能放到左边。
下面通过一个实例来说明赋值运算符的使用方法。
【实例4-1】赋值运算符(代码4-1.txt)
新建名为“fztest”的【C++ Source File】源程序,源代码如下所示:
![](https://epubservercos.yuewen.com/A8BCBE/16499866604816706/epubprivate/OEBPS/Images/Figure-P71_8657.jpg?sign=1739694382-BVaofakqYbVcfLHncPxkMEl4WBF5trTo-0-3303f4c552ddeaec8dd2ffb0b0346d47)
【代码详解】
在程序中,定义了两个int型变量,分别是a和b。接下来给a赋值为10,给b赋值为4,将b的值赋给a,之后再给b赋值为7。将a和b的值分别输出。
运行结果如图4-1所示。
![](https://epubservercos.yuewen.com/A8BCBE/16499866604816706/epubprivate/OEBPS/Images/Figure-P72_8751.jpg?sign=1739694382-8DVEdaTzF16eZLwuZBoMFPIlDDGNSNjH-0-82da8a3bc5c510fb3efdd2afd9334fee)
图4-1 代码运行结果
【实例分析】
在本例中,a的值为4,b的值为7。最后一行中b的值被改变并不会影响到a。
到目前为止,一直在使用简单的“=”赋值运算符,其实还有其他赋值运算符,它们都以类似的方式工作,根据运算符和右边的操作数把一个值赋给左边的变量,如表4-1所示。
表4-1 赋值运算符
![](https://epubservercos.yuewen.com/A8BCBE/16499866604816706/epubprivate/OEBPS/Images/Figure-T72_8879.jpg?sign=1739694382-q78nCCwrbDZKUyB0SHOozWmTyDRlZUH5-0-f1e164898eb098335475877c81b30a8b)
4.1.2 算术运算符
在C++语言中,算术运算符包含双目的加、减、乘、除四则运算符,求余运算符以及单目的正负运算符。在C++中没有幂运算符,如果需要实现幂预算,就需要通过函数来实现,如表4-2所示。
表4-2 算术运算符
![](https://epubservercos.yuewen.com/A8BCBE/16499866604816706/epubprivate/OEBPS/Images/Figure-T73_9157.jpg?sign=1739694382-yNlMzV7TKw4hem2fjAK7QhKFjWbICSaw-0-cf5546aa51c05d5b643d76c298b6a8cf)
由算术运算符连接的表达式称为算术表达式,例如a+b*3和(a+b)/4。
提示
求余运算符用于求出两个操作数的余数,例如30%20=10。
下面通过一个实例来说明算术运算符的使用方法和技巧。
【实例4-2】算数运算符(4-2.txt)
新建名为“caltest”的【C++ Source File】源程序,源代码如下所示:
![](https://epubservercos.yuewen.com/A8BCBE/16499866604816706/epubprivate/OEBPS/Images/Figure-P73_9161.jpg?sign=1739694382-h0PonqEJ8RNq6zAHhnhJhE0rIqhZnKWI-0-c31ffd65f38b4a45f87d0e4e2ca8365b)
【代码详解】
首先,在主程序中定义了三个变量a、b、c。接下来,对a赋值为10,对b赋值为4,将a+b的值赋值给c,把结果输出。再将a%b的结果复制给c,同样将结果输出。
运行结果如图4-2所示。
![](https://epubservercos.yuewen.com/A8BCBE/16499866604816706/epubprivate/OEBPS/Images/Figure-P73_9153.jpg?sign=1739694382-ZdVChFwLg0J0sQya1IWthkCjm6GmXy33-0-0f74427240902cf7ef1e039f83e7d36a)
图4-2 代码运行结果
【实例分析】
在本例中可以看出,第一次给c赋值时,是把a+b的值赋给了c;接下来将a%b的值赋给了c,变量c随着不同的赋值,它的值也在不断改变。
4.1.3 关系运算符
在C++中,关系运算符用于变量和数值(常量)间的比较。如果两个操作数的关系符合设定的关系,该关系表达就为逻辑“真”,否则为逻辑“假”。“真”用true表示,“假”用false表示。
表4-3列出了几种关系运算符。
表4-3 关系运算符
![](https://epubservercos.yuewen.com/A8BCBE/16499866604816706/epubprivate/OEBPS/Images/Figure-T74_9418.jpg?sign=1739694382-1B2G0DNRzbR6OBJGPQKjSSDyme1oYdLj-0-9937bd8cbae558a90cf4dbd82cd6622f)
下面用一个实例来说明关系运算符的用法。
提示
应注意区分赋值运算符“=”和关系运算符“==”。“==”用于比较两个数是否相等,而“=”用于把右值赋给左值。
【实例4-3】关系运算符(代码4-3.txt)
新建名为“gxtest”的【C++ Source File】源程序,源代码如下所示:
![](https://epubservercos.yuewen.com/A8BCBE/16499866604816706/epubprivate/OEBPS/Images/Figure-P74_9421.jpg?sign=1739694382-lLnjyIZ9NQIHrXA8YrODRbDd35hdl3fr-0-b0132026e4262e90f6f1626b04d5c82f)
【代码详解】
在这个例子中,首先定义了int型变量a,赋值为10;int型变量b,赋值为9。接下来定义了bool型变量flag,给flag变量赋值a==b+1的结果,若a和b+1相等,则flag返回true,否则返回false,输出flag结果;给flag变量赋值a==b的结果,若a和b相等,则flag返回true,否则返回false,输出flag结果;给flag变量赋值a>b的结果,若a大于b,则flag返回true,否则返回false,输出flag结果;给flag变量赋值a>=b+1的结果,若a大于等于b,则flag返回true,否则返回false,输出flag结果;给flag变量赋值b>a的结果,若b>a,则flag返回true,否则返回false,输出flag结果;给flag变量赋值a>=b+1的结果,若a大于等于b+1,则flag返回true,否则返回false,输出flag结果;给flag变量赋值a<b+1的结果,若a小于b+1,则flag返回true,否则返回false,输出flag结果;给flag变量赋值a!=b的结果,若a不等于b,则flag返回true,否则返回false,输出flag结果。
运行结果如图4-3所示。
![](https://epubservercos.yuewen.com/A8BCBE/16499866604816706/epubprivate/OEBPS/Images/Figure-P75_9463.jpg?sign=1739694382-SVzZWYjKRx4Dj7wCMlCWDN1M4lC6R5j4-0-5f48aacd6f8a3c905b3923bb28cadf6d)
图4-3 代码运行结果
【实例分析】
从结果来看,使用关系运算符将比较后的结果输出,验证了关系运算符的含义。
4.1.4 逻辑运算符
在C++中,逻辑运算符是将多个关系表达式和逻辑量组成一个逻辑表达式,逻辑表达式的值可能为“真”或者“假”。逻辑运算符分为表4-4所示的几种类型。
表4-4 逻辑运算符
![](https://epubservercos.yuewen.com/A8BCBE/16499866604816706/epubprivate/OEBPS/Images/Figure-T75_9535.jpg?sign=1739694382-o8EiP7mEgWdnbpNF8e94uCjbOiYW9ndm-0-9a75274db5226f0883cb323b47a6d7ef)
逻辑运算符在实际编程过程中占有非常重要的地位,下面将可能的逻辑运算结果全部列出,作为在编程过程中的参考。
(1)&&(与)操作的所有可能条件及结果:
真&&真=真
真&&假=假
假&&假=假
(2)||(或)操作的所有可能条件及结果:
真||真=真
真||假=真
假||假=假
(3)!操作的所有可能条件及结果:
!真=假
!假=真
下面用一个实例来说明逻辑运算符的用法。
【实例4-4】逻辑运算符(代码4-4.txt)
新建名为“ljtest”的【C++ Source File】源程序,源代码如下所示:
![](https://epubservercos.yuewen.com/A8BCBE/16499866604816706/epubprivate/OEBPS/Images/Figure-P76_9644.jpg?sign=1739694382-lPCUUZ2DCtP4ATpu59LR7n2UHIZECaa9-0-c30afe4d3747cef254e3680cfdbbfd43)
【代码详解】
在这个例子中,首先定义了bool型变量a,赋值为true;bool型变量b,赋值为false。接下来定义了bool型变量flag,给flag变量赋值a&&b的结果,输出flag的结果;给flag变量赋值a||b的结果,输出flag的结果;给flag变量赋值!a的结果,输出flag的结果。
运行结果如图4-4所示。
![](https://epubservercos.yuewen.com/A8BCBE/16499866604816706/epubprivate/OEBPS/Images/Figure-P77_9655.jpg?sign=1739694382-8fextwvIj38fdmHgmwJUAyD3Lfi8kfrw-0-916d7efb3d18e8d4568edfc2e752eb65)
图4-4 代码运行结果
【实例分析】
从结果来看,真与假的结果为假,真或假的结果为真,非真的结果为假。
4.1.5 自增和自减运算符
在C++中,提供了两个比较特殊的运算符:自增运算符++和自减运算符--,这是一种对变量进行加1或减1操作中比较简便的方法。
虽然,++和--运算符解释起来非常简单,但是将它放到变量前面和后面的含义有所不同。下面举个例子来说明。
![](https://epubservercos.yuewen.com/A8BCBE/16499866604816706/epubprivate/OEBPS/Images/Figure-P77_9760.jpg?sign=1739694382-EwaSJuVKzjkHwpJ0jy3fIDC4LPpLoSX3-0-ee94ab56d3ccd7ee2fd4a9cd3a1ddfbc)
a=++num1;总的来看是一个赋值语句,把++num1的值赋给a,因为自增运算符在变量的前面,所以num1先自增加1变为5,然后赋值给a,最终a也为5。
b=num2++;是把num2++的值赋给b,因为自增运算符在变量的后面,所以先把num2赋值给b,b应该为8,然后num2自增加1变为9。
如果出现以下情况怎么处理呢?
![](https://epubservercos.yuewen.com/A8BCBE/16499866604816706/epubprivate/OEBPS/Images/Figure-P77_9761.jpg?sign=1739694382-GDVCF8pRklVLjxvRXO2IlTK5LTX2UO5E-0-cfcd5798b15ed04ae9522ca0b5af6c2b)
到底是c=(num1++)+num2;,还是c=num1+(++num2);,这要根据编译器来决定,不同的编译器可能有不同的结果。所以在以后编程的过程中,应该尽量避免出现这种复杂的情况。
下面使用一个实例来说明自增和自减运算符的使用方法。
【实例4-5】自增自减(代码4-5.txt)
新建名为“zztest”的【C++ Source File】源程序,源代码如下所示:
![](https://epubservercos.yuewen.com/A8BCBE/16499866604816706/epubprivate/OEBPS/Images/Figure-P77_9762.jpg?sign=1739694382-qHzXUKytbVRhVJzB6zSQiMn5nQdysy94-0-7fb46a8fe7a40c81fc87bf9e0b870465)
【代码详解】
在这个例子中,首先定义int型变量a并赋值为10,int型变量b并赋值为9,int型变量flag并赋值为a;然后a自加1,先输出flag,再输出a;接着将a自加1,赋值给flag,输出flag;最后将a输出,再自减1。
运行结果如图4-5所示。
![](https://epubservercos.yuewen.com/A8BCBE/16499866604816706/epubprivate/OEBPS/Images/Figure-P78_9798.jpg?sign=1739694382-YmHSRgYUUMd1SfDQrxMA1eIA6z1WWi1C-0-739545e1e9f2e4b2257f3fa6036ca735)
图4-5 代码运行结果
【实例分析】
从结果来看,使用“++”和“--”对a进行了自增和自减操作,验证了自增和自减的功能。
4.1.6 位逻辑运算符
前面介绍了逻辑运算符,本节介绍位逻辑运算符。位逻辑运算符与逻辑运算符有些相似之处,它也分为与、或、非等。
位逻辑运算符是对每位进行操作而不影响左右两位,这有别于常规逻辑运算符是对整个数进行操作的。表4-5列出了位逻辑运算符及其功能。
表4-5 位逻辑运算符及其功能
![](https://epubservercos.yuewen.com/A8BCBE/16499866604816706/epubprivate/OEBPS/Images/Figure-T78_9910.jpg?sign=1739694382-lNTJgXGTzLPS7O0Z2S8BqhqMuLnZoClO-0-44548d26603cd193dba7baaff47ea6c3)
下面详细地说明每种位逻辑运算符的使用。
1.~(按位取反)
将1变为0,将0变为1,例如:
![](https://epubservercos.yuewen.com/A8BCBE/16499866604816706/epubprivate/OEBPS/Images/Figure-P78_9880.jpg?sign=1739694382-RGbb7iKiwJgwZ5JPeAT6YBQKIi5fzMvY-0-39182a53a45eea405396f4f432beb593)
提示
按位取反时,如果操作数不是32位,会自动转为32位进行取反。
2.&(按位取与)
只有两个操作数都是1时结果才是1,否则为0。
![](https://epubservercos.yuewen.com/A8BCBE/16499866604816706/epubprivate/OEBPS/Images/Figure-P79_10119.jpg?sign=1739694382-xLMqMZEEQ9ebGqUDjWROsiWddOdLvAJt-0-f1c74d33a73ab529c2788a14c2386acd)
3.|(按位取或)
两个操作数任意一位为1,结果就是1。
![](https://epubservercos.yuewen.com/A8BCBE/16499866604816706/epubprivate/OEBPS/Images/Figure-P79_10120.jpg?sign=1739694382-evsYOpHIzRuPjqGNyaBMopDHSuS7LmwM-0-6f16b66c56da709c38f71e7e4014cd6e)
4.^(按位异或)
两个操作数不同为1,相同为0。
![](https://epubservercos.yuewen.com/A8BCBE/16499866604816706/epubprivate/OEBPS/Images/Figure-P79_10121.jpg?sign=1739694382-w6zC10lVWp0SqRazzcn3YCxUFaV1f68H-0-258862d40b10b6bf4ec538bbe961c1ee)
下面使用一个实例来说明如何运算。
【实例4-6】位逻辑运算符(代码4-6.txt)
新建名为“wtest”的【C++ Source File】源程序,源代码如下所示:
![](https://epubservercos.yuewen.com/A8BCBE/16499866604816706/epubprivate/OEBPS/Images/Figure-P79_10122.jpg?sign=1739694382-DUTCkfvhMDdQvLSOr1M2R2BzuJaSFsdv-0-035df6218cc968362d5dcd57ff10d05d)
【代码详解】
在该例的主程序中,首先定义int型变量a并赋值为10;然后定义int型变量b并赋值为12;接着定义int型变量flag并赋值为“a按位取反”,输出flag;接着给flag赋值“a与b”,输出flag;接着给flag赋值“a或b”,输出flag;最后给flag赋值“a异或b”,输出flag。
运行结果如图4-6所示。
![](https://epubservercos.yuewen.com/A8BCBE/16499866604816706/epubprivate/OEBPS/Images/Figure-P80_54451.jpg?sign=1739694382-yU765YnfVVZhqDzs1VH4xav4qPD07mA4-0-5b5275821ad4fbb4232609e0256de057)
图4-6 代码运行结果
【实例分析】
从整个示例来看,对4种按位逻辑运算的操作验证了按位逻辑运算的功能。
4.1.7 移位运算符
在C++中,移位运算符有双目移位运算符:<<(左移)和>>(右移)。移位运算符组成的表达式也属于算术表达式,其值为算术值。
左移运算是将一个二进制位的操作数按指定移动的位数向左移位,移出位被丢弃,右边的空位一律补0。右移运算是将一个二进制位的操作数按指定移动的位数向右移动,移出位被丢弃,左边移出的空位要么一律补0,要么补符号位,这由不同的机器而定。在使用补码作为机器数的机器中,正数的符号位为0,负数的符号位为1。
提示
在C/C++语言中,移位操作不要超过界限,否则,结果是不可预期的。
下面通过一个实例来说明按位移动的使用方法。
【实例4-7】移位运算符(代码4-7.txt)
新建名为“ywtest”的【C++ Source File】源程序,源代码如下所示:
![](https://epubservercos.yuewen.com/A8BCBE/16499866604816706/epubprivate/OEBPS/Images/Figure-P80_10246.jpg?sign=1739694382-8W9bN36yn1NWVJ9HW2FPdQbSIffh3lQY-0-62a1c04fbd07202efff2fb564f811e6f)
【代码详解】
在本例的主程序中,定义int型变量a并赋值为3,定义int型变量b并赋值为5,定义int型变量flag并赋值为“a左移一位”,输出flag;给flag赋值“b右移一位”,输出flag。
运行结果如图4-7所示。
![](https://epubservercos.yuewen.com/A8BCBE/16499866604816706/epubprivate/OEBPS/Images/Figure-P81_10257.jpg?sign=1739694382-d90VhPSsocDjUBtmyu2YJDfBmUCYY0rc-0-d586cb4913599672f3585f46697b2873)
图4-7 代码运行结果
【实例分析】
从结果来看,利用“<<”和“>>”实现了移位运算,对a和b分别左移和右移一位,输出结果如下:
![](https://epubservercos.yuewen.com/A8BCBE/16499866604816706/epubprivate/OEBPS/Images/Figure-P81_10384.jpg?sign=1739694382-fCSsFTQIFLXzGgjy3h2yae4L6PLLUSdA-0-524d589f1d4a8bfb3714916d8e6477d4)
4.1.8 三元运算符
在C++中,三元运算符“?:”又称为条件运算符,是if-else的简化表达形式。
![](https://epubservercos.yuewen.com/A8BCBE/16499866604816706/epubprivate/OEBPS/Images/Figure-P81_10385.jpg?sign=1739694382-GigiZhoKdTayRODChVNK2VD3eI67a4K6-0-dd582c854cb5ed51a205718b495c3e5a)
当表达式1为真时,计算表达式2的值;当表达式1为假时,计算表达式3的值。表达式2和表达式3只会计算其中之一。
提示
条件运算符可以出现在任何需要表达式的地方,这扩大了它的适用范围。在语法上只能出现表达式而不能出现语句的地方(如变量初始化),条件运算符有着不可替代的作用。
下面通过一个例子来说明条件运算符的操作方法和技巧。
【实例4-8】条件运算符(代码4-8.txt)
新建名为“sytest”的【C++ Source File】源程序,源代码如下所示:
![](https://epubservercos.yuewen.com/A8BCBE/16499866604816706/epubprivate/OEBPS/Images/Figure-P81_10386.jpg?sign=1739694382-AJxzec7IcHey4BwkSNBZXKrEDw0MLsVy-0-9ec09fcec5a49fcd2f22907438d32f37)
【代码详解】
在该例中,首先定义了一个int型变量ncakes,赋值为1;然后输出cake的个数,如果ncakes的值大于1,就在cake后面加s,否则不加。因为ncakes为1,所以输出cake后不加s。接下来,ncakes自加1,此时ncakes变为2,所以输出结果cake后面加s。
运行结果如图4-8所示。
![](https://epubservercos.yuewen.com/A8BCBE/16499866604816706/epubprivate/OEBPS/Images/Figure-P82_10398.jpg?sign=1739694382-ycz6TorH9acLUwnKK6v640IR3d7NNZb5-0-9763db73bff25c0a3b4ea8837df2920e)
图4-8 代码运行结果
【实例分析】
从运行结果来看,根据ncakes值的不同,输出cake加s或者不加s。
4.1.9 逗号运算符
C++提供一种特殊的运算符—逗号,用它将两个表达式连接起来。逗号运算符是优先级最低的运算符,它可以使多个表达式放在一行上,从而大大简化程序。逗号表达式又称为顺序求值运算符。逗号表达式的一般形式为:
![](https://epubservercos.yuewen.com/A8BCBE/16499866604816706/epubprivate/OEBPS/Images/Figure-P82_10408.jpg?sign=1739694382-6PZA4mm2ZWymVyn8o7cUOEDmRvT3vmQh-0-6be95cf0da1997c37260241e5feb8fb0)
逗号表达式的求解过程是:先求解表达式1,再求解表达式2。整个逗号表达式的值是表达式2的值。
提示
程序中使用逗号表达式,通常是要分别求逗号表达式内各表达式的值,并不一定要求整个逗号表达式的值。
一般情况下,使用逗号运算符进行多个变量的初始化或者用于多个自增语句。然而,逗号表达式是可以作为任何表达式的一部分的。它用于把多个表达式连接起来,用逗号进行间隔的表达式列表的值就是其中最右边的表达式的值,其他表达式的值都会被丢弃。这就意味着最右边的表达式的值就是整个逗号表达式的值。
下面通过一个例子来说明逗号运算符的使用方法。
【实例4-9】逗号的应用(代码4-9.txt)
新建名为“dtest”的【C++ Source File】源程序,源代码如下所示:
![](https://epubservercos.yuewen.com/A8BCBE/16499866604816706/epubprivate/OEBPS/Images/Figure-P82_10508.jpg?sign=1739694382-vGeFfWX8GTpYNOFqbNDupVMWGUhtoTYA-0-5a0b433071a2642988613d0d4b11e4f5)
【代码详解】
在该例中,首先定义了两个int型变量i和j,给j赋值为10,接着j自增到11,然后把j和100相加,最后把j(j的值仍为11)和999相加,这样最终的结果就是1010。
运行结果如图4-9所示。
![](https://epubservercos.yuewen.com/A8BCBE/16499866604816706/epubprivate/OEBPS/Images/Figure-P83_10521.jpg?sign=1739694382-UVgilId3YA0MIOnmUgUofQcW8cQAdRri-0-af0ec0e8f8564336c143459f83989518)
图4-9 代码运行结果
【实例分析】
从运行结果来看,使用逗号运算符把i和j的值隔开,实现了逗号运算符顺序求值的过程。
4.1.10 类型转换运算符
在进行运算时,肯定会遇到混合数据类型的运算。例如一个整型数和一个浮点数相加就是一个混合数据类型的运算。C++有两种方式对数据类型进行转换:一种是“自动转换”;另一种是“强制转换”。
(1)自动转换
自动转换是将数据类型按照从低到高的顺序进行转换,转换顺序如图4-10所示。
![](https://epubservercos.yuewen.com/A8BCBE/16499866604816706/epubprivate/OEBPS/Images/Figure-P83_10527.jpg?sign=1739694382-1sb9Zj8dtYRe5vQnG3OoPmHmRDzKhHno-0-90f4c75a7fa975b8a2a33f22b3af0c20)
图4-10 自动转换顺序
(2)强制转换
强制转换是指在程序中通过指定的数据类型来改变图4-11中的转换顺序,将一个变量从其定义的类型转换为另一种新的类型。强制转换类型有两种格式:
![](https://epubservercos.yuewen.com/A8BCBE/16499866604816706/epubprivate/OEBPS/Images/Figure-P85_10826.jpg?sign=1739694382-DhjhIoW70TIcl2pNQPKK5C58SfUdmlmQ-0-e0de26410f9728a3cae4131de5508ea1)
图4-11 代码运行结果
●(类型名)表达式
●类型名(表达式)
类型名是任何合法的C++数据类型,通过强制转换可以将“表达式”转换为合适的数据类型。