事情是这样的,昨晚晚上,有个网友发消息给我,说他有几道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语言笔试枪手相关推荐

  1. 100 条经典C语言笔试题目

    100 条经典C语言笔试题目 题目来源: 1.中兴.华为.慧通.英华达.微软亚洲技术中心等中 外企业面试题目: 2.C 语言面试宝典(林锐<高质量编程第三版>). 说明: 1.部分C 语言 ...

  2. 2005年4月全国计算机等级考试二级C语言笔试试题及答案

    2005年4月全国计算机等级考试二级C语言笔试试题及答案 一.选择题((1)-(10)每小题2分,(11)-(50)每小题1分,共60分) 下列各题A).B).C).D)四个选项中,只有一个选项是正确 ...

  3. 关于c语言程序开发过程 下面说法错误的是,c语言笔试真题

    下面由我们YJBYS求职网专家为您分享关于二级c语言笔试真题,请您参考: 函数fun 的功能是:计算正整数n 的所有因子(1 和n 除外)之和作为 函数值返回. 例如:n=120 时,函数值为239. ...

  4. 全国计算机等级考试c语言程序设计真题,历年全国计算机等级考试二级C语言笔试选择真题...

    一.选择题((1)-(10).(21)-(40)每题2分,(11)-(20)每题1分,共70分) (1)下列数据结构中,属于非线性结构的是 A.循环队列 B.带链队列 C.二叉树 D.带链栈 (2)下 ...

  5. 省二c语言笔试试卷,2005年春浙省二级C语言笔试试卷.doc

    2005年春浙省二级C语言笔试试卷 2005年春浙江省高校非计算机专业学生 计算机等级考试试卷 (二级C) 试题一.判断题(每小题1分,共10分) 说明:在以下提供的若干个陈述中,逐一判断其正确与否, ...

  6. 2007年9月c语言真题及答案,2007年9月二级C语言笔试真题和答案(已再修改).doc

    2007年9月二级C语言笔试真题和答案(已再修改) 2007年9月二级C语言笔试真题及答案 (考试时间:120分钟,满分100分) 一.选择题((1)-(10)每题2分,(11)-(50)每题1分.共 ...

  7. 2016二级c语言笔试内容,2016年计算机二级c语言笔试试题「最新」

    2016年计算机二级c语言笔试试题「最新」 (25)设有如下程序段 char s[20]= "Bejing",*p; p=s; 则执行p=s;语句后,以下叙述正确的是 A)可以用* ...

  8. 计算机等级考试二级c语言笔试,全国计算机等级考试二级C语言笔试试题和答案.doc...

    全国计算机等级考试二级C语言笔试试题和答案 1999年9月全国计算机等级考试二级C语言笔试试题 一.选择题((1)-(40)每个选项1分,(41)-(50)每个选项2分,共60分) 下列各题A). ...

  9. 二级c语言笔试58,全国计算机等级考试-二级C语言笔试试题.doc

    全国计算机等级考试-二级C语言笔试试题 2002年4月全国计算机等级考试二级C语言笔试真题试题(含参考答案) 一.选择题(1)-(40)题每小题1分,(41)-(50)题每小题2分,共计60分.下 ...

最新文章

  1. Python中__str__和__repr__
  2. Axure8.0深入一点(篇)
  3. java-类的结构及使用
  4. OpenGL屏幕空间环境光遮挡的实例
  5. .NET 6 的 docker 镜像可以有多小
  6. Codeforces Round #766 (Div. 2) D. Not Adding 数学gcd
  7. 【APICloud系列|11】使用APPuploader申请ios开发证书及ios发布证书教程
  8. python编写登录_通过Python编写一个简单登录功能过程解析
  9. NoSQL之Cassandra
  10. PyTorch中的Variable类型
  11. ArcGIS 视域分析
  12. linux输入法安装指南,Linux 中文输入法安装
  13. 基于HFSS的圆极化阵列天线设计
  14. oracle net Manager 配置连接 tiptop 鼎捷ERP 数据库
  15. iOS 模拟器下载与安装
  16. java 仓库管理系统源码
  17. 彻底删除顽固dll文件
  18. 第一次马拉松(2013上海国际马拉松赛)
  19. 网页版微信为什么打不开连接服务器失败,电脑能上微信,但是打不开网页怎么回事?...
  20. Struck: Structured Output Tracking with Kernels

热门文章

  1. CentOS远程监控
  2. Asp.net mvc 实时生成缩率图到硬盘
  3. 解决Vmware中安装Ubuntu Server 14.04 分辨率无法全屏问题
  4. asp.net验证提示美化效果
  5. (转)告别程序员生涯,一点感慨,与诸君共勉
  6. linux安装自带mysql吗_Linux下安装mysql
  7. python 裁判文书网_python - 用selenium模拟登陆裁判文书网,系统报错找不到元素。...
  8. 解决:flask-sqlalchemy.exc.DataError: (pymysql.err.DataError) (1406数据库字段超出长度错误)
  9. python连接MySQL数据库搭建简易博客
  10. MySQL安装和完全卸载-Linux ubantu18.04