转载自:

http://www.jizhuomi.com/software/32.html

上一讲鸡啄米给大家讲了一些数据类型,这一讲主要讲解编程入门知识-运算符和表达式。运算符,顾名思义,就是用于计算的符号,比如+,-,*,/。表达式是用于计算的公式,由运算符、运算量(操作数)和括号组成。

有些运算符需要两个操作数,使用形式为:操作数 运算符 操作数,这样的运算符就叫做二元运算符或双目运算符,只需要一个操作数的运算符叫做一元运算符或单目运算符。运算符具有优先级和结合性。如果一个表达式中有多个运算符则先进行优先级高的运算,后进行优先级低的运算。结合性就是指当一个操作数左边和右边的运算符优先级相同时按什么样的顺序进行运算,是自左向右还是自右向左,下面会具体讲到。鸡啄米来详细介绍几种类型的运算符和表达式。

 1.算术运算符和算术表达式

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

C++的自增运算符"++"和自减运算符"--"都是一元运算符,这两个运算符都有前置和后置两种形式,比如i++是后置,--j是前置。无论是前置还是后置都是将操作数的值增1或减1后再存到操作数内存中的位置。如果i的原值是2,则i++这个表达式的结果是2,i的值则变为3,。如果j的原值也是2,则--j这个表达式的结果是1,j的值也变为1。自增或自减表达式包含到更复杂的表达式中时,比如假设i的原值是1,cout<<i++这个表达式会先输出i的值1,然后i再自增1,变为2,而cout<<++i这个表达式会先使i先自增1变为2,然后再输出i的值2。

2.赋值运算符和赋值表达式

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

除了"="外,赋值运算符还有+=,-=,*=,/=,%=,<<=,>>=,&=,^=,|=。其中前五个是赋值运算符和算术运算符组成的,后五个是赋值运算符和位运算符组成的,这几个赋值运算符的优先级跟"="相同,结合性也是自右向左。鸡啄米举几个例子说明下,a+=5就等价于a=a+5,x*=y+3等价于x=x*(y+3)。

 3.逗号运算符和逗号表达式

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

   4.逻辑运算和逻辑表达式

C++中提供了用于比较的关系运算符和用于逻辑分析的逻辑运算符。

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

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

5.条件运算符和条件表达式

C++中唯一的一个三元运算符是条件运算符"?"。条件表达式的使用形式是:表达式1?表达式2:表达式3。表达式1是bool类型的,表达死2,3可以是任何类型,并且类型可以不同。条件表达式的类型是表达式2和3中较高的类型,类型的高低后面介绍。条件表达式会先解表达式1,如果表达式1的值是true,则解表达式2,表达式2的值就是条件表达式的值,而如果表达式1的值是false,则解表达式3,其值就是条件表达式的最终结果。比如:(a<b)?a:b,如果a小于b,则结果为a,如果a大于b,则结果为b。

6.sizeof运算符

sizeof运算符用来计算某个对象在内存中占用的字节数。此运算符的使用形式为:sizeof(类型名)或sizeof(表达式)。计算结果是这个类型或者这个表达式结果在内存中占的字节数。

 7.位运算

