嵌入式工程师综合笔试题之C语言基础(含部分答案)

嵌入式工程师综合笔试题之C语言基础(含部分答案)

  1. continue、break和return的区别?
    continue:跳过本次循环.
    Break:只能在循环体内部或者switch开关语句中使用,跳出当前的体或层.
    return:返回断点出继续执行断点处的下一条语句.可以有返回值

  2. 初始化和赋值的区别?
    初始化是在程序运行前又系统将变量赋值.
    赋值是在程序开始运行之后完成,动作属于程序完成的.(变量定义后要初始化)

  3. 声明和定义的区别?
    声明:指定一个变量的标识符,用来描述变量的类型,用于编译器识别变量名所引用的实体.
    定义:是对声明的实现或者实例化,连接器需要他来引用内存实体.定义操作只能做一次.

  4. 全局变量、局部变量、static变量的区别?
    全局变量:生命周期为从声明处到整个程序,程序运行结束全局变量生命周期结束.可以进行多次赋值,可以作为返回值.
    局部变量: 从函数被调用的时刻算起到函数返回调用处的时刻结束,可以多次赋值,生命结束,系统回收,不可作为返回值.可以和全局变量重名,但是会屏蔽全局变量.
    Static:分配在静态存储区,在整个程序期间不会释放,全局变量用static生命作用域只限于本文件模块.

  5. 变量的生命周期和作用域分别是?

  6. 在C++程序中调用被C编译器编译后的函数,为什么要加extern “C” ?
    C++为了支持重载,对编译时函数的命名规则进行更改.使用extern “c”的方式在c++程序中声明C语言文件中的函数,在编译时告诉编译器使用C语言的规则对该函数的函数名进行重命名.

  7. 动态库和静态库的主要区别是什么?
    静态库在程序编译时会被连接到目标代码中,运行时不需要静态库,而动态库是在程序运行的时候被载入.所以运行时必须要动态库的存在.还有静态库中函数库发生更新需要重新编译,而动态库只需要替换对应的库即可,还有就是后缀不一样.

  8. 编译器编译源文件和库时,使用-l -L -I分别的作用是什么?
    -I:告诉编译器那里去找头文件.
    -L:告诉编译器那里去找库文件.
    -l(小写的L):告诉编译器要链接那些库.

  9. #include 和 #include “filename.h” 有什么区别?
    #include :是直接去系统里面找filename.h文件.
    #include “filename.h”:是现在本地目录找,如果没有就去系统找filename.h文件.

  10. 下面定义的含义:
    const int a;
    int const a;
    上面两个没有区别,只能初始化一次后面就不能对其赋值;
    const int *a;
    const修饰int,此时指针可以指向别的地址,而指针指向的内容不可改变.
    int * const a;
    const 修饰a(a是一个指针),不得指向别的地址,但是可以修改指针指向的内容.
    int const * const a;
    此时指针不能指向别的地址,指针所指向的内容也不可改变.
    13、#include
    int main()
    {
    Int i = 0;
    While( i ++ ){
    for( i ; i<5; i++){
    printf(“%d\n”, a < 3 );
    printf(“%d\n”, a );
    }
    break;
    }
    return 0;
    }
    该程序输出是什么。
    程序崩溃a未定义.
    14、详述c语言预处理,编译,链接,执行分别是什么?
    预编译:去掉注释展开宏定义和头文件.
    编译:
    链接:找符号(有且唯一),确定数据段,代码段地址.
    15、无符号数和有符号数的区别是什么?
    两者表达的范围不同.
    无符号数只能表达正数,所有位都用来表示大小.有符号数不仅可以表达正数也可以表达负数,其最高位用来表示正负(0正,1负).
    16、程序在编译过程中编译和链接各做了哪些工作? 编译连接后内存怎么分段,各段内存有哪些特点?

17、请写出下表达式运算的结果:
char x = 0xfd, y = 0xe;
!x x & y x = (!x) | (++x) ~x (y &&(++y))||(++y)运算后y的值
0 c 0xfe 0x2 0xf(||前面为真不执行后面语句)
17、定义一个无符号整形变量a,表达式实现:
将第15位和第30位置一,其它位不变;
将第18位和31位清零,其它位不变;
取出第19、20、21三位;
将第0位赋值为1,第15-19位赋值为0xd,第30位赋值为0x1;
18、 int a = 0xbf83f4, 分别取出a第一个字节的低5位,第二个字节的低6位,第三个字节的低5位组成一个新的两字节数再将此数的低1,3位置1, 5,7位置0, 8至12位取反,其余保持不变
19、#include
int main()
{
int a = 1;
if(- -a || ++a ) {
printf(“a = %d\n”, a );
if(a++ || a- -){
printf(“a = %d\n”, a );
}
}
else
printf(“a is faules\n”);
return 0;
}
20、现在有 int i = 10; int *p = &i ; int **p2 = &p;
分别叙述 &p(指针P2)、p(指针P指向的地址)、&p2(指针P2的地址)、p2(解P2等于P的地址)、**p2(解指针P2两次得到10)、&i(取地址i等于指针P)、(&i)(相当于对P指针进行解)、(&p2)(没有任何操作,任然是P2指针)。
21、请写一个函数,若处理器为大端,返回0;若处理器为小端返回1。
22、宏定义写出求两个数字中的较大者。
23、给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
24、判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
25、动态库和静态库的区别?
如果静态库的某一个库发生改动,那么整个工程就得重新编译链接(维护麻烦),而动态库只需要替换更改的库就行了,升级变得简单.静态库是在编译的时候将函数库进行连接的,而动态库的函数库连接是放在程序运行的时候.静态库打包之后比动态库要大.
26、宏定义实现两个整型数据的交换
27、两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。
28、罗马数字和整数相互转换。
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。
字符 数值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II。注意:9写做IX,4写做IV。
29、 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
30、给定一个整数数组 A,返回其中元素之和可被 K 整除的(连续、非空)子数组的数目。例如:
输入:A = [4,5,0,-2,-3,1], K = 5
输出:7
解释:
有 7 个子数组满足其元素之和可被 K = 5 整除:
[4, 5, 0, -2, -3, 1], [5], [5, 0], [5, 0, -2, -3], [0], [0, -2, -3], [-2, -3]
31、 给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值 target 相等?找出所有满足条件且不重复的四元组。

你可能感兴趣的:(C语言,面试,面试)