学习完c语言,需要对所学知识进行一个检测,下面有一套笔试题,
你有四十分钟进行检测,每道题五分,严格要求自己打分。
根据作者原话:在没有何提示的情况下,如果能得满分,那你可以扔掉本书了,因为你的水平已经大大超过了作者;如果能得80分以上,说明你的C语言基础还不错,学习本书可能会比较轻松;如果得分在50分以下,也不要气馁,努力学习就行了;如果不小心得了10分以下,那就得给自己敲敲警钟了;如果不幸得了0分,那实在是不应该,因为毕竟很多题是很简单的。
、答案解析:
1.根据隐式类型转换存储规则:
long double double float unsigned long int long int unsigned int int 当连个不同类型的值比较或相加减时,默认从低到高转换,即向上转换
所以,a和b相加时,b会隐式转换成unsigned int类型,对于-20来说,其补码为:
100000000 00000000 00000000 00010100 -- 原码 1111111111 111111111 111111111 11101011 -- 反码 1111111111 111111111 111111111 11101100 -- 补码
此时b是无符号整型,首位不再被当成符号位,所以b成了一个很大的数字,加上a当然比6大。
2.运行到strcpy的时候可能会发生异常,因为str1存储了10个字符a之后,后面存储的不是’\0’,
strcpy拷贝时会寻找’\0’作为结束标志,str1中第10个字符a之后的空间不是str1的,是内存的空间,
strcpy从此地方开始向后寻找’\0’时,会造成内存的非法访问,可能会导致程序出现异常。
3.i = 10,j = 1.
由于静态的局部变量是再内存中的静态区存储,静态局部变量在初始化一次后不会被销毁,且只初始化一次,在下一次使用时仍然保持上一次的值。所以i只初始化一次,每次继续调用该函数时,仍然保留上一次i的值。
对于j来说,j是静态全局变量,每次调用函数都会被初始化.
4.除了(3)是400以外,其余全都是4。
(1)p是指针,被置为空, 所以p所指向的地址就是一个空地址,既然是地址,题目限定了在32位系统下,所以就是4个字节。
(2)p其实就是对p进行解引用,p是所指向的对象是一个int类型,计算p其实就是计算int类型的大小。
3)对于数组来说,数组名表示数组首元素地址,除了下面两个例外:
1.sizeof(数组名),即数组名单独放在sizeof内部,表示的是整个数组的大小。
2.&数组名,取到的是整个数组的地址。
除了上面两个特例,其余的数组名都是表示数组首元素地址
很明显:(3)中的数组名单独放在sizeof内部,计算的就是整个数组大小,a数组有100个元素,每个元素是int类型,总大小就是400字节。
(4)a[100]就是计算a的第100个元素的大小,虽然a[100]并不存在,也不影响计算a的第100个元素的大小,也是一个int类型。比如说:int b[1] = {0}; 计算sizeof(b[10]),大小仍为4个字节。
(5)&a,是上面两个特例中的第二个特例,取到的是整个数组的地址,其实,整个数组的地址就是首元素的地址,只是如果取到整个数组的地址后+1,会跳过整个数组。
既然它是地址,地址就是4个字节。
(6)&a[0],就是取首元素地址,是地址就是4字节。
(7)这是一个典型的数组传参问题,b传参时,因为b是数组首元素地址,本质上传的是一个int*的指针,形参部分int b[100],实际上这是一个指针,所以计算b的大小,就是计算指针的大小,即4个字节。(b不再是数组首元素地址,b是一个指针)
5.对于数组a来说,它的元素类型是signed char类型,范围是-128~127。a[0] = -1,a[1] = -2,…a[127] = -128,此时a[128]不可能是-129,因为:
-128的二进制原码是:
100000000 00000000 00000000 10000000
补码是:
11111111 11111111 11111111 10000000
存入a[127]中会发生截断,补码的低8位放进去,即
10000000放入,转化成原码为:
1 00000000
而该原码规定就是-128。
而-129的二进制原码为:
100000000 00000000 00000000 10000001
补码为:
11111111 11111111 11111111 01111111
截取低8位存入a[128]中,是
01111111
转换成二进制原码是:
01111111
这是正数,正数的原码反码补码相同,转换成十进制是127.
所以a[128] = 127, a[129] = 126… ,直到a[255] = 0;
strlen计算长度时,就需要找’\0’作为结束标志,而0就代表’\0’。所以计算数组的长度时,大小为255.