级c语言题库.pdf

上传人:s****u 文档编号:12796426 上传时间:2020-05-24 格式:PDF 页数:9 大小:194.65KB
返回 下载 相关 举报
级c语言题库.pdf_第1页
第1页 / 共9页
级c语言题库.pdf_第2页
第2页 / 共9页
级c语言题库.pdf_第3页
第3页 / 共9页
点击查看更多>>
资源描述
位的概念我们知道,在计算机中,一字节占8位(现在的某些电脑也有占1 6位的), 这样表示的数的范围为0 -2 5 5,也即0 0 0 0 0 0 0 0 -1 1 1 1 1 1 1 1。位就是里面的0和1。 ch ar c=1 0 0 ;实际上c应该是0 1 1 0 0 1 0 0,正好是6 4 H。其中高位在前,低位在后。 | |第7位 第0位 二、位逻辑运算符符号 描述 c=c|0 x 4 0 ; 这样不论c原先是多少,和0 1 0 0 0 0 0 0或以后,总能使第6位为1,而其他位不变。 清除位:设置某位为0,而其他位保持不变。可以使用位逻辑与运算。c=c 这样c和1 0 1 1 1 1 1 1与以后,总能使第6位为0,其他位保持不变。那如果想让某位为1,其他位都为0怎么办呢? 三、位移运算符符号 描述 右移 位移运算符作用于其左侧的变量,其右侧的表达式的值就是移动的位 数,运算结果就是移动后的变量结果。b =a=1 ; /* n u m右移1位 * / p rin tf(%d n ,co u n t); 这样每次都判断最低位是不是1,判断完以后,让前面的右移一位即 可。对位的操作,一般程序中用的不多,但是在对计算机硬件操作时,肯定 会涉及到。例如,我们以后要讲到的对串口和声卡操作就要用到一些。预处理过程 扫描源代码,对其进行初步的转换,产生新的源代 码提供给编译器。可见预处理过程先于编译器对源代码进行处理。在C语言中,并没有任何内在的机制来完成如下一些功能:在编译时包 含其他源文件、定义宏、根据条件决定编译时是否包含某些代码。要完成这些工作,就需要使用预处理程序。尽管在目前绝大多数编译器都包 含了预处理程序,但通常认为它们是独立于编译器的。预处理过程读入源代码,检查包含预处理指令的语句和宏定义,并对源代码进行响应的 转换。预处理过程还会删除程序中的注释和多余的空白字符。 预处理指令是以#号开头的代码行。#号必须是该行除了任何空白字符外的第一个字符。#后是指令关键字,在关键字和#号之间允许存在任意个 数的空白字符。整行语句构成了一条预处理指令,该指令将在编译器进行编译之前对源代码做某些转换。下面是部分预处理指令: 指令 用途# 空指令,无任何效果 # in clu d e 包含一个源代码文件# d efin e 定义宏 # u n d ef 取消已定义的宏# if 如果给定条件为真,则编译下面代码 # ifd ef 如果宏已经定义,则编译下面代码# ifn d ef 如果宏没有定义,则编译下面代码 # elif 如果前面的# if给定条件不为真,当前条件为真,则编译下面代码# en d if 结束一个# if# else条件编译块 # erro r 停止编译并显示错误信息一、文件包含 # in clu d e预处理指令的作用是在指令处展开被包含的文件。包含可以是多重的,也就是说一个被包含的文件中还可以包含其他文件。标准C编 译器至少支持八重嵌套包含。预处理过程不检查在转换单元中是否已经包含了某个文件并阻止对它的 多次包含。这样就可以在多次包含同一个头文件时,通过给定编译时的条件来达到不同的效果。例如: # d efin e AAA# in clu d e t.c # u n d ef AAA# in clu d e t.c 为了避免那些只能包含一次的头文件被多次包含,可以在头文件中用编译时条件来进行控制。例如: /* my .h * /# ifn d ef MY_ H # d efin e MY_ H # en d if在程序中包含头文件有两种格式: # in clu d e # in clu d e my .h 第一种方法是用尖括号把头文件括起来。这种格式告诉预处理程序在编 译器自带的或外部库的头文件中搜索被包含的头文件。第二种方法是用双引号把头文件括起来。这种格式告诉预处理程序在当前被编译的应用 程序的源代码文件中搜索被包含的头文件,如果找不到,再搜索编译器自带的头文件。 采用两种不同包含格式的理由在于,编译器是安装在公共子目录下的,而被编译的应用程序是在它们自己的私有子目录下的。一个应用程序既 包含编译器提供的公共头文件,也包含自定义的私有头文件。采用两种不同的包含格式使得编译器能够在很多头文件中区别出一组公共的头文 件。二、宏 宏定义了一个代表特定内容的标识符。预处理过程会把源代码中出现的宏标识符替换成宏定义时的值。宏最常见的用法是定义代表某个值的全 局符号。宏的第二种用法是定义带参数的宏,这样的宏可以象函数一样被调用,但它是在调用语句处展开宏,并用调用时的实际参数来代替定 义中的形式参数。1 .# d efin e指令 # d efin e预处理指令是用来定义宏的。该指令最简单的格式是:首先神明一个标识符,然后给出这个标识符代表的代码。在后面的源代码中,就 用这些代码来替代该标识符。这种宏把程序中要用到的一些全局值提取出来,赋给一些记忆标识符。 # d efin e MAX_ NUM 1 0in t array MAX_ NUM; fo r(i=0 ;i在这个例子中,对于阅读该程序的人来说,符号MAX_ NUM就有特定的 含义,它代表的值给出了数组所能容纳的最大元素数目。程序中可以多次使用这个值。作为一种约定,习惯上总是全部用大写字母来定义宏, 这样易于把程序红的宏标识符和一般变量标识符区别开来。如果想要改变数组的大小,只需要更改宏定义并重新编译程序即可。 宏表示的值可以是一个常量表达式,其中允许包括前面已经定义的宏标识符。例如: # d efin e ONE 1# d efin e TWO 2 # d efin e THREE (ONE+TWO)注意上面的宏定义使用了括号。尽管它们并不是必须的。但出于谨慎考 虑,还是应该加上括号的。例如:six =THREE* TWO; 预处理过程把上面的一行代码转换成: six =(ONE+TWO)* TWO;如果没有那个括号,就转换成six =ONE+TWO* TWO;了。 宏还可以代表一个字符串常量,例如:# d efin e VERSION Versio n 1 .0 Co p y rig h t(c) 2 0 0 3 2 .带参数的# d efin e指令带参数的宏和函数调用看起来有些相似。看一个例子: # d efin e Cu b e(x ) (x )* (x )* (x )可以时任何数字表达式甚至函数调用来代替参数x。这里再次提醒大家 注意括号的使用。宏展开后完全包含在一对括号中,而且参数也包含在括号中,这样就保证了宏和参数的完整性。看一个用法: in t n u m=8 +2 ;v o lu me=Cu b e(n u m); 展开后为(8 +2 )* (8 +2 )* (8 +2 );如果没有那些括号就变为8 +2 * 8 +2 * 8 +2了。 下面的用法是不安全的:v o lu me=Cu b e(n u m+); 如果Cu b e是一个函数,上面的写法是可以理解的。但是,因为Cu b e是一个宏,所以会产生副作用。这里的擦书不是简单的表达式,它们将产 生意想不到的结果。它们展开后是这样的:v o lu me=(n u m+)* (n u m+)* (n u m+); 很显然,结果是1 0 * 1 1 * 1 2 ,而不是1 0 * 1 0 * 1 0 ;那么怎样安全的使用Cu b e宏呢?必须把可能产生副作用的操作移到宏调 用的外面进行:in t n u m=8 +2 ; v o lu me=Cu b e(n u m);n u m+; 3 .#运算符出现在宏定义中的#运算符把跟在其后的参数转换成一个字符串。有时 把这种用法的#称为字符串化运算符。例如:# d efin e PASTE(n ) ad h fk j# n main () p rin tf(%sn ,PASTE(1 5 ); 宏定义中的#运算符告诉预处理程序,把源代码中任何传递给该宏的参数转换成一个字符串。所以输出应该是ad h fk j1 5。 4 .# #运算符 # #运算符用于把参数连接到一起。预处理程序把出现在# #两侧的参数合并成一个符号。看下面的例子: # d efin e NUM(a,b ,c) a# # b # # c# d efin e STR(a,b ,c) a# # b # # c main () p rin tf(%d n ,NUM(1 ,2 ,3 );p rin tf(%sn ,STR(aa,b b ,cc); 最后程序的输出为: 1 2 3aab b cc 千万别担心,除非需要或者宏的用法恰好和手头的工作相关,否则很少有程序员会知道# #运算符。绝大多数程序员从来没用过它。 三、条件编译指令条件编译指令将决定那些代码被编译,而哪些是不被编译的。可以根据 表达式的值或者某个特定的宏是否被定义来确定编译条件。1 .# if指令 # if指令检测跟在制造另关键字后的常量表达式。如果表达式为真,则编译后面的代码,知道出现# else、# elif或# en d if为止;否则就不编译。 2 .# en d if指令# en d if用于终止# if预处理指令。 # d efin e DEBUG 0main () # if DEBUG p rin tf(Deb u g g in g n );# en d if p rin tf(Ru n n in g n ); 由于程序定义DEBUG宏代表0,所以# if条件为假,不编译后面的代码直到# en d if,所以程序直接输出Ru n n in g。 如果去掉# d efin e语句,效果是一样的。3 .# ifd ef和# ifn d ef # d efin e DEBUGmain () # ifd ef DEBUGp rin tf(y esn ); # en d if# ifn d ef DEBUG p rin tf(n o n );# en d if # if d efin ed等价于# ifd ef; # if !d efin ed等价于# ifn d ef 4 .# else指令# else指令用于某个# if指令之后,当前面的# if指令的条件不为真时,就 编译# else后面的代码。# en d if指令将中指上面的条件块。# d efin e DEBUG main () # ifd ef DEBUGp rin tf(Deb u g g in g n ); # elsep rin tf(No t d eb u g g in g n ); # en d ifp rin tf(Ru n n in g n ); 5 .# elif指令 # elif预处理指令综合了# else和# if指令的作用。# d efin e TWO main ()# ifd ef ONE p rin tf(1 n );# elif d efin ed TWO p rin tf(2 n );# else p rin tf(3 n );# en d if 程序很好理解,最后输出结果是2。 6 .其他一些标准指令# erro r指令将使编译器显示一条错误信息,然后停止编译。 # lin e指令可以改变编译器用来指出警告和错误信息的文件号和行号。 # p rag ma指令没有正式的定义。编译器可以自定义其用途。典型的用法是禁止或允许某些烦人的警告信息。 一、标准文件的读写1 .文件的打开fo pen () 文件的打开操作表示将给用户指定的文件在内存分配一个FILE结构区,并将该结构的指针返回给用户程序,以后用户程序就可用此FILE指针来 实现对指定文件的存取操作了。当使用打开函数时,必须给出文件名、文件操作方式(读、写或读写),如果该文件名不存在,就意味着建立(只 对写文件而言,对读文件则出错),并将文件指针指向文件开头。若已有一个同名文件存在,则删除该文件,若无同名文件,则建立该文件, 并将文件指针指向文件开头。fo p en (ch ar * filen ame,ch ar * ty p e); 其中* filen ame是要打开文件的文件名指针,一般用双引号括起来的文件名表示,也可使用双反斜杠隔开的路径名。而* ty p e参数表示了对打开 文件的操作方式。其可采用的操作方式如下:方式 含义 r 打开,只读w 打开,文件指针指到头,只写 a 打开,指向文件尾,在已存在文件中追加rb 打开一个二进制文件,只读 wb 打开一个二进制文件,只写ab 打开一个二进制文件,进行追加 r+ 以读/写方式打开一个已存在的文件w+ 以读/写方式建立一个新的文本文件 a+ 以读/写方式打开一个文件文件进行追加rb + 以读/写方式打开一个二进制文件 wb + 以读/写方式建立一个新的二进制文件ab + 以读/写方式打开一个二进制文件进行追加 当用fo p en (0成功的打开一个文件时,该函数将返回一个FILE指针,如果文件打开失败,将返回一个NULL指针。如想打开test文件,进行写: FILE * fp ;if(fp =fo p en (test,w)=NULL) p rin tf(File can n o t b e o p en ed n );ex it(); else p rin tf(File o p en ed fo r writin g n ); fclo se(fp ); DOS操作系统对同时打开的文件数目是有限制的,缺省值为5,可以通过修改CONFIG.SYS文件改变这个设置。 2 .关闭文件函数fclo se()文件操作完成后,必须要用fclo se()函数进行关闭,这是因为对打开的文 件进行写入时,若文件缓冲区的空间未被写入的内容填满,这些内容不会写到打开的文件中去而丢失。只有对打开的文件进行关闭操作时,停 留在文件缓冲区的内容才能写到该文件中去,从而使文件完整。再者一旦关闭了文件,该文件对应的FILE结构将被释放,从而使关闭的文件得 到保护,因为这时对该文件的存取操作将不会进行。文件的关闭也意味着释放了该文件的缓冲区。 in t fclo se(FILE * stream);它表示该函数将关闭FILE指针对应的文件,并返回一个整数值。若成功 地关闭了文件,则返回一个0值,否则返回一个非0值。常用以下方法进行测试: if(fclo se(fp )!=0 )p rin tf(File can n o t b e clo sed n ); ex it(1 ); elsep rin tf(File is n o w clo sed n ); 当打开多个文件进行操作,而又要同时关闭时,可采用fclo seall()函数,它将关闭所有在程序中打开的文件。 in t fclo seall();该函数将关闭所有已打开的文件,将各文件缓冲区未装满的内容写到相 应的文件中去,接着释放这些缓冲区,并返回关闭文件的数目。如关闭了4个文件,则当执行: n =fclo seall();时,n应为4。
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 考试试卷


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!