c语言面试题每日一练

目录
1.Linux中的常用命令 2
1.在/tmp/目录下创建test.txt文件,内容为: Hello,World! ,用一个命令写出来。 2
2.给test.txt文件除所有者之外增加执行权限,最终以数字写出文件的权限。 2
3.查找linux系统下以config结尾,并备份到/data/backup/目录下 2
4.创建 test.txt所属的用户为root,组为abc,请将test.txt使拥有者为abc,组为root,写出命令。 2
5.如何查看文件内容,命令有哪些?查看文件第1行到3行,查看文件最后一行。 4
6.查看linux服务器IP的命令 5
7.将普通用户test加入root组的命令是 5
2.Linux系统应用领域和虚拟机的上网模式。 6
Linux系统应用在哪些领域? 6
VM虚拟机网络模式有NAT、主机、桥接,有什么区别? 6
VM虚拟机快照功能有什么用,怎么用? 7
VM虚拟机和win文件共享有哪几种方式? 7
3.文件、编码、编译 8
1.何谓文件? 8
2.何谓文本文件?何谓二进制文件? 8
3.何谓字符编码?对于中文来说,GBK和UTF-8一般各占几个字节? 8
4,对于编译性语言,源文件到可执行文件做了哪些处理? 8
5.综合上述问题,请解释: 9
1、何谓编译器? 9
2、编译器究竟做了哪些事? 9
3、如何设计一门语言? 9
6.延伸 9
1、何谓链接器? 9
2、何谓解释器? 9
3、所谓编译型语言和解释型语言的区别? 9
4、前一个问题的本质是___编译时间不同____的区别,为什么? 9
4.采集物联网大事件 10
5.什么是大小端字节序? 12
6.将源文件变成可执行文件称为编译过程,请问: 13
对编译效率影响最大的是哪个步骤? 13
如何提升编译效率?即编译效率的优化。 13
7.程序员分类 14
什么是初级程序员? 14
如何进阶为高级程序员? 14
非专业性知识上,初级程序员需要具备哪些特质,才能进阶为高级程序员呢? 15
8.程序是什么? 16
(1)程序是什么? 16
(2)程序由哪些部分组成? 16
(3)可执行文件运行起来叫做进程,运行这个操作做了哪些事? 16
(4)你觉得程序员是怎么分级的? 16
9.变量 16
1.static 修饰的变量 存储在内存的什么区中 16
2.简述下变量的作用范围,以及你们对变量的理解 16
3.if 语句和三目运算符的的比较,简述各自的优缺点 16
10.结构体占内存大小和对齐方式。 17
11.宏 18
1.用宏定义写出swap(x,y),即交换两数。 18
2.写一个“标准”宏,这个宏输入两个参数并返回较小的一个 18
12.药水毒药 18
12. 32位升级到64位,修改使用数据库事务的方式,升级C++编译器导致的重构。 19
13.for循环的效率问题,CPU流水线和分支预判。 20

1.Linux中的常用命令
1.在/tmp/目录下创建test.txt文件,内容为: Hello,World! ,用一个命令写出来。

2.给test.txt文件除所有者之外增加执行权限,最终以数字写出文件的权限。

3.查找linux系统下以config结尾,并备份到/data/backup/目录下

没找到backup文件自己创建了一个,不知道对不对

4.创建 test.txt所属的用户为root,组为abc,请将test.txt使拥有者为abc,组为root,写出命令。

(1)先更改了超级用户即root的密码,在从当前普通用户切换到超级用户,在超级用户下创建一个test.txt文件,查看这个文件的权限属于root用户,root组

在创建一个abc组,用chgrp命令将test.txt文件的组改为abc组;

在abc组中创建添加一个abc用户,然后将test.txt文件所属的用户改为abc用户

5.如何查看文件内容,命令有哪些?查看文件第1行到3行,查看文件最后一行。
(1)cat命令查看

