西邮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 指各项说明,查看设备是否具有读写权限.
第一列指文件类型及权限;
第二列指链接占用的节点;
第三列指文件所有者;
第四列指文件所有者的用户组;
第五列指文件大小;
第六列指文件的创建时间或者最近修改时间;
最后一列是文件名称.