在完成三年的纳新题后 深深的感到学长们对这一张张试卷中注入的心血 让我们受益良多 接下来对这三年的一些题目进行总结。
2015年纳新题目总结:
第五题:
请解释什么是预处理,何时需要进行预处理?
为什么要进行C语言的预处理 因为在写代码时我们经常会有注释 宏定义等而且为了愉快的完成我们的代码工作 各种各样的函数也是必不可少的,所以我们要进行预处理,去用代码取代include 删除注释 替换define的符号等 ,这是一篇很好的预处理解释预处理总结
第七题
下列结构体在内存中所占的空间大小是多少?
struct node
{
int x;
char y;
double x;
};
struct node
{
int x;
double y;
char z;
};
其实这是一个字节对齐的应用 引入字节对齐的概念其实就是为了提高CPU的效率 其实我们可以想到 如果我们有一个int类型存储在0X0003 ~ 0X0006 CPU一次可以读32bit 显然 第一次从0X0001 ~ 0X0004 第二次从0X0005~0X0008 然后把两次的值拼接起来 我们才可以得到我们需要的数据 这样效率是十分低下的 这个时候我们的前辈引入了字节对齐 使得程序可以帮我们自动实现字节对齐(在较低版本的编译器中不可以)计算方式
第二十题
*如何理解本试卷中出现的“int main(int argc, char argv[] ) ”? 请谈一谈你所理解的main函数。
这两个参数其实给了我们对main函数一种新的使用方式 就是通过命令行去干涉程序 我们就可以在命令行上向程序内写入参数 ,
比如
当我们执行这样一个指令的时候<./a.out 1 2 3 4 5>,我们的参数就为5,分别是argv[1] 到argv[5] ,而在argv[0]中 就是<./a.out> 这样我们就可以在程序中去使用argc变量和argv数组。当然不止这样的作用,----->main函数参数的应用
2017年纳新题总结
第十二题
对比下面程序在Linux和windows上的输出结果,并思考原因。
int main(int argc, char *argv[])
{
while(1)
{
fprintf(stdout,"Group");
fprintf(stderr,"XiyouLinux");
getchar();
}
return 0;
}
** 首先输出的答案是 XiyouLinuxGroup ,为什么呢 明明Group是在前面 首先我们来看看fprintf的函数原形:
int fprintf(FILE stream,charformat,[argument]);
对于这道题本身来说纠结fprintf并无意义,但作为一起的知识点 也可以说非常重要 传送门**
其实这道题考我们的知识点就是stdout是行缓冲 其中的内容储存在一个缓冲区中 在遇到第一个换行符时进行输出 而stderr是无缓冲 直接进行输出。
第十四题
请修改下面的swap函数,使得既可以交换int类型的参数,也可以交换double类型的参数。
void swap(int *a,int *b)
{
int temp=*a;
*a=*b;
*b=temp;
}
这道题目其实没有什么细节上的考察,就是一个一般的函数重载和模板的应用
函数重载
void swap(int *a,int *b)
{
int temp=*a;
*a=*b;
*b=temp;
}
void swap(double *a,double *b)
{
double temp=*a;
*a=*b;
*b=temp;
}
函数模板
template<typename T>
void swap(T *a,T *b)
{
T temp=*a;
*a=*b;
*b=temp;
}
第十三题
观察程序的运行结果,说明出现这种情况的原因。
int main(int argc,char *argv[])
{
char str[512];
for(int i=0; i < 512; ++i){
str[i] = -1 - i;
}
printf("%lu\n",strlen(str));
return 0;
}
这道题考察的知识点有两个 一个是对于strlen函数的理解,二是原码,反码,补码的运算
首先这道题的答案是255 我们知道strlen函数的结束条件是’\0’ 我们可以发现数组是char类型 而我们在向数组存储的时候为int型 而这些数据在计算机中都是以二进制来存储的 意味是算式结果所代表的值会转化为其二进制所对应的字符 而‘\0’的的ASCLL码为0 也就是00000000 而 -1 原码为 10000001 补码为11111111 而255 为 补码11111111 正好相减为零 所以在str[255]上存储的就是‘\0’ 所以答案自然就是255
原码 反码 补码 的运算
2018年纳新题总结
第十题
分析下列代码段,解释输出的结果。
#include<iostream>
#define YEAR 2018
#define LEVELONE(x) "XiyouLinux "#x"\n"
#define LEVELTWO(x) LEVELONE(x)
#define MULTIPLY(x,y) x*y
int main(int argc,char *argv[])
{
int x = MULTIPLY(1 + 2,3);
printf("%d\n",x);
printf(LEVELONE(YEAR));
printf(LEVELTWO(YEAR));
return 0;
}
首先我们来看答案:
7
XiyouLinux YEAR
XiyouLinux 2018
**这道题考察我们的是点是带参数宏的用法 和 宏中‘#’ ‘##’的用法 以及 转换宏的用法。
其实在这道题中第三个define语句我们就可以把其看为一个转换宏 转换宏是什么呢 首先我们来看第二个define语句 当”YEAR“这个参数传入的时候语句直接就把YEAR与‘#’连在一起 而‘#’的作用就是把宏参数变成一个字符串 那当然会输出YEAR 但如果我们真的想要其输出YEAR这个宏所代表的值呢 就是去使用一个转换宏 不难想象转换宏所做的事情就是先把YEAR转换为2018 再把2018传个第二个define语句 这样就得到了我们所需要的值。
**
关于常用宏定义的介绍
**以上就是我对这几年纳新题的部分重点知识的总结 对于我来说是受益良多 **
对进几年纳新题不理解的可加我QQ2339824768