西邮Linux2019面试题

  1.下面代码段将打印出多少个‘=’?运用相关知识解释该输出。

int main(int argc, char *argv[]) 
{
 for (unsigned int i = 3; i >= 0; i--)
 putchar('=');
}

运行结果:

死循环

分析:i是无符号整型变量,不可能变为负值,所以会死循环。

2.下列三种交换整数的方式是如何实现交换的?

/* (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;

第一个是通过中间变量,暂时储存一个数的值,来达到交换数值的目的的。

第二个是通过算法,通过计算将a和b的值转化成一个算数式子储存,以便交换。(数学)

第三种是通过异或的原理,相同的两个值异或为零,任何数与零异或值不变。

3.有如下代码段所示的函数 f,当我们执行该函数时,会产生什么样的输出结果?在同一程序中 多次执行该函数,输出结果是否一致?

void f() 
{
    static int a = 0;
    int b = 0;
    printf("%d, %d\n", ++a, ++b);
}

执行结果:1 1

多次执行该结果是会变的,a是用static开辟的一个静态变量,是存在静态区的,函数执行结束后a所属的空间是不会被销毁的。

4.下面程序段的输出是什么?请解释该现象并说出与之相关尽可能多的知识。

int main(void) {
    printf("%d\n", printf("Xiyou Linux Group2%d", printf("")));
}

结果:Xiyou Linux Group2019

 printf函数的返回值是写入的字符总数,此处写入了19个字符。

5.执行下面的代码段,会输出什么?请试着解释其原因,并叙述相关知识。

int main(int argc, char *argv[]) 
{
    char ch = 255;
    int d = 'a' + 1;
    printf("%d %d", ch, d);
}

输出结果:-1 98

这道题考的是ascii码,ascii一般是127位,255是拓展出来的。

对于255:二进制是0000 0000 1111 1111,但char类型只有一个字节,所以他是以1111 1111存到内存中的,再以整型的方式往出来取时,会进行整形提升 ,1111 1111 1111 1111,然后转化为原码就是1000 0000 0000 0001,所以输出会是-1;.

对于d:a的ascii码为97,“+1”后就是98.

6.执行以下代码段,将产生什么样的输出?请对输出加以解释,并手动计算代码中 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 

-1|3

1111 1111 1111 1110

0000 0000 0000 0001


1111 1111 1111 1111——补码

1111 1111 1111 1110——反码

1000 0000 0000 0001——原码

所以是-1;

7.下面代码段的输出结果是什么?输出该结果的原因是?

#define X a+b
int main(int argc, char *argv[]) 
{
 int a = 1, b = 1;
 printf("%d\n", X*X);
}

输出结果:3 

宏只是单纯的替换,不涉及运算符a+b*a+b

8.请解释下面代码段中每一句的效果。

int val = 2018;
int *pi = 2019;
pi = &val;
*pi = 0;

第一句为给int类型变量val赋值,

第二句是给int类型指针变量pi赋值(这里是给int*类型赋值int类型,所以pi储存的的地址为2019),

第三句是将val的地址赋给pi。

第四句是通过地址找到val,将val修改为0


9.执行下列程序段,并输入“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);
}

输出结果:Linux Linux

q指向的是p的地址,此过程相当于先将Xiyou给p,然后再通过地址找到p,将其修改为Linux

10.执行下面的程序段,每次执行的输出结果一致吗,整理并解释输出结果。

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 + 1);
}

输出结果:0x7fffffffdb90, 0x7fffffffdb90
                  0x7fffffffdb94, 0x7fffffffdba0

分析:&a和a,一个表示整个数组的地址,一个表示首元素地址。

每次执行的结果是不一样的

11.斐波那契数列是这样的一串数列:1,1,2,3,5,8,13,......。在这串数列中,第一项、第二项为 1,其他项为前两项之和,该数列的第 x 项可以表示为下面的函数。请根据描述,写出一个程序,使之输入 x 后,能够输出斐波那契数列的第 x 项(其中 x<30)。当你完成之后,你可以尝试使用递归解决这个问题。 
 

#include<stdio.h>
int f(int n)
{
	if (n <= 2)
		return 1;//当n=1,2时返回值为1,即f(0)=f(1)=f(2)=1
	else
		return f(n - 1) + f(n - 2);//此时n>2,返回前两个数之和
}
int main()
{ 
	int n = 0;
	scanf("%d", &n);
	printf("%d\n", f(n));
	return 0;
}

12.下面代码段是某一种排序算法的简单实现,你知道它是什么吗?请讲解其原理,并尝试改进它。

int main(int argc, char *argv[])
{
    int nums[6] = {6, 3, 2, 4, 5, 1};
    for (int i = 0; i < 6; i++)
    {
        for (int j = i; j < 6; j++)
        {
            if (nums[i] > nums[j])
            {
                int c = nums[i];
                nums[i] = nums[j];
                nums[j] = c;
            }
        }
    }
}

这是选择排序

优化思路:每次找出最小之值和最大值的下标,一次循环结束后再进行交换

int main(){
    int len=sizeof(a)/sizeof(int);
    int t;
    /*初始化左端、右端元素下标*/
    int left = 0;
    int right = len - 1;
    while (left < right){
    	/*初始化最小值、最大值元素的下标*/
        int min = left;
        int max = right;
        for (int i = left; i <= right; i++){
        	/*标记每趟比较中最大值和最小值的元素对应的下标min、max*/
            if (a[i] < a[min])
                min = i;
            if (a[i] > a[max])
                max = i;
        }
        /*最大值放在最右端*/
        int t = a[max];
        a[max] = a[right];
        a[right] = t;
        /*此处是先排最大值的位置,所以得考虑最小值(a[min])在最大位置(right)的情况*/
        if (min == right)
            min = max;
        /*最小值放在最左端*/
        t = a[min];
        a[min] = a[left];
        a[left] = t;
        /*每趟遍历,元素总个数减少2,左右端各减少1,left和right索引分别向内移动1*/
        left++;
        right--;
    }
}

