一.运行下面的代码,输出结果是什么,解释原因。

int i;
int main(int argc, char *argv[])
{i--;if (i > sizeof(i)){printf(">\n");}else{printf("<\n");}return 0;
}

解答:i是int 型变量占4字节空间,所以sizeof(i)=4

因为定义为全局变量且i未初始化,则i默认为0

输出<

二.执行下面的代码段,输出结果和你预想的一样吗,谈谈你对宏的理解。

#define A 2 + 2
#define B 3 + 3
#define C A * B
int main(int argc, char *argv[])
{printf("%d\n", C);return 0;
}

解答:11

因为宏定义只是表面的复制替换,在这个过程不会有任何的运算操作,所以c=2+2*3+3=11

三.分析下面程序的输出结果

int main(int argc, char *argv[])
{char str[] = "Welcome to XiyouLinuxGroup";printf("%zu %zu\n", strlen(str), sizeof(str));return 0;}

解答:26 27

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

四.在程序中执行此函数,输出结果是什么,在同一程序中多次执行该函数,产生的输出结果是否相同?

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

解答:在前两篇文章有相同的题型,在此便不再赘述。(变量的生命周期)

五.分析以下程序,推测并验证其作用.

  1. int main(int argc, char *argv[])
    {int number;unsigned mask;mask = 1u << 31;scanf("%d", &number);while (mask){printf("%d", (number & mask) ? 1 : 0);mask >>= 1;}return 0;}

    ****解答:将十进制转化为二进制

mask = 1u << 31;表示无符号整型1进行左移位运算。

& 两个位都为1时,结果才为1
| 两个位都为0时,结果才为0
^ 异或 两个位相同为0,相异为1
~ 取反 0变1,1变0
<< 左移 各二进位全部左移若干位,高位丢弃,低位补0
>> 右移 各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移)

可以直接看做1*2**31,右移位运算可以看做/2**(n)

六.分析一下程序并说明其作用。

int main(int argc, char *argv[])
{char *str = "Xiyou Linux Group";printf("%c\n", *str + 1);return 0;
}

解答:输出*str可以视作一个字符串数组,那么*str取出的是字符'X',字符‘X’+1转化为ASCII码再%c输出便是Y.

七.以下程序段的运行结果是什么,你知道怎么判断两个浮点数是否相同吗?

int main(int argc, char *argv[])
{double a = 3.14;float b = a;if ((float)a == b){printf("Xiyou");}if (a != b){printf("LinuxGroup\n");}return 0;
}

解答:LinuxGroup

float:-3.4E38(-3.4*10^38)~3.4E38(3.4*10^38) 4字节

double:-1.7E308(-1.7*10^308)~1.7E308(1.7*10^308) 8字节

用==从语法上说没错,但是本来应该相等的两个浮点数由于计算机内部表示的原因可能略有微小的误差,这时用==就会认为它们不等。应该使用两个浮点数之间的差异的绝对值小于某个可以接受的值来判断判断它们是否相等,比如用。

if (fabs(price - p) < 0.000001)
来代替
  if (price == p)
定义一个精度,用差的绝对值比较,在精度范围内就认为是相等的;大小可以直接比较

****八.运行下列的代码,解释运行结果并谈谈自己的理解。

int main(int argc, char *argv[])
{int a[6] = {0x6f796958, 0x694c2075, 0x2078756e, 0x756f7247, 0x30322070,0};printf("%d\n", printf("%s", (char *)a));return 0;}

解答:

Xiyou Linux Group 2020

printf的返回值是输出字符个数。

a的输出结果是Xiyou Linux Group 20,%d输出printf的返回值,printf的返回值是20,里面的printf意味着有20个字符,而Xiyou Linux Group 20正好20个字符。

a[6]的里面是十六进制的ascii码,还有大小端的知识。  ##这里不会,copy了其他同学的解释..

九.分析下列程序的输出,解释其原因。

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]);printf("%d %d\n", c[1][1], d[1][1]);return 0;}