(2)head。默认显示文件的前10行

Head -行数 显示前面多少行

(3)tail。默认显示尾部10行。

Tail -行数 显示尾部倒数多少行
(4)vim编辑器。

(5)gedit编辑器。

(6)vscode编辑器

6.查看linux服务器IP的命令

7.将普通用户test加入root组的命令是

用usermod命令直接修改
2.Linux系统应用领域和虚拟机的上网模式。

Linux系统应用在哪些领域?
(1)从应用领域来看:
服务器系统:Linux操作系统价格低廉、灵活性好,现在被广泛的使用在服务器操作系统之中。对于一些希望计算机应用性能比较高的单位而言,windows系统需要经常进行资源整合和碎片化管理,系统在配置的时候经常需要重新启动,这就无法避免产生停机的问题。由于Linux系统的处理能力非常强悍,具备不可比拟的稳定性特征,因而Linux系统就不用经常进行重启,Linux系统的变化可以在配置的过程中实现,所以Linux服务器出现故障的概率比较小,很多企业组织在计算机配置的过程中经常使用Linux系统,从而降低服务器发生崩溃的可能性。
桌面系统: Linux系统版本特别在桌面应用方面给予了很大的改进,具有非常高的水平,可以作为一种结合办公应用、多媒体应用以及网络应用等多方面功能为一体的操作系统,最关键的是,这个桌面系统是可以免费使用。
嵌入式系统:由于Linux系统开放源代码,功能强大、可靠、稳定性强、灵活而且具有极大的伸缩性,再加上它广泛支持大量的微处理体系结构、硬件设备、图形支持和通信协议,因此,在嵌入式应用的领域里,从因特网设备(路由器、交换机、防火墙,负载均衡器)到专用的控制系统(自动售货机,手机,PDA,各种家用电器),LINUX操作系统都有很广阔的应用市场。特别是经过这几年的发展,它已经成功地跻身于主流嵌入式开发平台。
电子政务:由于具有很好的作用,大家对于Linux系统的态度都发生了很大的转变,而且Linux也成为了与Windows系统抗衡的力量。因为它具有超高安全性,让大家更加喜欢。目前有一些国家正在将电子政务系统向Linux平台发生转变,由此也证明了对Linux系统的认可。
(2)从技术领域
大数据:大数据领域通常都会把大数据平台部署在Linux操作系统之上,比如Hadoop、Spark就通常会部署在Linux操作系统上,所以对于想从事大数据开发相关岗位的人来说,学习Linux操作系统是学习大数据的第一步。
云计算:云计算对于Linux的依赖也非常明显,一方面云计算往往需要通过Linux操作系统来完成资源的虚拟化管理,另一方面Linux操作系统的定制化能力也比较强,可以根据平台的要求进行深度调整,这也是Linux操作系统往往会用在服务器领域的重要原因。
物联网领域:对于Linux操作系统的依赖程度也比较高,无论是设备端的开发(嵌入式开发),还是物联网平台的开发,Linux操作系统都扮演了重要的角色。由于物联网与边缘计算和人工智能等技术也有比较紧密的联系,所以这些领域对于Linux操作系统也具有一定程度的依赖。

