第2章C语言的初步知识改.ppt
第二章C程序设计的初步知识,2.1 简单C语言程序的构成和格式,例2.1 由矩形的两条边长求矩形的面积。#include“stdio.h”main()double a,b,area;a=1.2;b=3.6;area=a*b;/*求面积*/printf(“area=%fn”,area);,函数体,注:1、C程序由函数组成,但每个程序里必须有且只能有一个主函数main;2、函数由语句组成,每条语句以“;”结束。3、注释/*/,定义说明部分,执行语句部分,主函数,主函数名,2.2常量、变量和标识符,1、标识符用作变量名、符号名、函数名、数组名、文件名。标识符的构成规则:以字母(大小写皆可)或下划线开头随后可跟若干个(包括个)字母、数字、下划线标识符的长度各个系统不同,最好不要超过个字符(注意:区分大小写。如:和是两个不同的标识符;sum、Sum是二个标识符),例:判断下列用户标识符号合法性sum Sum M.D.John day Date 3days student_name#33 lotus_1_2_3 char ab _above$123,M.D.John,3days,#33,char,$123,ab,标识符的分类,1、关键字:C语言规定的,具有固定的含义,不能另作它用。如:int,float2、预定义标识符:C语言中预先定义并具有特定含义的标识符。C语言规定,语法上允许作为他用,但不提倡。如:printf,define3、用户标识符:用户根据需要自定义。一般给变量、函数、文件等命名。,32个关键字,由系统实现定义的,有特殊意义的标志符,有时也称为保留字(由系统定义,不能重作其它定义)auto break case char constcontinue default do double elseenum extern float for gotoif int long register returnshort signed sizeof static structswitch typedef unsigned union voidvolatile while,2、常量,在程序运行过程中不可改变的量。常量分为不同类型(表示形式)整型常数,实型常数和字符串常量等如:12、3.2、a符号常量:用一个标识符代表的一个常量定义方法:#define 标识符 常量例:#define PI 3.14159,3、变量,变量:其值是可以改变的量,它用用户标识符(变量名)来表示,在内存中占据一定的存储单元。注意事项:见名知义先定义后使用,通常在函数体前部,也可放函数外部或复合语句的开头习惯上,符号常量名用大写,变量名用小写,以示区别。,变量概念:其值可以改变的量变量名与变量值变量定义的一般格式:数据类型 变量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.数据占内存字节数2.数据取值范围3.其上可进行的操作,基本数据类型,整型,字符型,实型,有,无,说明:数据类型所占字节数随机器硬件不同而不同,上表以IBM PC机为例:,2.3 整型数据,一、整型常量1、十进制常数 如:123、34、02、八进制常数由07数字组成;最高位必须用0作引导符 如:0123(123)83、十六进制常数由09、af(A F)组成;最高位必须用0 x(0X)作引导符 如:0 x123(123)16注意:只有十进制数可以是负数,而八进制和十六进制数只能是整数,十进制:4956=410+910+510+610,二进制:1011=12+02+12+12,十六进制:81AE=816+116+1016+1416,八进制:4275=48+28+78+58,各种进制之间的转换二进制、八进制、十六进制转换成十进制,各种进制之间的转换(整数)二进制、八进制、十六进制转换成十进制方法:按权相加,十进制转换成二进制、八进制、十六进制原理:,方法:连续除以基,从低到高记录余数,直至商为0,二进制与八进制之间的转换二进制转换成八进制:从右向左,每3位一组(不足3位左补0),转换成八进制八进制转换成二进制:用3位二进制数代替每一位八进制数,例(1101001)2=(001,101,001)2=(151)8,例(246)8=(010,100,110)2=(10100110)2,000 0001 1010 2011 3100 4101 5110 6111 7,二进制与十六进制之间的转换二进制转换成十六进制:从右向左,每4位一组(不足4位左补0),转换成十六进制十六进制转换成二进制:用4位二进制数代替每一位十六进制数,例(11010101111101)2=(0011,0101,0111,1101)2=(357D)16,例(4B9E)16=(0100,1011,1001,1110)2=(100101110011110)2,0000 00001 10010 20011 30100 40101 50110 60111 71000 81001 91010 A1011 B1100 C1101 D1110 E1111 F,字节和位内存以字节为单元组成每个字节有一个地址一个字节一般由8个二进制位组成每个二进位的值是0或1,二、整型变量,定义形式:int k;/*定义语句必须以一个“;”结束*/int a,b;/*整型的变量只能存放整型数值*/int a=1,b=2;(1)没有在存储单元中存放任何初值,称变量值“无定义”。(2)C语言规定,可以在定义变量的同时给变量赋初值,称变量初始化。,三、整型变量的分类,1)整型变量根据其数值的范围,可以将变量分为:基本整型(int)、短整型(short int)、长整型(long int)2)为了充分利用变量的表示数据的范围,又可以将变量定义为:有符号数(signed)无符号数(unsigned)基本整型变量在内存中占4个字节(V C 6.0),带符号的数据类型与无符号的数据类型 带符号的数据类型(1)在内存中存储整数时,一般以最高位(即最左边一位)表示数的符号,以0表示正数,以1表示负数(2)数值是以补码形式存放的,一个正数的补码就是该数 的二进制数,一个负数的补码求解过程如下:先取该数的绝对值 然后以二进制形式表示 在对其取反 然后加1无符号的数据类型 二进制的最左位不作为符号位,而与右面各位一起表示数值,四、整数在内存中的存储形式,内存储器的最小存储单位称为“位”(bit),存放0或1的二进制数,称为二进制位。大多数计算机把8个二进制位组成一个“字节”(byte),给每一个字节分配一个地址。左侧为高位,右侧为低位;最左侧为符号位;1、正整数(二进制原码)2、负整数(二进制补码:原码的反码,反码加)3、无符号整数(不可能是负数,最高位不用来放符号),2.4 实型数据,一、实型常量 实型常量又称实数或浮点数。有两种表示形式1、十进制数形式(必须有小数点)如:0.345、.345、345.0、345.、0.0、0.、.02、指数形式 如:3.45e3、3.45E3 表示3.45103 注意:e前后必须有数字,e后必须是整型数;字母e(E)前后以及数字之间不得插入空格;例:.3e3 3e3 3.e3正确 错误写法:3e e3 e0.3,二、实型变量,单精度(float型):占4个字节,7位有效数字(1e-381e38)双精度(double型):占8个字节,1516位有效数字(1e-308 1e308)如:float x,y;double a,b,c;注意:(1)VC6.0中,所有float类型运算中自动转换成double型;(2)内存中一律以指数形式存在;(3)存整数不会出现误差,实数型往往存在误差。,2.5 算术表达式,基本的算术运算符+(加法运算符,或正值运算符)如:2+3、+6-(减法运算符,或负值运算符)如:3-4、-6*(乘法运算符)如:3*4、2*x/(除法运算符)如:5/3、(x+y)/(a+b)%(模运算符,或称求余运算符):%两侧均为整型数据1%4的值为1 2%4的值为2,两个整数相除,其值为整数。如:5/3值为1双目运算符两边类型不一致,类型将按规律自动转换除数、被除数有一个为实数时,结果为double型,2、算术表示式和运算符的优先级与结合型,用算术运算符和括号将运算对象(也叫操作数)连接起来的、符合语言语法规则的式子,称为算术表达式。运算对象包括常量、变量、函数等如:3.14*r*r x+sqrt(0.25*y)/(abs(a+b)-3.6)运算符的优先级和结合性优先级:先*、/、%,后+、-结合性:左结合性。即表达式从左向右进行计算,基本算术运算符:+-*/%结合方向:从左向右优先级:-*/%-+-(2)(3)(4)说明:“-”可为单目运算符时,右结合性两整数相除,结果为整数%要求两侧均为整型数据,例 5/2=2-5/2.0=-2.5,例 5%2=1-5%2=-1 1%10=1 5%1=0 5.5%2(),算术运算符的优先级实力训练,(5+1)/2 运算结果:5+1/2 运算结果:5*-2 运算结果:,3,5,-10,3、强制类型转换(显式转换),可以利用强制类型转换运算符将一个表达式转换成所需类型形式:(类型名)(表达式)如:(double)a、(int)(x+y)注意区别于(int)x+y(float)(8%5),显式转换(强制转换)例(int)(x+y)(int)x+y(double)(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,精度损失问题,2.6 赋值表达式,一、赋值运算符“=”用法:变量=表达式作用:将表达式的值赋给变量如:a=5;ave=(a+b)/10;注意:与数学中的等式不同!x=y和y=x在数学中是等价的,而在C语言中是不同的,例 a=3;d=func();c=d+2;,说明:,1、赋值运算符的右边可以是常量、变量、表达式,赋值运算符的左边只能是一个变量;例如,a+b=c就是非法的赋值表达式2、每赋一次值,存储单元中的数据被更新一次;3、赋值运算符的优先级只是比逗号运算符高,结合性自右向左;4、赋值表达式的值等于赋值运算符左边变量的值。,说明:结合方向:自右向左优先级:14左侧必须是变量,不能是常量或表达式,赋值表达式的值与变量值相等,且可嵌套,赋值转换规则:使赋值号右边表达式值自动转换成其左边变量的类型,例 3=x-2*y;a+b=3;,例 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,2.6.2 复合的赋值表达式,在赋值符“=”之前加上其它运算符,构成复合赋值运算符+=,-=,*=,/=,%=,=,&=,=,I=如:a+=3 等价于 a=a+3 x*=y+8 等价于 x=x*(y+8)(注意有括号,区别于x=x*y+8)x%=3 等价于 x=x%3,说明:结合方向:自右向左优先级:12左侧必须是变量,不能是常量或表达式,赋值表达式的值与变量值相等,且可嵌套,赋值转换规则:使赋值号右边表达式值自动转换成其左边变量的类型,例:a=12;a+=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),2.6.3 赋值运算中的类型转换,1、实型数据(包括单、双精度)赋给整型变量时,舍弃实数的小数部分2、整型数据赋给单、双精度变量时,数值不变,但以浮点数形式存储到变量中#include“stdio.h”void main()int i;float f;i=5.34;f=23;printf(“%d%fn”,i,f);注意:赋值表达式中,赋值号右边的值先转换成与赋值号左边的变量相同的类型,然后再进行赋值。,显式转换(强制转换)一般形式:(类型名)(表达式)例(int)(x+y)(int)x+y(double)(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,隐式转换运算转换规则:不同类型数据运算时先自动转换成同一类型,什么情况下发生运算转换-不同类型数据混合运算时赋值转换-把一个值赋给与其类型不同的变量时输出转换-输出时转换成指定的输出格式函数调用转换-实参与形参类型不一致时转换运算转换规则:不同类型数据运算时先自动转换成同一类型,2.7 自加、自减运算符和逗号运算符,1、自加运算符(+)、自减运算符(-)+i,-i:在使用i之前,先使i的值加1或减1i+,i-:在使用i之后,使i的值加1或减1注意:1)自增、自减运算符只能用于变量,而不能用于常量或表达式。如:5+、-(a+b)不合法2)+和-优先级别高于双目算术运算符,与单目运算符优先级相同,结合方向是“自右向左”如:-i+相当于-(i+),自增、自减运算符+-作用:使变量值加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,a=4,/c=15,a=4,说明:+-不能用于常量和表达式,如5+,(a+b)+-结合方向:自右向左优先级:-+-*/%-+-,例-i+-(i+)i=3;printf(“%d”,-i+);/-3,2、逗号运算符和逗号表达式,形式:表达式1,表达式2,表达式i作用:用于连接表达式如:3+5,6+8计算过程:1)求解表达式1;2)再求解表达式2,表达式i 3)整个逗号表达式的值是表达式i的值结合性:从左到右;所有运算符中,逗号运算符优先级最低。,一个逗号表达式又可与另一个表达式组成一个新的逗号表达式。如:(a=3*5,a*4),a+5 逗号运算符是所有运算符中级别最低的。设a=5,则上式的结果就是20。如:x=(a=3,6*3)结果:x=18 x=a=3,6*a 结果:x=3,a=3,整个逗号表达式等于18注意:并不是任何地方出现的逗号都是逗号运算符。如:printf(“%d,%d,%d”,a,b,c);,逗号运算符和表达式形式:表达式1,表达式2,表达式n结合性:从左向右优先级:最低逗号表达式的值:等于表达式n的值用途:常用于循环for语句中,例 a=3*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,例:#include main()int x,y=7;float z=4;x=(y=y+6,y/z);printf(x=%dn,x);,运行结果:x=3,