解答:2 0 2 0

二维数组复制可以不打“{}”但是定义数组的时候,部分初始化,剩余元素自动补0;

char arr[10];//局部定义数组或者变量的时候不赋值么,数组或者变量的内容是不确定的

一个是没赋值,一个是没赋完值,注意两者的区别。

十.执行下面的程序段,其输出结果是什么,请根据相关知识,解析其原因。

int main(int argc, char *argv[])
{int a = 1;printf("%d\n", *(char *)&a);
}

解答:1

我们试着来解剖*(char*)&a

char*定义一个指向char型变量的指针,那么&a被定义为了该指针,我们可以暂时把它看作p,

因为p=&a所以我们又可以得出p指向a,解p指针,我们得到了a.在这个过程中a被强制转化为了字符,

也就是0000 0000 0000 0000 0000 0000 0000 0001,计算机小端输出为1.(大小端知识可以去看21年的最后一题)

十一.下面程序段的输出结果是什么,若取消第三行的const注释,a数组还能被修改吗?如果取消6,8行的注释,程序还能正常运行吗,试着解释其原因。

int main(int argc, char *argv[])
{/*const*/ char a[] = "XiyouLinux\0";char *b = "XiyouLinux\0";a[5] = '\0';// b[5] = '\0';printf("%s\n", a);// printf("%s\n",b);return 0;}

解答:不能

因为a被const定义不可以修改

字符串指针b指向的内容是不可修改的,用字符串指针定义的是存放在静态存储区,是常量,不可更改。

#摘自网络

现在我们有一个C语言文件(hello.c):

#include <stdio.h>int main() {printf("hello, world!\n");return 0;
}

现在我们将执行以下命令将源文件(hello.c)转化为可执行目标文件(hello):

gcc -o hello hello.c

我们使用的是gcc编译器驱动程序完成的。这个转化的过程可分为四个阶段完成。执行这四个阶段的程序(预处理器、编译器、汇编器和链接器)一起构成了编译系统。

hello.c(源程序[文本])->预处理器(cpp)->hello.i(修改了的源程序[文本])->编译器(ccl)->hello.s(汇编程序[文本])->汇编器(as)->hello.o(可重定位目标程序[二进制])->链接器(ld)->hello(可执行目标程序[二进制])
  • 预处理阶段。预处理器(cpp)根据字符#开头的命令,修改原始的C程序。结果就得到了另外一个C程序,通常是以.i作为文件扩展名。
  • 编译阶段。编译器(ccl)将文本文件hello.i翻译成文本文件hello.s,它包含一个汇编语言程序。汇编程序是非常有用的,它位不同高级语言的不同编译器提供了通用的输出语言。
  • 汇编阶段。汇编器(as)将hello.s翻译成机器语言指令,将这些指令打包成一种叫做可重定位目标程序的格式,并将格式保存在目标文件hello.o中。如果我们使用文本编辑器打开hello.o文件,将会看到一堆乱码。
  • 链接阶段。hello程序调用了printf函数,它是每个C编译器都会提供的标准C库中的一个函数。printf函数存在于一个名为printf.o的单独的预编译好了的目标文件中,而这个文件必须以某种方式合并到我们的hello.o程序中,链接器(ld)就是处理这种合并,结果就得到了hello文件。它是一个可执行文件,可以被加载到内存中,由系统执行。