VM虚拟机网络模式有NAT、主机、桥接,有什么区别?
Bridged(桥接模式)
桥接模式就是将主机网卡与虚拟机虚拟的网卡利用虚拟网桥进行通信。在桥接的作用下,类似于把物理主机虚拟为一个交换机,所有桥接设置的虚拟机连接到这个交换机的一个接口上,物理主机也同样插在这个交换机当中,所以所有桥接下的网卡与网卡都是交换模式的,相互可以访问而不干扰。在桥接模式下,虚拟机ip地址需要与主机在同一个网段,如果需要联网,则网关与DNS需要与主机网卡一致。
NAT(地址转换模式)
NAT模式借助虚拟NAT设备和虚拟DHCP服务器,使得虚拟机可以联网。
在NAT模式中,主机网卡直接与虚拟NAT设备相连,然后虚拟NAT设备与虚拟DHCP服务器一起连接在虚拟交换机VMnet8上,这样就实现了虚拟机联网。那么我们会觉得很奇怪,为什么需要虚拟网卡VMware Network Adapter VMnet8呢?原来我们的VMware Network Adapter VMnet8虚拟网卡主要是为了实现主机与虚拟机之间的通信。
主机模式
其实就是NAT模式去除了虚拟NAT设备,然后使用VMware Network Adapter VMnet1虚拟网卡连接VMnet1虚拟交换机来与虚拟机通信的,Host-Only模式将虚拟机与外网隔开,使得虚拟机成为一个独立的系统,只与主机相互通讯。

VM虚拟机快照功能有什么用,怎么用?
快照的作用类似于一个系统还bai原点,一个虚拟系统里可以存在多个快照。利用快照可进行系统和数据还原。
当搭建好一个环境后,在没有添加任何数据时,或改变系统环境时,可以启用快照功能,虚拟机会保存虚拟系统里当前的环境,包括所安装的软件等设置;
当环境改变或需要重新搭建并系统初始化时,为免安装其他大型软件,可以启用快照的保存点进行恢复。作用就达到了快捷搭建环境的作用,也可以说是一种备份。
怎么用?
(1)打开虚拟机软件,在创建一个test文件之前,依次选择虚拟机-快照-拍摄快照,起名字:无test文件。然后点击拍摄快照。

(2)创建一个test文件夹

(3)再选择快照恢复到无test文件夹

VM虚拟机和win文件共享有哪几种方式?
(1).网络共享文件:虚拟机网络设置为NAT方式。使用Feiq等文件传输工具进行传输。此方法只要主机和虚拟机之间网络互通即可。
(2).使用共享文件夹的方式。给虚拟机添加共享文件夹指向一个本机的文件夹。要拷贝文件借此文件夹。启用共享文件夹之后,为虚拟机添加网上邻居会发现一个//vmware-host/Shared Folders/VMShare(这里是你的共享文件夹名)的网上邻居路径,使用此路径即可访问到本机文件。
(3). 使用FTP,TFTP等文件传输协议上传文件

3.文件、编码、编译
1.何谓文件?
文件是计算机文件属于文件的bai一种,与普通文du件载体不同,计算机文件是以计zhi算机硬盘为载体存储在计dao算机上的信息集合。

文件可以是文本文档、图片、程序等等。文件通常具有三个字母的文件扩展名,用于指示文件类型(例如,图片文件常常以 JPEG 格式保存并且文件扩展名为 .jpg)。

文件夹是一种计算机磁盘空间里面为了分类储存电子文件而建立独立路径的目录,“文件夹”就是一个目录文件夹图标名称,我们可以暂且称之为“电子文件夹”; 它提供了指向对应磁盘空间的路径地址,它可以有扩展名,但不具有文件扩展名的作用,也就不象文件那样用扩展名来标识格式。

2.何谓文本文件?何谓二进制文件?
文本文件:文bai本文件是一种计算机文件,它是一种典型的顺序文件,其文件的逻辑结构又属于流式文件。简单的说,文本文件是基于字符编码的文件,常见的编码有ASCII编码,UNICODE编码等等。
二进制文件:是基于值编码的文件,你可以根据具体应用,指定某个值是什么意思(这样一个过程,可以看作是自定义编码)。用户一般不能直接读懂它们,只有通过相应的软件才能将其显示出来。二进制文件一般是可执行程序、图形、图像、声音等等。
可以看出文本文件与二进制文件的区别并不是物理上的,而是逻辑上的。这两者只是在编码层次上有差异,文本文件基本上是定长编码的(也有非定长的编码如UTF-8)。而二进制文件则可看成是变长编码,因为是值编码,多少个比特代表一个值,完全由自己决定。

