据悉,深圳某工程师沦为C语言笔试枪手
事情是这样的,昨晚晚上,有个网友发消息给我,说他有几道C语言笔试题不会写,所以,就出现了解题的这一幕。
文章中,我只讲解了一部分,有一些题目觉得没必要讲,然后我在pdf上做了注释,想看的在公众号留言「20201227」获取pdf文档。
1、第一题
#include "stdio.h"int x = 2;
int y = 0; int main()
{if(x){y++;}printf("%d\n",y);getchar();return 0;
}
这是送分题,就没有怎么好说的了,答案 1 .
2、解析一道比较有坑的。
#include "stdio.h"
#include "string.h"int a()
{static int i =0;if(i>=1){return --i;}return i++;
}int main()
{int A1 = 0;int A2 = 0;int A3 = 0;A1 = a();A2 = a();A3 = a();printf("%d,%d,%d\n",A1,A2,A3);getchar();return 0;
}
这个题目,主要要搞清楚,return i++
,是先return i
再++
,那就问题不大了。
3、这题应该好好说一下
#include "stdio.h"int arg[] = {0,1,2,3};
int *p = &arg[1];
int v = 0;
int w = 0;int main()
{int i;*(p++)+= 5;v = *p; *p = *p +5;w=*p;printf("v:%d\n",v);printf("w:%d\n",w);for(i=0;i<4;i++)printf("arg[%d]=%d\n",i,arg[i]);getchar();return 0;
}
这题乍一看其实没有什么难度,但是实际写的时候,容易出问题,特意拿出来说一下。
核心在这行代码 *(p++)+= 5;
分解出来就是 取得p指向的值,然后 +=5
,再让p指向下一个位置。
反汇编代码是这样的
mov rax,QWORD PTR [rip+0x2f0f] # 404040 <p>
lea rdx,[rax+0x4] //这是让指针指向下一个位置保存的寄存器
mov QWORD PTR [rip+0x2f04],rdx # 404040 <p>
mov edx,DWORD PTR [rax] //这是用来也 5 运算的寄存器
add edx,0x5
mov DWORD PTR [rax],edx
如果知道了这点,其他的就容易很多了。
int i;*(p++)+= 5; //arg[1] = 6 p指向arg[2]v = *p; //v = arg[2] = 2*p = *p +5; //arg[2] = 2+5 = 7w=*p; //w = 7printf("v:%d\n",v);printf("w:%d\n",w);
大家可以自己试试,如果把 *(p++)+= 5
改成 *(++p)+= 5
结果如何呢?
4、链表编程题
下面的题目我只写了第一题,后面的一题没有继续下,写链表的题目,我建议画一张链表的连接图,这样写代码的时候就会特别清晰了。
大家有不懂的,可以尽管问,另一个题目,欢迎留言写出来,我觉得这样的题目简单,但是也比较考验思维能力。
题目:
链表图形
直接上代码吧
#include "stdio.h"
#include "string.h"
#include "stdlib.h"typedef struct _STUDENT_INFO
{int IDx;char Name[32];struct _STUDENT_INFO *Next;
} STUDENT_INFO_DEF;STUDENT_INFO_DEF * creat(void)
{STUDENT_INFO_DEF * h = (STUDENT_INFO_DEF *)malloc(sizeof(STUDENT_INFO_DEF));h->Next = NULL;return h;
}int InsertStu(STUDENT_INFO_DEF *head,STUDENT_INFO_DEF stu)
{if(head == NULL){printf("head NULL\n");return -1;}STUDENT_INFO_DEF * temp = head;STUDENT_INFO_DEF * new = (STUDENT_INFO_DEF *)malloc(sizeof(STUDENT_INFO_DEF));new->IDx = stu.IDx;strncpy(new->Name,stu.Name,strlen(stu.Name));new->Next = NULL;while (temp->Next != NULL) {temp=temp->Next;}temp->Next = new;printf("[InsertStu] IDx:%d Name:%s Ok\n",new->IDx,new->Name);return (0);
}/*遍历链表*/
int TraverseStu(STUDENT_INFO_DEF *head)
{STUDENT_INFO_DEF * temp = head;if(head == NULL){printf("head NULL\n");return -1;}while(temp->Next!=NULL){temp = temp->Next;printf("[TraverseStu]IDx:%d Name:%s\n",temp->IDx,temp->Name);}return (0);
}int FindAndDelete(STUDENT_INFO_DEF *head,STUDENT_INFO_DEF stu)
{STUDENT_INFO_DEF * temp = head;STUDENT_INFO_DEF * temp1 = NULL;if(head == NULL){printf("head NULL\n");return -1;}while(temp->Next!=NULL){temp = temp->Next;if(temp->IDx == stu.IDx) break;}temp1 = temp->Next;temp->Next = NULL;while(temp1!=NULL){free(temp1);temp1 = temp1->Next;}printf("[FindAndDelete]\n");return 0;
}int main()
{int i;/*创建链表头*/STUDENT_INFO_DEF *head; STUDENT_INFO_DEF stu;head=creat();for(i=0;i<5;i++){stu.IDx = i+1;snprintf(stu.Name, strlen("student")+2, "student%d", i+1);InsertStu(head,stu);}TraverseStu(head);stu.IDx = 2;FindAndDelete(head,stu);TraverseStu(head);getchar();return 0;
}
代码输出
weiqifa@bsp-ubuntu1804:~/c/mianshi$ gcc lianbiao.c && ./a.out
[InsertStu] IDx:1 Name:student1 Ok
[InsertStu] IDx:2 Name:student2 Ok
[InsertStu] IDx:3 Name:student3 Ok
[InsertStu] IDx:4 Name:student4 Ok
[InsertStu] IDx:5 Name:student5 Ok
[TraverseStu]IDx:1 Name:student1
[TraverseStu]IDx:2 Name:student2
[TraverseStu]IDx:3 Name:student3
[TraverseStu]IDx:4 Name:student4
[TraverseStu]IDx:5 Name:student5
[FindAndDelete]
[TraverseStu]IDx:1 Name:student1
[TraverseStu]IDx:2 Name:student2
推荐阅读:
专辑|Linux文章汇总
专辑|程序人生
专辑|C语言
我的知识小密圈
据悉,深圳某工程师沦为C语言笔试枪手相关推荐
- 100 条经典C语言笔试题目
100 条经典C语言笔试题目 题目来源: 1.中兴.华为.慧通.英华达.微软亚洲技术中心等中 外企业面试题目: 2.C 语言面试宝典(林锐<高质量编程第三版>). 说明: 1.部分C 语言 ...
- 2005年4月全国计算机等级考试二级C语言笔试试题及答案
2005年4月全国计算机等级考试二级C语言笔试试题及答案 一.选择题((1)-(10)每小题2分,(11)-(50)每小题1分,共60分) 下列各题A).B).C).D)四个选项中,只有一个选项是正确 ...
- 关于c语言程序开发过程 下面说法错误的是,c语言笔试真题
下面由我们YJBYS求职网专家为您分享关于二级c语言笔试真题,请您参考: 函数fun 的功能是:计算正整数n 的所有因子(1 和n 除外)之和作为 函数值返回. 例如:n=120 时,函数值为239. ...
- 全国计算机等级考试c语言程序设计真题,历年全国计算机等级考试二级C语言笔试选择真题...
一.选择题((1)-(10).(21)-(40)每题2分,(11)-(20)每题1分,共70分) (1)下列数据结构中,属于非线性结构的是 A.循环队列 B.带链队列 C.二叉树 D.带链栈 (2)下 ...
- 省二c语言笔试试卷,2005年春浙省二级C语言笔试试卷.doc
2005年春浙省二级C语言笔试试卷 2005年春浙江省高校非计算机专业学生 计算机等级考试试卷 (二级C) 试题一.判断题(每小题1分,共10分) 说明:在以下提供的若干个陈述中,逐一判断其正确与否, ...
- 2007年9月c语言真题及答案,2007年9月二级C语言笔试真题和答案(已再修改).doc
2007年9月二级C语言笔试真题和答案(已再修改) 2007年9月二级C语言笔试真题及答案 (考试时间:120分钟,满分100分) 一.选择题((1)-(10)每题2分,(11)-(50)每题1分.共 ...
- 2016二级c语言笔试内容,2016年计算机二级c语言笔试试题「最新」
2016年计算机二级c语言笔试试题「最新」 (25)设有如下程序段 char s[20]= "Bejing",*p; p=s; 则执行p=s;语句后,以下叙述正确的是 A)可以用* ...
- 计算机等级考试二级c语言笔试,全国计算机等级考试二级C语言笔试试题和答案.doc...
全国计算机等级考试二级C语言笔试试题和答案 1999年9月全国计算机等级考试二级C语言笔试试题 一.选择题((1)-(40)每个选项1分,(41)-(50)每个选项2分,共60分) 下列各题A). ...
- 二级c语言笔试58,全国计算机等级考试-二级C语言笔试试题.doc
全国计算机等级考试-二级C语言笔试试题 2002年4月全国计算机等级考试二级C语言笔试真题试题(含参考答案) 一.选择题(1)-(40)题每小题1分,(41)-(50)题每小题2分,共计60分.下 ...
最新文章
- Python中__str__和__repr__
- Axure8.0深入一点(篇)
- java-类的结构及使用
- OpenGL屏幕空间环境光遮挡的实例
- .NET 6 的 docker 镜像可以有多小
- Codeforces Round #766 (Div. 2) D. Not Adding 数学gcd
- 【APICloud系列|11】使用APPuploader申请ios开发证书及ios发布证书教程
- python编写登录_通过Python编写一个简单登录功能过程解析
- NoSQL之Cassandra
- PyTorch中的Variable类型
- ArcGIS 视域分析
- linux输入法安装指南,Linux 中文输入法安装
- 基于HFSS的圆极化阵列天线设计
- oracle net Manager 配置连接 tiptop 鼎捷ERP 数据库
- iOS 模拟器下载与安装
- java 仓库管理系统源码
- 彻底删除顽固dll文件
- 第一次马拉松(2013上海国际马拉松赛)
- 网页版微信为什么打不开连接服务器失败,电脑能上微信,但是打不开网页怎么回事?...
- Struck: Structured Output Tracking with Kernels
热门文章
- CentOS远程监控
- Asp.net mvc 实时生成缩率图到硬盘
- 解决Vmware中安装Ubuntu Server 14.04 分辨率无法全屏问题
- asp.net验证提示美化效果
- (转)告别程序员生涯,一点感慨,与诸君共勉
- linux安装自带mysql吗_Linux下安装mysql
- python 裁判文书网_python - 用selenium模拟登陆裁判文书网,系统报错找不到元素。...
- 解决:flask-sqlalchemy.exc.DataError: (pymysql.err.DataError) (1406数据库字段超出长度错误)
- python连接MySQL数据库搭建简易博客
- MySQL安装和完全卸载-Linux ubantu18.04