西邮linux兴趣小组2020年面试题 学习记录相关推荐

  1. 西邮Linux兴趣小组2020纳新试题题解

    西邮Linux兴趣小组2020纳新试题题解 1. 请试着解释其输出. int main(int argc , char *argv[]) {unsigned char a = 255;char ch ...

  2. 西邮Linux兴趣小组2020纳新试题

    第一题: 运行下面的代码,输出结果是什么,请解释说明: #include<stdio.h> int i; int main(int argc, char *argv[]) {i--;if ...

  3. 西邮Linux兴趣小组2021纳新试题

    1.大小和长度竟然不是一个意思, sizeof()和strlen()有什么异同之处? 他们对于不同参数的结果有什么不同?请试举例子说明. int main(void) { char s[] = &qu ...

  4. 西邮Linux兴趣小组2021纳新试题②

    1. 结果:127 -128 signed char的范围是-128~127 unsigned char的范围是0~256 计算a-ch是把ch转换成整数,而输出ch是进行了类型转换为char类型,1 ...

  5. 2021年 西邮Linux兴趣小组 纳新免试题揭秘

    文章目录 引言 第一关 第二关 第三关 第四关 第五关 总结 引言 小组2020年的免试题的四位出题人是:小组18级成员李兆龙,20级成员赵子玮,刘树杭,任子涧. 同时19级成员周阔,戚凯萌,胡哲宁, ...

  6. 西邮Linux兴趣小组纳新笔试试题

    下面是西邮Linux小组今年纳新的笔试试题 1. 下面这个程序的输出结果是什么? int main() { int a = (1, 2); printf("a = %d\n", a ...

  7. 西邮linux兴趣小组网络,西邮Linux兴趣小组纳新笔试试题

    下面是西邮Linux小组今年纳新的笔试试题,原文在这里. 1. 下面这个程序的输出结果是什么? int main() { int a = (1, 2); printf("a = %d\n&q ...

  8. [c语言]西邮Linux兴趣小组2020纳新面试题

    一.运行下面的代码,输出结果是什么,解释原因. int i; int main(int argc, char *argv[]) {i--;if (i > sizeof(i)){printf(&q ...

  9. 西邮 Linux 兴趣小组 2021 纳新试题

    1. 请试着解释其输出 int main(int argc , char *argv[]) {unsigned char a = 255;char ch = 128;a -= ch;printf(&q ...

最新文章

  1. Ant Design Pro 登录流程以及路由权限设置
  2. MPB:湖南师大尹佳组-​乳酸菌对酸和胆碱盐的耐受能力
  3. 364 页 PyTorch 版《动手学深度学习》PDF 开源了(全中文,支持 Jupyter 运行)
  4. 220v正反转电机接线法_电压为220/380V电动机如何接线,380V电机如何转接成220V详解...
  5. ORACLE EBS常用表及查询语句(最终整理版)
  6. c语言 动态数组_C语言的学习笔记!助你一路成长!
  7. java开发_读写txt文件操作
  8. php如何判断日期是否是周末(星期六和星期天)
  9. python 抢红包 不越狱_这个Python脚本牛逼了,秒抢红包and无视撤回消息
  10. 如何根据日期+数字生成流水号
  11. 第六章 平均绝对误差(MAE)与均方根误差(RMSE)
  12. C#读写欧姆龙PLC数据omron 使用TCP/IP FINS协议
  13. 在计算机中正确的邮件写信格式,电子邮件格式怎么写
  14. 网页导出pdf不完整_网页文本无法复制?学会这3个套路,一分钟帮你突破限制...
  15. C51学习笔记 4.定时器
  16. 做了7年开源数据库开发,我学到了什么?
  17. Word粘贴参考文献格式问题
  18. 第4章 JavaScript表达式与运算符
  19. vue2[初级]事件处理器
  20. 生活小目标、GTD时间管理、习惯追踪法

热门文章

  1. 微信小程序---网络数据请求
  2. 万字吐血总结JVM知识点
  3. 物化实验计算机量子化学计算,量子化学计算实验详解.pdf
  4. 一文搞定python中的multiply()和dot以及用法
  5. Matlab简单实现Kmeans聚类分析
  6. vb怎么样实时取mysql数据库数据_浅谈如何使用vb.net从数据库中提取数据
  7. Redis的配置文件redis.conf的解析
  8. 新能源家用光伏储能逆变器双向计量电能表
  9. 刘谦魔术揭秘:数硬币
  10. Linux解决——This account is currently not available