3.何谓字符编码?对于中文来说,GBK和UTF-8一般各占几个字节?
在计算机中,所有信息最终都是用二进制来表示的。每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte)。也就是说,一个字节一共可以用来表示256种不同的状态,从00000000到11111111。
GBK编码:英文采用单字节编码,汉字采用双字节编码,安全兼容ascll
UTF-8使用1~4字节为每个字符编码:
一个US-ASCIl字符只需1字节编码(Unicode范围由U+0000~U+007F)。
带有变音符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文等字母则需要2字节编码(Unicode范围由U+0080~U+07FF)。
其他语言的字符(包括中日韩文字、东南亚文字、中东文字等)包含了大部分常用字,使用3字节编码。
其他极少使用的语言字符使用4字节编码

4,对于编译性语言,源文件到可执行文件做了哪些处理?
将源代码文件处理成可执行程序,要经过四个过程:预处理——编译——汇编——链接
5.综合上述问题,请解释:
1、何谓编译器?
将高级语言源代码一次性的编译成可被该平台硬件执行的机器码,并包装成该平台所能识别的可执行性程序的格式。
2、编译器究竟做了哪些事?
(1)预处理
预处理过程主要处理的是#include、#define、#if、#else、#ifdef、#endif等指令以及处理注释、行号(用于调试)等工 作。
(2)编译大致包括一下六个部分:扫描,语法分析,语义分析,源代码优化,代码生成,目标代码优化。
(3)汇编
这一过程是通过汇编器完成的,输出文件是可以在指定机器上执行的指令。
(4)链接
由上面的过程可以看出,目标文件都是单独生成的。学过c语言的都知道,有时候会进行跨文件的变量或者函数引用。那么,这种情况下需要确定其地址。链接的过 程就是将汇编后生成的目标文件(.o文件)组合成完整的可执行程序,在这个过程之中,就要完成变量或者函数的地址定位。

3、如何设计一门语言?
创造一门编程语言需要有以下几个过程:
(1)设计语言的特性。
(2)定义语言的单词、语法和语义。
(3)实现编译器或者解释器将程序翻译为计算机底层表示。
(4)生成计算机程序的二进制存储格式。
(5)完善语言的运行时环境和标准库。
6.延伸
1、何谓链接器?
c/c++中的每个文件可以看作一个模块,模块之间京城需要进行互相访问(函数,变量),这种访问通过符号的引用来实现。这种引用带来的问题就是链接需要解决的问题。这个过程主要包括了地址和空间分配,地址绑定以及重定位等步骤。如caller.c中的函数main调用了另一文件callee.c文件中的 函数func,由于模块是单独编译,main在编译期间不会清楚func的地址,这就要在链接期间进行函数的定位。
2、何谓解释器?
对源程序逐行解释成特定平台的机器码并立即执行