13.请简单叙述两种字节序(大端、小端)的概念,你的机器是什么字节序?试着写一个 C 语言程序来验证。

大端存储模式:是指数据的低位字节序保存在内存的高地址中,而数据的高位字节序保存在内存的低地址中(高位在前)
小端存储模式:是指数据的低位字节序保存在内存的低地址中,而数据的高位字节序保存在内存的高地址中(低位在前)

 
    #include<stdio.h>
    int Check()
    {
        int i = 1;
        return (*((char*)&i));
        //返回1表示小端
        //返回0表示大端
    }
    int main()
    {
        int c = Check();
        if (1 == c)
        {
            printf("小端\n");
        }
        else
        {
            printf("小端\n");
        }
        return 0;
    }

14.以下是在某机器下执行 Linux 命令 ls 的部分输出(有删节),参考该输出,你可以说出哪些关于该命令以及其他 Linux的相关知识? 

[root@xiyoulinux /]# ls -al 
total 36  
drwxr-xr-x  17 root root  4096 Sep 21 23:45 .  
drwxr-xr-x  17 root root  4096 Sep 21 23:45 ..  
lrwxrwxrwx   1 root root     7 Aug 21 22:21 bin -> usr/bin  
drwxr-xr-x   4 root root  2048 Jan  1  1970 boot  
drwxr-xr-x  21 root root  3580 Nov 21 21:16 dev  
drwxr-xr-x  83 root root  4096 Nov 21 22:12 etc  
drwxr-xr-x   4 root root  4096 Sep 22 00:07 home  
drwxr-xr-x   2 root root  4096 Aug 21 22:21 mnt  
drwxr-x---   9 root root  4096 Nov 19 19:15 root  
dr-xr-xr-x  13 root root     0 Nov 21 21:15 sys  
drwxrwxrwt  10 root root   380 Nov 21 22:30 tmp  
drwxr-xr-x   9 root root  4096 Nov 21 22:12 usr  

该命令显示出指定目录下的内容(包括当前目录中文件及其子目录)。

-al 指查看设备是否具有读写权限。

第一列表示文件类型及权限

第二列表示链接数

第三列表示该文件所有者

第四列表示该文件所属群组

第五列表示文件大小(字节)

后面三列是该文件的最后修改时间

最后一列是文件名称
 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

binary~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值