据悉,深圳某工程师沦为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语言

我的知识小密圈

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/466721.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大数据工具使用——安装Hadoop(多台服务器)和Hive、Hbase

1.配置环境版本 资料上传百度云&#xff0c;自取&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1evVp5Zk0_X7VdjKlHGkYCw 提取码&#xff1a;ypti 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 &#xff08;之前安装的是apache版本的Hadoop2.6.4,在启…

进程间通信——信号

进程间通信——信号 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 一、信号和中断 1、信号基本概念 &#xff08;1&#xff09;发送信号&#xff1a;产生信号&#xff0c;有多种发送信号的方式【一个进程到另一个进程&#xff0c;内核向用户&#x…

[转] 关于 WCF 中数据压缩的几篇文章

原文:http://www.cnblogs.com/jiabao/archive/2007/12/04/982534.html在.net3.0出现以前我们进行分布式开发式有两个选择一个是webservice&#xff0c;另一个是remoting&#xff1b;在早期的项目中&#xff0c;比较喜欢remoting&#xff0c;因为remoting可控性好&#xff0c;也…

聊一聊我自己的从业经历和感悟

嵌入式学习&#xff0c;是一个很枯燥的过程&#xff0c;我记得在学习三极管的时候&#xff0c;我真的对这个东西一点感觉都没有&#xff0c;我知道三极管可以放大&#xff0c;然后电子从一个地方去到了另一个地方&#xff0c;然后就触发了某个开关&#xff0c;就发了大水。然后…

gmake与make的区别

gnu make在linux下一般是叫make但是如果是在其他的unix系统下&#xff0c;因为有一个原生的makegnu make就改个名字叫gmake了。就这们简单当port一个老的unix程序&#xff0c;如老的SunOS上的程序时往往需要sed s/gmake/make/ggmake是GNU Make的缩写。Linux系统环境下的make就是…

大数据——sqoop操作mysql和hive导出导入数据

1.sqoop安装 &#xff08;1&#xff09;下载CDH版本的sqoop &#xff08;2&#xff09;解压并进行环境配置 环境变量为&#xff1a; export SQOOP_HOME/home/sqoop-1.4.6-cdh5.15.1 export PATH$PATH:$SQOOP_HOME/bin 在sqoop安装目录/conf/下&#xff1a; #新建sqoop-en…

LinuxC高级编程——线程

LinuxC高级编程——线程 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 一、线程基础 main函数和信号处理函数是同一个进程地址空间中的多个控制流程&#xff0c;多线程也是如 此&#xff0c;但是比信号处理函数更加灵活&#xff0c;信号处理函数的控制…

来自专业的RIA咨询strechmedia机构提供的Flex组件

具体内容见这里&#xff0c;其中最有用的是chart range selection组件&#xff0c;可以用作历史数据浏览和分析&#xff0c;不光能用slider来选择查看的范围&#xff0c;还能控制范围的大小&#xff0c;而且通过图形也能对range selection进行反向操作&#xff0c;非常酷&#…

年终了,肿一下

也没有没有跟大家好好唠唠&#xff0c;一年时间过得飞快&#xff0c;我还记得那时候从老家开车来深圳&#xff0c;一路狂奔&#xff0c;在广西入境广东的时候&#xff0c;因为疫情排查&#xff0c;我们在那里堵了3个小时&#xff0c;还因为路途颠簸&#xff0c;车子一起一停&am…

大数据——spark安装部署和python环境配置

需要配置多台服务器&#xff0c;实验环境&#xff1a;master和data两台服务器&#xff0c;已安装好hadoop&#xff0c;可参考前文&#xff01;&#xff01;&#xff01; 1.spark安装 master安装 &#xff08;1&#xff09;下载scala和spark &#xff08;2&#xff09;解压并…

LinuxC高级编程——线程间同步

LinuxC高级编程——线程间同步 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 1、 互斥锁mutex 多个线程同时访问共享数据时可能会冲突。对于多线程的程序&#xff0c;访问冲突的问题是很普遍的&#xff0c;解决的办法是引入互斥锁&#xff08;Mutex&a…

2021年,这是你们收到的第一份礼物

一、 前言大家好&#xff0c;2020年就要过去了&#xff0c;这一年来&#xff0c;感谢大家对公众号的支持&#xff0c;但是感谢不能停留在嘴上&#xff0c;所以&#xff0c;这次邀请了正点原子赞助。一起给大家送点礼品&#xff01;作为一名 电子/嵌入式 人&#xff0c;正点原子…

SQL SERVER自定义函数

SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- -- Author: captain -- Create date: 2008.05.05 -- Description: 删除垃圾代码 -- ALTER FUNCTION [fzdongmancn].[fun_deleteLj] ( old varchar(1000) ) RETURNS varchar(1000) AS BEGIN declare ind…

Python参考手册(第4版)pdf

下载地址&#xff1a;网盘下载内容简介 本书是权威的Python语言参考指南&#xff0c;内容涉及核心Python语言和Python库的最重要部分。本书内容简洁扼要、可读性强&#xff0c;书中还包括了一些没有在Python官方文档或其他资料中出现过的一些高级的主题。这一版在内容上进…

大数据学习-python通过Pyhive连接hive数据库

1.hbase和hive结合 &#xff08;1&#xff09;hbase建表添加数据 #test是表名&#xff0c;name是列族 #hbase可以一个列族里边多个字段 create test,name#添加数据 put test,1,name:t1,1 put test,1,name:t2,2#查询 scan test#查询 get 表名&#xff0c;row-key&#xff0c;列…

深入理解Linux内核进程上下文切换

在原作者基础上修改了些文字描述&#xff0c;让文章更加通俗易懂作者简介韩传华&#xff0c;就职于南京大鱼半导体有限公司&#xff0c;主要从事linux相关系统软件开发工作&#xff0c;负责Soc芯片BringUp及系统软件开发&#xff0c;乐于分享喜欢学习&#xff0c;喜欢专研Linux…

Linux C高级编程——网络编程基础(1)

Linux高级编程——BSD socket的网络编程 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 一网络通信基础 TCP/IP协议簇基础&#xff1a;之所以称TCP/IP是一个协议簇&#xff0c;是因为TCP/IP包含TCP 、IP、UDP、ICMP等多种协议。下图是OSI模型与TCP/IP模…

使用SQLDMO中“接口SQLDMO.Namelist 的 QueryInterface 失败”异常的解决方法

SQLDMO&#xff08;SQL Distributed Management Objects&#xff0c;SQL分布式管理对象&#xff09;&#xff0c;它封装 Microsoft SQL Server 数据库中的对象。它允许我们通过COM对象&#xff0c;对SQLServer进行管理。SQLDMO对象来自SQLDMO.dll。因为SQLDMO.dll是一个COM对象…

GetKeyState(), GetAsyncKeystate(), GetKeyboardSlate()

GetKeyState、GetAsyncKeyState、GetKeyboardState函数的差别&#xff1a; 1、BOOL GetKeyboardState( PBYTE lpKeyState );获得全部的256个键&#xff08;键盘按键、鼠标按键等等&#xff09;的状态&#xff0c;lpKeyState是指向一个256bit的数组。存放全部键的状态。 2、SHOR…

你月薪多少?

今天跟一个读友聊天&#xff0c;他刚毕业没多久&#xff0c;在一家方案公司上班&#xff0c;月薪6.5&#xff0c;做的Android 开发&#xff0c;用RK方案&#xff0c;有时候也需要做MCU相关的开发&#xff0c;事情多&#xff0c;压力也不少&#xff0c;而且不是双休&#xff0c;…