3、所谓编译型语言和解释型语言的区别?
主要区别在于,编译型源程序编译后即可在该平台运行,解释型是在运行期间才编译。所以前者运行速度快,后者跨平台性好。
4、前一个问题的本质是___编译时间不同____的区别,为什么?
一个是在程序运行前就编译好了,一个是在程序运行时才开始编译
4.采集物联网大事件

  1. 3月20日,华为智能安防分销业务战略暨新品发布会在线上召开。发布会上,华为智能安防发布了对应“Huawei HoloSens”的中文品牌“华为好望”,并推出了面向安防分销市场的4款安防新品,包括华为好望D系列软件定义摄像机(SDC)、智能NVR800网络视频录像机、华为好望APP和好望商城。
      据悉,华为智能安防聚焦十大场景:零售商超、工厂园区、建筑工地、农业养殖、企业园区、仓储物流、幼儿园、智慧社区、办公楼宇、餐饮店等,契合场景业务需求,提供多种智能化应用帮助用户实现数字化与智能化转型。

  2. 4月7日,嵌入式解决方案供应商赛普拉斯半导体公司宣布,面向物联网开发者推出IoT-AdvantEdge解决方案。该方案囊括了连接芯片、微控制器(MCU)、软件、开发工具及支持、生态伙伴的协力,其目标是通过解决一系列关键物联网设备的设计问题,降低开发的复杂性。借助IoT-AdvantEdge,企业能够克服无线连接、硬件设备和云安全、功耗、设备管理和维护、高集成度、使用便捷性、人机界面、盈利能力等方面的挑战,快速地将可靠、安全、高品质的产品推向市场。

  3. 4月15日,蓝牙技术联盟(Bluetooth Special Interest Group,简称SIG)发布了《2020年蓝牙市场最新资讯》。
      报告指出,蓝牙已成为物联网领域采用最多的数据传输的技术,比如可穿戴设备、运动健康监测设备、传感器,以及植入设备等。预计到2024年,整个基于蓝牙的数据传输设备年出货量将会达到15亿。其中,蓝牙可穿戴设备出货量将会达到4.11亿,蓝牙互联玩具年出货量将会达到1.2亿,超出传统设备类别定义的8300万互联端点年出货量将达到8300万。

  4. 4月20日,国家发改委首次明确了“新基建”的范围,这包括信息基础设施、融合基础设施、创新基础设施三个方面。其中信息基础设施包括以5G、物联网、工业互联网、卫星互联网为代表的通信网络基础设施。

  5. 5月7日,工业和信息化部发布《关于深入推进移动物联网全面发展的通知》。《通知》提出到2020年底,NB-IoT网络实现县级以上城市主城区普遍覆盖,重点区域深度覆盖;移动物联网连接数达到12亿;推动NB-IoT模组价格与2G模组趋同,引导新增物联网终端向NB-IoT和Cat1迁移;打造一批NB-IoT应用标杆工程和NB-IoT百万级连接规模应用场景。

  6. 5月,UCloud优刻得正式发布了物联网边缘网关软件系统UIoT Edge,提供了开放的子设备接入、函数计算、消息路由、一键部署/远程运维以及本地Web Portal五大核心功能,用户可以将UIoT Edge运行系统直接安装到符合要求的X86、ARM硬件网关,快速完成业务部署,从而专注自身产品创新。

  7. 6月17日,中国移动“创新2020,云上科技周”在网络云平台正式开幕。会上,中移物联网有限公司总经理乔辉发布了中国移动物联网操作系统OneOS。
    据介绍,OneOS是一款面向物联网领域推出的轻量级实时操作系统,具有可裁剪、跨平台、低能耗、高安全等特点,支持ARM Cortex-M/R/A、MIPS、RISC-V等主流CPU架构,兼容POSIX、CMSIS等标准接口,支持MicroPython语言开发,提供图形化开发工具,能够有效提高开发效率并降低开发成本,帮助用户开发稳定可靠、安全易用的物联网应用。

  8. 6月22日,360OS发布《数字城市物联网安全体系白皮书》。该白皮书针对数字城市物联网的发展概况、特点及安全风险进行了系统性总结,提出物联网安全“141”体系架构和32种物联网安全能力要求,为物联网行业数字化推进和转型提供了安全应用指南。

  9. 6月23日,阿里云宣布旗下物联网平台在深圳的华南节点正式上线,此次新平台可以极大降低华南地区设备接入的延时,并支持通过规则引擎接入其他阿里云产品中。据悉,阿里云物联网平台提供了一站式的设备接入、设备管理、监控运维、数据流转、数据存储等服务,数据按照实例维度隔离,可根据业务规模灵活提升规格,具备高可用性、高并发、高性价比的特性。

5.什么是大小端字节序?

