linux c笔试题

合集下载

嵌入式Linux C语言应用开发试题及答案

嵌入式Linux C语言应用开发试题及答案

嵌入式Linux C语言应用开发试题及答案一:选择题1.下面不是对Linux操作系统特点描述的是( B )。

[A] 良好的可移植性[B] 单用户[C] 多用户[D] 多任务2.查看创建目录命令mkdir的帮助文档,可以使用命令( D)。

[A] mkdir –h [B] help mkdir [C] mkdir -p [D] man mkdir3.在C语言中,要求运算数必须是整型的运算符是( D )。

[A] / [B] ++ [C] != [D] %4.C语言程序的三种基本程序是( A )。

[A] 顺序结构,选择结构,循环结构[B] 递归结构,循环结构,转移结构[C] 嵌套结构,递归结构,顺序结构[D] 循环结构,转移结构,顺序结构5.数据结构包含的内容不包括(a)A.线性结构B.存储结构C.逻辑结构D.数据运算6.向一个单链表linklist中的节点t后面插入一个节点p,下列操作正确的是(a)A.p->next = t->next;t->next = p;B.t->next = p->next;t->next = p;C.t->next = p;p->next = t->next;D.t->next = p;t->next = p->next;7.下列哪种打开文件的方式不能修改文件已有的内容( B )[A] r+ [B] r [C] w+ [D] a+8.以下哪种不是进程的状态( B )[A] 运行态[B] 锁定态[C] 睡眠态[D] 停止态9.常用来进行多任务同步的机制是( B )[A]管道[B] 信号量[C]信号[D]共享内存10.下列对于有名管道描述错误的是( D )[A] 可以用于互不相关的进程间[B] 通过路径名来打开有名管道[C] 在文件系统中可见[D] 管道内容保存在磁盘上11.不能被用户进程屏蔽的信号是( B )[A] SIGINT [B] SIGSTOP [C] SIGQUIT [D] SIGILL12.fread()返回值的含义是( B )[A] 读取的字节数[B] 读取的对象数[C] 缓冲区的首地址[D] 013.以下不属于socket的类型的是 ( )。

linuxc基础试题(含答案)

linuxc基础试题(含答案)

linuxc基础试题(含答案)一、选择题1. 在Linux环境下,以下哪个命令可以用来编译C语言程序?A) gccB) g++C) makeD) rm答案:A) gcc2. 在C语言中,若要定义一个整型变量,应使用哪个关键字?A) floatB) intC) doubleD) char答案:B) int3. 以下哪个函数用于动态分配内存?A) malloc()B) alloc()C) calloc()D) new()答案:A) malloc()4. 在C语言中,哪个关键字用于定义结构体?A) structB) unionC) enumD) class答案:A) struct5. 以下哪个函数用于打开文件?A) fopen()B) open()C) fopen_s()D) creat()答案:A) fopen()二、填空题6. 在Linux环境下,C语言的编译器通常指的是______。

答案:gcc7. 在C语言中,用于声明函数原型的是______。

答案:函数原型8. 在C语言中,用于声明数组的语法是______。

答案:类型数组名[长度];9. 在C语言中,用于定义指针的语法是______。

答案:类型指针变量名;10. 在Linux环境下,标准输入输出文件的文件描述符分别是______和______。

答案:0 和 1三、判断题11. Linux环境下,C语言程序的编译和链接是两个独立的步骤。

()A) 正确B) 错误答案:A) 正确12. 在C语言中,静态变量在程序执行期间始终保持不变。

()A) 正确B) 错误答案:B) 错误13. 在C语言中,数组的下标是从1开始的。

()A) 正确B) 错误答案:B) 错误14. 在C语言中,函数的参数传递都是按值传递的。

()A) 正确B) 错误答案:A) 正确15. 在Linux环境下,可以使用重定向符号“>”将输出结果保存到文件中。

()A) 正确B) 错误答案:A) 正确四、编程题16. 编写一个C语言程序,实现以下功能:输入一个整数,输出它的阶乘。

嵌入式linux c开发常见笔试题目

嵌入式linux c开发常见笔试题目

嵌入式Linux C开发的常见笔试题目主要围绕C语言基础、Linux操作系统以及嵌入式系统开发等方面。

以下是一些可能的笔试题目:
1. 请解释C和C++的主要区别。

2. 描述一下静态变量和全局变量在内存中的分配情况。

3. 解释一下什么是预处理器以及它的主要作用。

4. 编写一个程序,实现两个整数的交换而不使用第三个变量。

5. 描述一下进程和线程的区别以及它们之间的关系。

6. 什么是死锁?请列举至少两种导致死锁的情况。

7. 请解释一下中断处理程序的工作原理。

8. 如何在Linux中创建一个新进程?
9. 描述一下Linux中的同步和异步机制。

10. 什么是RTOS?请列举至少两个RTOS的例子。

Linux操作系统下的C语言开发环境搭建测试题

Linux操作系统下的C语言开发环境搭建测试题

