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

西邮Linux兴趣小组2019年面试题总结,第1张

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

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

#include
int main()
{
    int a=1,b=2,c;
    
    c=a;
    a=b;
    b=c;
    printf("a=%d b=%dn",a,b);
    

    
    a=a-b;
    b=b+a;
    a=b-a;
    printf("a=%d b=%dn",a,b);
    

    
    a^=b;
    b^=a;
    a^=b;
    printf("a=%d b=%dn",a,b);
    
    return 0;
}

 

#include
void f()
{
    static int a=0;//a用static修饰作为静态局部变量,储存在静态区,在本文件中保存函数结束时的值
    int b=0;
    printf("%d,%dn",++a,++b);
}
int main()
{
    f();f();f();f();
    
    return 0;
}

结果如下:

#include
int main()
{
    printf("%dn",printf("Xiyou Linux Group2%d",printf("")));
    
    return 0;
}

a为第一次声明变量不可直接作为常量进行赋值 *** 作编译错误

现将程序改为下:

#include
int main(int argc,char*argv[])
{
    char ch=255;
    int e=ch+1;
    int d;
    char c;
    printf("ch=%d nch+1=%c nd=%d nc=%cn",ch,e,d,c);
    
    return 0;
}

结果如下:

#include
int main(int argc,char*argv[])
{
    char x=-2,y=3;
    char t=(++x)|(y++);//[或运算] 补码有一个位为1则此位为1(进行或运算时x=2,y=3)
    //x先++再做或运算,y先做或运算再++
    printf("x=%d y=%d t=%dn",x,y,t);
    //因为-1的补码是11111111,与谁或运算都是它本身
    t=(++x)||(y++);//[逻辑或] x,y中任意一个为真(不为0)则t为真(1)
    printf("x=%d y=%d t=%dn",x,y,t);
    return 0;
}

运算结果如下:

在计算机数据都是以补码的方式存储的。

优点:

1.避免了0的编码有两个(-0,+0),一个数的编码只能有一个;

2.符号位和有效值位可以一起处理,减法通过加法就可以实现,即简化了计算机的结构设计也提高了运算速度。

#define X a+b
int main(int argc,char*argv[])
{
    int a=1,b=1;
    printf("%dn",X*X);//a+b*a+b无括号,结果是3
    return 0;
}

#define X (a+b)
int main(int argc,char*argv[])
{
    int a=1,b=1;
    printf("%dn",X*X);//(a+b)*(a+b)=4
    return 0;
}

#include
int main()
{
    int val=2018;//将2018赋值给变量val
    int *pi=2019;//将指针pi强行用常量初始化(也可以不初始化,结果相同且不会警告)
    pi=&val;//将指针pi指向变量val的地址
    *pi=0;//将指针pi指向的值val改变为0
    printf("&val=%dn",&val);
    printf("pi=%dn",pi);//pi=&val(随机分配地址)
    printf("val=%dn",val);
    printf("*pi=%dn",*pi);/
    return 0;
}

结果如下: 

long int fb(unsigned int n)
{
	long int f;
	if(n==1||n==2) f=1;//斐波那契前两项为1,后面的项为前两项之和
	else f=fb(n-1)+fb(n-2);
	return(f);
}
int main()
{
	unsigned int m;
	scanf("%d",&m);
	if(m>=1)
	    printf("%ldn",fb(m));
	return 0;
}

改进冒泡排序(加入一个判断量change):

#include
int main()
{
	int s[1001];
	int i, j, n, t;
    int change=1;
	scanf("%d", &n);
	for (i = 0; i < n; i++)
		scanf("%d", &s[i]); 
	for (i = 0; i < n&&change; i++)//若没有发生交换(change=0)则说明已经有序则提前退出排序
	{
        change=0;
		for (j = 0; j < n - i - 1; j++)
		{
            
			if (s[j] > s[j + 1])
			{
				t = s[j];
				s[j] = s[j + 1];
				s[j + 1] = t;
                change=1;//若发生了交换,change置为1
			}
		}
	}
    printf("%lf secondsn", Times);
	for (i = 0; i < n; i++)
		printf("%d ", s[i]);
}

第二种优化双向排序(也叫鸡尾酒排序)

下列出代码核心部分:

lenght = sizeof(a)/sizeof(int);
lenght = sizeof(a)/sizeof(a[0]);//先计算总长度
right = lenght-1;
left = 0;
//先给右边的赋值,因为右边的先排出数组里面的最大值 ,外层先装一个代表right的for循环吧 
while(right>left)
{
    //下面的两个for循环是平等关系的,用一个while循环把她们括起来 
    for(i=left;ia[i+1])
        {
            temp = a[i];
            a[i] = a[i+1];
            a[i+1] = temp;
        }
    }
    right--;//这样满足下一次摆放的那个数是放在右边的倒数第二个位置上面 
    temp = 0;
    for(j=right;j>left;j--)
    {
        //内部的for循环是进行右边的数字大小排序,就是把比较小的数字放在右边的位置。
        if(a[j]

 其他排序法:https://blog.csdn.net/TGRD4/article/details/121567712

 

#include
#include
#include 
int main(int argc, char **argv)
{
    union 
    {
        short s;
        char  c[sizeof(short)];
    } un;
    un.s = 0x0102;//小端将高位字节排放在内存的高地址端(2在1前)
    if (sizeof(short) == 2)
    {
        if (un.c[0] == 1 && un.c[1] == 2)
            printf("大端n");
        else if (un.c[0] == 2 && un.c[1] == 1)
            printf("小端n");
        else
            printf("不能判断n");
    }
    else
	    printf("sizeof(short) = %dn", sizeof(short));
    printf("un.c[0]=%dn",un.c[0]);
    printf("un.c[0]=%pn",un.c[0]);
    printf("un.c[1]=%dn",un.c[1]);
    printf("un.c[1]=%pn",un.c[1]);
    printf("un.c[2]=%pn",un.c[2]);//NULL
    exit(0);
}

1)大端模式:Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
低地址 --------------------> 高地址
0x12  |  0x34  |  0x56  |  0x78

2)小端模式:Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
低地址 --------------------> 高地址
0x78  |  0x56  |  0x34  |  0x12

这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit。
但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器)。
另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如果将多个字节安排的问题。
因此就导致了大端存储模式和小端存储模式。例如一个16bit的short型x,在内存中的地址为0x0010,x的值为0x1122,那么0x11为高字节,0x22为低字节。
对于大端模式,就将0x11放在低地址中,即0x0010中,0x22放在高地址中,即0x0011中。小端模式,刚好相反。
我们常用的X86结构是小端模式,而KEIL C51则为大端模式。很多的ARM,DSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。

来源于博客:https://www.cnblogs.com/broglie/p/5645200.html
 

 每一列的意义:

 来源于博客:https://blog.csdn.net/zhuoya_/article/details/77418413

其他关于linux的知识:

https://blog.csdn.net/qq_23329167/article/details/83856430

https://wlybsy.blog.csdn.net/article/details/105289038

https://blog.csdn.net/qq_26219679/article/details/79647221

https://blog.csdn.net/lcgoing/article/details/86737110

 

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5604824.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存