字节序:简单来说,就是指的超过一个字节的数据类型在内存中存储的顺序。
大端字节序:
高位字节数据存放在低地址处,低位数据存放在高地址处;
小端字节序:
高位字节数据存放在高地址处,低位数据存放在低地址处;
在内存中,栈是向下生长的,以char arr[4]为例,(因为char类型数据只有一个字节,不存在字节序的问题)依次输出每个元素的地址,可以发现,arr[0]的地址最低,arr[3]的地址最高,如图:

接下来看什么是高低位:
给一个十进制整数,123456,很明显左边的是高位,右边的是低位。计算机也是这样认为的。给一个16进制数,0x12345678,以字节为单位,从高位到低位依次是 0x12、0x34、0x56、0x78。

1、 如何通过语言判断字节序,请用目前的知识点(变量+运算符+输出函数)判断大小端。
如何判断当前系统是大端还是小端呢?

可以以1为例,1在栈中存储的大小端格式分别如下图所示:

如果我们可以得到 1 在内存中存储的第一个字节,那么我们就可以知道当前系统是大端存储还是小端存储了。

6.将源文件变成可执行文件称为编译过程,请问:
对编译效率影响最大的是哪个步骤?

引用博客中的一个图,在整个编译过程中,编译器对中间代码所做的工作最多
可以看到对编译效率影响最大的就是中间代码优化

如何提升编译效率?即编译效率的优化。

一个是提高编译器中间代码优化的性能:
① 代码优化按照优化的代码块尺度分为:局部优化、循环优化和全局优化。即

  1. 局部优化:只有一个控制流入口、一个控制流出口的基本程序块上进行的优化;
  2. 循环优化:对循环中的代码进行的优化;
  3. 全局优化:在整个程序范围内进行的优化。

② 常见的代码优化方式

  1. 删除多余运算;
  2. 代码外提:将循环内不变的量外提,减少代码运算次数;
  3. 强度削弱:把强度大的运算换成强度小的运算,比如把乘法换位加法运算;
  4. 变换循环控制条件。
    ③ 基本块内的优化
    由于基本块内的逻辑清晰,故而要做的优化手段都是较为直接浅层次的。目前基本块内的常见的块内优化手段有:
  5. 删除公共子表达式;
  6. 删除无用代码;
  7. 重新命名临时变量 (一般是用来应对创建过多临时变量的,如t2 := t1 + 3如果后续并没有对t1的引用,则可以t1 := t1 + 3来节省一个临时变量的创建);
  8. 交换语句顺序;
  9. 在结果不变的前提下,更换代数操作(如x∶=y2是需要根据运算符重载指数函数的,这是挺耗时的操作,故而可以用强度更低的x∶=y*y来代替);
  10. DAG(无环路有向图)应用于基本块的优化工作。

另一个是在人工编写代码时,在熟悉语法规则和编译器编译规则的基础上尽可能的精简代码
7.程序员分类
什么是初级程序员?
坚持某种语言/操作系统是是最好的,总是局限于某种技术,没有从解决问题的角度来看待。
知识面太过狭窄,只注重当前阶段的技能知识,不去拓展视野。往往看待问题也比较单一。
只关注工作的完成,完成的效果怎样,有没有最好的完成,有没有进步,这些。
用的技术还是老技术,经验还是原来的经验。

如何进阶为高级程序员?

(1) 编程是一门技艺,需要用心坚持不懈的学习和训练。
(2) 设法为工作建立文档,让他人能够理解它;设法让工作工程化,以使他人能够以它为基础进行构建。
(3) 不断学习广播的知识积累自己的经验,让自己能在特定情况下选择孔的解决方案,背景来源于对计算机科学基本原理的理解,而经验来自广泛的实际项目,理论与实践的结合才会让人强大。
(4) 调整自己的方法,适应当前的情形与环境。不仅要完成工作,还要把工作完成的漂亮。
(5) 注重团队合作。在一个项目中,个体有自己的个性和技艺的位置。
(6) 坚持不懈。

非专业性知识上,初级程序员需要具备哪些特质,才能进阶为高级程序员呢?

