自考资讯

导航

自学考试《C语言程序设计》习题及答案

来源 :中华考试网 2017-01-31

  【1.16】答案:D

  注释:空字符和空格符是不同的两个字符,空格符的ASCII码值是32,空字符的ASCII值是0。

  【1.17】答案:A

  【1.18】答案:B

  【1.19】答案:A

  【1.20】答案:C

  【1.21】答案:B

  注释:单纯从C语言语法来说,选项B、C都是正确的,但是选项C中第一个运算的两个对象都是整型常数,其结果也是整型数0,最后的运算结果也就是0了。

  【1.22】答案:C

  【1.23】答案:A

  注释:将条件表达式增加一个括号,此式变为a

  【1.24】答案:C

  【1.25】答案:B

  【1.26】答案:B

  注释:当通过一个运算对象即可决定逻辑运算&&的结果时,则对另一个运算对象不做处理。

  【1.27】答案:D

  【1.28】答案:B

  注释:数组元素在内存中按行排列,此数组的前3个元素的值分别是3、2、1,表达式中虽然数组下标的写法似乎每行有3个元素,和定义时的3行2列不一致,但是C语言引用数组元素时是根据数组的首地址和给出的下标进行运算决定元素的地址。题中表达式引用了数组前3个元素。

  【1.29】答案: A

  【1.30】答案:D

  【1.31】答案:B

  【1.32】答案:B

  【1.33】答案:B

  【1.34】答案:A

  【1.35】答案:C

  【1.36】答案:C

  【1.37】答案:C

  【1.38】答案:D

  【1.39】答案:D

  【1.40】答案:C

  1.41】答案:D

  注释:scanf函数返回值是输入数据的个数,printf函数的返回值是输出的字符个数。

  【1.42】答案:D

  【1.43】答案:C

  注释:在C语言中, 经常用一个变量来作为逻辑表达式,其含义就是:当变量的值不为0时关系成立。

  【1.44】答案:D

  注释:break语句仅可跳出switch语句,不会跳出while循环,这是一个死循环。

  【1.45】答案:A

  【1.46】答案:C

  【1.47】答案:C

  【1.48】答案:D

  注释:当除数y为0时,程序发生溢出错误。

  【1.49】答案:C

  【1.50】答案:A

  【1.51】答案:C

  【1.52】答案:C

  注释:答案C的赋值号左侧是数组s的首地址,是一个常量,赋值号右侧是一个字符串常量,不可能将一个字符串常量赋给一个地址常量。

  【1.53】答案:D

  注释:D选项缺少字符串结束标志。

  【1.54】答案:C

  注释:此处函数形参是一个指针变量,接受实参的地址,而不是一个数组。

  【1.55】答案:A

  【1.56】答案:D

  注释:这里首先要明确一些基本概念。在C语言中,程序与文件是不同的概念,一个程序可以由一个文件组成,也可以由多个文件组成;一个文件中又可以包含多个函数;函数是构成C程序的基本单位。

  变量的作用域因变量的存储类型不同而不同。auto和register类型的变量的作用域是说明变量的当前函数;外部变量的作用域是整个程序,即外部变量的作用域可以跨越多个文件;内部静态变量(定义在一个函数内部的static型的变量)的作用域是当前函数,外部静态变量(定义在函数外面的static型的变量)的作用域是当前文件,即可以跨越同一文件中的不同函数。

  【1.57】答案:A

  【1.58】答案:A

  注释:它和参数a一样,数据类型说明被省略,按照C语言的规定,在这种情况下,表示它们是int型。

  【1.59】答案:C

  注释:函数swapa是值传递,函数的执行结果不能返回;函数swapb中变量temp不是指针变量,所以它不能接受地址量,用指针变量x为它赋值是不对的;函数swap中虽然指针变量交换了地址,即它们的指向的目标变量进行了交换,但是目标变量并没有行值的交换。

  【1.60】答案:B

  【1.61】答案:D

  【1.62】答案:D

  注释:主调函数中b=0,在执行fun1函数里的除法时发生溢出错误。

  【1.63】答案:B

  【1.64】答案:C

  【1.65】答案:D

  注释:在答案D中,正确的函数调用应当是:printf("%d", *y)。

  【1.66】答案:C

  注释:要注意与说明语句"int (*p)[ ];"的区别。说明语句"int (*p)[ ];"说明的是一个指向数组的指针。

  【1.67】答案:C

  注释:题干中由于*和p被小括号括起,所以p应被解释为一个指针,而后的下标运算符[]说明所指向的对象是一个有4个int型元素的一维数组;如果是int (*p)(),则是指向函数的指针。对于int *p[4],则根据运算符的优先级,先考虑p和[]运算符的关系,所以它就是一个指针数组了。

  【1.68】答案:B

  注释:选项B有两处错误,一是数组名是常量,不能出现的赋值好的左侧,二是指针变量只能和整数做加,不能和作为地址常量的数组名相加。

  【1.69】答案:D

  注释:s作为数组名是地址常量,而s++是s=s+1,C语言不允许对常量进行赋值。

  【1.70】答案:C

  【1.71】答案:C

  注释:a是二维数组名,a+1中的1不是1个字节,而是数组的"一行",即10个字节,所以a+1是第二个字符串的首地址,A选项正确。在C编译系统中对二维数组名可这样理解(注意,这里仅是理解):a指向一个一维数组,故(a+1)是指向a[1]的,*(a+1)就是取a[1]的值,它保存第二个字符串"ShangHai"的首地址,所以选项B也正确。*a是第一个字符串的首地址,加1是第一个字符串中第二个字符的地址,选项C的输出是"beiJing"。选项D中的&a[1][0]是对第二个字符串的第一个字符做取地址运算,得到该地址就是字符串"ShangHai"的首地址。注意,对于二维数组来说,做一次*或[]运算的结果仍是地址量,做两次才是取数值。

  【1.72】答案:A

  注释:p是一个一级指针,选项B中对它进行了两次*运算是错误的。ptr是一个指向一维数组的指针,它所指向的数组有三个元素,对于这样一个指针,对它进行两次**运算才能取出地址单元中所存的数据,C选项中*ptr表示数组第一行的首地址,该地址是一维数组的地址,+3表示加上三个它所指向的数据类型的长度,所以(*ptr+1)+2是数组中数值4的地址。根据以上分析,选项D对ptr进行了两次地址操作(*和[]),所以结果应是数据,但是它加1后指向数组第二行,根据后面[]中2它的地址增加两个一维数组的长度,就指向数组的最后一行,再做*运算就是数10,即a[3][0]。

  【1.73】答案:A

  【1.74】答案:B B

  【1.75】答案:D

  【1.76】答案:B

  【1.77】答案:D

  注释:答案D是另一种交换两个变量值的算法。

  【1.78】答案:B

  【1.79】答案:C

  注释:使用C对p进行赋值,则p->next是a[0]的地址,引用其成员n再做前增1运算,结果就是2。

  【1.80】答案:B

  【1.81】答案:D

  【1.82】答案:A

  【1.83】答案:C

  注释:联合变量temp的成员是占用同一存储单元,它的长度是4个字节。266的二进制表示是100001010,存放在存储单元的低端两个字节,如下图:

  高字节

  0 0 0 0 0 0 0 1

  低字节 0 0 0 0 1 0 1 0

  引用temp.ch进行输出,只取最低的第一个字节。

  【1.84】答案:D

  注释:由于结构指针指向了结构数组的0号元素,所以表达式(p++)->m的含义是先取出m(变量a的地址),然后指针p加1。表达式*(p++)->m的含义是先取出m的内容(变量a的值),然后指针p再加1。表达式(*p).m的含义是取出m(变量a的地址)。表达式*(++p)->m的含义是先将指针p加1,然后再取m的内容(变量b的值)。

  【1.85】答案:D

  【1.86】答案:B

  【1.87】答案:C

  【1.88】答案:A

  【1.89】答案:D

  【1.90】答案:D

  【1.91】答案:A

  【1.92】答案:B

  【1.93】答案:A

  【1.94】答案:D

  注释:函数fopen中的第二参数是打开模式,"r"模式是只读方式,不能写文件;"a+"模式是读/追加方式,允许从文件中读出数据,但所有写入的数据均自动加在文件的末尾;"w"模式是写方式,允许按照用户的要求将数据写入文件的指定位置,但打开文件后,首先要将文件的内容清空。"r+"模式是读/写方式,不但允许读文件,而且允许按照用户的要求将数据写入文件的指定位置,且在打开文件后,不会将文件的内容清空。本题的要求是"修改"文件的内容,因此只能选择答案D。

  【1.95】答案:C

  【1.96】答案:D

  【1.97】答案:C

  【1.98】答案:B

  注释:语句z=2*(N+Y(5+1)引用了两个宏定义。C语言是区分字母大小的,第二个宏定义中的N直接用3替换,用5+1替换n,则有z=2*(3+(3+1)*5+1);结果是48。注意对于带参数的宏亦是直接的文本替换,此例中n用5+1去替换,结果是(N+1)*5+1,而不是(N+1)*(5+1)。

  【1.99】答案:C

  注释:宏替换后的结果是printf("%d",10/3*3)。

  【1.100】答案:C

分享到

您可能感兴趣的文章