西邮Linux兴趣小组2020纳新面试题总结

#include<stdio.h>
int i=0;// i=1~5是<
int main(int argc,char*argv[])
{
    i--;
    if(i>sizeof(i))
        printf(">\n");
    else
        printf("<\n");
    return 0;
}//输出">"

sizeof的返回值类型是一个size_t型,size_t(typedef unsigned int size_t),它是一个unsigned int型。

而x 是 int 类型,比较时会将 x 变为 unsigned int类型,而 -1 变为 unsigned 类型是一个很大的整

数,所以是大于。

#include<stdio.h>
#define A 2+2
#define B 3+3
#define C A*B
int main(int argc,char*argv[])
{
    printf("%d\n",C);
    return 0;
}
/*直接替换为C=A+B=2+2*3+3=11*/

宏:http://C语言宏定义、宏函数、内置宏与常用宏_Apollon_krj的博客-CSDN博客

#include<stdio.h>
int main(int argc,char*argv[])
{
    char str[]="welcome to xiyoulinuxgroup";
    printf("%zu %zu\n",strlen(str),sizeof(str));//26  27
    return 0;
}

%zu输出size_t型。size_t在库中定义为unsigned int。

如果%zu不能使用,可以用%u取代。但%zu不能输出负数。

关于sizeof,strlen:https://blog.csdn.net/niushuai666/article/details/7677210

#include<stdio.h>
void fun()
{
    int x=0;
    static int num=0;
    for(int i=0;i<5;i++)
    {
        x++;
        num++;
    }
    printf("x = %d  num = %d\n",x,num);//static静态局部变量在函数结束后仍保留值用于下一次运算
}
int main(int argc,char*argv[])
{
    fun();fun();fun();fun();
    return 0;
}

结果如下:

#include<stdio.h>
int main(int argc,char*argv[])
{
    int number;
    unsigned mask;
    mask=1u<<31;//将1转换为unsigned int类型再将其32位二进制码向左移31位
    scanf("%d",&number);
    while(mask)
    {
        printf("%d",(number&mask)?1:0);//转换为32位的二进制数(numberh和mask此为都不为0则转为1,有一个为0则是0)
        mask>>=1;//mask二进制数向右移一位一直到高位全部补为0退出
    }
    return 0;
}
/* 移位操作都是针对补码进行的*/

 结果如下(输出32位十六进制数):

(<<左移运算符)

左移运算符是用来将一个数的各二进制位全部左移若干位,右补0。高位左移后溢出,舍弃。

例如:

将a的二进制数左移2位,右补0。若a=15,即二进制数00001111,左移2位得00111100,即十进制数60。

3 << 2,则是将数字3左移2位。即00000011----->00001100(12);

(>>右移运算符)

按二进制形式把所有的数字向右移动对应的位数,低位移出(舍弃)。高位的空位补符号位,即正数补零,负数补1。

例如:

11 >> 2,则是将数字11右移2位,即00001011------>00000010(2);

#include<stdio.h>
int main(int argc,char*argv[])
{
    char *str="xiyou linux group";
    printf("%c\n",*(str+2));//改变优先级则可以先移动到y的地址再取值
    printf("%c\n",*str+1);//先取到x(*str)后加1得到字母顺序表的后一个字母y
    return 0;
}//结果都是y 

 

#include<stdio.h>
int main(int argc,char*argv[])
{
    double a=3.14;
    float b=a;//取a的float范围赋值给b(有精度的缺失)
    if((float)a==b)//a暂时被强制转换为了float类型与b相同
    {
        printf("xiyou ");
    }
    if(a!=b)//两个不同类型的数不相等(必须在用一个精度内进行比较相等)
    {
        printf("linuxgroup\n");
    }
    return 0;
}//xiyou linuxgroup 

#include<stdio.h>
int main(int argc,char*argv[])
{
    int a[6]={0x6f796958,0x694c2075,0x2078756e,0x756f7247,0x30322070,0};
    printf("%d\n",printf("%s",(char*)a));
    return 0;
    /*按输出:0x58 0x69 0x79 0x6f 0x75 0x20    0x4c 0x69 0x6e 0x75 0x78 0x20     0x47 0x72 0x6f 0x75 0x70 0x20     0x32 0x30 0x32 0x30*/
    /*按题目:0x58 0x69 0x79 0x6f    0x75 0x20 0x4c 0x69     0x6e 0x75 0x78 0x20     0x47 0x72 0x6f 0x75     0x70 0x20 0x32 0x30     0x32 0x30*/
    /*eg:空格(ASCII:32->(20)十六进制)小端表示法*/
}//Xiyou Linux Group 2020

  大小端:字节序:大端法和小端法 - Broglie - 博客园