Linux操作系统下的C语言开发环境搭建测试题(答案见尾页)一、选择题1. Linux操作系统下,C语言开发环境的搭建需要以下哪些步骤?A. 安装GCC编译器B. 设置环境变量C. 编译和运行C程序D. 配置终端2. 在Linux操作系统中,以下哪个命令可以用来编译和运行C程序?A. gccB. g++C. chmodD. make3. 在Linux操作系统中,如何修改默认的编译器路径?A. 修改PATH环境变量B. 使用export命令C. 编辑/etc/profile文件D. 修改gcc的配置文件4. 在Linux操作系统中,安装了GCC编译器后,如何验证其安装成功?A. 输入gcc --version命令B. 输入gcc -v命令C. 输入gcc --configure命令D. 输入gcc -E命令5. 在Linux操作系统中,如何配置终端以方便进行C语言编程?A. 更改终端的提示符B. 安装tmux或screen工具C. 配置bashrc文件6. 在Linux操作系统中,如何使用GDB调试器调试C程序?A. 安装gdb软件包B. 编译程序时添加-g选项C. 使用gdb命令启动程序D. 查看程序内存布局7. 在Linux操作系统中,如何查看源代码文件的内容?A. 使用cat命令B. 使用less命令C. 使用grep命令D. 使用find命令8. 在Linux操作系统中,如何使用vi编辑器编辑C语言源代码文件?A. 进入vi编辑器B. 编辑文件内容C. 保存文件并退出vi编辑器D. 检查文件是否已保存9. 在Linux操作系统中,如何通过FTP上传和下载文件?A. 使用ftp命令B. 使用sftp命令C. 使用scp命令D. 使用ls命令10. 在Linux操作系统中,如何设置用户权限以确保C语言源代码的安全?A. 使用chmod命令B. 使用chown命令C. 使用umask命令D. 使用acl命令11. Linux操作系统下,C语言开发环境的搭建需要以下哪些步骤?B. 设置环境变量C. 配置编译选项D. 编译和运行C程序12. 在Linux系统下,如何修改一个文件的权限使其可读可写?A. chmod 666 filenameB. chmod 777 filenameC. chmod 644 filenameD. chmod 755 filename13. 在Linux系统下,使用以下哪个命令可以查看文件的详细信息,如文件大小、创建日期等?A. ls -lB. df -hC. tar -xvf file.tarD. stat filename14. 在Linux系统下,如何使用vi编辑器打开一个文件?A. vi filenameB. vim filenameC. nano filenameD. emacs filename15. 在Linux系统下,安装了GCC编译器后,如何验证其是否正确安装?A. echo $PATHB. which gccC. gcc --versionD. all of the above16. 在Linux系统下,如何创建一个新的目录并进入该目录?A. mkdir new_directoryB. cd new_directoryC. rmdir new_directoryD. mkdir -p new_directory17. 在Linux系统下,如何使用grep命令在文本中搜索特定的字符串?A. grep "search_string" filenameB. grep "search_string" filename | lessC. grep "search_string" filename | moreD. all of the above18. 在Linux系统下,如何修改一个文件的换行符为LF(Unix风格)?A. dos2unix filenameB. unix2dos filenameC. cat filename | tr '' '' > filenameD. all of the above19. 在Linux系统下,如何使用find命令查找特定文件?A. find / -name "filename_pattern"B. find . -type f -name "filename_pattern"C. find / -name "filename_pattern" -printD. all of the above20. Linux操作系统下,C语言开发环境的搭建需要以下哪些步骤?A. 安装编译器B. 配置编译环境变量C. 安装文本编辑器D. 编写、编译和运行C源代码21. 在Linux操作系统下,以下哪个命令可以用来编译和运行C语言源代码?A. gccB. g++C. chmodD. make22. 在Linux操作系统下,以下哪个命令可以用来安装一个新的C语言库?A. apt-getB. yumC. pacman23. 在Linux操作系统下,以下哪个命令可以用来查看源代码的层次结构?A. catB. grepC. treeD. less24. 在Linux操作系统下,以下哪个命令可以用来创建一个新目录?A. mkdirB. rmdirC. touchD. cp25. 在Linux操作系统下,以下哪个命令可以用来删除一个文件?A. rmB. mvC. rmdirD. cp26. 在Linux操作系统下,以下哪个命令可以用来复制文件或目录?A. cpB. mvC. rmD. ln27. 在Linux操作系统下,以下哪个命令可以用来查看文件的内容?A. catB. grepC. lessD. head28. 在Linux操作系统下,以下哪个命令可以用来查找文件?A. findB. locateD. man29. 在Linux操作系统下,以下哪个命令可以用来查看当前目录的内容?A. lsB. cdC. pwdD. man30. Linux操作系统下,C语言开发环境的搭建需要哪些步骤?A. 安装GCC编译器B. 配置内核头文件C. 安装文本编辑器D. 配置终端环境31. 在Linux操作系统下,如何验证C语言编译成功?A. 编译一个简单的C源代码,观察是否有语法错误B. 使用命令行进入编译后的目录,查看生成的可执行文件C. 在终端中输入编译命令,观察是否有错误信息D. 将编译后的程序在另一个系统中运行,检查功能是否实现32. Linux操作系统下,C语言开发常用的文本编辑器有哪些?A. VimB. EmacsC. nanoD. Kate33. 在Linux操作系统下,如何配置终端环境以便于C语言编程?A. 设置默认编码为UTF-8B. 配置PATH环境变量,确保编译器路径已添加C. 安装并配置版本控制工具(如Git)D. 配置别名,提高编程效率34. 在Linux操作系统下,C语言开发中常用的调试工具有哪些?A. GDB调试器B. DDD调试工具C. Valgrind内存检测工具D. printf()函数调试35. Linux操作系统下,C语言开发环境的搭建过程中,如何配置网络连接?A. 修改网络配置文件,设置静态IP地址B. 关闭防火墙,确保端口畅通C. 配置DNS服务器,解析域名D. 使用Wireshark工具监控网络流量36. 在Linux操作系统下,C语言开发环境中,如何管理项目文件?A. 使用版本控制工具(如Git)进行项目管理B. 使用文件系统树形结构管理项目文件C. 使用目录和文件名来管理项目文件D. 使用标签系统管理项目文件37. Linux操作系统下,C语言开发环境的搭建完成后,如何优化编译速度?A. 升级GCC编译器到最新版本B. 优化编译选项,减少编译时间C. 使用增量编译,避免重复编译D. 使用并行编译,提高编译速度38. 在Linux操作系统下,C语言开发环境的搭建过程中,如何安装必要的库文件?A. 使用包管理器(如apt或yum)安装库文件B. 从官方网站下载库文件并手动安装C. 从源代码编译库文件并安装D. 使用静态链接库文件,减少动态链接的内存开销39. Linux操作系统下,C语言开发环境的搭建完成后,如何进行代码测试和调试?A. 使用GDB调试器进行单步调试B. 使用DDD调试工具查看内存状态C. 使用printf()函数打印变量值进行调试D. 使用单元测试框架进行自动化测试40. Linux操作系统下,C语言开发环境的搭建需要以下哪些步骤?A. 安装GCC编译器B. 配置环境变量C. 安装文本编辑器D. 编译和运行C程序41. 在Linux操作系统下,以下哪个命令可以用来查看系统中的所有进程?A. ps -efB. topC. freeD. all42. 在Linux操作系统下,如何修改一个文件的权限使得文件所有者具有读写权限,其他用户只具有读权限?A. chmod 644 filenameB. chmod 755 filenameC. chmod 664 filenameD. chmod 777 filename43. 在Linux操作系统下,使用以下哪个命令可以查看当前目录下的隐藏文件?A. ls -aB. ls -lC. ls -hD. ls -d44. 在Linux操作系统下,如何安装一个新软件包?A. apt-get updateB. yum install package_nameC. pacman -S package_nameD. brew install package_name45. 在Linux操作系统下,如何使用grep命令查找包含特定字符串的文件?A. grep "search_string" filenameB. grep "search_string" /path/to/filenameC. grep "search_string" $(find /path/to/search -type f)D. grep "search_string" /path/to/search/*46. 在Linux操作系统下,如何修改文件的所有者和组?A. chown new_owner:new_group filenameB. chown new_owner:new_group /C. chown new_owner:new_group *D. chown new_owner:new_group .47. 在Linux操作系统下,如何创建一个新的用户组?A. groupadd group_nameB. groupadd -g GID group_nameC. groupadd -G GID group_nameD. groupadd -p group_name48. 在Linux操作系统下,如何设置Shell提示符?A. export PS1="\u@\h:\w\$ "B. export PS1="\u@\h:\w\$ "C. export PS1="\u@\h:\w\\$ "D. export PS1="\u@\h:\w\$ "二、问答题1. 请简述在Linux操作系统下搭建C语言开发环境的步骤。

Linux程序员(C语言)考证题库

Linux程序员(C语言)考证题库

Linux程序员(C语言)考证题库一、单项选择题1.Linux的根分区的文件系统类型是C。

A.FAT16B.FAT32C.ext3D.NTFS2.安装好Linux操作系统后,系统默认的超级用户(系统管理员)账号是C。

A.administratorB.guestC.rootD.boot3.Linux文件系统的文件都按其作用分门别类地放在相关的目录中,对于外部设备文件,一般应将其放在C目录中。

A./binB./etcC./devD./lib4.Linux有三个查看文件的命令,若希望在查看文件内容过程中,可以用光标上下移动来查看文件内容,应使用C命令。

A.catB.moreC.lessD.menu5.可以为文件或目录重命名的命令是C。

A.mkdirB.rmdirC.mvD.rm6.已知某用户stud1,其用户目录为/home/stud1。

如果当前目录为/home,进入目录/home/stud1/test的命令是:C。

A.cd testB.cd/stud1/testC.cd stud1/testD.cd home7.Linux文件权限一共10位长度,分成四段,第三段表示的内容是C。

A.文件类型B.文件所有者的权限C.文件所有者所在组的权限D.其他用户的权限8.将Windows C:盘(hda1)安装在Linux文件系统的/winsys目录下,命令是B。

A.mount–t vfat dev/hda1/winsysB.mount–t vfat/dev/hda1/winsysC.mount–t vfat/dev/hda1winsysD.mount–t vfat dev/hda1winsys9.一般情况下,系统启动过程自动加载的文件系统信息是存放在文件D中A./usr/sbin/cfdiskB./sbin/fdiskC./etc/mtabD./etc/fstab10.系统中有用户user1和user2,同属于users组。

CC++ linux 嵌入式相关 带答案的笔试题 (2) 汇总

CC++ linux 嵌入式相关 带答案的笔试题 (2) 汇总

7.C++中为什么用模板类。

答:(1)可用来创建动态增长和减小的数据结构(2)它是类型无关的,因此具有很高的可复用性。

(3)它在编译时而不是运行时检查数据类型,保证了类型安全(4)它是平台无关的,可移植性(5)可用于基本数据类型8.CSingleLock是干什么的。

答:同步多个线程对一个数据类的同时访问12.Linux有内核级线程么。

答:线程通常被定义为一个进程中代码的不同执行路线。

从实现方式上划分,线程有两种类型:“用户级线程”和“内核级线程”。

用户线程指不需要内核支持而在用户程序中实现的线程,其不依赖于操作系统核心,应用进程利用线程库提供创建、同步、调度和管理线程的函数来控制用户线程。

这种线程甚至在象DOS 这样的操作系统中也可实现,但线程的调度需要用户程序完成,这有些类似Windows 3.x 的协作式多任务。

另外一种则需要内核的参与,由内核完成线程的调度。

其依赖于操作系统核心,由内核的内部需求进行创建和撤销,这两种模型各有其好处和缺点。

用户线程不需要额外的内核开支,并且用户态线程的实现方式可以被定制或修改以适应特殊应用的要求,但是当一个线程因I/O 而处于等待状态时,整个进程就会被调度程序切换为等待状态,其他线程得不到运行的机会;而内核线程则没有各个限制,有利于发挥多处理器的并发优势,但却占用了更多的系统开支。

Windows NT和OS/2支持内核线程。

Linux 支持内核级的多线程14.使用线程是如何防止出现大的波峰。

答:意思是如何防止同时产生大量的线程,方法是使用线程池,线程池具有可以同时提高调度效率和限制资源使用的好处,线程池中的线程达到最大数时,其他线程就会排队等候15函数模板与类模板有什么区别?答:函数模板的实例化是由编译程序在处理函数调用时自动完成的,而类模板的实例化必须由程序员在程序中显式地指定。

22.TCP/IP 建立连接的过程?(3-way shake)答:在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。

LINUX复习题cj完整版

LINUX复习题cj完整版

LINUX复习题cj完整版1、Linu某最早是由一位名叫(c)的计算机爱好者开发.(A)Linu某Sarwar(B)RobPike(C)LinuTorvald(D)RichardPeteren2、下列(D)是自由软件。

(A)Window某P(B)UNI某(C)Solari(D)Linu某3、下列(A)不是Linu某的特点(A)单用户(B)设备独立性(C)开放性(D)多任务4、Linu某安装过程中的硬盘分区工具是(D)。

(A)FIPS(B)PQmagic(C)FDISK(D)DikDruid磁盘德鲁伊5、Linu某的根分区的文件系统类型是(B)。

(A)FAT32(B)e某t3(C)FAT16(D)NTFS7、GRUB的菜单定义在(A)文件中。

(A)#(B)C:\\>(C)grub>(D)$9、GRUB的命令行模式的命令提示符是(A)。

(A)grub>(B)$(C)#(D)C:\\>10、当安装好Linu某后,系统默认的帐号是(C)。

(A)adminitrator(B)guet(C)root(D)boot11、在命令行模式中、输入(C)不能进入末行模式。

(A)?(B)/(C):(D)i12、可以为文件或目录重命名的命令是(B)。

(A)rm(B)mv(C)rmdir(D)mkdir13、用于文件系统挂载的命令是(A)。

(A)mount(B)fdik(C)df(D)man14、不能用来关机的命令是(D)。

(A)hutdown关机(B)halt休息,停止(C)init初始化(D)logout注销15、Linu某系统中,将加密过的密码放到(C)文件中。

(A)other(B)/etc/paword(C)/etc/hadow(D)/etc/pawd16、变更用户身份的命令是(C)。

(A)who(B)whoami(C)u(D)id17、用于终止某一进程执行的命令是(C)。

(A)free(B)ptree(C)kill(D)p18、比较文件的差异要用到的命令是(A)。

linux及C试题(含答案)

linux及C试题(含答案)

linux及C试题(含答案)华清远见嵌入式学院《Linux及C》考试题(B卷)一、选择题(23题,每空2分,共46分)1.在使用mkdir命令创建新的目录时,在其父目录不存在时先创建父目录的选项(D )。

A.-mB.-dC.-fD.-p2.任何时候用户需要回到用户主目录时可以使用命令 ( A ) 。

A. cdB. pwdC. pathD. cd .3.将当前目录下的文件shell.sh移动到目录/home/linux下的命令为( B ) 。

A. cp shell.sh /home/linuxB. mv shell.sh /home/linuxC. ls shell.sh / home/linux/she ll.shD. mv /root/shell.sh /home/linux/shell.sh4.下面( C )命令不能用来显示文件的内容。

[A] more [B] less [C] find [D] cat5./etc/shadow文件中存放( B )。

A.用户账号基本信息B.用户口令的加密信息C.用户组信息D.文件系统信息6.LINUX所有服务的启动脚本都存放在( B )目录中。

A./etc/rc.d/init.dB./etc/init.dC./etc/rc.d/rcD./etc/rc.d7.若要将当前目录中的myfile.txt文件压缩成myfile.txt.tar.gz,则实现的命令为(C )。

A.tar -cvf myfile.txt myfile.txt.tar.gzB.tar -zcvf myfile.txt myfile.txt.tar.gzC.tar -zcvf myfile.txt.tar.gz myfile.txtD.tar -cvf myfile.txt.tar.gz myfile.txt8.以下程序的运行结果为( C )#include#includeint SubCount(char *dest, int count){strcpy(dest,"555");count++;return 0;}int main(){int count = 3;char caBuf[8];SubCount(caBuf,count);printf("%d\n",count);return 0;}[A] 8[B] 4[C] 3 [D] 59.下面的代码输出是( A )void foo(void){unsigned int a = 6; int b = -20;(a+b > 6) ? puts("> 6") : puts("<= 6");}[A] > 6 [B] <= 610.C语言中,逻辑“真”等价于( C )。

嵌入式LinuxC笔试题积累(转)

嵌入式LinuxC笔试题积累(转)

嵌⼊式LinuxC笔试题积累(转)/h_armony/article/details/67648111. 嵌⼊式系统中断服务⼦程序(ISR)中断是嵌⼊式系统中重要的组成部分,这导致了很多编译开发商提供⼀种扩展—让标准C⽀持中断。

具代表事实是,产⽣了⼀个新的关键字__interrupt。

下⾯的代码就使⽤了__interrupt关键字去定义了⼀个中断服务⼦程序(ISR),请评论⼀下这段代码的。

__interrupt double compute_area (double radius){ double area = PI * radius * radius;printf(" Area = %f", area);return area;}1). ISR 不能返回⼀个值。

2). ISR 不能传递参数。

3). 在许多的处理器/编译器中,浮点⼀般都是不可重⼊的。

有些处理器/编译器需要让额处的寄存器⼊栈,有些处理器/编译器就是不允许在ISR中做浮点运算。

此外,ISR应该是短⽽有效率的,在ISR中做浮点运算是不明智的。

4). 与第三点⼀脉相承,printf()经常有重⼊和性能上的问题。

2.C语⾔中对位的操作,⽐如对a的第三位清0,第四位置1.本来应该会的,⼀犯晕写反了,以后注意!#define BIT3 (1<<3)#define BIT4 (1<<4)a &= ~BIT3; a |= BIT4;3.volatile表⽰这个变量会被意想不到的改变,每次⽤他的时候都会⼩⼼的重新读取⼀遍,不适⽤寄存器保存的副本。

volatile表⽰直接存取原始地址例:并⾏设备的硬件寄存器(状态寄存器)在多线程运⾏的时候共享变量也要时时更新⼀个中断服务⼦程序中访问到的的⾮⾃动变量(定义变量时默认为⾃动变量,这⾥指全局变量或加修饰的变量)4.Const:Const char*p //p 指向的内容不能被修改Char const *p; // p指针指向内容不能修改Const (char*) p; //p指针不能修改,p++ 操作会出错Const type fun(); // 返回值类型为⼀个const type类型,不能修改Fun( const char *p); //保护指针,引⽤传递的值不被修改.类成员函数:中 fun() const; //表明FUN不能修改成员变量,不调⽤⾮const 成员函数.5.要求设置⼀绝对地址为0x67a9 的整型变量的值为0xaa66int *ptr = (int *)0x67a9;*ptr = 0xaa66;6、#include "stdio.h"int a=0;int b;static char c;int main(int argc,char *argv[]){char d=4;static short e;a++;b=100;c=(char)++a;e=(++d)++;printf("a=%d, b=%d, c=%d, d= %d, e=%d",a,b,c,d,e);return 0;}a) 写出程序输出答案:a = 2, b = 100, c = 2, d = 6, e = 57a)对于整形变量A=0x12345678,请画出在little endian及big endian的⽅式下在内存中是如何存储的?little endian big endian 刚好反过来⾼地址--〉 0x12 低地址--〉 0x120x34 0x340x56 0x56低地址--〉 0x78 ⾼地址--〉 0x78记忆⽅法:⼩端模式:地址的增长顺序与值的增长顺序相同(x86为⼩端模式)⼤端模式:地址的增长顺序与值的增长顺序相反b)在ARM系统中,函数调⽤的时候,参数是通过哪种⽅式传递的?参数<=4时候,通过R0~R3传递,>4的通过压栈⽅式传递8 .1请实现内存复制函数void* memcpy(void* dst, void* src, int count)。

linux c笔试题

linux c笔试题

c语言常见笔试题大全(一)1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL我在这想看到几件事情:1). #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等)2). 懂得预处理器将为u币你哦门票,模糊刚看见快乐科技计划发广告和统一,(表示无符号长整型),那么你有了一个好的起点。

记住,第一印象很重要。

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

#define MIN(A,B) ((A) <= (B) ?(A) : (B))这个测试是为下面的目的而设的:1). 标识#define在宏中应用的基本知识。

这是很重要的,因为直到嵌入(inline)操作符变为标准C的一部分,宏是方便产生嵌入代码的唯一方法,对于嵌入式系统来说,为了能达到要求的性能,嵌入代码经常是必须的方法。

2). 三重条件操作符的知识。

这个操作符存在C语言中的原因是它使得编译器能产生比if-then-else更优化的代码,了解这个用法是很重要的。

3). 懂得在宏中小心地把参数用括号括起来4). 我也用这个问题开始讨论宏的副作用,例如:当你写下面的代码时会发生什么事?least = MIN(*p++, b);3. 预处理器标识#error的目的是什么?如果你不知道答案,请看参考文献1。

这问题对区分一个正常的伙计和一个书呆子是很有用的。

只有书呆子才会读C语言课本的附录去找出象这种问题的答案。

当然如果你不是在找一个书呆子,那么应试者最好希望自己不要知道答案。

死循环(Infinite loops)4. 嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢?这个问题用几个解决方案。

我首选的方案是:while(1){}一些程序员更喜欢如下方案:for(;;){}这个实现方式让我为难,因为这个语法没有确切表达到底怎么回事。

Linux下C语言 编程题目

Linux下C语言 编程题目

Linux下C语言编程测试题目说明:1. 试卷总分100分。

2. 试卷中代码的运行环境为:Linux 2.6.23环境,平台为32为处理器系统,编译器为GCC4.4.3。

一.选择题:1.下面哪项不是链表优于数组的特点?()A. 方便删除B. 方便插入C. 长度可变D. 存储空间小2. 以下程序的输出结果是( )。

int func(int n){ static int m=0;m=m+n;return(m); }main(){ int i,a=0;for(i=1;i<=4;i++)a+=func(i);printf("%d\n",a); }A.10 B.15 C.20 D.223. 以下程序执行后,a的值是()void main(){int a,k=4,m=6,*p1=&k,*p2=&m;a = p1==&m;printf(“%d\n”,a);}A) 4 B) 1 C) 0 D) 运行时出错,a无定值4. 编译以下程序时,结果是()。

#include<iostream.h> //第1行#define aa 123; //第2行void main(void) //第3行{cout<<aa<<’\n’;} //第4行A.编译时第2行出错B.编译时第4行出错C.编译时第2行和第4行出错D.编译时无错误5.main(){struct node{int a;int b;int c;};struct node s= { 3, 5,6 };struct node *pt = &s;printf("%d" , *(int*)pt);}这段程序的输出是:(a) 3(b) 5(c) 6(d) 76.int foo ( int x , int n){int val;val =1;if (n>0){if (n%2 == 1) val = val *x;val = val * foo(x*x , n/2);}return val;}这段代码对x和n完成什么样的功能(操作)(a) x^n (x的n次幂)(b) x*n(x与n的乘积)(c) n^x(n的x次幂)(d) 以上均不是7.main(){int a[5] = {1,2,3,4,5};int *ptr = (int*)(&a+1);printf("%d %d" , *(a+1), *(ptr-1) );}这段程序的输出是:(a) 2 2(b) 2 1(c) 2 5(d) 以上均不是8.void foo(int [][3] );main(){int a [3][3]= { { 1,2,3} , { 4,5,6},{7,8,9}}; foo(a);printf("%d" , a[2][1]);}void foo( int b[][3]){++ b;b[1][1] =9;}这段程序的输出是:(a) 8(b) 9(c) 7(d)以上均不对9.main(){int a, b,c, d;a=3;b=5;c=a,b;d=(a,b);printf("c=%d" ,c);printf("d=%d" ,d);}这段程序的输出是:(a) c=3 d=3(b) c=5 d=3(c) c=3 d=5(d) c=5 d=510.main(){int a[][3] = { 1,2,3 ,4,5,6};int (*ptr)[3] =a;printf("%d %d " ,(*ptr)[1], (*ptr)[2] ); ++ptr;printf("%d %d" ,(*ptr)[1], (*ptr)[2] );}这段程序的输出是:(a) 2 3 5 6(b) 2 3 4 5(d) 以上均不对11.int *f1(void){int x =10;return(&x);}int *f2(void){int*ptr;*ptr =10;return ptr;}int *f3(void){int *ptr;ptr=(int*) malloc(sizeof(int));return ptr;}上面这3个函数哪一个最可能引起指针方面的问题(a) 只有f3(b) 只有f1 and f3(c) 只有f1 and f2(d) f1 , f2 ,f312.void f1(int *, int);void f2(int *, int);void (*p[2]) ( int *, int);main(){int a;int b;p[0] = f1;p[1] = f2;a=3;b=5;p[0](&a , b);printf("%d\t %d\t" , a ,b);p[1](&a , b);printf("%d\t %d\t" , a ,b);}void f1( int* p , int q){tmp =*p;*p = q;q= tmp;}void f2( int* p , int q){int tmp;tmp =*p;*p = q;q= tmp;}这段程序的输出是:(a) 5 5 5 5(b) 3 5 3 5(c) 5 3 5 3(d) 3 3 3 313.void e(int );main(){int a;a=3;e(a);}void e(int n){if(n>0){e(--n);printf("%d" , n);e(--n);}}这段程序的输出是:(a) 0 1 2 0(b) 0 1 2 1(c) 1 2 0 1(d) 0 2 1 114.typedef int (*test) ( float * , float*)test tmp;tmp 的类型是(a) 函数的指针,该函数以两个指向浮点数(float)的指针(pointer)作为参数Pointer to function of having two arguments that is pointer to float(b) 整型(c) 函数的指针,该函数以两个指向浮点数(float)的指针(pointer)作为参数(arguments),并且函数的返回值类型是整型Pointer to function having two argument that is pointer to float and return int(d) 以上都不是15.main(){char p;char buf[10] ={ 1,2,3,4,5,6,9,8};p = (buf+1)[5];printf("%d" , p);}这段程序的输出是:(a) 5(b) 6(c) 9(d) 以上都不对16.V oid f(char**);main(){char * argv[] = { "ab" ,"cd" , "ef" ,"gh", "ij" ,"kl" };f( argv );}void f( char **p ){char* t;t= (p+= sizeof(int))[-1];printf( "%s" , t);}这段程序的输出是:(a) ab(b) cd(c) ef(d) gh17.int counter (int i){static int count =0;count = count +i;return (count );}main(){int i , j;for (i=0; i <=5; i++)j = counter(i);}本程序执行到最后,j的值是:(a) 10(b) 15(c) 6(d) 718. 下列程序的输出是什么?()#include <iostream>#include <string>using namespace std;int main(){int x = 10, y = 10, i;for(i=0; x>8; y=i++){pri ntf(“%d, %d,”, x--, y);}return 0;}A 10,0,9,1B 10,10,9,0C 10,1,9,2D 9,10,8,019 which definition is correct?( )A int a[];B int n=10,a[n];C int a[10+1]={0};D int a[3]={1,2,3,4};20 How many bytes will be occupied for the variable(definition:char **a[3][4])?( )A 64B 96C 48D 128二.简答题:1.在某工程中,要求设置一绝对地址为0x67a9的整型变量的值为0xaa66。

常见linux笔试题-100道选择题-(答案见最后)

常见linux笔试题-100道选择题-(答案见最后)

Linux认证笔试基本题(答案见最后)(以下均为单选题)01.D 02.B 03.C 04.C 05.B 06.C 07.B 0 8.C 09.A 10.B1.cron 后台常驻程序 (daemon) 用于:A. 负责文件在网络中的共享B. 管理打印子系统C. 跟踪管理系统信息和错误D. 管理系统日常任务的调度2.在大多数Linux发行版本中,以下哪个属于块设备 (block devices) ?A. 串行口B. 硬盘C. 虚拟终端D. 打印机3.下面哪个Linux命令可以一次显示一页内容?A. pauseB. catC. moreD. grep4.怎样了解您在当前目录下还有多大空间?A. Use dfB. Use du /C. Use du .D. Use df .5.怎样更改一个文件的权限设置?A. attribB. chmodC. changeD. file6.假如您需要找出 /etc/my.conf 文件属于哪个包 (package) ,您可以执行:A. rpm -q /etc/my.confB. rpm -requires /etc/my.confC. rpm -qf /etc/my.confD. rpm -q | grep /etc/my.conf7.假如当前系统是在 level 3 运行,怎样不重启系统就可转换到 level 5 运行?A. Set level = 5B. telinit 5C. run 5D. ALT-F7-58.那个命令用于改变 IDE 硬盘的设置?A. hdparamB. ideconfigC. hdparmD. hddparm9.下面哪个命令可以列出定义在以后特定时间运行一次的所有任务?A. atqB. cronC. batchD. at10.下面命令的作用是:set PS1="[\u\w\t]\\$" ; export PS1A. 改变错误信息提示B. 改变命令提示符C. 改变一些终端参数D. 改变辅助命令提示符11.作为一个管理员,你希望在每一个新用户的目录下放一个文件 .bashrc ,那么你应该在哪个目录下放这个文件,以便于新用户创建主目录时自动将这个文件复制到自己的目录下。

北京天元特通linux c笔试题

北京天元特通linux c笔试题

北京天元特通linux c笔试题一、选择题1.vi中哪条命令是不保存强制退出( C )A.:wqB.:wq!C.:q!D.:quit2.在Ubuntu Linux中,系统默认的(A)用户对整个系统拥有完全的控制权。

A.rootB.guestC.administratorD.supervistor3.当登录Linux时,一个具有唯一进程ID号的shell将被调用,这个ID是什么(B )A.NIDB.PIDC.UIDD.CID4.下面哪个命令是用来定义shell的全局变量( D)A.exportfsB.aliasC.exportsD.export5.哪个目录存放用户密码信息(B )A./bootB./etcC./varD./dev6.默认情况下管理员创建了一个用户,就会在( B )目录下创建一个用户主目录。

A./usrB./homeC./rootD./etc7.当使用mount进行设备或者文件系统挂载的时候,需要用到的设备名称位于( D )目录。

A./homeB./binC./etcD./dev8.如果要列出一个目录下的所有文件需要使用命令行(C)。

A.ls –lB.lsC.ls –a(所有)D.ls –d9.哪个命令可以将普通用户转换成超级用户(D)A.superB.passwdC.tarD.su10.除非特别指定,cp假定要拷贝的文件在下面哪个目录下(D )A.用户目录B.home目录C.root目录D.当前目录11.在vi编辑器里,命令"dd"用来删除当前的( A)A.行B.变量C.字D.字符14.按下(A)键能终止当前运行的命令A.Ctrl-CB.Ctrl-FC.Ctrl-BD.Ctrl-D15.用 "rm -i",系统会提示什么来让你确认( B)A.命令行的每个选项B.是否真的删除C.是否有写的权限D.文件的位置二、填空题16.在Linux系统中,以___文件的______方式访问设备。

嵌入式linux c开发常见笔试题目

嵌入式linux c开发常见笔试题目

嵌入式linux c开发常见笔试题目嵌入式Linux C开发是一个广泛应用于各种嵌入式设备的技术领域,也是许多企业在招聘时重点考察的技能。

在笔试中,考察的内容通常包括C语言基础、嵌入式系统知识、Linux系统编程等方面。

以下是一些常见的嵌入式Linux C开发笔试题目,供大家参考。

1. C语言基础在嵌入式Linux C开发中,对C语言的熟练掌握是非常重要的。

下面是一些与C语言基础相关的题目:1.1 请写出C语言中的数据类型,并解释其含义。

1.2 请解释C语言中的指针,并写出指针的声明、赋值和使用的例子。

1.3 请解释C语言中的结构体,并写出结构体的定义和使用的例子。

2. 嵌入式系统知识嵌入式系统是指在限定的资源和空间中运行的计算机系统,对于嵌入式Linux C开发来说,对嵌入式系统的了解是必不可少的。

下面是一些与嵌入式系统知识相关的题目:2.1 请解释嵌入式系统的特点,并举例说明。

2.2 请简要解释Linux内核的作用,并说明为什么在嵌入式系统中常使用Linux内核。

2.3 请解释交叉编译的概念,并说明为什么在嵌入式Linux C开发中常使用交叉编译。

3. Linux系统编程Linux系统编程是指在Linux系统上进行程序开发和调试的技术。

对于嵌入式Linux C开发者来说,熟悉Linux系统编程是必备的技能。

下面是一些与Linux系统编程相关的题目:3.1 请解释Linux系统中的进程和线程,并说明它们的区别和联系。

3.2 请解释Linux文件系统的层次结构,并说明每个层次的作用。

3.3 请解释Linux中的系统调用,并举例说明几个常用的系统调用。

4. 嵌入式Linux应用开发嵌入式Linux应用开发是指在嵌入式Linux系统上进行应用程序开发的技术。

下面是一些与嵌入式Linux应用开发相关的题目:4.1 请编写一个在嵌入式Linux系统上运行的Hello World程序。

4.2 请解释Linux设备驱动程序的概念,并说明为什么在嵌入式Linux应用开发中常涉及到设备驱动程序。

(完整版)Linux高级编程笔试题答案

(完整版)Linux高级编程笔试题答案

高级编程笔试题答案一、选择题1.在网络字节序中,所谓”小端"(little endian)说法正确的是( B )A。

高字节数据存放在低地址处,低字节数据存放在高地址处B. 低字节位数据存放在内存低地址处,高字节位数据存放在内存高地址处C。

和编译器相关D. 上述答案都不正确2.C语言中,系统自动打开的文件是( D )A。

二进制文件 B.随机文件C。

非缓冲文件 D.设备文件3.TCP使用( B )进行流量控制.A。

3次握手法 B. 窗口控制机制C。

自动重发机制D。

端口机制4.TCP/IP层IP协议的服务是( C )A。

可靠服务 B. 有确认的服务C. 无连接数据报D. 以上都不对5.对于一个没有设置任何套接口选项的阻塞套接口,调用recv接收对方的数据,对方发送数据前突然断电,下列哪种情况将会发生( A )A. recv永远不会返回B。

recv立刻返回—1C. recv立刻返回0D. recv在等待很长一段时间后返回-16.下列哪些关于套接口选项函数的说法是正确的( C )A。

SO_DONTLINGER选项是让TCP套接口不对数据进行缓存,调用send函数后立刻将数据发送出去;B。

调用SO_RCVBUF和SO_SNDBUF调整TCP窗口的大小;C。

SO_REUSEADDR选项允许套接口绑定在一个已经在使用的地址上;D。

SO_MAX_MSG_SIZE选项获取每次调用TCP套接口send时,所能发送的最大字节数;二、问答题1.fork和vfork的区别?vfork用于创建一个新进程,而该进程的目的是exec一个新程序。

vfork与fork一样都创建一个子进程,但他并不把父进程地址空间完全复制到子进程中,因为子进程通常都会调用exec或(_exit),于是也就不会访问该地址空间.vfork与fork的另一个区别是vfork保证子进程先运行,在它调用exec或_exit 之后父进程才可能被调度运行。

一份LINUX的笔试题

一份LINUX的笔试题

发一份LINUX的笔试题
1.解释命令ls -amore具体含义.
2.LINUX中的管道指什么重定向又指什么
3.GCC -g -o test.elf test.c的具体含义.
4.浅述GCC编译器在编译时都有哪几个过程
5,在题3的基础上编写一MAKEFILE文件,要求能自动完成编译和清除功能6.说明uclinux 和linux的区别
7解释下面一组GDB命令的含义.
break 94
run
info line 121
8.什么是链接脚本其作用是什么请编写一个简单的链接脚本
9.编写一个SHELL脚本程序,将当前目录及其子目录中所有后缀为.O类型文件的文件名输出到用户指定的文件中.
10.请写出5个LINUX基本系统调用的函数名称.
11.描述LINUX中字符设备驱动的基本编成框架.
12.编写一个hello world程序,要求以创建进程的方式打印hello world.
13.浅谈bootloader,kelnel,filesystem三者之间的关系.。

linux考试试卷(笔试)带答案

linux考试试卷(笔试)带答案

LINUX毕业考试试卷(笔试)姓名:班级:分数:一、填空题(每题1分共60分)1在linux系统中,以( 文件)方式访问设备。

2.卸载挂载点目录的命令正确的是:(umount )3在linux命令中,#find /etc –size -2500c –print 该命令行可以解释为(查找一个文件尺寸小于为2500bytes)4. 编辑器vi中退出并且保存的命令分别是: ( wq/x)5. Linux文件系统中每个文件用( -)来标识。

6. 在安装Linux系统中,使用(setup )程序对网络进行配置,该安装程序会一步步提示用户输入主机名、域名、域名服务器、IP地址、网关地址和子网掩码等必要信息。

7.某文件的权限为:drw-r--r--,该文件属性是( 文件夹) 。

8.安装Linux系统对硬盘分区时,必须有两种分区类型:( 主分区)和( 扩展分区)。

9.在linux系统中,ping 192.168.1.100命令行可以解释为(测试本机与主机192.168.1.100的连通性)10. 链接分为( 硬)和( 软)链接。

11. 唯一标识每一个用户的是( UID)和( 用户名)。

12. 在Linux系统中所有内容都被表示为文件,组织文件的各种方法称为( 文件管理)。

13. DHCP可以实现动态( ip)地址分配。

14. DNS实际上是分布在internet上的主机信息的数据库,其作用是实现(ip和域名)之间的转换。

15. vi编辑器具有两种工作模式:( 命令)和( 编辑)。

16. 可以用ls –al命令来观察文件的权限,每个文件的权限都用10位表示,并分为四段,其中第一段占( 1 )位,表示( 文件类型),第二段占3位,表示(拥有者)对该文件的权限。

17.(Ping)命令用于测试网络的连通性。

18.要显示png.tar文件的内容,应该使用的命令为:(# tar –tvf png.tar)。

19. 在使用ls命令时,用八进制形式显示非打印字符应使用参数( -q)。

linux-c++笔试题

linux-c++笔试题

笔试题(Linux C/C++)应聘者姓名________ 联系方式________一、选择题:1、若进栈序列为1, 2, 3, 4,进栈过程中可以出栈,则下列不可能的一个出栈序列是____。

A)1, 4, 3, 2 B)2, 3, 4, 1 C)3, 1, 4, 2 D)3, 4, 2, 12、若有以下说明语句:char w; int x; float y,z;则表达式w*x+z-y的结果为____类型。

A)float B)char C)int D)double3、下列程序的输出结果是____。

main(){int a=0, b=0, c=0;if(++a>0 || ++b>0)++c;printf(“\na=%d, b=%d, c=%d”, a, b, c);}A)a=0,b=0, c=0 B)a=1, b=1, c=1C)a=1, b=0,c=1 D)a=0, b=1, c=14、有以下结构体定义struct A { union B {char c; char c;intI; inti;short s; short s;float f; float f;} AAA; } BBB;则在32位x86平台的linux系统中,sizeof(AAA)和sizeof(BBB)的结果分别是____。

A) 11, 11 B) 11, 4 C) 16, 11 D) 16, 45、已知宏定义#define N 3#define Y(n) ((N+1)*n)执行语句z=2*(N+Y(5+1)); 变量z的值为____。

A) 42 B) 48 C)54 D) 出错6、已知某二叉树的先序遍历为F B A C D E G H,中序遍历为A B D C E F G H,该二叉树的后序遍历为____。

A) A D E C B H G F B) A B D E C G H F 、C) G H A D E C B F D) H G A D E C B F7、下面叙述不正确的是____。

初级linux工程师笔试题

初级linux工程师笔试题

初级linux工程师笔试题(C/C++/linux)一, 选择题.1. C++是从早期的C语言逐渐发展演变过来的,与C语言向比,它在求解方法上最大的改进是什么?()A. 面向过程B. 面向对象C. 安全性D. 复用性2.下面哪一个不是C++的标准数据类型()A intB charC bool D. real3.对于类,下面哪个是不正确的? ()A. 类是对象的设计蓝图。

B. 使用关键字class创建类结构C. 类被声明后。

类名成为类型面并且可以用来声明变量D. 类与结构体相同,它们之间没有区别4. 对静态数据成员的描述中,正确的选项是哪一个?()A. 静态成员数据可以在类体内进行初始化。

B. 静态成员不可以被类的对象调用。

C. 静态成员不受private控制符作用。

D. 静态成员可以直接用类名调用5. 函数重载声明正确的是: ()A.int fun(int , int);int fun(constint, constint);B.int get();double get();C.int *reset(int *);Double*reset(double *);D. int add(inti, int j);int add(int &i, int &j);6. 终止一个前台进程可能用到的命令和操作 ( ) 。

A. killB.<CTRL>;+CC. shut downD. halt7. 具有很多C语言的功能,又称过滤器的是 ( ) 。

A cshB tcshC awkD sed8.对名为fido的文件用chmod 551 fido 进行了修改,则它的许可权是( ) 。

A -rwxr-xr-xB -rwxr--r--C -r--r--r--D -r-xr-x—x9.Linux文件系统的文件都按其作用分门别类地放在相关的目录中,对于外部设备文件,一般应将其放在 ( )目录中。

linux笔试题及答案

linux笔试题及答案

linux笔试题及答案一、选择题1. 在Linux系统中,哪个命令可以查看当前目录下的文件和文件夹?A. lsB. pwdC. cdD. mkdir答案:A2. 下列哪个命令可以用来创建一个新的文件夹?A. touchB. mkdirC. rmdirD. rm答案:B3. 在Linux中,如何删除一个名为file.txt的文件?A. rm file.txtB. del file.txtC. erase file.txtD. delete file.txt答案:A4. 要查看一个文本文件的内容,应该使用哪个命令?A. catB. dogC. showD. view答案:A5. 如果需要对Linux系统进行备份,通常使用哪个命令?A. cpB. tarC. dumpD. backup答案:B二、填空题1. 在Linux系统中,使用________命令可以切换到用户的主目录。

答案:cd ~2. 若要查看当前系统的内核版本信息,可以使用________命令。

答案:uname -r3. 为了查找名为image.png的文件,可以使用________命令。

答案:find /path/to/search -name image.png4. 若要查看某个目录下的所有隐藏文件,可以使用________命令。

答案:ls -a5. 为了压缩一个目录及其所有子目录和文件,可以使用________命令。

答案:tar -czvf archive_name.tar.gz /path/to/directory三、简答题1. 请简述Linux中的文件系统结构。

答:Linux文件系统是一种层次式的文件组织结构,由一系列目录和子目录组成。

最顶层是根目录(/),所有其他文件和目录都是根目录的子目录。

常见的主要目录包括:/bin(存放基本的用户二进制文件)、/home(用户的主目录)、/etc(系统配置文件)、/var(经常变化的文件,如日志文件)等。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

c语言常见笔试题大全(一)1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL我在这想看到几件事情:1). #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等)2). 懂得预处理器将为u币你哦门票,模糊刚看见快乐科技计划发广告和统一,(表示无符号长整型),那么你有了一个好的起点。

记住,第一印象很重要。

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

#define MIN(A,B) ((A) <= (B) ?(A) : (B))这个测试是为下面的目的而设的:1). 标识#define在宏中应用的基本知识。

这是很重要的,因为直到嵌入(inline)操作符变为标准C的一部分,宏是方便产生嵌入代码的唯一方法,对于嵌入式系统来说,为了能达到要求的性能,嵌入代码经常是必须的方法。

2). 三重条件操作符的知识。

这个操作符存在C语言中的原因是它使得编译器能产生比if-then-else更优化的代码,了解这个用法是很重要的。

3). 懂得在宏中小心地把参数用括号括起来4). 我也用这个问题开始讨论宏的副作用,例如:当你写下面的代码时会发生什么事?least = MIN(*p++, b);3. 预处理器标识#error的目的是什么?如果你不知道答案,请看参考文献1。

这问题对区分一个正常的伙计和一个书呆子是很有用的。

只有书呆子才会读C语言课本的附录去找出象这种问题的答案。

当然如果你不是在找一个书呆子,那么应试者最好希望自己不要知道答案。

死循环(Infinite loops)4. 嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢?这个问题用几个解决方案。

我首选的方案是:while(1){}一些程序员更喜欢如下方案:for(;;){}这个实现方式让我为难,因为这个语法没有确切表达到底怎么回事。

如果一个应试者给出这个作为方案,我将用这个作为一个机会去探究他们这样做的基本原理。

如果他们的基本答案是:“我被教着这样做,但从没有想到过为什么。

”这会给我留下一个坏印象。

第三个方案是用 gotoLoop:...goto Loop;应试者如给出上面的方案,这说明或者他是一个汇编语言程序员(这也许是好事)或者他是一个想进入新领域的BASIC/FORTRAN程序员。

数据声明(Data declarations)5. 用变量a给出下面的定义a) 一个整型数(An integer)b) 一个指向整型数的指针(A pointer to an integer)c) 一个指向指针的的指针,它指向的指针是指向一个整型数(A pointer to a pointer to an integer)d) 一个有10个整型数的数组(An array of 10 integers)e) 一个有10个指针的数组,该指针是指向一个整型数的(An array of 10 pointers to integers)f) 一个指向有10个整型数数组的指针(A pointer to an array of 10 integers)g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A pointer to a function that takes an integer as an argument and returns an integer)h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数( An array of ten pointers to functions that take an integerargument and return an integer )答案是:a) int a; // An integerb) int *a; // A pointer to an integerc) int **a; // A pointer to a pointer to an integerd) int a[10]; // An array of 10 integerse) int *a[10]; // An array of 10 pointers to integersf) int (*a)[10]; // A pointer to an array of 10 integersg) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integerh) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer人们经常声称这里有几个问题是那种要翻一下书才能回答的问题,我同意这种说法。

当我写这篇文章时,为了确定语法的正确性,我的确查了一下书。

但是当我被面试的时候,我期望被问到这个问题(或者相近的问题)。

因为在被面试的这段时间里,我确定我知道这个问题的答案。

应试者如果不知道所有的答案(或至少大部分答案),那么也就没有为这次面试做准备,如果该面试者没有为这次面试做准备,那么他又能为什么出准备呢?Static6. 关键字static的作用是什么?这个简单的问题很少有人能回答完全。

在C语言中,关键字static有三个明显的作用:1). 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。

2). 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。

它是一个本地的全局变量。

3). 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。

那就是,这个函数被限制在声明它的模块的本地范围内使用。

大多数应试者能正确回答第一部分,一部分能正确回答第二部分,同是很少的人能懂得第三部分。

这是一个应试者的严重的缺点,因为他显然不懂得本地化数据和代码范围的好处和重要性。

Const7.关键字const是什么含意?我只要一听到被面试者说:“const意味着常数”,我就知道我正在和一个业余者打交道。

去年Dan Saks已经在他的文章里完全概括了const的所有用法,因此ESP(译者:Embedded Systems Programming)的每一位读者应该非常熟悉const能做什么和不能做什么.如果你从没有读到那篇文章,只要能说出const意味着“只读”就可以了。

尽管这个答案不是完全的答案,但我接受它作为一个正确的答案。

(如果你想知道更详细的答案,仔细读一下Saks 的文章吧。

)如果应试者能正确回答这个问题,我将问他一个附加的问题:下面的声明都是什么意思?const int a;int const a;const int *a;int * const a;int const * a const;前两个的作用是一样,a是一个常整型数。

第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。

第四个意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。

最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。

如果应试者能正确回答这些问题,那么他就给我留下了一个好印象。

顺带提一句,也许你可能会问,即使不用关键字 const,也还是能很容易写出功能正确的程序,那么我为什么还要如此看重关键字const呢?我也如下的几下理由:1). 关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。

如果你曾花很多时间清理其它人留下的垃圾,你就会很快学会感谢这点多余的信息。

(当然,懂得用const的程序员很少会留下的垃圾让别人来清理的。

)2). 通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。

3). 合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。

简而言之,这样可以减少bug的出现。

Volatile8. 关键字volatile有什么含意并给出三个不同的例子。

一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。

精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。

下面是volatile变量的几个例子:1). 并行设备的硬件寄存器(如:状态寄存器)2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)3). 多线程应用中被几个任务共享的变量回答不出这个问题的人是不会被雇佣的。

我认为这是区分C程序员和嵌入式系统程序员的最基本的问题。

嵌入式系统程序员经常同硬件、中断、RTOS等等打交道,所用这些都要求volatile变量。

不懂得volatile内容将会带来灾难。

假设被面试者正确地回答了这是问题(嗯,怀疑这否会是这样),我将稍微深究一下,看一下这家伙是不是直正懂得volatile完全的重要性。

1). 一个参数既可以是const还可以是volatile吗?解释为什么。

2). 一个指针可以是volatile 吗?解释为什么。

3). 下面的函数有什么错误:int square(volatile int *ptr){return *ptr * *ptr;}下面是答案:1). 是的。

一个例子是只读的状态寄存器。

它是volatile因为它可能被意想不到地改变。

它是const因为程序不应该试图去修改它。

2). 是的。

尽管这并不很常见。

一个例子是当一个中服务子程序修该一个指向一个buffer 的指针时。

3). 这段代码的有个恶作剧。

这段代码的目的是用来返指针*ptr指向值的平方,但是,由于*ptr指向一个volatile型参数,编译器将产生类似下面的代码:int square(volatile int *ptr){int a,b;a = *ptr;b = *ptr;return a * b;}由于*ptr的值可能被意想不到地该变,因此a和b可能是不同的。

结果,这段代码可能返不是你所期望的平方值!正确的代码如下:long square(volatile int *ptr){int a;a = *ptr;return a * a;}位操作(Bit manipulation)9. 嵌入式系统总是要用户对变量或寄存器进行位操作。

相关文档
最新文档