《C语言教程第2章数据类型运算符和表达式.ppt》由会员分享,可在线阅读,更多相关《C语言教程第2章数据类型运算符和表达式.ppt(50页珍藏版)》请在三一办公上搜索。
1、第2章 数据类型、运算符与表达式,2.1 一个简单的C程序例子2.2 C程序常见符号分类2.3 数据类型2.4 常量2.5 变量2.6 常用运算符及表达式2.7 赋值和表达式中的类型转换,2.1:一个简单的C程序例子,#include/*函数功能:计算两个整数相加之和 入口参数:整型数据a和b 返回值:整型数a和b之和*/int Add(int a,int b)return(a+b);/*主函数*/main()int x,y,sum=0;printf(Input two integers:);scanf(%d%d,/*输出x和y相加之和*/,并列的两个函数其中一个是程序的入口,程序注释,编译预
2、处理命令,下面针对一般的C程序作几点说明:(1)一个完整的C语言程序可以由多个函数组成,但必须包含一个且只能包含一个名为main的函数(主函数)。程序总是从main函数开始执行,与它在程序中的位置无关。(2)在一个C函数模块中,由左右花括号 括起来的部分是函数体,其中的语句系列实现函数的预定功能。(3)函数首部包括函数返回值类型、函数名、形参类型、形参名的说明。有时可以没有形参,但()不能省略。(4)C程序中的每一个语句必须以“;”结束,但书写格式是自由的。(5)#include是编译预处理命令,其作用是将双引号或尖括号括起来的文件内容读到该命令的位置处。(6)在C程序的任何位置处都可以用/*
3、.*/作注释,以提高程序的可读性。,2.2 C程序常见符号分类,关键字(Keyword)又称为保留字,C语言中预先规定的具有固定含义的一些单词数据类型修饰符int,控制语句return等 标识符(Identifier)系统预定义标识符,main,printf 等 用户自定义标识符,通常用做变量名、函数名Add,x,y 等运算符(Operator)34种,详见附录2 分隔符(Separator)空格、回车/换行、逗号等 其它符号 大花括号“”和“”通常用于标识函数体或者一个语句块“/*”和“*/”是程序注释所需的定界符 数据(Data)变量(Variable)常量(Constant),标识符命名
4、,变量名函数名由英文字母、数字和下划线组成,大小写敏感不可以是数字开头直观,见名知意,便于记忆和阅读最好使用英文单词或其组合切忌使用汉语拼音 下划线和大小写通常用来增强可读性variablenamevariable_namevariableName不允许使用关键字作为标识符的名字 int,float,for,while,if等某些功能的变量采用习惯命名如:for语句所采用的循环变量习惯用i,j,k,Windows 风格,UNIX 风格,2.3 数据类型(Data Type),数据类型总表,数据类型决定:1.数据占内存字节数2.数据取值范围3.数据表示形式4.可参与的运算种类,b,B,KB,MB
5、,GB,TB,如何衡量数据类型所占空间大小?bit,中文叫法:位Byte,中文叫法:字节Kilobyte(KB),中文叫法:KMegabyte(MB),中文叫法:兆Gigabyte(GB),中文叫法:GTerabyte(TB),中文叫法:T,1 TB=1,024 GB,1 GB=1,024 MB,1 MB=1,024 KB,1 KB=1,024 B,1 B=8 b,数据类型总表(数据类型修饰符),说明:数据类型所占字节数随机器硬件不同而不同.,标识符命名规则,在C语言中,变量名的命名要符合以下几个规则:组成:只能由英文字母、数字、下划线组成,且第一个字母必须是英文字母或下划线大小写敏感不能使用
6、关键字不能与库函数名重名长度:Turbo C系统下的有效长度为1至32个字符。命名原则:见名知意不宜混淆 如l与I,o与0,例:判断下列标识符号合法性sum Sum M.D.John day Date 3days#33 lotus_1_2_3 char ab _above$123,3days,#33,char,$123,ab,枚举常量:直接常量:整型常量 实型常量 字符常量 字符串常量,定义:程序运行时其值不能改变的量(即常数)分类:符号(宏)常量:,2.4常量,1.整型常量的表示形式,整型常量,在C语言中,有3种类型的整型常量:基本整型常量、长整型常量、无符号整型常量。基本整形常量三种形式:
7、十进制整数:由数字09和正负号表示.如 123,-456,0八进制整数:由数字0开头,后跟数字07表示.如0123,011十六进制整数:由0 x开头,后跟09,af,AF表示.如0 x123,0 xff,例 12 与 12L,例 30000 为int型 65536 为long int 型,问题:0123=()100 x123=()100 xff=()10,表示形式:十进制小数形式:(必须有小数点)如0.123,.123,123.0,0.0,123.指数形式:(e或E之前必须有数字;指数必须为整数)如12.3e3,123E2,1.23e4,e-5,实型常量的类型默认double型在实型常量后加字
8、母f或F,认为它是float 型在实型常量后加字母lf或LF,认为它是long double 型,2.4.2 实型常量(实数或浮点数),定义:用单引号括起来的单个普通字符或转义字符.,字符常量的值:该字符的ASCII码值,如 101-A 012-n 376-x61-a 60-0 483-(),例:A-101-x41-65,如 A65,a97,048,n10,如 a A?n 101,转义字符:反斜线后面跟一个字符或一个代码值表示,例 转义字符举例(ch2_001.c,ch2_004.c)main()printf(101 x42 Cn);printf(I say:How are you?n);pr
9、intf(C Programn);printf(Turbo C);,运行结果:(屏幕显示)A B CIsay:”How are you?”C ProgramTurbo C,2.4.3 字符常量,字符常量与字符串常量不同,2.4.4 字符串常量定义:用双引号(“”)括起来的字符序列存储:每个字符串尾自动加一个 0 作为字 符串结束标志,2.4.5 宏(符号)常量,一般形式:#define 标识符 字符串(宏体)功能:用指定标识符(宏名)代替字符串(宏体),宏体可缺省,表示宏名定义过或取消宏体,定义位置:任意(一般在函数外面)作用域:从定义命令到文件结束#undef可终止宏名作用域 格式:#und
10、ef 宏名,宏定义可嵌套,不能递归,引号中的内容与宏名相同也不置换,宏定义中使用必要的括号(),宏展开:预编译时,用宏体替换宏名-不作语法检查,如#define YES 1#define NO 0#define PI 3.1415926#define OUT printf(“Hello,World”);,例#define PI 3.14159 printf(“2*PI=%fn”,PI*2);宏展开:printf(“2*PI=%fn”,3.14159*2);,例#define WIDTH 80#define LENGTH WIDTH+40 var=LENGTH*2;宏展开:var=80+40*2
11、;,所谓“枚举”是指一一列举出来.声明枚举类型用enum开头例如:enum weekdaysun,mon,tue,wed,thu,fri,sat;声明了一个枚举类型enum weekday,可以用此类型来定义变量。如:enumweekdayworkday,week-end;workday和week-end被定义为枚举变量,它们的值只能是sun到sat之一。例如:workday=mon;week-end=sun;是正确的。(1)在C编译中,对枚举元素按整型常量处理,故称枚举常量。它们不是变量,不能对它们赋值。例如:sun=0;mon=1;是错误的。,2.4.6 枚举常量,(2)枚举元素作为整型常
12、量,它们是有值的,C语言编译按定义时的顺序使它们的值为0,1,2,。在上面定义中,sun的值为0,mon的值为1sat为6。如果有赋值语句:workday=mon;workday变量的值为1。这个整数是可以输出的。如:printf(%d,workday);将输出整数1。也可以改变枚举元素的值,在定义时由程序员指定,如:enum weekdaysun=7,mon=1,tue,wed,thu,fri,satworkday,week-end;定义sun为7,mon=1,以后顺序加1,sat为6。(3)枚举值可以用来做判断比较,用在条件语句中。如if(workday=mon)if(workdaysun
13、),(4)一个整数不能直接赋给一个枚举变量。如:workday=2;是不对的。它们属于不同的类型。应先进行强制类型转换才能赋值。如:workday=(enumweekday)2;它相当于将顺序号为2的枚举元素赋给workday,相当于workday=tue;甚至可以是表达式。如:workday=(enumweekday)(5-3);(5)枚举元素代表的是一个整数值,是一个整数值的名字,并不是字符串,因此可以用于使用整数值的任何场合,但不能作为字符串直接输入和输出。workday=2;printf(“%s”,workday);/*错误的*/,1、变量的声明与初始化概念:其值可以改变的量变量定义的
14、一般格式:数据类型 变量名1,变量名2,变量名n;,变量初始化:定义时赋初值,例:int a,b,c;float data;,决定分配字节数和数的表示范围,合法标识符,例:int a=2,b,c=4;float data=3.67;char ch=A;int x=1,y=1,z=1;int x=y=z=1;,变量的使用:先定义,后使用,例1 int student;stadent=19;/Undefined symbol statent in function main,变量定义位置:一般放在函数开头,2.5 变量,一个类型说明语句可以同时定义多个同类型的变量,各变量之间用逗号“,”分隔。用户
15、定义的变量名只是用来标识内存中的一个具体的存储单元,在这个存储单元中存放的数据为变量的值。在未对这些变量赋值前,这些变量中(即存储空间中)的值是随机的 C语言允许在定义变量的同时为变量赋初值。在为整型变量初始化或赋值时,C编译系统自动将被赋数据转换成与相应变量的类型一致。由于各种整型变量所占的字节数有限,因此,它们所能存放的整数有一定的范围。,变量定义说明,整型变量占字节数随机器不同而不同,一般占一个机器字shortintlong可用sizeof(类型标识符)测量,实型变量float:占4字节,提供7位有效数字double:占8字节,提供1516位有效数字,字符型变量字符变量存放字符ASCII
16、码char与int数据间可进行算术运算,例 float a;a=111111.111;/*a=111111.1*/double b;b=111111.111;/*b=111111.111*/,例 a=D;/*a=68;*/x=A+5;/*x=65+5;*/s=!+G/*s=33+71;*/,例1/*ch2_003.c*/#include#define PRICE 12.5 main()int num=3;float total;char ch1,ch2=D;total=num*PRICE;ch1=ch2-A+a;printf(“total=%f,ch1=%cn”,total,ch1);,运行结
17、果:total=37.500000,ch1=d,2、const类型修饰符,用const修饰定义的变量为常量const float pi=3.1425926;const常量与宏常量相比的优点是什么?const常量有数据类型某些集成化调试工具可以对const常量进行调试,#define pi 3.1425926,3、数据在内存中的存储格式,整型实型N=S2j字符型,所占位数决定实数的取值范围,所占位数决定实数的精度,4、char型与int型之间的关系,例:小写字母转换为大写字母,#include main()char ch=b;printf(%c,%dn,ch,ch);ch=b-32;printf
18、(%c,%dn,ch,ch);,#include main()char ch=b;printf(%c,%dn,ch,ch);ch=b-(a-A);printf(%c,%dn,ch,ch);,b,98B,66,b,98B,66,2.6 运算符和表达式,学习运算符应注意:运算符功能与运算量关系要求运算量个数要求运算量类型运算符优先级别结合方向结果的类型,基本算术运算符:+-*/%结合方向:从左向右优先级:-*/%-+-(2)(3)(4)说明:“-”可为单目运算符时,右结合性两整数相除,结果为整数%要求两侧均为整型数据,余数的符号与被除数的符号相同,例 5/2=-5/2.0=,例 5%2=-5%2=
19、12%(-7)=(-12)%7 5%1=5.5%2,例 5/2=2-5/2.0=-2.5,例 5%2=1-5%2=-1 12%(-7)=5(-12)%7=-5 5%1=0 5.5%2(),一.算术运算符和表达式,关系运算符种类:=!=结合方向:自左向右优先级别:,例 ca+b/c(a+b)ab!=c/(ab)!=c a=bc/a=(bc),关系表达式的值:是逻辑值“真”或“假”,用1和0表示,例 int a=3,b=2,c=1,d,f;ab(ab)=c b+cb f=abc,/表达式值1,/表达式值1,/表达式值0,/d=1,/f=0,二.关系运算符和表达式,关系运算注意:,例 若a=0;b=
20、0.5;x=0.3;则 a=x=b的值为,0,例 5278在C中是允许的,值为,0,例 int i=1,j=7,a;a=i+(j%4!=0);则a=,2,例 a0 结果为 A100 结果为,1,0,二.关系运算符和表达式,关系运算注意:,例 注意区分“=”与“=”int a=0,b=1;if(a=b)printf(“a equal to b”);else printf(“a not equal to b”);,例 应避免对实数作相等或不等的判断如 1.0/3.0*3.0=1.0 结果为可改写为:fabs(1.0/3.0*3.0-1.0)1e-6,0,二.关系运算符和表达式,逻辑运算符种类:!&
21、|逻辑运算真值表,C语言中,运算量:0表示“假”,非0表示“真”,运算结果:0表示“假”,1表示“真”,三.逻辑运算符和表达式,例 ab&xy a=b|x=y!a|ab,/(a=x)&(x=b),/(ab)&(xy),/(a=b)|(x=y),/(!a)|(ab),三.逻辑运算符和表达式,优先级:,结合方向:,优先级:,结合方向:,例 a=4;b=5;!a a&b a|b!a|b 4&0|2 53&2|84-!0 c&d,值为1,值为0,值为1,值为1,值为1,值为1,/(53)&2|(8(4-(!0)值为1,短路特性:逻辑表达式求解时,并非所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运
22、算符才能求出表达式的解时,才执行该运算符,例 a(m=ab)&(n=cd),/结果m=0,n=1,优先级:,结合方向:,简单赋值运算符符号:=格式:变量名=表达式作用:将一个数据(常量或表达式)赋给一个变量,复合赋值运算符种类:+=-=*=/=%=&=|=含义:exp1 op=exp2 exp1=exp1 op exp2,例 a=3;d=func();c=d+2;,四.赋值运算符和表达式,说明:结合方向:自右向左优先级:14左侧必须是变量,不能是常量或表达式,赋值表达式的值与变量值相等,且可嵌套,赋值转换规则:使赋值号右边表达式值自动转换成其左边变量的类型,例 3=x-2*y;a+b=3;,例
23、 float f;int i;i=10;f=i;则 f=10.0,例 int i;i=2.56;/结果i=2;,例:a=b=c=5 a=(b=5)a=5+(c=6)a=(b=4)+(c=6)a=(b=10)/(c=2),/表达式值为5,a,b,c值为5,/b=5;a=5,/表达式值11,c=6,a=11,/表达式值10,a=10,b=4,c=6,/表达式值5,a=5,b=10,c=2,四.赋值运算符和表达式,说明:结合方向:自右向左优先级:14左侧必须是变量,不能是常量或表达式,赋值表达式的值与变量值相等,且可嵌套,赋值转换规则:使赋值号右边表达式值自动转换成其左边变量的类型,例:a=12;a
24、+=a-=a*a,例:int a=2;a%=4-1;a+=a*=a-=a*=3;,/a=-264 等价于a=a+(a=a-(a*a),/a=0 等价于a=a+(a=a*(a=a-(a=a*3),四.赋值运算符和表达式,作用:使变量值加1或减1种类:前置+i,-i(先执行i+1或i-1,再使用i值)后置 i+,i-(先使用i值,再执行i+1或i-1),例 j=3;k=+j;j=3;k=j+;j=3;printf(“%d”,+j);j=3;printf(“%d”,j+);a=3;b=5;c=(+a)*b;a=3;b=5;c=(a+)*b;,/k=4,j=4,/k=3,j=4,/4,/3,/c=20
25、,a=4,/c=15,a=4,五.自增、自减运算符+-,作用:使变量值加1或减1种类:前置+i,-i(先执行i+1或i-1,再使用i值)后置 i+,i-(先使用i值,再执行i+1或i-1),说明:+-不能用于常量和表达式,如5+,(a+b)+-结合方向:自右向左优先级:-+-*/%-+-(2)(3)(4),例-i+-(i+)i=3;printf(“%d”,-i+);/-3,例-i+i=3;printf(“%d”,-i+);,五.自增、自减运算符+-,形式:表达式1,表达式2,表达式n结合性:从左向右优先级:15(级别最低)逗号表达式的值:等于表达式n的值用途:常用于循环for语句中,例 a=3
26、*5,a*4 a=3*5,a*4,a+5例 x=(a=3,6*3)x=a=3,6*a例 a=1;b=2;c=3;printf(“%d,%d,%d”,a,b,c);printf(“%d,%d,%d”,(a,b,c),b,c);,/a=15,表达式值60,/a=15,表达式值20,/赋值表达式,表达式值18,x=18,/逗号表达式,表达式值18,x=3,/1,2,3,/3,2,3,六.逗号运算符和表达式,形式:表达式1,表达式2,表达式n结合性:从左向右优先级:15(级别最低)逗号表达式的值:等于表达式n的值用途:常用于循环for语句中,例:/*ch2_6.c*/#include main()in
27、t x,y=7;float z=4;x=(y=y+6,y/z);printf(x=%dn,x);,运行结果:x=3,六.逗号运算符和表达式,七.位操作运算符,|-按位或运算-按位异或运算&-按位与运算-按位右移运算-按位求反,高,低,位操作运算符只能作用与char和int数据类型,例.逻辑运算与位运算的不同main()int x=12,y=8;printf(n%5d%5d%5d,!x,x|y,x,0 1 1-13 12 865532 12 8,逻辑非的结果不是按位取反,正数的补码与其原码相同,负数的补码为其反码加1,八.位操作运算符,八、综合优先级,()-.!+-+-(类型)sizeof*/%
28、+-=!=&|&|?:=+=-=*=/=%=&=|=,高,低,单目运算符,算术运算符,关系运算符,逻辑运算符,赋值运算符,逗号运算符,九、结合性,多数运算符为左结合少数为右结合:单目运算符赋值运算符条件运算符,隐式转换什么情况下发生运算转换-不同类型数据混合运算时赋值转换-把一个值赋给与其类型不同的 变量时输出转换-输出时转换成指定的输出格式函数调用转换-实参与形参类型不一致时 转换运算转换规则:不同类型数据运算时先自动转换成 同一类型,该类型占内存字节数最大,2.7 不同类型数据间的转换,显式转换(强制转换)一般形式:(类型名)(表达式)例(int)(x+y)(int)x+y(double)
29、(3/2)(int)3.6 说明:强制转换得到所需类型的中间变量,原 变量类型不变,例 main()float x;int i;x=3.6;i=(int)x;printf(“x=%f,i=%d”,x,i);结果:x=3.600000,i=3,精度损失问题,这一章我们学到了,变量的命名规则数据类型char,short,int,long,float,double,long doublesigned,unsignedenum常数、转义字符运算符算术运算符、关系运算符、逻辑运算符、增一/减一运算符、位运算符、赋值运算符、类型强转运算符、逗号运算符、条件运算符(?:)、sizeof类型转换优先级和结合性,