在做某件事的时候,会把注意力投注在他们在做的事的事情上,然后会试着把他们做的更好。
喜欢试验各种事物,拿到一样新东西,能很快掌握它,并把它和学到的知识结合在一起。
好奇喜欢提问,对自己不明白的事情一定要搞懂它,留下来就是你未来的问题麻烦。
有现实感。会设法理解面对的各种现实事物的本质,了解某事事情有多困难,需要花费多长时间,能更好的给自己坚持下去的毅力。
保持前沿。尽力熟悉广泛的技术和环境,技术和环境都是在不断变化的,唯一不变的就是变化,为了保持自己的能力和核心竞争力,我们必须保持自己的学习。

1、 这些特质现阶段你个人具备了多少呢?

应该具有好奇喜欢试验各种功能新事物。

1、谈谈你对智能物联网的憧憬。
智能物联网,一个是智能,一个是互联;
智能肯定是可以帮助我们解决很多事情的的,这些事情不一定很大,但一定能够让我们进一步解放自己的时间和空间;
生活中的洗衣机,冰箱,空调,扫地机器人等,直接连在网上,可以自己执行命令解决家务活,解决好后通过网络通知一下本人就可以了。
工业上,各个机器的调度管理都将变得更加智能,减少人工决策时间,提高效率。
而且可以产生定制化制造。

2、你将在智能物联网当中承载的⻆色。
桥梁家;建造连接物与人之间的桥梁的工程师,我可以自己给自己家里设计一套系统,按照自己的意愿,个性化的定制自己的物联和智能。
8.程序是什么?
(1)程序是什么?
计算机程序(Computer Program),港、台译做电脑程式,计算机程序是一组计算机能识别和执行的指令,运行于电子计算机上,满足人们某种需求的信息化工具。
也有说算法+数据结构=程序;

(2)程序由哪些部分组成?
算法+数据

(3)可执行文件运行起来叫做进程,运行这个操作做了哪些事?
1.系统初始化,包括中断向量表的重新映射
2.加载RW段(.data段初始化)
3.加载ZI段(.bss段初始化)
4.初始化用户堆栈
5.初始化Microlib
6.调用main函数

(4)你觉得程序员是怎么分级的?
一般分为以下几个级别,初级工程师、中级工程师、高级工程师、资深工程师/架构师
9.变量
1.static 修饰的变量 存储在内存的什么区中
静态区中

2.简述下变量的作用范围,以及你们对变量的理解
全局变量:在所有函数外定义的,可以供所有函数所有文件(不论是当前文件还是其他文件),放在静态区,编译时即分配好内存,系统结束时释放内存。
局部变量:在函数内部定义,只能在函数内部调用,当调用多个函数时可以有多个备份,彼此不影响,放在栈区,函数结束时释放。
静态全局变量:在全局变量前加了static ,只是改变了它的作用域,当不想让其它工程文件访问时。
静态局部变量:在局部变量前加上static,改变了变量的存储地址,放在了静态区,作用域还是不变,在循环函数中置赋值一次。

3.if 语句和三目运算符的的比较,简述各自的优缺点
三目运算符最主要的优点就是一定程度上减少代码量
三元运算符只能处理简单情况,在有条件执行多条语句时,无法取代if else语句
if条件语句最主要的优点就是结构清晰

10.结构体占内存大小和对齐方式。
typedef struct bb
{
int id; //4(4)
double weight; //8
float height; //8
}BB;

typedef struct aa
{
char name[2]; //2(2)
int id; //4
short score; //2(6)
BB b; //24
short grade; //2(6)

}AA;

