校招笔试 | C语言笔试必考系列!!!
说到C语言,可能有人觉得太简单了
这有啥好说的
但素,,,,
今天小姐姐就遇到了一个这样的事
所以说C语言里面坑还是很多的
今天就给大家准备了几个笔试经典的题目
可以助大家顺利通过笔试
1. 以下叙述中不正确的是(D)
A.在不同的函数中可以使用相同名字的变量
B.函数中的形式参数是在栈中保存
C.在一个函数内定义的变量只在本函数范围内有效
D.在一个函数内复合语句中定义的变量在本函数范围内有效
(复合语句值函数中的成对括号构成)
注:D项是有错误的比如我举个例子
#include<stdio.h> int man() { { int a=10; } printf("%d\n",a); return 0; }
这个如果再编译中,一定会出现,a未定义的错误的。
2.
#include<stdio.h> #include<Windows.h> int main() { int i; char acNEW[20]; for (i = 0; i < 5; i++) { acNEW[i] = '0'; } printf("%d\n", strlen(acNEW)); system("pause"); return 0; }
问题是求输出结果:
这个答案应该不确定,因为它在为字符数组赋值时,并未赋 '0' ,但是strlen函数认为结束的标准就是 '0' ,所以当它读到最后一位他会继续走下去,直到它遇到 '0'。
因为后面是垃圾数据都是随机的,所以strlen函数在读时直到遇到 '0' 它才会停下来,所以答案是不确定的。
3.全局变量可以定义在被多个.c文件包含着的头文件中?
错误
这个在编译时会报错的,但是如果使用static修饰就可以编译通过。
4.在X86下,有这些程序:
include<stdio.h> include<Windows.h> int main() { union { short k; char i[2]; }*s,a; s = &a; s->i[0] = 0x39; s->i[1] = 0x38; printf("%x\n", a.k); system("pause"); return 0; } }
这道题问的是输出的什么?这里牵扯的知识点 联合体和大小端存储,x86是小端存储,这种东西就得靠记了。。没办法大家都知道联合体空间公用对吧,short长度为2B,char i[2]长度也为2B.所以你的a.k虽然并未赋值,但是你等于输出了char i[2]数组中的内容,他们虽然名字不同现在他们内容是一样的。这就考验我们大小端的概念了。
接下来下面是我画的这道题的理解图:
大家也知道读取数据一般是从高位开始读,比如一个数字 120 我们肯定是先看他最大的位对吧(高位),所以这道题的答案是 3839
我再截图验证一下:
5.求下列程序输出结果
#include<stdio.h> #include<Windows.h> int main() { unsigned char a = 200; unsigned char b = 100; unsigned char c = 0; c = a + b; printf("%d %d", a + b, c); system("pause"); return 0; }
这道题主要考的是你对unsigned的理解,接下来我画一张图帮大家理解
现在我说的对不对呢?大家看看输出结果
6.在x86,vc++ 6.0环境下,有下列程序
#include<stdio.h> #include<Windows.h> int main() { char c; unsigned char uc; unsigned short us; c = 128; uc = 128; us = c + uc; printf("0x%x\n", us); us = (unsigned char)c + uc; printf("0x%x\n", us); us = c + (char)uc; printf("0x%x\n", us); system("pause"); return 0; }
做这道题前应该知道 char 的取值范围是-128 ~ 127,所以当你给uc赋128的时候,它真实的值为-128。
具体我说的对不对?看看运行结果。
7.
#include<stdio.h> #include<Windows.h> struct tagAAA { unsigned char ucld : 1; unsigned char ucpara : 2; unsigned char ucState : 6; unsigned char ucTail : 4; unsigned char ucAvail; unsigned char ucTail2; unsigned char ucData; }AAA_S1; struct tagAAA2 { unsigned int ucld : 1; unsigned int ucpara : 2; unsigned int ucState : 6; unsigned int ucTail : 4; unsigned int ucAvail; unsigned int ucTail2; unsigned int ucData; }AAA_S2; int main() { printf("%d %d\n", sizeof(AAA_S1), sizeof(AAA_S2)); system("pause"); return 0; }
求AAA_S再分别为1字节对齐和四字节对齐的情况下,占用空间的大小:?
答案为 6 16.
这个问题就是位域的问题,我有专门关于结构体对齐的博客,点击这个链接就能看https://blog.csdn.net/Dawn_sf...
8.
#include<stdio.h> #include<Windows.h> #pragma pack(4); int main() { unsigned char puc[4]; struct sagPIM{ unsigned char ucpim1; unsigned char ucDate:1; unsigned char ucDate1:2; unsigned char ucDate2:3; }*pstPimData; pstPimData = (struct sagPIM*)puc; memset(puc, 0, 4); pstPimData->ucpim1 = 2; pstPimData->ucDate = 3; pstPimData->ucDate1 = 4; pstPimData->ucDate2 = 5; printf("%02x %02x %02x %02x\n", puc[0], puc[1], puc[2], puc[3]); system("pause"); return 0; }
这个主要还是位域,还有存储的一些关系了。
因为按照位域存储,该结构体只需要2个字节即可存储全部内容,然后开始思考他内部的结构。
下来我画一个图理解一下。
再看看运行的结果吧 有图有真相。
这些题目都是历年笔试的必考题,大家一定要仔细看看这里面涉及的知识点呀,这样笔试的时候才能过过过呀~~