资源描述
Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,*,*,Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,*,*,本章知识点:,预备知识,数据类型,常量与变量,不同类型数据间的转换,运算符和表达式,2,数据类型运算符和表达式,计算机中数的表示及进制转换,数码、基与权,数码:表示数的符号,基:数码的个数,权:每一位所具有的值,数制,2.0,预备知识,二进制、八进制、十六进制转换成十进制,方法:按权相加,各种进制之间的转换,二进制、八进制、十六进制转换成十进制,十进制转换成二进制、八进制、十六进制,方法:连续除以基,从低到高记录余数,直至商为,0,各种进制之间的转换,(,整数,),方法:按权相加,例 把十进制数,459,转换成十六进制数,459,16,28,16,1,16,0,(459),10,=(1CB),16,1 C B,余,11,余,12,余,1,二进制转换成八进制:,从右向左,每,3,位一组(不足,3,位左补,0,),转换成八进制,八进制转换成二进制:,用,3,位二进制数代替每一位八进制数,例,(1101001),2,=(001,101,001),2,=(151),8,例,(246),8,=(010,100,110),2,=(10100110),2,000 0,001 1,010 2,011 3,100 4,101 5,110 6,111 7,二进制与八进制之间的转换,二进制转换成十六进制:,从右向左,每,4,位一组(不足,4,位左补,0,),转换成十六进制,十六进制转换成二进制:,用,4,位二进制数代替每一位十六进制数,例,2,=(,00,11,0101,0111,1101),2,=(357D),16,例,(4B9E),16,=(,0,100,1011,1001,1110),22,0000 0,0001 1,0010 2,0011 3,0100 4,0101 5,0110 6,0111 7,1000 8,1001 9,1010 A,1011 B,1100 C,1101 D,1110 E,1111 F,二进制与十六进制之间的转换,内存以字节为单元组成,每个字节有一个地址,一个字节一般由,8,个二进制位组成,每个二进位的值是,0,或,1,0,1,2,3,4,5,6,7,0,1,2,3,4,5,6,7,8,9,10,.,字节和位,原码:最高位为符号位,其余各位为数值本身的绝对值,反码:,正数:反码与原码相同,负数:符号位为,1,,其余位对原码取反,补码:,正数:原码、反码、补码相同,负数:最高位为,1,,其余位为原码取反,再对整个数加,1,3,12,6,9,1,2,4,5,7,8,10,11,9-5=4,9+7=16=(14),12,数值的表示方法,原码、反码和补码,原码,反码,补码,+7,00000111,00000111,00000111,-7,1,0000111,1,1111000,1,1111001,+0,00000000,00000000,00000000,-0,10000000,11111111,00000000,数的范围,01111111,11111111,(-127+127),01111111,10000000,(-127+127),01111111,10000000,(-128+127),负十进制数的,补码,:该正数的原码各位全部取反加,1,例,7,原码:,0 0 0 0 0 1 1 1,取反:,1 1 1 1 1 0 0 0,加,1,:,1 1 1 1 1 0 0 1=-7,(用一字节表示数,,C,语言中的,char,占一字节,),0 1 1 1 1 1 1 1,char,:,最大,:127,1,0 0 0 0 0 0 0,最小,:-128,数值表示:,C,语言中数值使用补码表示,unsigned char,:,最大,:255,最小,:0,01 11 11 11 11 11 11 11,short,:,最大,:32767,1,0 00 00 00 00 00 00 00,最小,:-32768,11 11 11 11 11 11 11 11,unsigned short,:,最大,:65535,00 00 00 00 00 00 00 00,最小,:0,1 1 1 1 1 1 1 1,0,0 0 0 0 0 0 0,10,数制,基,权,表示,数码,特点,10,,,10,,,10,,,十进制数,09,10,逢十进一,二进制数,01,2,2,,,2,,,2,,,逢二进一,八进制数,07,8,8,,,8,,,8,,,逢八进一,十六进制数,09,AF,af,16,16,,,16,,,16,,,逢十六进一,十进制:,59=5,10+,10,十六进制:,3B=3,16+11,16,八进制:,73=7,8+3,8,数值表示,计算机内用,二进制,59,111011,73 3B,11,数据类型总表,C,数,据,类,型,基本类型,构造类型,指针类型,空类型,void,定义类型,typedef,字符类型,char,枚举类型,enum,整 型,实型,单精度型,float,双精度型,double,数组,结构体,struct,共用体,union,短整型,short (int),长整型,long(int),整型,int,数据类型决定:,1.,数据占内存字节数,2.,数据取值范围,3.,其上可进行的操作,2.1,数据类型,类型,符号,关键字,数的表示范围,所占位数,整型,字符型,实型,有,无,(signed),int,(,signed,),short,(,signed),long,有,有,有,无,说明,:,数据类型所占字节数,与,C,语言编译系统有关,(,VC,默认生成,32,位的机器代码)基本整型,int,=,长整型,long,基本数据类型,16,或,32,16,-3276832767,32,-21474836482147483647,16,或,32,16,065535,32,04294967295,32,3.4e-383.4e38,64,1.7e-3081.7e308,8,-128127,8,0255,unsigned char,(signed),char,double,float,unsigned,int,un,signed,short,un,signed,long,标识符,定义:用来标识变量、常量、函数等的字符序列,组成:,只能由,字母、数字、下划线,组成,且第一个字母必须是字母或下划线,大小写敏感,不能使用关键字,长度:最长,32,个字符,命名原则:见名知意,不宜混淆 如,l,与,I,o,与,0,例,:,判断下列标识符号合法性,sum Sum M.D.John day Date 3days,student_name#33 lotus_1_2_3,char ab _above$123,3days,#33,char,$123,ab,2.2,常量与变量,一般用大写字母,是宏定义预处理命令,不是,C,语句,直接常量,:,整型常量,实型常量,字符常量,字符串常量,定义:程序运行时其值不能改变的量(即常数),分类,:,符号常量,直接常量,符号常量,:,用标识符代表常量,定义格式:,#define,符号常量 常量,例:,#define PI 3.14159,main(),float area,r=10;,area=r*r*PRICE;,printf(Area=%f,area);,运行结果:,Area=314.159000,常量,三种形式:,十进制整数:由数字,0,9,和正负号表示,.,如,123,-456,0,八进制整数:由数字,0,开头,后跟数字,0,7,表示,.,如,0123,011,十六进制整数:由,0 x,开头,后跟,0,9,a,f,A,F,表示,.,如,0 x123,0Xff,例,12,与,12L,整型常量默认为,int,类型,在整常量后加字母,l,或,L,,认为它是,long int,型常量,问题:,0123 =(),10,0 x123=(),10,0Xff =(),10,83,291,255,问题:,0123 =(),10,0 x123=(),10,0Xff =(),10,整型常量(整常数),表示形式:,十进制数形式:(必须有小数点)如,0.123,.123,0.0,123.0,123.,指数形式:,(e,或,E,之前必须有数字;指数必须为整数,),如,12.3e3,123E2,1.23e4,e-5,实型常量默认为,double,型,在实型常量后加字母,f,或,F,,以指定为,float,型,实型常量(实数或浮点数),定义,:,用,单引号,括起来的单个,普通字符,或,转义字符,.,字符常量的,值,:该字符的,ASCII,码值,=!=,),逻辑运算符:(!,&|,),位运算符 :(,|&,),赋值运算符:(,=,及其扩展),条件运算符:(,?:,),逗号运算符:(,),指针运算符:(*,&,),求字节数 :(,sizeof,),强制类型转换:(类型),分量运算符:(,.-,),下标运算符:(,),其它 :(,()-,),2.4,运算符和表达式,运算符功能,与运算量关系,要求运算量个数,要求运算量类型,运算符优先级别,结合方向,结果的类型,学习运算符应注意,基本算术运算符:,+,-,*/%,结合方向:从左向右,优先级:,-,-,*/%,-,+-,(2)(3)(4),说明:,-,可为,单目,运算符时,右结合性,两整数相除,结果为整数,%,要求两侧均为整型数据,例,5/2 =,-5/2.0 =,例,5%2 =,-5%2 =,1%10 =,5%1 =,5.5%2,算术运算符和表达式,2,-2.5,1,-1,1,0,(,),作用:使变量值加,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,自增、自减运算符,+-,作用:使变量值加,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+);,自增、自减运算符,+-(,注意可读性,),例,i+i+j;(i+)+(i+)+j;-,i+i+j;i+;i+;,例,i+j;i+j;(i+)+j;-,i+j;i=i+1;,简单赋值运算符,符号:,=,格式:,变量标识符,=,表达式,作用:将一个数据(常量或表达式)赋给一个变量,复合赋值运算符,种类,:,+=-=*=/=%=,=&=|=,含义:,exp1 op=exp2,exp1=exp1 op exp2,a+=3,a=a+3,x*=y,x=x*y,x%=y+3,x=x%(y+3),例,a=3;,d=func();,c=d+2;,赋值运算符和表达式,结合方向:,自右向左,优先级,:,14,左侧必须是变量,不能是常量或表达式,赋值表达式的值与变量值相等,且可嵌套,赋值转换,规则,:,使赋值号右边表达式值,自动,转换成其左边变量的类型,例,3=x-2*y;,a+b=3;,例,float f;,int 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,说明(,1,):,结合方向:,自右向左,优先级,:,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,),:,形式:,表达式,1,表达式,2,表达式,n,结合性,:,从左向右,优先级,:,15,逗号表达式的值:等于表达式,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,逗号运算符和表达式,例,:,/*ch2_6.c*/,#include,main(),int x,y=7;,float z=4;,x=(y=y+6,y/z);,printf(x=%dn,x);,运行结果:,x=3,关系运算符,种类,:,=!=,结合方向:自左向右,优先级别:,=,=,!=,优先级,6,(高),优先级,7,(低),例,ca+b /c(a+b),ab!=c /(ab)!=c,a=bc /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=0.5;x=0.3;,则,a=x278,在,C,中是允许的,,值为,0,例,int i=1,j=7,a;,a=i+(j%4!=0);,则,a=,2,例 ,a0,结果为,A100,结果为,1,0,关系运算注意(,1,),例 注意区分,=,与,=,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,关系运算注意(,2,),a,b,!a,!b,a&b,a|b,真,假,真,假,假,假,真,真,逻辑运算符,种类:,!&|,逻辑运算真值表,C,语言中,运算量,:,0,表示,假,,,非,0,表示,真,运算结果,:,0,表示,假,,,1,表示,真,真,假,假,假,假,假,真,真,假,假,真,真,真,假,真,真,逻辑运算符和表达式(,1,),!,(2),&,(11),|,(12),高,低,例,a=x&xb&xy,a=b|x=y,!a|ab,优先级:,结合方向:,!,:,从右向左,&:,从左向右,|:,从左向右,/(a=x)&(xb)&(xy),/(a=b)|(x=y),/(!a)|(ab),逻辑运算符和表达式(,2,),!,(2),&,(11),|,(12),高,低,优先级:,结合方向:,!,:,从右向左,&:,从左向右,|:,从左向右,例,a=4;b=5;,!a,a&b,a|b,!a|b,4&0|2,53&2|83)&2|(8b)&(n=cd),/,结果,m=0,n=1,逻辑运算符和表达式(,4,),一般形式:,expr1,?,expr2,:,expr3,执行过程,功能:,2,选,1,相当于条件语句,例,if(ab),printf(%d,a);,else,printf(%d,b);,printf(%d,ab?a:b);,例 求,a+|b|,printf(a+|b|=%dn,b0?a+b:a-b);,expr1,取,expr2,值,取,expr3,值,非,0,=0,例,(a=b)?Y:N,(x%2=1)?1:0,(x=0)?x:-x,(c=a&cb?a:cd?c:d,ab?a:(cd?c:d),expr1,、,expr2,、,expr3,类型可不同,表达式值取较高的类型,例,x?a:b /x=0,表达式值为,b;x0,表达式值为,a,xy?1:1.5 /xy ,值为,1.0;x,圆括号,下标运算符,指向结构体成员运算符,结构体成员运算符,自左至右,2,!,+,_ _,_,(,类型,),*,&,sizeof,逻辑非运算符,按位取反运算符,自增运算符,自减运算符,负号运算符,类型转换运算符,指针运算符,取地址运算符,取长度运算符(字节数),(,单目运算符,),自右至左,优先级,运算符,含 义,运算对象个数,结合方向,3,*,乘法运算符,除法运算符,求余运算符(取模运算),(,双目运算符,),自左至右,4,+,-,加法运算符,减法运算符,(,双目运算符,),自左至右,5,左移运算符,右移运算符,(,双目运算符,),自左至右,6,=,关系运算符,(,双目运算符,),自左至右,7,=,!=,等于运算符,不等于运算符,(,双目运算符,),自左至右,8,&,按位,与,运算符,(,双目运算符,),自左至右,9,按位,异或,运算符,(,双目运算符,),自左至右,优先级,运算符,含 义,运算对象个数,结合方向,10,|,按位,或,运算符,(,双目运算符,),自左至右,11,逻辑与运算符,(,双目运算符,),自左至右,12,|,逻辑或运算符,(,双目运算符,),自左至右,13,?,:,条件运算符,(,三目运算符,),自右至左,14,=,+=-=*=/=%=&=|=,赋值运算符,(,双目运算符,),自右至左,15,,,逗号运算符,(,顺序求值,),(,双目运算符,),自左至右,C,语言函数参考手册,1.C标准库函数,2.I/O函数,3.字符处理函数,4.字符串处理函数,5.数学函数,6.时间和日期函数,7.其他函数,-03-30,1.C,标准库函数,:诊断,1.,中只定义了一个带参的宏,assert,,其定义形式如下:,void assert(int,表达式,),2.assert,宏用于为程序增加诊断功能,它可以测试一个条件并可,能,使程序终止。在执行语句:,assert(,表达式,);,时,如果表达式为,0,,则在终端显示一条信息:,Assertion failed:0,file,源文件名,line,行号,Abnormal program termination,然后调用,abort,终止程序的执行。,3.,在,中,带参宏,assert,是被定义为条件编译的,如果在源文件中定义了宏,NDEBUG,,则即使包含了头文件,,,assert,宏也将被忽略。,:字符类别测试,在头文件,中定义了一些测试字符的函数。在这些函数中,每个函数的参数都是整型,int,,而每个参数的值或者为,EOF,,或者为,char,类型的字符。,中定义的标准函数列表如下:,中定义的函数,函数定义,函数功能简介,函数定义,函数功能简介,int isalnum(int c),检查字符是否是字母或数字,int isprint(int c),检查字符是否是可打印字符,int isalpha(int c),检查字符是否是字母,int ispunct(int c),检查字符是否是标点字符,int isascii(int c),检查字符是否是,ASCII,码,int isspace(int c),检查字符是否是空格符,int iscntrl(int c),检查字符是否是控制字符,int isupper(int c),检查字符是否是大写字母,int isdigit(int c),检查字符是否是数字字符,int isxdigit(int c),检查字符是否是十六进制数字字符,int isgraph(int c),检查字符是否是可打印字符,int toupper(int c),将小写字母转换为大写字母,int islower(int c),检查字符是否是小写字母,int tolower(int c),将大写字母转换为小写字母,:错误处理,中定义了两个常量,一个变量。,1.EDOM,它表示数学领域错误的错误代码。,2.ERANGE,它表示结果超出范围的错误代码。,3.errno,这是一个变量,该值被设置成用来指出系,统,调用的错误类型。,:整型常量,在头文件,中定义了一些表示整型大小的常量。下面给出这些常量的字符表示以及含义,见下表。,字符常量,取值,含义,CHAR_BIT,8,char,类型的位数,CHAR_MAX,255,或,127,char,类型最大值,CHAR_MIN,0,或,-127,char,类型最小值,INT_MIN,-32767,int,类型最小值,INT_MAX,32767,int,类型最大值,LONG_MAX,2147483647,long,类型最大值,LONG_MIN,-2147483647,long,类型最小值,SCHAR_MAX,127,signed char,类型最大值,SCHAR_MIN,-127,signed char,类型最小值,SHRT_MAX,32767,short,类型的最大值,SHRT_MIN,-32767,short,类型的最小值,UCHAR_MAX,255,unsigned char,类型最大值,UINT_MAX,65535,unsigned int,类型最大值,ULONG_MAX,4294967295,unsigned long,类型最大值,USHRT_MAX,65535,unsigned short,类型的最大值,:地域环境,在,中,定义了,7,个常量,一个结构,,2,个函数。,1.,常量的定义,LC_ALL,:传递给,setlocale,的第一个参数,指定要更改该,locale,的哪个方面。,LC_COLLATE,:,strcoll,和,strxfrm,的行为。,LC_CTYPE,:字符处理函数。,LC_MONETARY,:,localeconv,返回的货币信息。,LC_NUMERIC,:,localeconv,返回的小数点和货币信息。,LC_TIME,:,strftime,的行为。,以上扩展成具有唯一取值的整型常数表达式,可作为,setlocale,的第一个参数。,NULL,:由实现环境定义的空指针。,struct lconv,char*decimal_point;,char*thousands_sep;,char*grouping;,char*int_curr_symbol;,char*currency_symbol;,char*mon_decimal_point;,char*mon_thousands_sep;,char*mon_grouping;,char*positive_sign;,char*negative_sign;,char int_frac_digits;,char frac_digits;,char p_cs_precedes;,char p_sep_by_space;,char n_cs_precedes;,char n_sep_by_space;,char p_sign_posn;,char n_sign_posn;,;,2.struct lconv,结构,该结构用于存储和表示当前,locale,的设置。其结构定义如,右所示。,3.,函数,struct Iconv*localeconv(void);,函数,localeconv,将一个,struct Iconv,类型的对象的数据成员设置成为按照当前地域环境 的有关规则进行数量格式化后的相应值。,char*setlocale(int category,char*locale);,函数,setlocale,用于更改和查询程序的整个当前地域环境或部分设置。地域环境变量由参数,category(,上面定义的,6,个常量,),和,locale,指定。,:数学函数,在,中定义了一些数学函数和宏,用来实现不同种类的数学运算。下面给出,中标准数学函数的函数定义及功能简介,见下表。,函数定义,函数功能简介,函数定义,函数功能简介,double exp(double x);,指数运算函数,求,e,的,x,次幂函数,double fmod(double x,double y);,求模函数,double log(double x);,对数函数,ln(x),double sin(double x);,计算,x,的正弦值函数,double log10(double x);,对数函数,log,double cos(double x);,计算,x,的余弦值函数,double pow(double x,double y);,指数函数,(x,的,y,次方,),double tan(double x);,计算,x,的正切值函数,double sqrt(double x);,计算平方根函数,double asin(double x);,计算,x,的反正弦函数,double ceil(double x);,向上舍入函数,double acos(double x);,计算,x,的反余弦函数,double floor(double x);,向下舍入函数,double atan(double x);,反正切函数,1,double fabs(double x);,求,浮,点数的绝对值,double atan2(double y,double x);,反正切函数,2,double ldexp(double x,int n);,装载浮点数函数,double sinh(double x);,计算,x,的双曲正弦值,double frexp(double x,int*exp);,分解浮点数,函数,double cosh(double x);,计算,x,的双曲余弦值,double modf(double x,double*ip);,分解双精度数函数,double tanh(double x);,计算,x,的双曲正切值,在标准库中,还有一些与数学计算有关的函数定义在其他头文件中。,:非局部跳转,在头文件,中定义了一种特别的函数调用和函数返回顺序的方式。这种方式不同于以往的函数调用和返回顺序,它允许程序流程立即从一个深层嵌套的函数中返回。,中定义了两个宏:,int setjmp(jmp_buf env);/*,设置调转点,*/,和,longjmp(jmp_buf jmpb,int retval);/*,跳转,*/,宏,setjmp,的功能是将当前程序的状态保存在结构,env,,为调用宏,longjmp,设置一个跳转点。,setjmp,将当前信息保存在,env,中供,longjmp,使用。其中,env,是,jmp_buf,结构类型的,该结构定义为:,typedef struct,unsignedj_sp;,unsignedj_ss;,unsignedj_flag;,unsignedj_cs;,unsignedj_ip;,unsignedj_bp;,unsignedj_di;,unsignedj_es;,unsignedj_si;,unsignedj_ds;,jmp_buf1;,直接调用,setjmp,时,返回值为,0,,这一般用于初始化(设置跳转点时)。以后再调用,longjmp,宏时用,env,变量进行跳转。程序会自动跳转到,setjmp,宏的返回语句处,此时,setjmp,的返回值为非,0,,由,longjmp,的第二个参数指定。,下面通过例子来理解,中定义的这两个宏。,非局部跳转演示。,#include,jmp_buf env;/*,定义,jmp_buf,类型变量,*/,int main(void),int value;,value=setjmp(env);/*,调用,setjmp,,为,longjmp,设置跳转点,*/,if(value!=0),printf(Longjmp with value%dn,value);,exit(value);/*,退出程序,*/,printf(Jump.n);,longjmp(env,1);/*,跳转到,setjmp,语句处,*/,return 0;,本例程先应用,setjmp,宏为,longjmp,设置跳转点,当第一次调用,setjmp,时返回值为,0,,并将程序的当前状态(寄存器的相关状态)保存在结构变量,env,中。当程序执行到,longjmp,时,系统会根据,setjmp,保存下来的状态,env,跳转到,setjmp,语句处,并根据,longjmp,的第二个参数设置此时,setjmp,的返回值。,本例程的运行结果为:,Jump.,Longjmp with value 1,一般地,宏,setjmp,和,longjmp,是成对使用的,这样程序流程可以从一个深层嵌套的函数中返回。,:信号,头文件,中提供了一些处理程序运行期间引发的各种异常条件的功能,例如一些来自外部的中断信号等。在,中只定义了两个函数:,int signal(int sig,sigfun fname);,和,int raise(int sig);,signal,函数的作用是设置某一信号的对应动作。其中参数,sig,用来指定哪一个信号被设置处理函数。在标准,C,中支持的信号如下表。,取值,说明,默认执行动作,使用的操作系统,SIGABRT,异常中止,中止程序,UNIX DOS,SIGPPE,算术运算错误,中止程序,UNIX DOS,SIGILL,非法硬件指令,中止程序,UNIX DOS,SIGINT,终端中断,中止程序,UNIX DOS,SIGSEGV,无效的内存访问,中止程序,UNIX DOS,SIGTERM,中止信号,中止程序,UNIX DOS,参数,fname,是一个指向函数的指针,当,sig,的信号发生时程序会自动中断转而执行,fname,指向的函数。执行完毕再返回断点继续执行程序。系统提供了两个常量函数指针,可以作为函数的参数传递。它们分别是:,SIG_DEF,:执行默认的系统第一的函数。,SIG_IGN,:忽略此信号。,raise,函数的作用是向正在执行的程序发送一个信号,从而使得当前进程产生一个中断而转向信号处理函数,signal,执行。其中参数,sig,为信号名称,它的取值范围同函数,signal,中的参数,sig,取值范围相同,见,左表,。,下面通过例子理解函数,signal,和,raise,。,例,signall,和,raise,函数演示,#include,#include,void Print1();,void Print2();,int main(),signal(SIGINT,Print1);,printf(Please enter Ctr+c for interuptn);,getchar();,signal(SIGSEGV,Print2);,printf(Please enter any key for a interuptn);,getchar();,raise(SIGSEGV);,void Print1(),printf(This is a SIGINT interupt!n);,void Print2(),printf(This is a SIGSEGV interupt!n);,本例程首先通过用户终端输入,Ctrl+c,产生一个终端中断,然后应用,signal,函数调用中断处理函数,Print1,;再通过,raise,函数生成一个无效内存访问中断,并通过,signal,函数调用中断处理函数,Print2,。,本例程的运行结果为:,Please enter Ctr+c for interupt,C,This is a SIGINT interupt!,Please enter any key for a interupt,a,This is a SIGSEGV interupt,:可变参数表,可变参数表,中的宏是用来定义参数可变的函数的。在,C,语言中,有些库函数或者用户自定义的函数的参数是可变的,常用省略号“”(例如库函数中的,printf,),定义这样的函数就要使用到,中的宏。,1.va_list,用于保存宏,va_start,,,va_arg,以及,va_end,所需信息的数据类型。,2.,中还定义了三个宏,void va_start(va_list ap,parmN);,type va_arg(va_list ap,type);,void va_end(va_list ap);,va_start,的作用是初始化,ap,,因此,va_start,要在所有其它的,va_,开头的宏前面最先,使,用,(,除了用,va_list,定义变量外,),,后面的,va_copy,va_arg,va_end,都要使用到,ap,。在一对,va_start,和,va_end,之间不能再次使用,va_start,宏。其中,,parmN,为,.,之前的最后一个参数。例如,printf,函数定义为:,printf(const char*format,.);,那么在,printf,函数中的,va_start,使用之后,parmN,的值就等于,*format,。,va_arg,的作用就是返回参数列表,ap,中的下一个具有,type,类型的参数,每次调用,va_arg,都会修改,ap,的值,这样才能连续不断地获取下一个,type,类型的参数。,va_end,与,va_start,构成了一个,scope,,,va_end,标志着结束,,va_end,之后,ap,就无效了。,:公共定义,在头文件,中,指定了标准库中的公共定义。其中主要包括以下内容:,1.NULL,空指针类型常量。,2.offset(type,member-designator),它是扩展,iz-t,类型的一个整型常数表达式。它的值为从,type,定义的结构类型,的开头到结构成员,member-designator,的偏移字节数。,3.ptrdiff_t,表示两指针之差的带符号整数类型。,4.size_t,表示由,sizeof,运算符计算出的结果类型,它是一个无符号整数类型。,5.wchar_t,它是一种整数类型,取值范围为在被支持的地域环境中最大扩展字符集的所有字符的各种代码,空字符代码值为,0,。,:输入输出,在头文件,中定义了输入输出函数,类型和宏。这些函数、类型和宏几乎占到标准库的三分之一。,下,面给出头文件,中声,明的函数以及功能简介,见,右,表。,函数定,义,函数功能,简,介,函数定义,函数功能简介,FILE*fopen(char*filename,char*type),打开一个文件,int puts(char*string),送一字符串到流中,FILE*fropen(char*filename,char*type,FILE*fp),打开一个文件,并将该文件关联到,fp,指定的流,int ungetc(char c,FILE*stream),把一个字符退回到输
展开阅读全文