1、v 2.1 C语言的数据类型语言的数据类型v 2.2 标识符、常量和变量标识符、常量和变量v 2.3 基本数据类型(整型、实型、字符型、基本数据类型(整型、实型、字符型、字符串)字符串)v 2.4 运算符及表达式运算符及表达式 程序程序=数据结构数据结构+算法算法 在高级程序设计语言中,对数据结构的描述是通过数据类型数据类型的形式实现的,而对算法的描述则是通过各种语句语句功能实现的。2.1 数据类型单精度型 双精度型 数据类型基本类型构造类型指针类型空类型 整型实型(浮点型)字符型 枚举型数组类型结构体类型共用体类型2.2 标识符、常量和变量2.2.1 字符集字符集 字符(character)
2、是组成语言最基本的元素。C语言字符集由字母,数字,空格,标点和特殊字符组成。字母:大、小写英文字母共52个。数字:09共10个。空白符:空格符、制表符、换行符等统称为空白符共3个。标点和特殊字符:+-*/%_ .=&|();?:”!#共25个。2.2 标识符、常量和变量、$2.2.2 标识符l概念:用于标识变量名变量名、符号常量名符号常量名、函数名函数名、数组名数组名、类类型名型名、文件名文件名的有效字符序列有效字符序列称为标识符。l组成:l允许用作标识符的字符有:26个英文字母(包括大小写)、数字(09)、下划线;l构成规则:l第一个字符必须是字母字母或下划线下划线,后面跟任意的字母、数字和
3、下划线;l长度:最长31个字符(最好限制在8个以内)l注意事项:l大小写敏感l不能使用关键字l命名原则:见名知意例:判断下列标识符号合法性sum Sum M.D.John day Date 3days student_name#33 lotus_1_2_3 char ab _above$123M.D.John3days#33char$123ab2.2 标识符、常量和变量语言中有32个关键字,不允许用户再用来定义标识符。autodefaultfloatregisterstructvolatilebreakdoforreturnswitchwhilecasedoublegotoshorttyped
4、efcharelseifsignedunionconstenumintsizeofunsignedcontinueexternlongstaticvoid12个预处理命令:define endif elif error line include ifdef ifndef pragma undef if else2.2 标识符、常量和变量2.2.3 常 量 概念:常量是指在程序中其值不能被改变的量。类型:直接常量:如18、0、-3、4.6、-1.23、0.0、a、x、“abcd”符号常量:用标识符表示的常量。通常习惯用大写字母表示符号常量。2.2 标识符、常量和变量符号常量的定义形式:#defi
5、ne#define 符号常量名符号常量名 常量表达式或字符串常量表达式或字符串 如:#define PI 3.141592654#define PRICE 30注意:注意:l 符号常量在程序中符号常量在程序中不能被赋值不能被赋值l 习惯上,符号常量名用大写字母表示,变量名习惯上,符号常量名用大写字母表示,变量名用小写字母表示,以示区别。用小写字母表示,以示区别。PRICE=100;【例】已知某产品的单价和【例】已知某产品的单价和数量,求总价格。数量,求总价格。#define PRICE 30main()int num,total;num=10;total=num*PRICE;printf(“t
6、otal=%d”,total);total=3002.2.4 变 量 概念:变量指在程序执行过程中其值可以改变的量。它用标识符(变量名)来表示,在内存中占据一定的存储单元。变量三要素:变量名、变量类型、变量值2.2 标识符、常量和变量a10变量名变量的值存储单元决定分配字节数和数的表示范围合法标识符 变量的定义形式:类型标识符 变量名1,变量名2,.;变量的使用:先定义,后使用例:int a,b,c;float data;例:int student;stadent=19;/Undefined symbol statent in function main 变量的赋值:定义时赋值;程序执行过程中
7、赋值 变量的定义位置:一般放在函数开头2.2 标识符、常量和变量int a,b=2;a=1;main()int a,b=2;float data;a=1;data=(a+b)*1.2;printf(“data=%fn”,data);变量定义可执行语句main()int a,b=2;a=1;float data;data=(a+b)*1.2;printf(“data=%fn”,data);Error:Expression syntax in function main2.3 基本类型数据2.3.1 整型数据整型数据 一、整型常量一、整型常量:即整常数。C整常数可以用以下几种形式表示:2.3 基本
8、数据类型1、十进制整数:如123、0、-456等。2、八进制整数:以0开头。如0123=(123)8=(83)10。3、十六进制整数:以0 x(0X)开头。如0 x123=(123)16=(291)10、0 x54=(84)10。根据数值的范围分为以下几种类型:1)基本型,以int表示;2)短整型,以short int表示,或以short表示;3)长整型,以long int表示,或以long表示;为了充分利用变量的表数范围,又可以将变量定义为“无符号”类型和“有符号”类型。加上修饰符unsigned以指定为“无符号数”,加上修饰符signed以指定为“有符号数”;如果不指定,则隐含为有符号(s
9、igned)。实际上signed完全可以不写。2.3 基本数据类型2.3 基本类型数据类型类型标识符所占字节数取 值 范 围有符号基本类型有符号基本类型int421474836482147483647即即-231(231-1)无符号基本类型无符号基本类型unsigned int404294967295,即即0(232-1)有符号短整型有符号短整型short2-3276832767,即,即-215(215-1)无符号短整型无符号短整型unsigned short2065535,即,即0(216-1)有符号长整型有符号长整型long4-21474836482147483647即即-231(231-
10、1)无符号长整型无符号长整型unsigned long404294967295,即即0(232-1)归纳起来,有以下六种整型变量:2.3 基本数据类型二、整型变量二、整型变量2.3 基本数据类型整型数据在内存中是以二进制补码形式存放的。int i;i=10;000000000000101010(a)数据存放示意图(b)数据在内存中的实际存放情况-10100000000000101011111111111101011111111111110110-10的原码按位取反加1形式:类型标识符变量列表类型标识符变量列表;注意注意:对变量的定义,一般放在函数开头的声明部分。2.3 基本数据类型int a,
11、b;unsigned int i,j;long e,f;main()short a,b;a=32767;b=a+1;printf(%d,%d,%u,%u,a,b,a,b);0111111111111111a:b:100000000000000032767,-32768,32767,32768三、整型常量三、整型常量 即整常数。2.3 基本数据类型1、整数值在-32768+32767范围内,认为是short型。2、若超过了上述范围,而在-2147483648+2147483647范围内,则认为是longh或int型。3、在一个整常量后面加一个字母l或L,则认为是long int型常量。4、在一个
12、整常量后面加一个字母u或U,则认为是unsigned类型。1)十进制整数:如123、0、-456等。2)八进制整数:以0开头。如0123=(123)8=(83)10。3)十六进制整数:以0 x(0X)开头。如0 x123=(123)16=(291)10、0 x54=(84)10。实型变量分为单精度型(float)和双精度型(double)。类型类型长度长度有效数字有效数字正数正数数值范围数值范围float32673.4e-383.4e38double6415161.7e-3081.7e308对每一个实型变量都应该在使用前加以定义。如:float x,y;double z;2.3 基本数据类型2
13、.3.2 实型数据实型数据2.3.2 实型数据实型数据2、实型常量、实型常量:即实数,又称浮点数。有两种表示形式:2.3 基本数据类型 1)十进制小数形式。一般由数字和小数点组成(必须有小数点,但小数点前后的0可以省略)。例如:0.246 .246 246.0 246.0.0 等都是正确的小数表示形式。2)十进制指数形式。由尾数、字母E或e及指数部分组成。具体格式如下所示:尾数e(E)指数部分例:135e3 124e-2 -12.12e-5 .135E4 0e0 注意:字母e(E)之前必须有数字,且e(或E)后面的指数必须为整数。如e3、.e3、2.1e3.5、e等都不是合法的指数形式。一、字
14、符变量一、字符变量 字符变量用来存放字符,且只能存放一个字符,占用一个字节(-128+127)的内存空间。类型标识符为char。定义方法:char c1,c2;/*定义了两个字符型变量c1、c2*/字符变量的赋值方法:c1=a;2.3 基本数据类型2.3.3 字符型数据字符型数据2.3.3 字符型数据字符型数据二、字符型常量二、字符型常量:C语言的字符型常量有两种形式:1、普通字符:用一对单引号(即撇号)括起来的单个字符。例如:b、Y、9、(、y。2、用一对单引号(即撇号)括起来的以一个“”开头的转义字符,形如n,t等,意思是将反斜杠()后面的字符转变成另外的意义。如 n 不代表字母n而作为“
15、换行”符。像“换行”这种非显示字符难以用一般形式的字符表示,所以C语言规定用“转义字符”这种特殊形式表示。常见转义字符如下表所示。2.3 基本数据类型转义字符含义ASCII值0表示字符串结束0n换行,将当前位置移到下一行开头10t水平制表(跳到下一个Tab的位置)9v竖向跳格11b左退一格,将当前位置移到前一列8r回车,将当前位置移到本行开头13f换页,将当前位置移到下页开头12a响铃7单引号39双引号34反斜杠“”92ddd1到3位八进制数代表的字符(ASCII码)2.3 基本数据类型例例.字符型常量的输出字符型常量的输出main()printf(Hello!thow are you?nIm
16、 fine!n);printf(This is a cupbbbpen.n);printf(A,101);2.3 基本数据类型Hello!how are you?Im fine!This is a pen.A,A三、字符在内存中的存储形式及使用方法三、字符在内存中的存储形式及使用方法 1、将一个字符常量存放到一个字符变量中,实际是将该字符对应的ASCII码存放到存储单元中。char c1,c2;c1=A;c2=n;2、字符和整型数据可以相互赋值。3、字符数据可以字符形式输出,也可以整数形式输出。2.3 基本数据类型c2c10100000100001010main()char c1;c1=65;
17、printf(%c,%dn,c1,c1);A,65main()char c1,c2;c1=a;c2=b;c1=c1-32;c2=c2-32;printf(%c,%cn,c1,c2);4、语言允许字符数据与整数直接进行算术运算。2.3 基本数据类型【例】编写程序实现英文字符的大小写转换。A,B思考:将一个超过一个字节表示范围的数赋给char型,会出现什么情况?2.3.4 字符串常量字符串常量2.3 基本数据类型 字符串常量是由一对双引号(“”)括起来的字符序列。如“How are you!”、“China”、“a”、“$123.45”等。u 双引号是字符串常量的定界符。如果字符串中有双引号应使用
18、转义字符“”来表示。如要输出字符串It is“good”,语句应为printf(“It is“good”);u 字符串的长度为字符序列中字符的个数,不包括两边的双引号。如字符串“How are you!”的长度是12。u 不要将字符常量和字符串常量混淆。如a是字符串常量,a是字符常量。说明:若:char c;c=a;c=a;规定:在每个字符串的结尾加一个“字符串结束标志”,以便系统据此判断字符串是否结束。规定以字符0作为字符串结束标志。0的ASCII值为0,是不可显字符,也不作任何操作,即“空操作字符”。aa0aa注意:写字符串时不必加0,它是系统自动加上的。China0China2.3 基本
19、数据类型2.4 运算符及表达式2.4 运算符及表达式l运算符运算符:规定了对数据的基本操作。规定了对数据的基本操作。l表达式表达式:将运算对象:将运算对象(常量、变量、函数等常量、变量、函数等)用运用运算符连接起来的符合算符连接起来的符合C语言语法规则的式子语言语法规则的式子 如:(a-b)/c*2+a+-15%4 学习运算符应注意:l运算符功能l与运算量关系要求运算量个数要求运算量类型l运算符优先级别 在一个表达式中如果有多个运算符时,则计算是有先后次序的,这种计算的先后次序称为相应运算符的优先级。l结合方向 当一个运算对象两侧运算符的优先级别相同时进行运算(处理)的结合方向称为运算符的结合
20、性。按“从右向左”的顺序运算,称为右结合性;按“从左向右”的顺序运算,称为左结合性。l结果的类型C语言的运算符2.4 运算符及表达式(1)算术运算符+-*/%(2)赋值运算符=及其扩展赋值运算符(3)自增、自减运算符 +-(4)关系运算符=!=(5)逻辑运算符!&|(6)逗号运算符,(7)位运算符|&(8)条件运算符?:(9)指针运算符*&(10)求字节数运算符 sizeof(11)强制类型转换运算符 (类型标识符)(12)成员运算符 .(13)下标运算符 (14)其它 如函数调用运算符()C语言的运算符2.4 运算符及表达式(1)算术运算符+-*/%(2)赋值运算符=及其扩展赋值运算符(3)
21、自增、自减运算符 +-(4)关系运算符=!=(5)逻辑运算符!&|(6)逗号运算符,(7)位运算符|&(8)条件运算符?:(9)指针运算符*&(10)求字节数运算符 sizeof(11)强制类型转换运算符 (类型标识符)(12)成员运算符 .(13)下标运算符 (14)其它 如函数调用运算符()2.4.1 算术运算符算术运算符1、基本算术运算符基本算术运算符2.4 运算符及表达式运算符名称示例运算功能-取负-a使a的值为负值+加a+b求a与b的和-减a-b求a与b的差*乘a*b求a与b的积/除a/b求a与b的商%取余a%b求a整除以b的余数说说 明明2.4 运算符及表达式 乘法运算符是“*”,
22、不能用或号,也不能省略。在数学中5a、5a、5a都是合法的,但在C语言中只能写成5*a。除法运算符是“/”,不能用号表示。两个整数相除结果为整数,如7/2的结果值为3,舍去小数部分。如果参加运算的两个数中有一个数为实数,则结果是double型,因为所有实数都按double型进行运算。取余运算符“%”两侧的数据必须为整型数据。结果按下式计算:余数=被除数-除数*商。如7%3的结果为1。7%1.2则是错误的。2、算术表达式、算术表达式用算术运算符、圆括号将运算对象连接起来的符合C语法规则的式子就称为算术表达式。如:(a-b)/c*2+a+-15%4 2.4 运算符及表达式 表达式中的乘号不能省略。
23、表达式中只能使用合法用户标识符。例如:数学式 相应的C语言表达式应写成:3.1415926*r*r。表达式不允许有分子分母、上下标等形式,必要时要利用圆括号保证运算的顺序。例如:应写成:(a+b*b)/(c+d)。表达式不允许使用方括号和花括号,只能使用圆括号帮助限定运算顺序。可以使用多层圆括号,但左右括号必须配对,运算时从内层圆括号开始,由内向外依次计算表达式的值。dcba22r3、算术运算符的优先级与结合性、算术运算符的优先级与结合性2.4 运算符及表达式运算种类结合性优先级()高低-(负号)左结合性*,/,%+,-右结合性4、基本类型数据间的混合运算、基本类型数据间的混合运算2.4 运算
24、符及表达式(1)在运算过程中,C语言遇到两种不同数据类型的数值运算时,会将某个数做适当的类型转换,然后再进行运算。类型转换总是按照数据长度增加的方向逐个运算符进行,以保证精度不降低。自动类型转换 例如:表达式 5+b-x/2+y*m(假设m为int型,x为float型,y为double型)doublefloatlongunsignedintchar,short高低注意:横向箭头表示必定的转换,纵向箭头表示当运算符两侧的数据类型不一致时将它们中低级别的类型转换成高级别的类型.箭头方向只是级别的高低,并不是转换的过程.2.4 运算符及表达式m为int型,x为float型,y为double型intd
25、oubleresult=5 +b -x /2 +y *mdoubledoubledoubledouble2.4 运算符及表达式(2)当需要将某数据转换成指定类型时使用强制类型转换,通过类型转换运算符实现。一般形式为:(类型标识符)(表达式)例如:(double)a /*将a转换成double型*/(int)(x+y)/*将x+y的和转换成整型*/(float)(10*5)/*将10*5的积转换成float型*/注意:类型标识符和表达式都必须加括号(单个变量可以不加括号).(int)(x+y)与(int)x+y 无论是强制转换或是自动转换,只是为了本次运算对数据长度进行的临时性转换,不改变数据定
26、义时的类型。强制类型转换的优先级高于自动类型转换。main()int i=1,j=5,k1,k2,k3;float x=5.7,y=2.8,z1,z2,z3;k1=(int)x;k2=(int)(x)/y;k3=(int)(x/y);z1=(float)i;z2=(float)i/j;z3=(float)(i/j);printf(k1=%dn,k1);printf(k2=%dn,k2);printf(k3=%dn,k3);printf(z1=%fn,z1);printf(z2=%fn,z2);printf(z3=%fn,z3);【例】强制类型转换示例。k1=5k2=1k3=2z1=1.0000
27、00z2=0.200000z3=0.0000002.4 运算符及表达式#include main()int a,b,c;float s,area,temp;printf(please input 3 sizesn);scanf(%d%d%d,&a,&b,&c);s=(a+b+c)/2;temp=s*(s-a)*(s-b)*(s-c);if(temp=0)printf(your input is wrong);else area=sqrt(temp);printf(The area is%f,area);【例】分析程序。2.4 运算符及表达式#include main()float a,b,c;
28、float s,area,temp;printf(please input 3 sizesn);scanf(%d%d%d,&a,&b,&c);s=(a+b+c)/2;temp=s*(s-a)*(s-b)*(s-c);if(temp=0)printf(your input is wrong);else area=sqrt(temp);printf(The area is%f,area);正确程序应为:2.4 运算符及表达式2.4.2 赋值运算符赋值运算符1、赋值运算符和赋值表达式、赋值运算符和赋值表达式2.4 运算符及表达式 赋值运算符:=赋值表达式:用赋值运算符将一个变量和一个表达式连接起来的
29、式子,其功能是将=右边的表达式的值存放到左边的变量中。形式为:变量标识符=表达式 注意:赋值表达式 赋值语句 赋值表达式的值:即被赋值后=左边变量的值。例 b=5 d=5+b-x/2+y*mb=5有两层含义:一是使变量b的值为5,二是求得赋值表达式“b=5”的值为5。a=(b=5);语句执行后a的值为?说明:说明:2.4 运算符及表达式 赋值运算符“=”的左边必须是变量,不能是常量或者表达式。右边的表达式可以是常量、变量、表达式和函数调用。如y=sqrt(2)。赋值运算符“=”不同于数学中的等号,它没有相等的含义。例如:x=x+1,其含义是取出变量x中的值加1后,再存入变量x。赋值运算符的结合
30、性为“右结合性”,低优先级。如:x=y=z=8 等价于 x=(y=(z=8)y=a+3 先+后=例 3=x-2*y;a+b=3;(错)2、赋值运算中的类型转换、赋值运算中的类型转换2.4 运算符及表达式 规则:当“=”左边变量的类型和右边表达式值的类型不一致时,要将右边表达式值类型强制转换为左边变量的类型。左边变量类型右边表达式值的类型转换说明intdouble将实型数据的小数部分截去后再赋值doubleint将整型数据转换成实型数据后再赋值intchar值不变,高24位补0,或进行符号扩展Long,intshort值不变,高16位进行符号扩展shortLong,int截取低16位数值3、复合
31、赋值运算符、复合赋值运算符2.4 运算符及表达式a+=3a=a+3x*=y+8x=x*(y+8)x%=3x=x%3种类:+=-=*=/=%=&=|=含义:变量 op=表达式变量=变量 op 表达式(op:+、-、*、/、%、&、|)优点:简化程序,使生成的机器代码简短。说明:与“=”优先级相同,也是“右结合性”。x*=y+8;k+=j+=i+82.4.3 自增(自增(+)、自减()、自减(-)运算符)运算符2.4 运算符及表达式 作用:使变量值加1或减1 种类:前置 +i,-i (先执行i+1或i-1,再使用i值)后置 i+,i-(先使用i值,再执行i+1或i-1)例 j=3;k=+j;j=3
32、;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;/j=j+1=4,k=j=4/k=j=3,j=j+1=4/4/3/c=20,a=4/c=15,a=4说明:说明:2.4 运算符及表达式 自增、自减运算符(+、-),只能用于变量,不能用于常量和表达式,如2+或(x+y)+都是不合法的。+和-的结合方向是“右结合性”,优先级高于基本算术运算符,与负号运算符为同一优先级。例如,-i+,相当于-(i+)。j+k相当于(j+)+k。main()P34 int i=5,j,k;j=+i;i=5;k
33、=i+;printf(i=%d,j=%d,k=%dn,i,j,k);printf(j=%d,k=%dn,+j,k+);2.4.4 逗号运算符逗号运算符2.4 运算符及表达式形式:表达式1,表达式2,表达式n结合性:从左向右逗号表达式的值:等于表达式n的值优先级别:最低如:如:x=(a=3,b=5,c=b*4)t=3,t+2 (a=2*3,a*5),a+6比较下面两式:a=(2+b,a*2,a*=5)a=2+b,a*2,a*=52.4.5 sizeof运算符运算符2.4 运算符及表达式 作用:返回变量或数据类型的字节长度 形式:sizeof(类型标识符)或 sizeof(变量名)sizeof(double)表达式的值为8 sizeof(int)表达式的值为2 设有下列程序段:float f;int i;i=sizeof(f);变量i的值为?