#include<stdio.h>
int main(int argc,char*argv[])
{
    int a[2][3]={{5,7},{5,2}};//按照给定格式进行元素分配
    int b[2][3]={5,7,5,2};//按照顺序分配,一行满了再换下一行
    int c[2][2]={{5,7},{5,2}};
    int d[2][2]={5,7,5};
    printf("%d %d\n",a[1][1],b[1][1]);//2  0
    printf("%d %d\n",c[1][1],d[1][1]);//2  0
    return 0;
}

#include<stdio.h>
int main(int argc,char*argv[])
{
    int a=1;
    printf("%d\n",*(char*)&a);//对a取地址得到1的地址并且转换为指针变量,再取此指针指向的地址就是a,得到a=1*/
    return 0;
}//1


 

#include<stdio.h>
int main(int argc,char*argv[])
{
    const char a[]="xiyoulinux\0";
    char*b="xiyoulinux\0";
    /*a[5]='\0';错误,不能对只读常量赋值*/
    /*b[5]='\0';错误,不能通过指针对数组b进行赋值(段错误,找不到内存)*/
    printf("%s\n",a);
    printf("%s\n",b);
    return 0;
}

详细内容: ​​​http://谈谈C语言从源文件变为可执行文件之间发生的过程详解(C程序的编译链接运行)_呋喃吖的博客-CSDN博客  

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

#include<stdio.h>
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 seconds\n", 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;i<right;i++)
    {		
        temp = 0;
        //第一个for循环里面的交替是进行左边的值比较与交换,就是针对左边的较大数字排序 
        if(a[i]>a[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]<a[j-1]) 
        {
            temp = a[j];
            a[j] = a[j-1];
            a[j-1] = temp;
        }
    }
   left++;//这样满足下一次左边放着第二大的数字是再左边第二个位置上面 		
}

 其他排序法:总结排序方法(未完)_TGRD4的博客-CSDN博客

(1)/(2):查看目录/文件

ls                查看当前目录下的所有目录和文件

ls -a            查看当前目录下的所有目录和文件(包括隐藏的文件)

ls -l 或 ll       列表查看当前目录下的所有目录和文件(列表查看,显示更多信息)

ls /dir            查看指定目录下的所有目录和文件   如:ls /usr

前两个命令:(绿标为当前操作文件)

 补充:

绿色---->代表可执行文件
红色---->代表压缩文件
深蓝色---->代表目录
浅蓝色----->代表链接文件
灰色---->代表其它的一些文件

第三个命令:(两个效果一样)

最后一个命令:

也可以直接通过文件管理器复制文件路径,粘贴在ls后面。

双杠线和单杠线都可以使用,下列输出一致:

 

(3):创建目录

mkdir    aaa            在当前目录下创建一个名为aaa的目录

mkdir    /usr/aaa    在指定目录下创建一个名为aaa的目录

目录切换 

命令:cd 目录

cd /        切换到根目录

cd /usr        切换到根目录下的usr目录

cd ../        切换到上一级目录 或者  cd ..

cd ~        切换到home目录

cd -        切换到上次访问的目录

新建文件

命令:touch 文件名

示例:在当前目录创建一个名为aa.txt的文件        touch  aa.txt

运行如下:(在myworld目录下创建了一个ok目录显示后切换到ok目录,在ok目录下创建了一个新文件txt1.txt并将其显示,最后再切换回原目录)

(4):拷贝目录

命令:cp -r 目录名称 目录拷贝的目标位置   -r代表递归

示例:将/usr/tmp目录下的aaa目录复制到 /usr目录下面     cp /usr/tmp/aaa  /usr

注意:cp命令不仅可以拷贝目录还可以拷贝文件,压缩包等,拷贝文件和压缩包时不用写-r递归

此时ok目录中存在一个txt1.txt文本文件需要拷贝到另一个目录myworld中(操作如下): 

此时指定查看两个目录下的文件:

txt1.txt已被成功复制

如果需要复制的是空文件也可以直接使用mkdir在目标目录下创建一个新文件。

参考博客:Linux常用命令_Demon的博客-CSDN博客_linux常用命令

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

TGRD

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

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

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

打赏作者

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

抵扣说明:

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

余额充值