C语言基础知识 考研复习篇ppt课件.ppt
C,基础知识,专题一:,热身练习:,1.已知各变量的类型说明如下,则以下不符合C语言语法的表达式是。int k,a,b;unsigned long w=5;double x=1.42;A) x%(-3) B) w+=-2 C) k=(a=2,b=3,a+b) D) a+=a-=(b=4)*(a=3),热身练习:,2.设x、y、t均为int型变量,则执行语句:x=y=3;t=+x|+y;后,x 的值为 ,y的值为 。 A)不定值 B) 4 C) 3 D) 8,热身练习:,3.有如下定义,若要求a1,a2,c1,c2的值分别为10,20,A和B,当从第一列开始输入数据时,正确的数据输入方式是。int a1,a2; char c1,c2;scanf(“%d%d”,A) 1020AB B) 10 20 ABC) 10 20AB D) 10 20 AB,一、语言的特点,、语言简洁、紧凑,使用方便、灵活;一共有32个关键字,9种控制语句,主要用小写字母表示。,一、语言的特点,九种控制语句:,一、语言的特点,2、运算符丰富:共有34种运算符。 算术运算符、关系运算符、逻辑运算符、位操作运算符、赋值运算符、条件运算符、逗号运算符、指针运算符、求字节数运算符、特殊运算符等。3、数据结构丰富: 的数据类型有:整型、实型、字符型、数组类型、结构体类型、共用体类型、指针类型、空类型等。,一、语言的特点,4、具有结构化的控制语句;5、语法限制不太严格,程序设计自由度大;6、C语言能进行位操作,能实现汇编语言的大部分功能,可以直接对硬件进行操作;7、生成目标代码质量高,程序执行效率高;8、用C语言编写的程序可移植性好。,二、语言的词汇,在语言中使用的词汇分为六类:标识符:变量名、函数名、标号等统称为标识符 标识符只能是字母、数字、下划线组成的字符串,并且第一个字符必须是字母或下划线,用户定义的标识符不应与关键字相同。 关键字:由语言规定的具有特定意义的字符串运算符:与变量、函数一起组成表达式,实现运算功能 分隔符:逗号和空格 常量:数字常量、字符常量、字符串常量、符号常量、转义字符 注释符:“/*”开头并以“*/”结尾的串,三、数据类型,(一)基本类型的分类及特点,【注】带*号表示的数据类型与机器硬件有关,(二)变量在内存中的存放形式,1、整型数据在内存中以补码形式存放 正数:原码即为补码(该数的二进制数) 负数:(1)取绝对值 (2)求绝对值的二进制形式 (3)将二进制按位取反 (4)再加上1,可得补码注意:若给出一个数在内存中的存放形式,先看最高位来判断是正负数。,-10在机器内存中的存放形式,(二)变量在内存中的存放形式,求-10的补码过程:10的原码:0000000000001010 按位取反:1111111111110101再加1,得-10的补码:1111111111110110,(二)变量在内存中的存放形式,有符号整型变量:最大表示32767无符号整型变量:最大表示65535,(二)变量在内存中的存放形式,解决整型数据的溢出问题如:int a=32767,b; b=a+1;printf(“%d”,b);,b= -32768,(二)变量在内存中的存放形式,2、实型数据在内存中的存放形式 实型数据一般占4个字节(32位)内存空间。按指数形式存储。实数3.14159在内存中的存放形式如下:,三、数据类型变量,main() float a; double b; a=33333.33333; b=33333.33333333333333; printf(%fn%fn,a,b); 由于a 是单精度浮点型,有效位数只有七位。而整数已占五位,故小数二位后之后均为无效数字。b 是双精度型,有效位为十六位。但Turbo C 规定小数后最多保留六位,其余部分四舍五入。double d=12.3456789;printf(“%lf”,d);,三、数据类型常量,1、整数常量十进制整数:带符号,09组成,第一位数字为非零(除零外) -456八进制整数:07组成,最高位用0引导 0123=(123)8=(83)10十六进制整数:09及af 或 AF组成,最高位用0 x或0X引导, 0 x123=(123)16=(291)10整数常量后加字母u或U表示该数为无符号型,加字母l或L表示该数为长整型 12345u 123L,三、数据类型常量,2、实型常量 在C中有两种表示方法:十进制小数形式:0.0、25.0、300.、-267.8230等。 注意,必须有小数点。 指数形式:men(或mEn)表示 m*10n (这里m为非0实数,n为整数)。如:12.3E-2表示12.3*10-2 在C编译系统中,将浮点型常量 作为双精度来处理,以下不是合法的实数,请说明理由:345 E7 -5 53.-E3 2.7E,三、数据类型常量,3、字符常量-转义字符,三、数据类型常量,3、字符常量-转义字符ddd 输出一到三位八进制数所对应的字符 xhh 输出一到两位16进制数所对应的字符例如:char a=101, b=x41;putchar(a); putchar(b);,答案:A A,三、数据类型常量,字符常量就是一个普通整数,也可参与各种数学运算每个字符具有一个0255之间的数值,可从ASCII表查出注意:5和整数5的区别5的ASCII码值是53思考: 6 2的值是多少?,例题:小写字母转换为大写字母,#include main()char ch = b; printf(%c, %dn, ch, ch);ch = b - 32; printf(%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,相当于97-65,三、数据类型常量,4、字符串常量用双引号括住的由0个或多个字符组成的字符序列I am a string表示空字符串除注释外,是唯一可以出现中文的地方C语言内部用0表示字符串的结束x和x是不同的里定义了一系列专门的字符串处理函数转义字符也可在字符串中使用,实践挑战:,1、设:char *s=“ta017bc”;则strlen(s)的值为( )。(04南师大)2、在一个32位系统中(如Windows XP),若定义char *s=010010010n;则sizeof(s)的值为( ),strlen(s)的值为( ),答案:1、52、29,sizeof 到底是什么?,C语言的关键字,并非函数计算类型占用的字节数两种语法形式 sizeof(类型)结果为类型占用的字节数 sizeof(表达式)结果为表达式值所属类型占用的字节数 一般都使用sizeof(变量名),strlen( )到底是什么?,strlen( )是函数,返回字符串中所包含的字符个数。注:统计时不包括0两种语法形式 strlen(字符串)如:strlen(“abcd”); strlen(字符指针变量);char *s=“abc; stelen(s);,三、数据类型常量,宏常量也称符号常量一般采用全大写字母表示 宏定义不是语句,而是一种编译预处理命令格式如下: #define 标识符 字符串使用时,将标识符用字符串完全替换,正确的实例:计算圆的周长和面积,#include #define PI 3.14159#define R 5.3main()printf(area = %fn, PI * R * R);printf(circumference = %fn, 2 * PI * R);,area = 88.247263circumference = 33.300854,相当于执行#include main()printf(area = %fn, 3.14159 * 5.3 * 5.3);printf(circumference = %fn, 2 * 3.14159 * 5.3);,宏替换,错误实例 :计算圆的周长和面积,#include #define PI 3.14159;#define R 5.3;main()printf(area = %fn, PI * R * R);printf(circumference = %fn, 2 * PI * R);,相当于执行#include main()printf(area = %fn, 3.14159;*5.3;*5.3;);printf(circumference = %fn, 2*3.14159;*5.3;);,语法错误,实践挑战:,3、在C语言中,宏定义#define PI 3.14159中,用宏名PI代替了一个()(南师大06)A.单精度数B.双精度数C.字符序列D.常量,答案:C,枚举(Enumeration)常量,enum weeks SUN, MON, TUE, WED, THU, FRI, SAT;/*声明了一个枚举类型*/ enum weeks today; /*用上面类型定义变量*/ today = TUE; /*变量today只能在上面定义的范围内取值*/ enum response no, yes, none; enum response answer; answer = yes; enum response no = -1, yes = 1, none = 0;,其值为2,其值为1,四、运算符,常见的运算符算术运算符赋值运算符类型强转(强制类型转换)关系运算符逻辑运算符增和减位运算符,四、运算符,运算符有三个属性:运算元数:最少1个,最多3个-1; 32?3:2优先级:结合性:即指运算符与运算元的结合方向,用于指导同级的运算 表达式:运算元与运算符的组合式 a*b/c-2.2+A,简化后的优先级:1一级运算符 2单变量运算符 3算术运算符 4位运算符 5关系运算符 6位逻辑运算符 7逻辑运算符 8条件运算符 9赋值运算符 10逗号运算符,四、运算符基本的算术运算符,当两个整数相除时,其结果为整数,即舍去小数部分。如:10/3=3;,四、运算符,赋值运算符及赋值表达式简单的赋值运算符用“=”表示属于双目运算符优先级较低,仅高于逗号具有右结合性由“= ”连接的式子称为赋值表达式 功能是计算表达式的值再赋予左边的变量a=b=c=5可理解为 a=(b=(c=5)赋值表达式的值就是“=”号右侧的值 x=(a=5)+(b=8),四、运算符,复合的赋值运算符 在赋值符“=”之前加上其它二目运算符可构成复合赋值符。如+=,-=,*=,=,%=,=,&=,=,|= 例如: a+=5 等价于a=a+5 x*=y+7 等价于x=x*(y+7) r%=p 等价于r=r%p 能提高编译效率并产生质量较高的目标代码,自动类型转换,相同类型数据的运算结果,还是该类型不同类型数据的运算结果,是两种类型中取值范围大的那种double float long int short char,自动类型转换,取值范围小的类型赋值给取值范围大的类型是安全的 double d; float f=1.5; d=f; 反之是不安全的若大类型的值在小类型能容纳的范围之内,则平安无事 double d=1.5; float f; f=d;若浮点数转为整数,会丢失小数部分,非四舍五入 int i; float f=1.64; i=f;(i的值为1)反之,转换后的结果必然是错误的,具体结果与机器和实现方式有关double d=123.456789e100; float f; f=d;,Example: int x = 10;float y;y = (float)x;,(float)10,10.000000,消除从大到小的警告x = (int)y;通过下面方式把表达式的值转为任意类型(类型)表达式,不改变x,强制类型转换,Example: int total, number;float average;average = total / number;,15 / 2,7,两个整数运算的结果还是整数,不是浮点数,强制类型转换,Example: int total, number;float average;average = (float)total / number;,15.000000 / 2,7.500000,强制类型转换,增一和减一运算符,n+,n-,+n,-n+让参与运算的变量加1,-让参与运算的变量减1作为后缀(postfix)运算符时,先取n的值,然后加/减1,n+,n-,+n,-n+让参与运算的变量加1,-让参与运算的变量减1作为后缀(postfix)运算符时,先取n的值,然后加/减1作为前缀(prefix)运算符时,先加/减1,然后取n的值,增一和减一运算符,例如:j = +i - 2,等价于:i = i + 1;j = i 2;,4,6,增一和减一运算符,例如:j = i+ - 2,等价于: j = i 2;i = i + 1;,3,6,增一和减一运算符,例:输出结果和变量a的值?int a=3;printf(%d,-a+);,等价于: printf(%d,-a);a = a + 1;,4,增一和减一运算符,例题:,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);,解析:对p=(i+)+(i+)+(i+)应理解为三个i相加,故P值为15。然后i再自增1三次相当于加3故i的最后值为8。而对于q的值则不然,q=(+j)+(+j)+(+j)应理解为q先自增1,再参与运算,由于q自增1三次后值为8,三个8相加的和为24,j的最后值仍为8。,四、运算符,逗号运算符和逗号表达式 功能是把两个表达式连接起来组成一个表达式, 称为逗号表达式。 其一般形式为: 表达式1,表达式2 分别求两个表达式的值,并以表达式2的值作为整个逗号表达式的值。 如:int a=2,b=4,c=6,x,y; y=(x=a+b),(b+c);,四、运算符,关系运算符 大于= 大于或等于= 等于!= 不等于,双目运算符结合性均为左结合优先级低于算术运算符高于赋值运算符其中:,=的优先级相同, 高于=和!=和!=的优先级相同,四、运算符,逻辑运算符 & 与运算| 或运算! 非运算,与运算符&和或运算符|为双目运算符具有左结合性非运算符!为单目运算符, 具有右结合性。逻辑运算符的优先级为: !(非)&(与)|(或),四、运算符,位运算符,&按位与运算|按位或运算按位异或运算,按位右移运算按位求反,位运算,按位与运算通常用来对某些位清0或保留某些位 和0“与”可清0,和1 “与”可保留如把a 的高八位清 0 ,保留低八位 a&255255 的二进制数为0000000011111111 按位或运算可以实现对数据的某些位置1和1”或”置1按位“异或”可实现某些位翻转,某些位保留和1“异或”翻转,和0异或“保留原值”问题:想把a的低八位翻转,高八位保留,如何做?,位运算,在不溢出的情况下,左移一位相当于乘以2,左移n位,相当于乘以2n在不考虑数据丢失的情况下,右移一位相当于整除2,右移m位,相当于除以2n实战:1、下列表达式中,值为6的是()A. (3|7)1)|6)13)&7 D. (710)|151E. (5&7)1)|4,