网站首页 > 教程分享 正文
第3小时 运算符和表达式
C语言的运算符范围很宽,把除了控制语句和输出输入语句以外的几乎所有的基本操作都作为运算符进行处理,如“=”作为赋值运算符,方括号作为下标运算符。C的运算符有下列几类:算术运算符(+ - * / %);赋值运算符(=);逗号运算符(,);关系运算符(== >= <= !=);逻辑运算符(! && ||);位运算符(>> &等);条件运算符(? :);指针运算符(* &);求字节运算符(sizeof);强制类型换运算符((类型));分量运算符(. >);下标运算符([])及其它。在这里我们介绍前五种运算符。用运算符和括号将运算对象连接起来的,符合C语法规则的式子,成为C表达式。
本章导读:1.掌握C语言基本的运算符性质
2.熟悉表达式的运算方式和结合性质
3.复习第一小时中的上级步骤
4.掌握运算符的优先级.
3.1算术运算符和表达式
C 语言分别用 +,-,* ,/ 表示四则运算的加、减、乘、除运算符。%是模运算符或称求余运算符,它的两端均应为整数部分,如7%4的值是3.需要说明的是,两个整数的除法的结果是整数,如5/3的结果为1,略去小数部分。但是除数或被除数中有一个是负数则舍入的方向会不同,如-5/3在有的机器上的结果是-1,有的机器上是-2。多数机器采用“向零取整”的方法。
用算术运算符和括号将运算对象连接起来的符合C语法规则的式子,称为C算术表达式。
例如:a*b/c-1.5+'a'。
如果在运算中有一个数为实数,则结果是double型的,因为所有的实数都按double进行运算。相关的程序代码在:光盘的progrom\第三小时下。
例: void main()
{ printf("\n\n%d,\n",20/7,-20/7);
printf("%f,%f\n",20.0/7,-20.0/7);
}
利用前面使用的方法把上面的程序写进TC环境中并保存,如图3.1所示。
图3.1 输入环境中
语句printf中%d和后面的输出结果是相对应的,这一点会在结果中体现。下面对程序进行编译和链接,并运行的结果。如图3.2所示。
图3.2 运行结果
3.2赋值运算符和表达式
赋值符号“=” 赋值运算符,它的作用是讲一个数据赋予另一个变量,也可以是将一个表达式的赋予一个常量。如“a=3”的作用是把常数3赋予常量a。
C语言中有复合的赋值语句,就是在“=”之前加上其他的运算符。常见的有+=,-=,*=,/=,%=等。应用符合运算符可以简化程序,同时也可以编译效率。
用赋值运算符将一个变量和一个表达式连接起来的式子称为赋值表达式。赋值表达式的一般形式是:<变量><赋值运算符><表达式>,(表达式也可以是赋值表达式)。
看几个表达式:a=b=c=5 (它的表达式为5,a,b,c值均为5)
a=5+(b=4) (表达式为11,a的值是11,b的值是4)
a=(b=10)/(c=2) (表达式为5,a 值为5,b值为10,c值为2)
赋值表达式中包含有复合的赋值运算符的情况,如a+=a-=a*a, 假设 a的初值是12,它的分开形式相当于(1) a-=a*a即a=a-a*a,a的值为-132,(2)a+=-132,即a=a+(-132),a的值为-264。
如果赋值运算符两边的数据类型不相同,系统将自动进行类型转换,即把赋值号右边的类型换成左边的类型。具体规定如下:
1)实型赋予整型,舍去小数部分。前面的例子已经说明了这种情况。
2)整型赋予实型,数值不变,但将以浮点形式存放,即增加小数部分(小数部分的值为0)。
3)将一个double型数据赋予float型变量时,截取其前7位有效数值,存放在float变量的存储单元(32位)中。但应注意数值范围不可以溢出。
4) 字符型赋予整型,由于字符型为一个字节,而整型为二个字节,故将字符的ASCII码值放到整型量的低八位中,高八位为0。整型赋予字符型,只把低八位赋予字符量。相关的程序代码在:光盘的progrom\第三小时下。
main()
{
int a,b=322;
float x,y=8.88;
char c1='k',c2;
a=y;
x=b;
a=c1;
c2=b;
printf("%d,%f,%d,%c",a,x,a,c2); }
在TC中的显示如图3.3所示。
图3.3输入环境中
本例表明了上述赋值运算中类型转换的规则。
(1)a为整型,赋予实型量y值8.88后只取整数8。
(2)x为实型,赋予整型量b值322, 后增加了小数部分。
(3)字符型量c1赋予a变为整型。
(4)整型量b赋予c2 后取其低八位成为字符型(b的低八位为01000010,即十进制66,按ASCII码对应于字符B)。
结果如图3.4所示。
图3.4 运行结果
3.3逗号运算符和表达式
逗号运算符是C语言提供的一种特殊的运算符,用它将两个表达式连接起来。如:4+3,5=6,称为逗号表达式,也称为“顺序求职运算符”它的表达式的一般形式为“表达式1,表达式2”,执行顺序是先进行表达式1,而后进行表达式2。整个逗号表达式的结果是表达式2的值。表达式可以扩展为“表达式1,表达式2,表达式3......表达式n”
观看下面的例子:相关的程序代码在:光盘的progrom\第三小时下。
main()
{ int a,b,x,y;
x=(a=3,6*3);
y=a=3,6*a;
printf("%d,%d,%d,%d",a,b,x,y);}
把上面的程序写进TC环境中,从命名为SP3_2.C ,如图3.5所示。
图3.5程序输入完毕
图3.3中第一处有下划线的说明整个逗号表达式的结果是最后一个表达式的值。第二处有下划线的说明并不是任何地方出现的逗号都是作为逗号运算符。第三处关键是与第二处进行对比 。当编译和链接正常时,就可以进行运行。如图3.6所示。
图3.6 运行结果
由运行结果可见x的取的是后面的3 *6=18,而printf中的逗号并不是全是逗号运算符,应看情况而定。严格地讲这个例子中用到了C语言中语句的含义。语句的含义将在后面的内容中讲到。
3.4关系运算符和表达式
C语言中提供的关系运算符有六种:>,<,>=,<=,==,!=。前四种关系运算符的级别相同,后面两种关系运算符的级别相同。且前四种的优先级高与两种。用关系运算符将两个表达式(算术运算表达式,赋值运算表达式,逗号运算表达式,关系运算表达式)相连的式子,称为关系表达式。
在C语言中关系表达式的值是一个逻辑值,非真即假。例如:“5==3”的值为“假”,“5>=3”的值为“真”。C语言中没有逻辑性数据,故而以“1”代表“真”,以“0”代表“假”。
假如设a=3,b=2,c=1,则:
关系表达式“a>b”的值为“真”,表达式的值为“1”。
关系表达式“(a>b)==c”的值为“真”,(因为a>b的值为1,等于c的值)表达式的值为“1”。
关系表达式“b+c<a”的值为“假”,表达式的值为“0”。
d=a>b d的值为1。
f=a>b>c f的值为0(因为“a>b”的运算符是自左至右的结合方向,先执行的值为1,再执行“1>c”,的值为0,把它赋予f)。
3.5 各类数值型数据之间的混合运算
前面讲到整形和实型可以混合运算,字符型数据可以同整型通用,故而整形,实型及字符型之间是可以混口运算的。在进行变量的运算中变量的数据类型是可以转换的。转换的方法有两种,一种是自动转换,一种是强制转换。
自动转换发生在不同数据类型的量混合运算时,由编译系统自动完成。自动转换遵循以下规则:
1) 若参与运算量的类型不同,则先转换成同一类型,然后进行运算。
2) 转换按数据长度增加的方向进行,以保证精度不降低。如int型和long型运算时,先把int量转成long型后再进行运算。
3) 所有的浮点运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成double型,再作运算。
4) char型和short型参与运算时,必须先转换成int型。
5) 在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。如果右边量的数据类型长度左边长时,将丢失一部分数据,这样会降低精度,丢失的部分按四舍五入向前舍入。
一般转换的方向如下:
float → double ← long ← unsigned ← int ← char,short
高 底
下图表示了类型自动转换的规则。相关的程序代码在:光盘的progrom\第三小时下。
main(){
float PI=3.14159;
int s,r=5;
s=r*r*PI;
printf("s=%d\n",s);}
在TC环境中如图3.7所示。
图3.7 程序解析
下面看它的运行结果如图3.8所示。
图3.8运行结果
强制类型转换是通过类型转换运算来实现的。其一般形式为;
(类型说明符)(表达式)
其功能是把表达式的运算结果强制转换成类型说明符所表示的类型。
(float) a 把a转换为实型
(int)(x+y) 把x+y的结果转换为整型
在使用强制转换时应注意以下问题:
1)类型说明符和表达式都必须加括号(单个变量可以不加括号),如把(int)(x+y)写成(int)x+y则成了把x转换成int型之后再与y相加了。
2) 无论是强制转换或是自动转换,都只是为了本次运算的需要而对变量的数据长度进行的临时性转换,而不改变数据说明时对该变量定义的类型。
main(){
float f=5.75;
printf("(int)f=%d,f=%f\n",(int)f,f);
}
在TC环境中如图3.9所示。
图3.9 程序输入完毕
下面看它的运行结果如图3.10所示。
图3.10 运行结果
3.6自增自减运算符
自增,自减运算符:自增1运算符记为“++”,其功能是使变量的值自增1。
自减1运算符记为“--”,其功能是使变量值自减1。
自增1,自减1运算符均为单目运算,都具有右结合性。可有以下几种形式:
++i i自增1后再参与其它运算。
--i i自减1后再参与其它运算。
i++ i参与运算后,i的值再自增1。
i-- i参与运算后,i的值再自减1。
在理解和使用上容易出错的是i++和i--。 特别是当它们出在较复杂的表达式或语句中时,常常难于弄清,因此应仔细分析。相关的程序代码在:光盘的progrom\第三小时下。
main(){
int i=8;
printf("%d\n",++i);
printf("%d\n",--i);
printf("%d\n",i++);
printf("%d\n",i--);
printf("%d\n",-i++);
printf("%d\n",-i--);
}
在TC环境中如图3.11所示。
图3.11 TC中运行
它的运行结果如图3.12所示。
图3.12 运行结果
main(){
int i=5,j=5,p,q;
p=(i++)+(i++)+(i++);
q=(++j)+(++j)+(++j);
printf("%d,%d,%d,%d",p,q,i,j);
}
在TC环境中如图3.13所示。相关的程序代码在:光盘的progrom\第三小时下。
图3.13 TC中运行
它的运行结果如图3.14所示。
图3.14 运行结果
3.7逻辑运算符和表达式
c语言中提供了三种逻辑运算符:
1) && 与运算 (相当于其他语言的AND)
2) || 或运算 (相当于其他语言的OR)
3) ! 非运算 (相当于其他语言的NOT)
表一显示逻辑运算符的真值表:
a | b | !a | !b | a&&b | a||b |
真 真 假 假 | 真 假 真 假 | 假 假 真 真 | 假 真 假 真 | 真 假 假 假 | 真 真 真 假 |
表一 逻辑运算符真值表
逻辑表达式的一般形式为:(表达式 逻辑运算符 表达式)。其中的表达式又可以是逻辑
表达式,从而构成嵌套形式。运算符&&和或运算符||均为双目运算符。具有左结合性。非运算符!为单目运算符,具有右结合性。逻辑运算符和其它运算符优先级的关系可表示如下:
!(非)→&&(与)→||(或)
按照运算符的优先顺序可以得出:
a>b && c>d 等价于 (a>b)&&(c>d)
!b==c||d<a 等价于 ((!b)==c)||(d<a)
a+b>c&&x+y<b 等价于 ((a+b)>c)&&((x+y)<b)
逻辑运算的值也为“真”和“假”两种,用“1”和“0 ”来表示。其求值规则如下:
1. 与运算 &&:参与运算的两个量都为真时,结果才为真,否则为假。
如:5>0 && 4>2,由于5>0为真,4>2也为真,相与的结果也为真。
2或运算||:参与运算的两个量只要有一个为真,结果就为真。 两个量都为假时,结果为假。如:5>0||5>8,由于5>0为真,相或的结果也就为真,而后面的5>8不执行。只有前项为假时,才对后项执行。
3.非运算!:参与运算量为真时,结果为假;参与运算量为假时,结果为真。如!(5>0)的结果为假。
注意:在C编译在给出逻辑运算值时,以“1”代表“真”,“0 ”代表“假”。 但反过来在判断一个量是为“真”还是为“假”时,以“0”代表“假”,以非“0”的数值作为“真”即将非零得值认为是真。例如:由于5和3均为非“0”因此5&&3的值为“真”,即为1;5||0的值为“真”,即为1。
逻辑运算表达式的值应该是一个逻辑量“真”或者“假”。下面看个例子,相关的程序代码在:光盘的progrom\第三小时下。
main()
{
char c='k';
int i=1,j=2,k=3;
float x=3e+5,y=0.85;
printf("%d,%d\n",!x*!y,!!!x);
printf("%d,%d\n",x||i&&j-3,i<j&&x<y);
printf("%d,%d\n",i==5&&c&&(j=8),x+y||i+j+k);
}
在TC环境中输入如图3.15所示。
图3.15 TC中运行
它的运行结果如图3.16所示。
图3.16 运行结果
3.8运算符的优先级及结合方向
在程序运行的过程中,就像在数学的运算中,有先后的优先级和结合方向。下面将要介绍上面与介绍过的运算符的优先级和结合方向。在表二中显示了他们的性质:
表二 运算符的优先级及结合方向
优先级 | 运算符 | 含义 | 运算对象个数 | 结合方向 |
1 | ! ++ ―― | 逻辑非运算符 自增运算符 自减运算符 | 1 (单目运算符) | 右→左 |
2 | * / % | 乘法运算符 除法运算符 求余运算符 | 2 (双目运算符) | 左→右 |
3 | + - | 加法运算符 减法运算符 | 2 (双目运算符) | 左→右 |
4 | < > <= >= | 关系运算符 | 2 (双目运算符) | 左→右 |
5 | && | 逻辑与运算符 | 2 (双目运算符) | 左→右 |
6 | || | 逻辑或运算符 | 2 (双目运算符) | 左→右 |
7 | = += -= ≥= ≤= | 赋值运算符 | 2 (双目运算符) | 右→左 |
8 | , | 逗号运算符 | 左→右 |
(1)同一优先级的运算符,运算次序又结合方向决定。
(2)本表并没有介绍所有的运算符,日后再遇到是应先了解它们的优先级。
3.9本小时总结
本小时主要讲解了C语言中基本的运算符,通过例题了解了它们的用法和性质。它们在以后的学习中将会有很大的作用。同时它们之间的优先级也是相当关键的,特别别是对于初接触它的人。
3.10实战练习
(1)写出下面程序运行的结果并上机进行验证:
main()
{ int i,j,m,n;
i= 8,j=10;
m=++i;
n=j++;
printf("%d,%d,%d,%d\n",i,j,m,n);
}
(2) 求下面表达式的值:
x+a%3(int)(x+y)%2/4;
(设 x=2.5,a=7,y=4.7)
(float)(a+b)/2+(int)x%(int)y。
(设 a=3,b=3,x=3.5,y=2.5)
猜你喜欢
- 2024-09-10 C语言知识分享:使用C语言实现一段动画效果,简单又易懂!
- 2024-09-10 菜鸟教程-C语言经典示例一(c语言菜鸟经典100例)
- 2024-09-10 另类方式讲解C语言指针!(另类方式讲解c语言指针的过程)
- 2024-09-10 C语言从入门到精通:步入C的世界(c 语言入门)
- 2024-09-10 征服C语言基础教程分享(征服c指针pdf)
- 2024-09-10 C语言也能干大事 教程 视频(c语言大佬)
- 2024-09-10 C语言杨辉三角思路讲解来啦!#程序员
- 2024-09-10 新手C语言教程第一弹|感性认识一波C语言
- 2024-09-10 第三集 | 入门c语言 HelloWorld 讲解03 #c语言
- 2024-09-10 初识C语言:简介、环境搭建、第一个HelloWorld
你 发表评论:
欢迎- 最近发表
-
- 有了这份900多页的Android面试指南,你离大厂Offer还远吗?
- K2 Blackpearl 流程平台总体功能介绍:常规流程功能
- 零基础安卓开发起步(一)(安卓开发入门视频)
- 教程:让你的安卓像Windows一样实现程序窗口化运行
- Android事件总线还能怎么玩?(事件总线有什么好处)
- Android 面试被问“谈谈架构”,到底要怎样回答才好?
- Android开发工具Parcel和Serialize
- Android 中Notification的运用(notification widget安卓)
- Android退出所有Activity最优雅的方式
- MT管理器-简单实战-去除启动页(mt管理器怎么去除软件弹窗)
- 标签列表
-
- css导航条 (66)
- sqlinsert (63)
- js提交表单 (60)
- param (62)
- parentelement (65)
- jquery分享 (62)
- check约束 (64)
- curl_init (68)
- sql if语句 (69)
- import (66)
- chmod文件夹 (71)
- clearinterval (71)
- pythonrange (62)
- 数组长度 (61)
- javafx (59)
- 全局消息钩子 (64)
- sort排序 (62)
- jdbc (69)
- php网页源码 (59)
- assert h (69)
- httpclientjar (60)
- postgresql conf (59)
- winform开发 (59)
- mysql数字类型 (71)
- drawimage (61)
本文暂时没有评论,来添加一个吧(●'◡'●)