这两个结构体 分别占用多大的内存,为什么?
首先我们要知道结构体内存计算与编译器的默认对齐数有关,一般windows环境默认对齐数为8,linux默认对齐数为4,也就是整个结构体的大小要为8或4的倍数,如果结构体内的变量大小有超过8或4的那就以结构体内最大的那个变量的大小作为对齐数。
结构体里的变量的存储空间大小是以下一个变量的大小为对齐数来对齐(整数倍)的比如前一个为char,后一个为int,则前一个需要4个字节的空间,一个给char另外三个空着。
内嵌有结构体时:以结构体里最大的变量作为上一个变量的对齐。

当有宏定义#pram pack(n)是,意思就是结构体里变量和整个结构体的对齐数变为了n,下一个变量所占的空间比n大时就按n来对齐,比n小时就按下一个变量的大小来对齐,但整个结构体还是按照n来对齐。

位域:

从上述可以看出:位域就是占几位大小,定义几个整型的位域也是占几个位的大小,但是整个结构体还是以整型变量的4字节大小位对齐数;
则:第一个有24个字节大
第二个有48字节
11.宏
1.用宏定义写出swap(x,y),即交换两数。

#define swap1(x, y)
(y) = (x) + (y);
(x) = (y) - (x);
(y) = (y) - (x);

2.写一个“标准”宏,这个宏输入两个参数并返回较小的一个

#define Min(a,b) ( ((a)>=(b))?(b):(a))
12.药水毒药
某实验室,现有64瓶药水,其中一瓶会致死。现在你可以用小白鼠来测试药水。小老鼠在吃了有毒的药水后,需要3天才会死亡。现在你只有三天时间,请问最少需要多少只老鼠就可以找出有毒的药水?

一个老鼠只喝一瓶药水肯定是不行的。。。
那就只能让它喝多瓶药水了,64瓶药水里有1瓶是毒药,那么对应的有64种情况,只需要老鼠的生亡情况等于大于64就能将所有的情况都检测到。
假设有n只老鼠,只有2n种情况:2n>=64,n=6,则需要6只老鼠。

  1. 32位升级到64位,修改使用数据库事务的方式,升级C++编译器导致的重构。
    你的公司有一个巨大的C++代码库,是多年来数十名乃至数百名工程师努力工作的成果。你发现需要对这些代码进行大规模的重构,比如从32位升级到64位,或是修改使用数据库事务的方式,或是(三天保佑)因为需要升级C++编译器,语法和语义全部(又)变了。你的任务就是把代码调通了。你会怎么做?

  2. 从32位升级到64位会导致,long和pointer。在32位环境下,顾名思义,两者长度都是32位,也就是4个字节;而在64位环境下,都是8个字节。所以,当你把pointer或者long型数据赋给int型时,会发生数据截断。

这个就需要注意那些将long/pointer和int混用的,找出这些类型的变量,把pointer转换为unsigned long

  1. 改用基于Aspectj AOP配置事务,可以批量处理事务

  2. 这只能重新再编写了。

13.for循环的效率问题,CPU流水线和分支预判。
1.请问下图中哪个循环体运行效率更高?为什么?

经过测试发现,有时第二种比第一种时间短,有时第二种时间比第一种长,大部分是第二种比第一种时间短。

正常情况下,次数多的循环放在内层,会减少cache更新数据的次数,当离开内层循环的时候会恢复外层的计数器,外层循环次数越少,恢复计数器的次数越少,效率较高,由此看来情况二更加高效。
从cpu指令执行机制上来分析,因为基本所有cpu都有分支指令预测,所以如果有10次循环,只有第一次和最后一次可能预测失败。如果外层循环为A次,则预测失败的次数为2*A+2,所以外层循环次数少的情况效率更高。
但是并不总是绝对的,如果CPU在放在cache中的数据利用率更高,那么花费的时间就会更短。

我这边加了判断后,内循环次数多的用时基本上全都比外循环次数多的花费的时间少。

也有相等的。
应该是增加了判断后,CPU对分支的判断失败几率又增大了,导致外循环的失败率更大。消耗的时间也就更长了些。

你可能感兴趣的:(C,linux,编程语言)