《第2章数据类型运算符表达式(2)定稿(精品).ppt》由会员分享,可在线阅读,更多相关《第2章数据类型运算符表达式(2)定稿(精品).ppt(131页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 常量与变量常量与变量 整型、实型、字符型数据整型、实型、字符型数据 变量的初始化变量的初始化 各类数值型数据间的混合运算各类数值型数据间的混合运算 算术运算符与算术表达式算术运算符与算术表达式 赋值运算符与赋值表达式赋值运算符与赋值表达式 逗号运算符与逗号表达式逗号运算符与逗号表达式第二章第二章 数据类型、运算符与表达式数据类型、运算符与表达式常量常量程序运行期间,值不能被改变的量称为程序运行期间,值不能被改变的量称为常量常量C C语言有两种实现常量的方法:语言有两种实现常量的方法:直接常量直接常量和和符号常量符号常量直接常量直接常量v直接常量直接常量,就是直接具有具体的值的数据。,就是直接
2、具有具体的值的数据。如如:1,02,0 x3c;整型常量整型常量 0.1,10.0e-3;实型常量实型常量 a,1;字符常量字符常量 “hello”字符串常量字符串常量符号常量符号常量v符号常量符号常量:用一个标识符代表一个常量:用一个标识符代表一个常量实现方式:实现方式:#define 标识符标识符 字符串字符串它的作用是用指定的标识符去代表一个字它的作用是用指定的标识符去代表一个字符串。符串。#define PI 3.14159#define PI 3.14159int main()int main()float r,c,s,v;r=20;float r,c,s,v;r=20;c=2*c=
3、2*PIPI*r;printf(“*r;printf(“周长周长周长周长=%f”,c);=%f”,c);s=s=PIPI*r*r;printf(“*r*r;printf(“面积面积面积面积=%f”,s);=%f”,s);v=4*v=4*PIPI*r*r*r/3;printf(“*r*r*r/3;printf(“体积体积体积体积=%f”,v);=%f”,v);return 0;return 0;符号常量的实现符号常量的实现这个这个这个这个字符串字符串字符串字符串将要在预将要在预将要在预将要在预处理时去替换符号处理时去替换符号处理时去替换符号处理时去替换符号PIPIPIPIPIPIPIPI会被指定
4、的字符串会被指定的字符串会被指定的字符串会被指定的字符串3.141593.141593.141593.14159代替代替代替代替符号常量的注意事项符号常量的注意事项必须注意的是:必须注意的是:符号常量不是变量,符号常量不是变量,不能被赋值。不能被赋值。#define#define PIPI 3.14159 3.14159int main()int main()PIPI=100;=100;这样的赋值是错误的这样的赋值是错误的这样的赋值是错误的这样的赋值是错误的符号常量的注意事项符号常量的注意事项必须注意的是:必须注意的是:如果指定的符号出现如果指定的符号出现在双引号中,就不被替换。在双引号中,就
5、不被替换。#define#define PIPI 3.14159 3.14159int main()int main()printf(“PI=%f”,printf(“PI=%f”,PIPI););这个这个这个这个PIPIPIPI不会被替换不会被替换不会被替换不会被替换这个这个这个这个PIPIPIPI会被替换会被替换会被替换会被替换转义字符常量转义字符常量另外:语言还存在另一种形式的特殊另外:语言还存在另一种形式的特殊的字符常量。的字符常量。它是用单引号括起来的以一个它是用单引号括起来的以一个“”字字符符开头的规定的字符序列开头的规定的字符序列,称为称为“转义字转义字符常量符常量”。比如比如:n
6、,t,r,转义字符常量及其含义转义字符常量及其含义转义字符转义字符转义字符转义字符含义含义含义含义ASCIIASCIIASCIIASCII 代码代码代码代码控控控控制制制制字字字字符符符符nnnn回车换行回车换行回车换行回车换行(光标移到下一行第一列光标移到下一行第一列光标移到下一行第一列光标移到下一行第一列)10101010tttt水平制表水平制表水平制表水平制表 (光标移到下一个光标移到下一个光标移到下一个光标移到下一个TabTabTabTab位位位位置置置置)9 9 9 9bbbb退格退格退格退格(光标移回到同一行前一列光标移回到同一行前一列光标移回到同一行前一列光标移回到同一行前一列)
7、8 8 8 8rrrr回车回车回车回车(光标移到同一行第一列光标移到同一行第一列光标移到同一行第一列光标移到同一行第一列)13131313ffff换页换页换页换页(光标移到下一页开头光标移到下一页开头光标移到下一页开头光标移到下一页开头)12121212转义字符常量及其含义转义字符常量及其含义转义字符转义字符转义字符转义字符含义含义含义含义ASCIIASCIIASCIIASCII 代码代码代码代码dddddddddddddddddddddddd为为为为1 1 1 1至至至至3 3 3 3位八进制数字构成位八进制数字构成位八进制数字构成位八进制数字构成,表表表表示对应的示对应的示对应的示对应的A
8、SCIIASCIIASCIIASCII码的字符码的字符码的字符码的字符xddxddxddxdddddddddd为为为为1 1 1 1至至至至2 2 2 2位十六进制数字构成位十六进制数字构成位十六进制数字构成位十六进制数字构成,表表表表示对应的示对应的示对应的示对应的ASCIIASCIIASCIIASCII码的字符码的字符码的字符码的字符特特特特殊殊殊殊标标标标点点点点符符符符号号号号反斜杠字符反斜杠字符反斜杠字符反斜杠字符 “”92929292 单引号单引号单引号单引号(撇号撇号撇号撇号)字符字符字符字符 39393939 “双引号字符双引号字符双引号字符双引号字符 “34343434变量变
9、量程序运行期间,值可以被改变的量称为程序运行期间,值可以被改变的量称为变量变量 语言允许把数据存放在变量中,每一个语言允许把数据存放在变量中,每一个变量都由一个变量名来标识。变量都由一个变量名来标识。每个变量都必须具有一个类型。每个变量都必须具有一个类型。每个变量根据它的类型,在内存中占据一每个变量根据它的类型,在内存中占据一定数目的字节单元,该变量的值就存放在定数目的字节单元,该变量的值就存放在这些内存单元中。这些内存单元中。变量变量123123prodprod变量名变量名变量名变量名 prod prod prod prod 实际上是一个实际上是一个实际上是一个实际上是一个符号地址符号地址符
10、号地址符号地址内存单元内存单元内存单元内存单元的的的的地址地址地址地址123123是变量是变量是变量是变量prodprod的的的的变量值变量值变量值变量值内存单元内存单元内存单元内存单元的的的的内容内容内容内容变量的本质就是命名的内存单元变量的本质就是命名的内存单元变量的命名规定变量的命名规定语言中,变量(标识符)的语言中,变量(标识符)的命名规定命名规定:只能由大小写字母、下划线和数字组成;只能由大小写字母、下划线和数字组成;开头的第一个字符只能是大小写字母或开头的第一个字符只能是大小写字母或 下划线;下划线;大小写是敏感的;大小写是敏感的;不能与的关键字重复;不能与的关键字重复;名字在整个
11、程序中必须是唯一的;名字在整个程序中必须是唯一的;名字的长度不能超过系统的规定。名字的长度不能超过系统的规定。变量非法命名的例子变量非法命名的例子非法的非法的变量名:变量名:3rd_entry (数字开头数字开头)all$done(包含非法字符包含非法字符$)the end (包含空格包含空格)int (系统关键字系统关键字)不好的变量命名的例子不好的变量命名的例子不是很好的不是很好的变量名:变量名:a,aa (不知何意不知何意)numberofstudent (全部小写难以辨认全部小写难以辨认)totaltotals (名字太相似名字太相似)变量的定义和使用变量的定义和使用语言中规定,变量必
12、须语言中规定,变量必须“先定义,后使用先定义,后使用”系统将根据变量的定义为其分配相应大小的系统将根据变量的定义为其分配相应大小的内存单元。内存单元。变量的定义和使用变量的定义和使用int radius;/*radius of circle*/关键字关键字 intint 告诉编译系告诉编译系统我要定义统我要定义一个整型变一个整型变量,用它来量,用它来保存一个整保存一个整型的数值。型的数值。这是变量的这是变量的名字。以后名字。以后的程序中就的程序中就用这个名字用这个名字来访问这个来访问这个变量。变量。注释用来解释注释用来解释这个变量,它这个变量,它是给程序员的是给程序员的信息。对程序信息。对程序
13、中的重要变量中的重要变量作注释是很好作注释是很好的编程习惯。的编程习惯。变量的定义格式变量的定义格式变量定义的一般格式是:变量定义的一般格式是:type name;/*comment*/类型类型 名字;名字;/*/*注释注释*/int age;/*age of student*/int age;/*age of student*/float score;/*score of student*/float score;/*score of student*/float average;/*average of score*/float average;/*average of score*/lo
14、ng number;/*number of student*/long number;/*number of student*/char UserSelection;/*key user hit*/char UserSelection;/*key user hit*/#include#include int main()int main()int a,b,int a,b,sumsum;a=123;b=456;a=123;b=456;sum=a+b;sum=a+b;printf(“sum=%dn”,printf(“sum=%dn”,simsim););return 0;return 0;变量先定
15、义后使用的好处变量先定义后使用的好处此处定义的变此处定义的变量名是量名是 sumsum此处由于输此处由于输入错误或其入错误或其它原因,出它原因,出现了名字为现了名字为 simsim 的符号。的符号。由于该符号由于该符号在这之前从在这之前从未定义过,未定义过,所以在编译所以在编译时,便会出时,便会出现错误信息。现错误信息。Error:Undefined symbol sim#include#include int main()int main()int a,re;float c;int a,re;float c;a=23;c=2.5;a=23;c=2.5;re=a%c;re=a%c;printf
16、(“printf(“余数余数余数余数=%dn”,re);=%dn”,re);return 0;return 0;变量先定义后使用的好处变量先定义后使用的好处变量变量a a是整型是整型符号符号是是“求求余余”运算符,运算符,它要求参与运它要求参与运算的数据必须算的数据必须是整型的。而是整型的。而变量变量c c却是实却是实型的,型的,所以编所以编译时就会出现译时就会出现错误信息。错误信息。Error:Illegal use of floating point变量变量c c是实型是实型整型变量的分类整型变量的分类类型类型类型类型关键字关键字关键字关键字字节数目字节数目字节数目字节数目(VC+)(VC
17、+)(VC+)(VC+)有符号有符号有符号有符号signedsignedsignedsigned基本整型基本整型基本整型基本整型intintintint4 4 4 4 字节字节字节字节短短短短整型整型整型整型shortshortshortshort 2 2 2 2 字节字节字节字节长整型长整型长整型长整型longlonglonglong4 4 4 4 字节字节字节字节无符号无符号无符号无符号unsignedunsignedunsignedunsigned基本整型基本整型基本整型基本整型unsigned intunsigned intunsigned intunsigned int4 4 4 4
18、字节字节字节字节短短短短整型整型整型整型unsigned unsigned unsigned unsigned shortshortshortshort2 2 2 2 字节字节字节字节长整型长整型长整型长整型unsigned unsigned unsigned unsigned longlonglonglong4 4 4 4 字节字节字节字节整型数据在内存中的存储方式整型数据在内存中的存储方式数据在内存中是以数据在内存中是以“二进制数二进制数”的形式存放的。的形式存放的。更准确的说:数据在内存中是以更准确的说:数据在内存中是以“二进制数二进制数”的的“补码补码”形式存放的。形式存放的。整型数据
19、在内存中的存储方式整型数据在内存中的存储方式如果是语句如果是语句:short a=-10;那么内存中那么内存中实际存放的是实际存放的是-10 的补码的补码a-10 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0例如有语句例如有语句:short a=10;那么内存中实那么内存中实际存放的是际存放的是+10 的补码的补码a 100 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0整型数据补码的求法:正数整型数据补码的求法:正数正数的补码等于正数的原码(二进制表示)。正数的补码等于正数的原码(二进制表示)。0000 000010100000+10的原码:的原码:+10的二进
20、制数,最高位为的二进制数,最高位为00000 000010100000+10的反码:等于的反码:等于+10的原码的原码0000 000010100000+10的补码:等于的补码:等于+10的原码的原码整型数据补码的求法:负数整型数据补码的求法:负数负数的补码等于负数的反码加负数的补码等于负数的反码加1 1。0000 000010100001-10的原码:的原码:+10的原码,将最高位变为的原码,将最高位变为11111 111101011111-10的反码:原码最高位不动,其余位取反的反码:原码最高位不动,其余位取反1111 111011011111-10的补码:反码整个加上的补码:反码整个加上
21、1有符号和无符号的区别有符号和无符号的区别 有符号和无符号的区别是什么?有符号和无符号的区别是什么?关键在于关键在于“最高位最高位”的性质。的性质。对于对于有符号数据有符号数据:把最高位作为符号位:把最高位作为符号位表示数据的符号表示数据的符号(0(0为正,为正,1 1为负为负),其余位其余位保存具体数值,因此可以用于正确保存限保存具体数值,因此可以用于正确保存限值范围内的正数或负数。值范围内的正数或负数。对于对于无符号数据无符号数据:最高位不作为符号位,:最高位不作为符号位,全部的位都用来表示数据的数值,因此可全部的位都用来表示数据的数值,因此可以用于正确保存限值范围内的正数。以用于正确保存
22、限值范围内的正数。有符号和无符号的区别有符号和无符号的区别例如:对于数例如:对于数 1 0 0 0 1 1 1 1当把它看成无符号数时,它是当把它看成无符号数时,它是 143当把它看成有符号数时,它是当把它看成有符号数时,它是 113,因为最高位是因为最高位是 1,所以它是,所以它是负数负数,而且,而且1 0 0 0 1 1 1 1 所是这个负数的补码。所是这个负数的补码。要想得到这个负数的大小,必须由补码倒要想得到这个负数的大小,必须由补码倒回去求出原码才能得到大小。回去求出原码才能得到大小。把负数的补码全部按位取反然后加一得到把负数的补码全部按位取反然后加一得到它的大小。它的大小。有符号和
23、无符号的区别有符号和无符号的区别例如:对于数例如:对于数 0 0 0 0 1 1 1 1当把它看成无符号数时,它是当把它看成无符号数时,它是 15当把它看成有符号数时,它是当把它看成有符号数时,它是 15,因因为最高位是为最高位是0,所以它是正数,它的大小就所以它是正数,它的大小就是是 0 0 0 1 1 1 1 所对应的十进制数。所对应的十进制数。变量的定义变量的定义变量的定义一般放在函数体的开头部分。变量的定义一般放在函数体的开头部分。定义方法:定义方法:类型符类型符 变量名列表;变量名列表;(用逗号分隔)(用逗号分隔)如整型变量的定义:如整型变量的定义:int num;unsigned
24、int age,score;long distant,SampleTimes;实型变量的定义实型变量的定义如如实型变量的定义:实型变量的定义:float TotalScore,AverScore;double area,result;long double radium;注:语言中的所有注:语言中的所有关键字关键字都是都是小写小写的。的。字符型变量的定义字符型变量的定义如字符型变量的定义如字符型变量的定义:char InputKey,UserSelection;unsigned char lines,grade;课堂练习课堂练习 问题问题1:字符串字符串“”占几个字节单元占几个字节单元?(A)
25、0个个(B)1个个(C)2个个 问题问题2:这样的赋值这样的赋值char c1=“”;是否正确?是否正确?(A)正确正确(B)不正确不正确答案答案:(B)答案答案:(B)课堂练习课堂练习 问题问题3:1 和和 1 是否相同?为什么是否相同?为什么?答案:不相同。答案:不相同。因为前者是整数因为前者是整数1,它的它的值是值是1,而后者是字符而后者是字符 1,它的值是它的值是49(ASCII码码)。问题问题4:1+0 和和 1 是否相同?是否相同?答案:相同。答案:相同。因为字符因为字符 0 0 的值是的值是48,加加1等于等于49,正好是字符正好是字符 1 的值的值。课堂练习课堂练习5.要将字符
26、要将字符 A 赋给字符变量赋给字符变量ch,下列语下列语句中正确的是句中正确的是()(A)ch=A(B)ch=a-32(C)ch=“A”(D)ch=“65”答案:答案:(B)2.3.22.3.2 变量赋初值变量赋初值变量赋初值变量赋初值变量在定义时值是不确定的。所以在变量变量在定义时值是不确定的。所以在变量初始化之前,不能让其参与运算,否则会初始化之前,不能让其参与运算,否则会得到不可预知的结果。得到不可预知的结果。int Total,Average;Total=Average*40;Total和和Average的值都是不确定的的值都是不确定的。变量赋初值的方法变量赋初值的方法 可以在定义变量
27、的同时进行初始化可以在定义变量的同时进行初始化如如:int TotalStudent=40;等价于等价于:int TotalStudent;TotalStudent=40;变量赋初值变量赋初值定义多个变量时,可以对其全部或部分定义多个变量时,可以对其全部或部分进行初始化进行初始化如:如:int TotalStudent=40,average,TotalScore=0;变量赋初值变量赋初值不能用连续赋值方式给多个变量赋同一初值不能用连续赋值方式给多个变量赋同一初值如:如:int TotalScore=AverScore=0;是错误的。是错误的。正确的应该是:正确的应该是:int TotalSco
28、re=0,AverScore=0;课堂练习课堂练习 下列变量说明语句中,正确的是下列变量说明语句中,正确的是()(A)char a=b=c=0;(B)char a;b;c;(C)int x,char c;(D)int x,y,z=0;答案:答案:(D)2.4.12.4.1 算术运算符和算术表达算术运算符和算术表达式式 基本的算术运算符基本的算术运算符 优先级别和结合性的概念优先级别和结合性的概念(2.6)(2.6)自增、自减运算符自增、自减运算符算术运算符和算术表达式算术运算符和算术表达式算术运算符(双目):算术运算符(双目):加加 减减 *乘乘 /除除 求余求余注意注意:参与求余运算的运算量
29、必须是参与求余运算的运算量必须是整型数据类型。整型数据类型。如:如:20*4;10-3+5*2-8%9/3;3%5 算术运算符的优先级和结合性算术运算符的优先级和结合性 算术运算符的算术运算符的优先级:优先级:*、/、同级同级、同级同级高高低低 算术运算符的算术运算符的结合性:结合性:自左向右自左向右优先级和结合性的概念优先级和结合性的概念优先级优先级:运算符的优先级并不决定计算:运算符的优先级并不决定计算的顺序,它只决定和它相邻的运算量是否的顺序,它只决定和它相邻的运算量是否优先和它一起构成相应的表达式。优先和它一起构成相应的表达式。结合性结合性:系统在求解一个表达式之前,:系统在求解一个表
30、达式之前,先要依据各种运算符的先要依据各种运算符的“优先级优先级”,对其,对其进进行行“因式分解因式分解”。整个表达式不断分解因。整个表达式不断分解因式,分解完成后,最终确定为一种级别最式,分解完成后,最终确定为一种级别最低的运算表达式,然后就按照这种运算符低的运算表达式,然后就按照这种运算符的结合性开始计算整个表达式的值。的结合性开始计算整个表达式的值。优先级和结合性的概念优先级和结合性的概念参考课本的附录参考课本的附录293页页语言全部语言全部34种运算符的性质以及种运算符的性质以及优先级和结合性。优先级和结合性。优先级和结合性的概念优先级和结合性的概念分解因式(按各种运算符的优先级)分解
31、因式(按各种运算符的优先级)10 -3 +5 *2 -8%9 /310 -3 +(5 *2)(8%9 /3)7+(5 *2)(8%9 /3)7+10 (8%9/3)17 (8%9/3)17 (8/3)17 215开始求解(按各种运算符的结合性)开始求解(按各种运算符的结合性)自增、自减运算符自增、自减运算符自增、自减运算符(单目)自增、自减运算符(单目)运算符:运算符:自增自增 自减自减 优先级:优先级:高于算术运算符,和强制类型高于算术运算符,和强制类型 转换运算符同级转换运算符同级结合性:结合性:右结合性右结合性作作 用:用:使变量的值加使变量的值加或减或减自增、自减运算符自增、自减运算符
32、用法:用法:+变量变量 -变量变量 (运算符前置运算符前置用法用法)变量变量+变量变量 -(运算符后置运算符后置用法用法)运算符前置运算符前置时:时:变量先加变量先加(减减),后被使用,后被使用(参与其它运算参与其它运算)+i i -i i?两种用法的区别在哪?两种用法的区别在哪?运算符后置运算符后置时:时:变量先被使用变量先被使用(参与其它运参与其它运算算),后加,后加(减减)i+i-i+i-自增、自减运算符不同用法的区别自增、自减运算符不同用法的区别假设假设假设假设i=5i=5+i+i这是一个自这是一个自这是一个自这是一个自增表达式。增表达式。增表达式。增表达式。这个这个这个这个表达式表达
33、式表达式表达式的值等于的值等于的值等于的值等于6 6 6 6。由于运算符由于运算符由于运算符由于运算符在前,所以在前,所以在前,所以在前,所以变量先加变量先加变量先加变量先加1 1 1 1,i i i i 等于等于等于等于6 6 6 6。i+i+然后变量然后变量然后变量然后变量的值再加的值再加的值再加的值再加1 1 1 1等于等于等于等于6 6 6 6。由于运算符在由于运算符在由于运算符在由于运算符在后,所以先得后,所以先得后,所以先得后,所以先得到整个自增到整个自增到整个自增到整个自增表表表表达式的值等于达式的值等于达式的值等于达式的值等于5 5 5 5。自增、自减运算符:例自增、自减运算符
34、:例#include#include int main()int main()int a=5;int a=5;+a;+a;printf(a=%dn,a);printf(a=%dn,a);a-;a-;printf(a=%dn,a);printf(a=%dn,a);a+;-a;a+;-a;printf(a=%dn,a);printf(a=%dn,a);运行结果运行结果:a=6 a=5 a=5自增、自减运算符:例自增、自减运算符:例#include#include int main()int main()int a=5,m;int a=5,m;m=+am=+a;printf(a=%d,m=%dn,a
35、,m);printf(a=%d,m=%dn,a,m);m=a-;m=a-;printf(a=%d,m=%dn,a,m);printf(a=%d,m=%dn,a,m);+a;m-;+a;m-;printf(a=%d,m=%dn,a,m);printf(a=%d,m=%dn,a,m);printf(a=%d,m=%dn,a-,+m printf(a=%d,m=%dn,a-,+m););由于运算符前置,所以变量由于运算符前置,所以变量由于运算符前置,所以变量由于运算符前置,所以变量a a a a先加先加先加先加1 1 1 1,然后再被使用。此处,然后再被使用。此处,然后再被使用。此处,然后再被使用。
36、此处的使用是参与赋值运算,所以的使用是参与赋值运算,所以的使用是参与赋值运算,所以的使用是参与赋值运算,所以把已经加过把已经加过把已经加过把已经加过1 1 1 1的变量的变量的变量的变量a a a a 赋值给赋值给赋值给赋值给变量变量变量变量m m m m。整个过程相当于顺序整个过程相当于顺序整个过程相当于顺序整个过程相当于顺序执行以下两个语句:执行以下两个语句:执行以下两个语句:执行以下两个语句:a=a+1;a=a+1;a=a+1;a=a+1;m=a;m=a;m=a;m=a;自增、自减运算符:例自增、自减运算符:例#include#include int main()int main()in
37、t a=5,m;int a=5,m;m=+a;m=+a;printf(a=%d,m=%dn,a,m);printf(a=%d,m=%dn,a,m);m=a-;m=a-;printf(a=%d,m=%dn,a,m);printf(a=%d,m=%dn,a,m);+a;m-;+a;m-;printf(a=%d,m=%dn,a,m);printf(a=%d,m=%dn,a,m);printf(a=%d,m=%dn,a-,+m printf(a=%d,m=%dn,a-,+m););由于运算符后置,所以先使由于运算符后置,所以先使用,即把用,即把a a赋值给赋值给m m,然后然后再减再减1 1。整个过程
38、相当于顺。整个过程相当于顺序执行以下两个语句:序执行以下两个语句:m=a;m=a;a=a-1;a=a-1;自增、自减运算符:例自增、自减运算符:例#include#include int main()int main()int a=5,m;int a=5,m;m=+a;m=+a;printf(a=%d,m=%dn,a,m);printf(a=%d,m=%dn,a,m);m=a-;m=a-;printf(a=%d,m=%dn,a,m);printf(a=%d,m=%dn,a,m);+a;m-;+a;m-;printf(a=%d,m=%dn,a,m);printf(a=%d,m=%dn,a,m);
39、printf(a=%d,m=%dn,a-,+m printf(a=%d,m=%dn,a-,+m););由于这两个表达式是单一由于这两个表达式是单一的自增自减表达式,并没的自增自减表达式,并没有参与其它的运算,所以有参与其它的运算,所以其作用只是将变量其作用只是将变量a a加加1 1,变量变量m m减减1 1。#include#include int main()int main()int a=5,m;int a=5,m;m=+a;m=+a;printf(a=%d,m=%dn,a,m);printf(a=%d,m=%dn,a,m);m=a-;m=a-;printf(a=%d,m=%dn,a,m)
40、;printf(a=%d,m=%dn,a,m);+a;m-;+a;m-;printf(a=%d,m=%dn,a,m);printf(a=%d,m=%dn,a,m);printf(a=%d,m=%dn,a-,+m printf(a=%d,m=%dn,a-,+m););自增、自减运算符:例自增、自减运算符:例运行结果运行结果:a=6,m=6 a=5,m=6 a=6,m=5 a=6,m=6自增、自减运算符使用注意事项自增、自减运算符使用注意事项注意:注意:自增、自减运算符的运算量只能自增、自减运算符的运算量只能是变量,不可能是常量或表达式。是变量,不可能是常量或表达式。?为什么?为什么?因为自增、自
41、减因为自增、自减运算符实际上具运算符实际上具有赋值功能,是有赋值功能,是语言中除了赋语言中除了赋值运算符之外值运算符之外唯唯一一可以改变变量可以改变变量值的运算符。值的运算符。+ii=i+1-ii=i -1而可以被赋值的量只能是而可以被赋值的量只能是变量,常量和表达式不可变量,常量和表达式不可能被赋值。能被赋值。自增、自减运算符使用注意事项自增、自减运算符使用注意事项像像下面这样的用法就是下面这样的用法就是错误错误的:的:用途:用途:常用于循环结构中循环变量的自动增减常用于循环结构中循环变量的自动增减常用于指针变量的自动增减,使其指向常用于指针变量的自动增减,使其指向相邻的内存单元相邻的内存单
42、元+10 (x+y)+课堂练习课堂练习1.设设a为整型变量为整型变量,下列表达式中,不正确下列表达式中,不正确的是的是()(A)a=a+1(B)(B)a+(C)(+a)+1(D)a+(1+)答案答案:(D)2.4.22.4.2 赋值运算符和赋值表达赋值运算符和赋值表达式式 赋值运算符赋值运算符 赋值表达式赋值表达式赋值运算符赋值运算符赋值运算符(双目)赋值运算符(双目)运算符:运算符:优先级:优先级:比逗号运算符级别高,比逗号运算符级别高,低于算术运算符。低于算术运算符。结合性:结合性:右结合性右结合性作作 用:用:将一个数据赋值给一个变量,将一个数据赋值给一个变量,这个数据可以是常量、变量或
43、这个数据可以是常量、变量或 表达式。表达式。复合赋值运算符复合赋值运算符复合赋值运算符(双目)复合赋值运算符(双目)在原有的赋值运算符之前再加上其它运算在原有的赋值运算符之前再加上其它运算符,即构成复合赋值运算符。其它运算符包括符,即构成复合赋值运算符。其它运算符包括5 5种算术运算符和种算术运算符和5 5种位运算符。种位运算符。运算符:运算符:+=-=*=/=%=&=|=a+=3相当于相当于相当于相当于a=a+3x%=y+8相当于相当于相当于相当于x%=(y+8)x=x%(y+8)不相当于不相当于不相当于不相当于x=x%y+8赋值表达式赋值表达式如:如:num=40把常量把常量40赋值给变量
44、赋值给变量num如:如:aver=total/num 把表达式把表达式total/num的值赋给变量的值赋给变量aver如如:temp=aver把变量把变量aver的值赋给变量的值赋给变量temp用赋值运算符把一个变量和一个表达式用赋值运算符把一个变量和一个表达式连接起来的式子。连接起来的式子。一般形式:一般形式:变量表达式变量表达式 赋值表达式的注意事项赋值表达式的注意事项注意:赋值表达式的左边只能是变量,注意:赋值表达式的左边只能是变量,而右边可以是常量、变量或任何合法的而右边可以是常量、变量或任何合法的表达式。表达式。像像下面这样的用法就是下面这样的用法就是错误错误的:的:10=x x+
45、y=1整个赋值表达式的值就等于被赋值后整个赋值表达式的值就等于被赋值后的左边变量的值。的左边变量的值。赋值表达式:例赋值表达式:例#include#include void main()void main()int a,b,c;int a,b,c;/*/*int a=b=c=10;int a=b=c=10;*/*/a=b=c=10;a=b=c=10;printf(“a=%d,b=%d,c=%dn”,a,b,c);printf(“a=%d,b=%d,c=%dn”,a,b,c);/*c=(a*3)=b;*/*c=(a*3)=b;*/c=(a=3)*b;c=(a=3)*b;printf(“a=%d,
46、b=%d,c=%dn”,a,b,c);printf(“a=%d,b=%d,c=%dn”,a,b,c);是错误的。是错误的。因为当一次因为当一次定义多个变量时,不能定义多个变量时,不能用连续号的方式给多用连续号的方式给多个变量赋同一初值个变量赋同一初值.赋值表达式:例赋值表达式:例#include#include int main()int main()int a,b,c;int a,b,c;/*int a=b=c=10;*/*int a=b=c=10;*/a=b=c=10;a=b=c=10;printf(“a=%d,b=%d,c=%dn”,a,b,c);printf(“a=%d,b=%d,c=
47、%dn”,a,b,c);/*c=(a*3)=b;*/*c=(a*3)=b;*/c=(a=3)*b;c=(a=3)*b;printf(“a=%d,b=%d,c=%dn”,a,b,c);printf(“a=%d,b=%d,c=%dn”,a,b,c);是正确的。是正确的。因为这是一因为这是一个赋值表达式。因式分个赋值表达式。因式分解的结果就相当于:解的结果就相当于:a=(b=(c=10)赋值表达式:例赋值表达式:例#include#include int main()int main()int a,b,c;int a,b,c;/*int a=b=c=10;*/*int a=b=c=10;*/a=b=
48、c=10;a=b=c=10;printf(“a=%d,b=%d,c=%dn”,a,b,c);printf(“a=%d,b=%d,c=%dn”,a,b,c);/*c=/*c=(a*3)(a*3)=b;*/=b;*/c=(a=3)*b;c=(a=3)*b;printf(“a=%d,b=%d,c=%dn”,a,b,c);printf(“a=%d,b=%d,c=%dn”,a,b,c);是错误的。是错误的。因为因为=号左边号左边只能是变量。只能是变量。#include#include int main()int main()int a,b,c;int a,b,c;/*int a=b=c=10;*/*in
49、t a=b=c=10;*/a=b=c=10;a=b=c=10;printf(“a=%d,b=%d,c=%dn”,a,b,c);printf(“a=%d,b=%d,c=%dn”,a,b,c);/*c=(a*3)=b;*/*c=(a*3)=b;*/c=(a=3)*b;c=(a=3)*b;printf(“a=%d,b=%d,c=%dn”,a,b,c);printf(“a=%d,b=%d,c=%dn”,a,b,c);赋值表达式:例赋值表达式:例是正确的。是正确的。#include#include int main()int main()int a,b,c;int a,b,c;/*int a=b=c=1
50、0;*/*int a=b=c=10;*/a=b=c=10;a=b=c=10;printf(“a=%d,b=%d,c=%dn”,a,b,c);printf(“a=%d,b=%d,c=%dn”,a,b,c);/*c=(a*3)=b;*/*c=(a*3)=b;*/c=(a=3)*b;c=(a=3)*b;printf(“a=%d,b=%d,c=%dn”,a,b,c);printf(“a=%d,b=%d,c=%dn”,a,b,c);赋值表达式:例赋值表达式:例运行结果:运行结果:a=10,b=10,c=10a=3,b=10,c=302.4.32.4.3 关系运算符和关系表达式关系运算符和关系表达式 关系