西邮linux兴趣小组2019-2021三年纳新试题浅析


关于纳新试题,您需要了解:

  1. 本题仅作为面试有限参考
  2. 为了代码的简洁,略去了大部分不影响理解的预处理指令
  3. 题目难度与序号无关
  4. 若无特殊声明,均假设在 Linux x86_64 GCC 编译器环境下

关于本篇博客,您需要了解:

  • 我会假定您已经具备一定的c语言基础,所以部分解析内容会比较简略
  • 由于我个人水平有限,若有错误与不足,欢迎您的指出!!!

西邮 Linux 兴趣小组 2019 纳新试题


下面代码段将打印出多少个‘=?运用相关知识解释该输出。
int main(int argc, char *argv[]) {
   
for (unsigned int i = 3; i >= 0; i--)
putchar('=');
}

:
将打出多少个 ‘=’ ???(太幽默了))

关于本题,我们只需要了解:

数据名称 字节 值的范围
unsigned int 4 0 到4,294,967,295

在减减为零后,由于整数越位,值会变为unsigned int的最大值。


下列三种交换整数的方式是如何实现交换的?
/* (1) */ int c = a; a = b    ; b = c;
/* (2) */ a = a - b; b = b + a; a = b - a;
/* (3) */ a ^= b; b ^= a; a ^= b;

对于(1). 通过赋值进行
对于(2). 通过从右向左的赋值运算进行
对于(3). 通过位运算以及复合赋值进行


有如下代码段所示的函数 f,当我们执行该函数时,会产生什么样的输出结果?在同一程序中
多次执行该函数,输出结果是否一致?
void f() {
   
static int a = 0;
int b = 0;
printf("%d, %d\n", ++a, ++b);
}

关于本题,我们需要了解到静态变量。
在函数f()内:
a为一个静态存储期,具有块作用域,无链接变量。
b为一个自动存储期,具有块作用域,无链接变量
a的值会随着函数的不断调用而不断+1,而b的每次输出都为零。


下面程序段的输出是什么?请解释该现象并说出与之相关尽可能多的知识。
int main(void) {
   
printf("%d\n", printf("Xiyou Linux Group2%d", printf("")));
}

首先!这行代码是对的,这是一个函数嵌套。
printf()的返回值是他成功打印字符的个数
第一个printf()的返回值为19(%d也算一位),第二个printf()的返回值为0。

首先打印Xiyou Linux Group2
然后打印0
最后打印出19
合起来就是Xiyou Linux Group2019


执行下面的代码段,会输出什么?请试着解释其原因,并叙述相关知识。
int main(int argc, char *argv[]) {
   
	char ch = 255;
	int d = a + 1;
	printf("%d %d", ch, d);
}

此题涉及到原码 反码 补码 的知识

因为a是一个未定义的变量,所以程序无法执行。

但是单看ch的值,我们会打印出-1,为什么呢?
char ch的字节为1位,取值范围为-128 – 127,所以ch = 255也是错的,
在用int的强行解释255时,因为255的二进制位为1111 1111,所以它就是255,
但是因为题目中为char类型,所以1111 1111被解释为符号位为1的整数,也就是-1.


执行以下代码段,将产生什么样的输出?请对输出加以解释,并手动计算代码中 t 的值。
int main(int argc, char *argv[]) {
   
	char x = -2, y = 3;
	char t = (++x) | (y++);
	printf("x = %d, y = %d, t = %d\n", x, y, t);
	t = (++x) || (y++);
	printf("x = %d, y = %d, t = %d\n", x, y, t);
}

本题输出如下

x = -1, y = 4, t = -1
x = 0, y = 5, t = 1

第一行输出涉及的char范围上题已讲,所以本行着重介绍位运算
我们都了解“||”运算符为“或”
而对于“|”咋可能比较陌生,“|”的含义为位运算中的按位取反(二进制),例如本题:
1111 1111 | 0000 0100 = 1111 1111 即为-1(补码),所以t = -1
(关于位运算的更多用处,例如掩码,打开位,切换位之类运算,可以在《c primer plus》的十五章详细了解)

第二行就是我们熟知的有真则真,在C语言中,非负便为真,所以t = 1


下面代码段的输出结果是什么?输出该结果的原因是?
#define X a+b
	int main(int argc, char *argv[]) {
   
	int a = 1, b = 1;
	printf("%d\n", X*X);
}

很“简单”的编译预处理,就是有点套路
一眼看过去答案为4,其实为三,只要明白C语言中运算符优先级即可
a+b*a+b = a+ 1 + b = 3


请解释下面代码段中每一句的效果。
	int val = 2018;
	int *pi = 2019;
	pi = &val;
	*pi = 0;

定义一个int类型的变量,为其赋值为2018;
定义一个指向int类型的指针变量,为地址pi为2019(错误);
使指针变量指向 val;
改变val的值为0;

将原题改为:

	int val = 2018;
	int *pi;
	pi = &val;
	*pi = 0;
	printf("%d",val);

即可输出0;


执行下列程序段,并输入“Xiyou Linux”(不含引号),那么程序的输出结果是什么?请解释其原因。
int main(int argc, char *argv[]) {
   
	char *p = (char *)malloc(sizeof(char) * 20),
	*q = p;
	scanf("%s %s", p, q);
	printf("%s %s\n", p, q);
}
  • 首先使用<stdlib.h>库中的malloc()函数分配了一个20字节大小的空间存放char类型并且使p指向它
  • 然后声明一个指针变量使得 p,q指向同一块空间
  • 输入Xiyou Linux
  • 因为Linux是后输入的,且p,q指向的同一空间,所以空间存储的数据被覆盖为Linux
  • 所以在输出时将同一空间内容打印两次,即为“Linux Linux”(不含引号)

执行下面的程序段,每次执行的输出结果一致吗,整理并解释输出结果。
int main(int argc, char *argv[]) {
   
	int a[4] = {
    2, 0, 1, 9 };
	printf("%p, %p\n", a, &a);
	printf("%p, %p\n", a + 1, &a +
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值