(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。

 8.混合运算时数据类型的转换。

表达式中的类型转换分为:隐含转换和强制转换。

在算术运算和关系运算中如果参与运算的操作数类型不一样,则系统会对其进行类型转换,这是隐含转换,转换的原则就是将低类型的数据转换为高类型数据。各类型从低到高依次为char,short,int,unsigned int,long,unsigned long,float,double。类型越高范围越大,精度也越高。隐含转换是安全的,因为没有精度损失。逻辑运算符的操作数必须是bool型,如果不是就需要将其转换为bool型,非0数据转换为true,0转换为false。位运算操作数必须是整数,如果不是也会自动进行类型转换,也是低类型数据转换为高类型数据。赋值运算要求赋值运算符左边的值和右边的值类型相同,不同的话也要进行自动转换,但这个时候不会遵从上面的原则而是一律将右值转换为左值的类型。比如,int iVal; float fVal; double dVal;则dVal=iVal*fVal;计算时先将iVal转换为跟fVal一样的float型,乘法的结果再转换为double型。

强制类型转换是由类型说明符和括号来实现的,使用形式为:类型说明符(表达式)  或   (类型说明符)表达式。它是将表达式的结果类型强制转换为类型说明符指定的类型。比如,float fVal=1.2;  int iVal = (int)fVal;计算后面表达式的值时会将1.2强制转换成1,舍弃小数部分。

好了,鸡啄米今天就讲到这里了,又是很重要的基础知识,以后学习中有很多地方会混淆,注意要记牢哦。

鸡啄米:C++编程入门系列之五(运算符和表达式)相关推荐

  1. 鸡啄米:C++编程入门系列之二(原码、反码与补码)

    转载自: http://www.jizhuomi.com/software/23.html 上一节进制数中鸡啄米讲了二进制.八进制.十进制和十六进制数的表示方法和相互转换关系.这节主要讲解二进制的几种 ...

  2. c语言类静态数据成员函数,鸡啄米:C++编程入门系列之二十一(C++程序设计必知:类的静态成员)...

    鸡啄米在上一讲数据和函数中讲到,函数之间共享数据也就是此函数访问彼函数的数据主要是通过局部变量.全局变量.类的数据成员.类的静态成员及友元实现的,前三个已经讲过了,这一讲鸡啄米来讲讲静态成员.静态成员 ...

  3. 鸡啄米VS2010/MFC编程入门教程——学习1初次接触

    2015年5月12日23:13:44 2013年~2014年,在九固开发伺服上位机的时候,刚开始的时候还想用VC6.0开发的,但是在WIN7下,各种不兼容,索性干脆直接换了VC2010. 原本想装VS ...

  4. 鸡啄米之VS2010/MFC编程入门之二十四(常用控件:列表框控件ListBox)

    目录 一.目的: 1.点击列表框某个变量后,编辑框就显示出来这个变量名字 一.参考: 1.VS2010/MFC编程入门之二十四(常用控件:列表框控件ListBox) ①总结:good:亲测有效,适合多 ...

  5. 鸡啄米vc++2010系列11(非模态对话框的创建)

    上一节鸡啄米讲了模态对话框及其弹出过程,本节接着讲另一种对话框--非模态对话框的创建及显示. 鸡啄米已经说过,非模态对话框显示后,程序其他窗口仍能正常运行,可以响应用户输入,还可以相互切换.鸡啄米会将 ...

  6. 鸡啄米vc++2010系列27(列表视图控件List Control 上)

    列表视图控件简介 列表视图控件List Control同样比较常见,它能够把任何字符串内容以列表的方式显示出来,这种显示方式的特点是整洁.直观,在实际应用中能为用户带来方便. 列表视图控件是对前面讲到 ...

  7. 鸡啄米vc++2010系列40(文档、视图和框架:分割窗口)

    分割窗口概述 分割窗口,顾名思义,就是将一个窗口分割成多个窗格,在每个窗格中都包含有视图,或者是同一类型的视图,或者是不同类型的视图. MFC分割窗口的方式有两种,动态分割和静态分割. 动态分割窗口通 ...

  8. 鸡啄米vc++2010系列35(工具栏资源及CToolBar类)

    工具栏简介 工具栏一般位于主框架窗口的上部,菜单栏的下方,由一些带图片的按钮组成.当用户用鼠标单击工具栏上某个按钮时,程序会执行相应的操作,如果鼠标没有点击,只是停留在某个按钮上一会后,会弹出一个小窗 ...

  9. 鸡啄米vc++2010系列12(属性页对话框)

    前面讲了模态对话框和非模态对话框,本节开始鸡啄米讲一种特殊的对话框--属性页对话框.另外,本套教程所讲大部分对VC++各个版本均可适用或者稍作修改即可,但考虑到终究还是基于VS2010版本的,所以将& ...

最新文章

  1. Go 学习笔记(45)— Go 标准库之 flag(命令行参数解析)
  2. 进入计算机用户名和密码,巧用U盘进入设密码系统免于输入用户名和登录密码...
  3. Py之mpld3:mpld3的简介、安装、使用方法之详细攻略
  4. 烧水壶起水沟了怎么办?
  5. 浅析请求转发和重定向
  6. c语言复数的运算实验报告,C语言复数的运算(实验报告).doc
  7. java udp丢包_linux 系统 UDP 丢包问题分析思路
  8. THUSC2019 退役记
  9. 各种渲染软件设计理论详解
  10. 流水线、精益生产、丰田生产方式和TOC的基本原则
  11. 介绍一款界面自动化的工具
  12. POJ 2187 凸包旋转卡壳
  13. Task5:第五回:样式色彩秀芳华
  14. android log抓取工具,Android PC端用ADB抓取指定应用日志实现步骤
  15. 寒假第二周学习总结与反思
  16. 三维空间刚体变换:欧拉角、旋转向量、四元数
  17. 武汉理工大学计算机学院转专业细则,计算机学院武汉理工大学2009年各学院转专业工作实施细则.doc...
  18. Python 根据身份证号码计算持有者年龄
  19. 浅谈混迹力扣和codeforces上的几个月
  20. 给自己:得失心莫太重,功利心莫太强

热门文章

  1. html——个人信息网页
  2. hj118888.com162287l9999提出的mysql索引问题
  3. HTTP协议之multipart/form-data请求分析
  4. 计蒜客 腾讯的一笔画游戏
  5. C#连接Access2013
  6. 标准化与归一化的差异
  7. 电力系统暂态稳定性分析,发电机相轨迹,转速功角曲线分析。ieee39,四机两区。
  8. SOA精华的内容和实用的知识
  9. linux达芬奇安装教程,在Linux系统中能安装和运行达芬奇DaVinci Resolve 17版本
  10. access怎么查询工龄_计算机二级Access数据库查询的功能教程