经典C语言笔试面试题汇总整理

#include“ ”与 #include <>的区别?

A:前者是从当前工作路径搜寻并引用头文件,后者先在Standard Library的路径寻找和引用头文件如果未找到则当前工作路径搜寻并引用头文件

Q .h头文件中的ifndef/define/endif 的作用?
A:防止该头文件被重复引用,也可以用#pragma once防止头文件被重复引用

Q 线程与进程的区别?
A线程和进程的区别在于,子进程和父进程有相同的代码段,不同的数据段,而多个线程则共享数据空间,每个线程有自己的执行堆栈和程序计数器为其执行上下文。多线程主要是为了节约CPU时间,发挥利用,根据具体情况而定。线程的运行中需要使用计算机的内存资源和CPU。通常在一个进程中可以包含若干个线程,它们可以利用进程所拥有的资源。在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位。由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统内多个程序间并发执行的程度,从而显著提高系统资源的利用率和吞吐量。
线程与进程的区别可以归纳为以下4点:
1)地址空间和其它资源(如打开文件):进程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见。
2)通信:进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。
3)调度和切换:线程上下文切换比进程上下文切换要快得多。
4)在多线程OS中,进程不是一个可执行的实体。
同时系统引入线程的好处:
1)创建一个新线程花费的时间少。
2)两个线程(在同一进程中的)的切换时间少。
3)由于同一个进程内的线程共享内存和文件,所以线程之间互相通信不必调用内核。
4)线程能独立执行,能充分利用和发挥处理机与外围设备并行工作的能力

Q 程序输出结果是?

int i = 10;
printf("%d\n", i);
printf("%d\n", sizeof(i++));
printf("%d\n", i);

A:输出三个值分别为10,4,10

分析:sizeof是关键字而并非函数,所以在编译阶段sizeof的值已经确定,i++不会被执行。


Q程序输出结果是?

int a = 1, b = 2, c = 3, d = 4, i = 5, j = 6;
(i = a < b) && (j = c < d);
printf("%d,%d\n", i, j);

A:i为1,j为1

分析:理论分析&&为短路运算符,即编译器一旦发现表达式的值可以确定则立刻中止运算,所以输出结果应该为1和6,但代码分别在linux和QT中执行结果都是1,1。


Q程序输出结果?

int i = 43;
printf("%d\n",printf("%d", printf("%d", i)));

A:4321

分析:考查printf返回值以及压栈顺序问题。printf返回值为打印的字符个数,三个printf压栈顺序从右向左。例如int j = printf("hi\n");printf("%d\n", j);输出结果j为3。


Q: 程序输出结果?

#include
const int i = 1;
int main(void)
{
    int i = i;
    printf("%d\n", i);
    return 0;
}

A:编译不通赤或者输出随机值。

分析:作用域问题。函数内部的变量i已屏蔽掉了全局变量i,所以函数内部赋值运算符的右值i是个未定义符号,理论上应该编译不通过,实际执行结果是可以编译通过,但输出值为随机数。

Q 关键字volatile有什么含意
A:一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:
1). 并行设备的硬件寄存器(如:状态寄存器)
2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
3). 多线程应用中被几个任务共享的变量

Q 分别写出BOOL,int,float,指针类型的变量a 与“零”的比较语句。
A:BOOL : if ( !a ) or if(a)
int : if ( a == 0)
float : const EXPRESSION EXP = 0.000001
if ( a < EXP && a >-EXP)
pointer : if ( a != NULL) or if(a == NULL)

Q 用变量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 integer
argument and return an integer )


答案是:
a) int a; // An integer
b) int *a; // A pointer to an integer
c) int **a; // A pointer to a pointer to an integer
d) int a[10]; // An array of 10 integers
e) int *a[10]; // An array of 10 pointers to integers
f) int (*a)[10]; // A pointer to an array of 10 integers
g) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integer
h) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer



你可能感兴趣的:(嵌入式软件)