西邮Linux兴趣小组2019面试题总结

本文总结了西邮Linux兴趣小组2019年的面试题,涉及内容包括C语言细节、数据类型、位操作、内存管理、函数特性、递归、排序算法、字节序以及Linux命令等。通过实例解析了变量交换、按位操作的原理,并探讨了static关键字的作用。此外,还介绍了冒泡排序的优化方法和Fibonacci数列的递归实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

西邮Linux兴趣小组2019面试题总结

在这里插入图片描述
unsigned int
unsigned int 取值范围为0~4294967295,当i减到0后,再进行一次自减,会变为4294967295,永远满足>=0的条件,因此会打印出无数个’=’.

在这里插入图片描述
(1) 使用了一个中间变量,先把a的值赋给中间变量,再把b的值赋给a,再把中间变量的值赋给b;
(2) 通过数学运算将两个变量的值进行交换;
(3) 按位异或(^):两者相同为0,不同为1;

按位或(|):两者都为0才为0,否则为1;(当参与运算的数字为负数时,则采用补码形式)

按位与(&):两者都为1才为1,否则为0.

按位异或原理:将a,b按位异或的值赋给c,因为 c 中是 1 的部分表示 a 和 b 中按位不同的位,0 表示 a 和 b 中按位相同的位,那么 a 同 c 异或的结果就是 a 中与 b 不同的位发生变化,二进制数每位只有两种状态,所以 a 变成了 b.在这里插入图片描述
单独执行时,会输出1,1;
但当多次执行时,变量a使用了static修饰,每次执行该函数会跳过a的初始化,a的值是上一次运算结果,而b每次都被重新定义为0,所以b输出1.

static关键字

  • static全局变量和普通全局变量区别:
    static全局变量和普通全局变量存储方式都为静态存储方式,区别在于各自的作用域,普通全局变量的作用域是整个源程序,,当一个源程序由多个源文件组成时,普通全局变量在各个源文件中都有效,而静态全局变量则限制了作用域,只在定义该变量的源文件中有效.
  • static局部变量和普通局部变量区别:
    static局部变量和普通局部变量的存储方式即生存期不同,static局部变量具有全局的生存期, 只初始化一次, 离开函数后仍然存在, 具有函数内的局部作用域,是特殊的全局变量.
  • static函数和普通函数区别:
    static函数与普通函数作用域不同,仅在本文件.只在当前源文件中使用的函数应该说明为内部函数即static修饰的函数,内部函数应该在当前源文件中说明和定义.对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件.
  • static三条作用:隐藏
    持久性
    默认值0

在这里插入图片描述输出 Xiyou Linux Group2019

函数嵌套,先打印了一个空字符,0通过%d被打印出来,19作为返回值被最后一次printf函数打印出来

printf的返回值
大部分C函数都有一个返回值,这是函数计算并返回给主调程序的值.可以把返回值赋给变量,也可以用于计算,还可以作为参数传递.printf()函数也有一个返回值,它返回打印字符的个数.
在这里插入图片描述
题目中没有给a赋值,所以运行程序时编译器会报错,如果忽略这个问题,则ch输出-1.
char类型的取值范围为-128~127
255是一个整数,在计算机中存储数据采用补码的形式,而正数原码补码相同,即

                      原码  1111 1111
                      反码  1111 1111
                      补码  1111 1111

此时用char来看待这个二进制数字,由于符号位为1,则为负数,负数由补码求原码

                      补码  1111 1111
                      原码  1000 0001

结果为-1
总结:1111 1111用int来看是255,用char来看是-1.
在这里插入图片描述
按位或(|)
逻辑或(||)
自加自减

  • 前缀:先给变量加减1,再取出来做表达式的值
  • 后缀:先把变量的值拿出来作表达式的值,再给变量加减1

则输出
x=-1,y=4,t=-1
x=0,y=5,t=1

在这里插入图片描述
:简单的替换,但需要注意的是在宏定义中表达式两边的括号不能少,否则在宏展开以后可能会产生歧义.

题目中表达式为 1+1*1+1 输出3

在这里插入图片描述

第一行定义了一个int类型的变量val并初始化为2018;
第二行声明了一个int类型的指针变量pi并初始化为2019;
第三行将val变量的地址赋给pi;
第四行将pi指向的空间所存储的数据改为0.
在这里插入图片描述
输出 Linux Linux
第二行代码为20个char类型的值请求内存空间,并设置p指向该位置.
p和q指向了同一个地址.
在这里插入图片描述
0x7ffee5db1110 0x7ffee5db1110
0x7ffee5db1114 0x7ffee5db1120
a表示数组的首地址,&a表示数组首元素的地址
a+1表示数组首地址加上一个元素所占的地址大小,这里int是4个字节,所以加上1x4.
&a+1表示加上整个数组的大小,这里数组尺寸是4,所以+1代表的是地址加上4x4.

在这里插入图片描述

#include<stdio.h>
int main(){
    int arr[30]={1,1};
    int x;
    printf("Input a number(<30):");
    scanf("%d",&x);
    if (x==1||x==2){
        printf("1");
    }else{
        for(int i=2;i<x;i++){
            arr[i]=arr[i-1]+arr[i-2];
            arr[x]=arr[i];
        }
        printf("%d",arr[x]);
    }
    return 0;
 }

递归

#include<stdio.h>
int Fibonacci(int n){
    if(n==1||n==2)
        return 1;
    else
        return Fibonacci(n-1)+Fibonacci(n-2);
}
int main(){
    int i;
    scanf("%d",&i);
    printf("%d",Fibonacci(i));
    return 0;
}

在这里插入图片描述
冒泡排序
冒泡排序的基本思想是每次比较两个相邻的元素,如果它们的顺序错误就把它们交换.
改进1:n个数排序只需要进行n-1趟;
改进2:则设置flag变量,当某一次执行了一次排序之后所有元素位置都没有改变,使循环跳出.

改进代码如下:

#include<stdio.h>
#include<stdbool.h>
int main(){
    int a[10];
    int n;
    int temp;
    bool flag=true;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d",&a[i]);
    }
    for(int i=0;i<n-1&&flag;i++){
        for(int j=0;j<n-1-i;j++){
            flag=false;
            if(a[j]>a[j+1]){
                flag=true;
                temp=a[j];
                a[j]=a[j+1];
                a[j+1]=temp;
            }
        }
    }
    for(int i=0;i<n;i++){
        printf("%d ",a[i]);
    }



    return 0;
}

在这里插入图片描述
字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有小端、大端两种字节顺序。小端字节序指低字节数据存放在内存低地址处,高字节数据存放在内存高地址处;大端字节序是高字节数据存放在低地址处,低字节数据存放在高地址处.
程序验证:

#include<stdio.h>
int main(){
    short int x=0x1122;
    char x0,x1;
    x0=((char*)&x)[0];
    x1=((char*)&x)[1];
    printf("%#x",x0);
    return 0;
}

如果输出0x22则为小端
输出0x11则为大端

在这里插入图片描述
Linux ls命令用于显示指定工作目录下之内容(列出目前工作目录所含之文件及子目录).
-al 指各项说明,查看设备是否具有读写权限.
第一列指文件类型及权限;
第二列指链接占用的节点;
第三列指文件所有者;
第四列指文件所有者的用户组;
第五列指文件大小;
第六列指文件的创建时间或者最近修改时间;
最后一列是文件名称.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值