《c语言深度解剖》--一套非常经典的笔试题(1)

简介: 学习完c语言,需要对所学知识进行一个检测,下面有一套笔试题,你有四十分钟进行检测,每道题五分,严格要求自己打分。根据作者原话:在没有何提示的情况下,如果能得满分,那你可以扔掉本书了,因为你的水平已经大大超过了作者;如果能得80分以上,说明你的C语言基础还不错,学习本书可能会比较轻松;如果得分在50分以下,也不要气馁,努力学习就行了;如果不小心得了10分以下,那就得给自己敲敲警钟了;如果不幸得了0分,那实在是不应该,因为毕竟很多题是很简单的

学习完c语言,需要对所学知识进行一个检测,下面有一套笔试题,
你有四十分钟进行检测,每道题五分,严格要求自己打分

根据作者原话:在没有何提示的情况下,如果能得满分,那你可以扔掉本书了,因为你的水平已经大大超过了作者;如果能得80分以上,说明你的C语言基础还不错,学习本书可能会比较轻松;如果得分在50分以下,也不要气馁,努力学习就行了;如果不小心得了10分以下,那就得给自己敲敲警钟了;如果不幸得了0分,那实在是不应该,因为毕竟很多题是很简单的。

b4270b2ad16047148701800ad283882a.png

33aef03839f54d82b7c2b1503c8ec7f5.png46e06be2a8c14b94b9ad007bff48f807.png

7b28ef2926044b70960ee50a5cc535c0.png

bd83208b854e4c48b2c43c87174db616.png

e1521d02c28c4a5e832e1242e7c72958.png

87f9cd40bd2240a9b507e653a0c4b189.png

e51284d899934ff4be290151b89bd29f.png

67a1f8e4d25843d4a09291ef25c9c008.png

b568382b77fe400787e6545306662a9f.png

ee3f94e542374b74b22f3ea566b59e10.png

087c2c00d922471a916643f4b03d59f6.png

9c9c308fd5d641d5b27bd5423c58393b.png

d19886d535964b479720c9a3a74e4a03.png

0749daddbe4e4739b7d7db41c32c4779.png

fe071bdabe11432dbc926b9d67cafe14.png

1326e5116ac844bb9695984c2043292b.png

c882da56cc7c46d2a03a512bad1a71e7.png

4adf314e2a7a47109376c49d0599f94e.png

9b63a6c0dc264c3b86caa00168021d9a.png答案解析:

b4270b2ad16047148701800ad283882a.png

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大。

46e06be2a8c14b94b9ad007bff48f807.png

2.运行到strcpy的时候可能会发生异常,因为str1存储了10个字符a之后,后面存储的不是’\0’,

strcpy拷贝时会寻找’\0’作为结束标志,str1中第10个字符a之后的空间不是str1的,是内存的空间,

strcpy从此地方开始向后寻找’\0’时,会造成内存的非法访问,可能会导致程序出现异常。

33aef03839f54d82b7c2b1503c8ec7f5.png

3.i = 10,j = 1.

由于静态的局部变量是再内存中的静态区存储,静态局部变量在初始化一次后不会被销毁,且只初始化一次,在下一次使用时仍然保持上一次的值。所以i只初始化一次,每次继续调用该函数时,仍然保留上一次i的值。

对于j来说,j是静态全局变量,每次调用函数都会被初始化.

7b28ef2926044b70960ee50a5cc535c0.png

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是一个指针)

bd83208b854e4c48b2c43c87174db616.png

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.

相关文章
|
3月前
|
存储 编译器 C语言
从C语言到C++_34(C++11_下)可变参数+ lambda+function+bind+笔试题(下)
从C语言到C++_34(C++11_下)可变参数+ lambda+function+bind+笔试题
57 5
|
11天前
|
存储 小程序 C语言
C语言数据的存储(内含百度笔试题)
C语言数据的存储(内含百度笔试题)
23 4
|
2月前
|
程序员 C语言 C++
【C语言基础】:动态内存管理(含经典笔试题分析)-2
【C语言基础】:动态内存管理(含经典笔试题分析)
|
2月前
|
程序员 编译器 C语言
【C语言基础】:动态内存管理(含经典笔试题分析)-1
【C语言基础】:动态内存管理(含经典笔试题分析)
|
3月前
|
算法 编译器 C语言
从C语言到C++_34(C++11_下)可变参数+ lambda+function+bind+笔试题(中)
从C语言到C++_34(C++11_下)可变参数+ lambda+function+bind+笔试题
35 2
|
3月前
|
存储 C语言 Python
从C语言到C++_24(二叉搜索树)概念+完整代码实现+笔试题(下)
从C语言到C++_24(二叉搜索树)概念+完整代码实现+笔试题
54 3
|
3月前
|
算法 编译器 C语言
从C语言到C++_34(C++11_下)可变参数+ lambda+function+bind+笔试题(上)
从C语言到C++_34(C++11_下)可变参数+ lambda+function+bind+笔试题
25 1
|
3月前
|
C语言
从C语言到C++_24(二叉搜索树)概念+完整代码实现+笔试题(中)
从C语言到C++_24(二叉搜索树)概念+完整代码实现+笔试题
23 1
|
2月前
|
程序员 C语言 C++
C语言学习记录——动态内存习题(经典的笔试题)、C/C++中程序内存区域划分
C语言学习记录——动态内存习题(经典的笔试题)、C/C++中程序内存区域划分
115 0
|
3月前
|
算法 测试技术 C语言
从C语言到C++_24(二叉搜索树)概念+完整代码实现+笔试题(上)
从C语言到C++_24(二叉搜索树)概念+完整代码实现+笔试题
39 0