华汉伟业------华汉伟业 嵌入式 C笔试,校招,题目记录及解析
- [3 请写出以下代码在小端CPU的运行结果:](#3 请写出以下代码在小端CPU的运行结果:)
- 4.下列转义字将中错误的是
- [6 表达式"100"+88" =](#6 表达式"100"+88" =)
- [8.以下关于 static关键字描述正确的是?](#8.以下关于 static关键字描述正确的是?)
- [9.设float a = 2, b = 4, c =3;,以下C语言表达式与代数式(a+b)+c计算结果不一致的是](#9.设float a = 2, b = 4, c =3;,以下C语言表达式与代数式(a+b)+c计算结果不一致的是)
- [10 在Linux中也提供了一组函数接口用于使用共享内存,它们声明在头文件sys/shm.h中,关于以下函数描述正确的是?](#10 在Linux中也提供了一组函数接口用于使用共享内存,它们声明在头文件sys/shm.h中,关于以下函数描述正确的是?)
- 11.已知二叉树后序遍历序列为showmebug,中序遍历序列为sohwgemub,它的前序遍历序列为
- [12 请写出以下代码的运行结果:](#12 请写出以下代码的运行结果:)
- [14 则表达式2*(N + Y(5+1) )的值是](#14 则表达式2*(N + Y(5+1) )的值是)
- [15 请指出以下代码的问题,并选择描述正确的选项](#15 请指出以下代码的问题,并选择描述正确的选项)
- 16.若变量已正确定义,表达式(j=3,j++)的值是
- [17 C语言中,下列运算符优先级最高的是](#17 C语言中,下列运算符优先级最高的是)
- [18 以下关于堆与栈的区别描述正确的是](#18 以下关于堆与栈的区别描述正确的是)
- [19 以下关于多态、继承、私有成员如何使用C++语言实现描述正确的是?](#19 以下关于多态、继承、私有成员如何使用C++语言实现描述正确的是?)
- [21 关于c/c++中 const关键字描述正确的是?](#21 关于c/c++中 const关键字描述正确的是?)
- [24 表达式 strcmp(" 3.14"."3.278")的值是一个](#24 表达式 strcmp(" 3.14".”3.278“)的值是一个)
- [25 数组定义为"int a[4];",表达式()是错误的。](#25 数组定义为"int a[4];”,表达式()是错误的。)
- [26 执行活句k=7>>1后, k的当前值是](#26 执行活句k=7>>1后, k的当前值是)
- [28 执行以下程序输出的结果是?](#28 执行以下程序输出的结果是?)
华汉伟业------华汉伟业 嵌入式 C笔试,校招,题目记录及解析
3 请写出以下代码在小端CPU的运行结果:
C,运行多次都是cccca55a,故xxxx应该是确定的
csharp
typedef union {
long value;
struct{
char a;
char b;
}v;
}Type;
void main() {
Type t;
t.v.a = 0x5A;
t.v.b = 0xA5;
printf("value=%x\n", t.value);
printf("sizeof(t.value)=%d\n", sizeof(t.value));//测试,自己加的
}
csharp
A输出结果:value=xxxxa55a,其中xxxx为不确定
B输出结果:value=xxxxA55A
C输出结果:value=xxxxa55a
D.输出结果:value=xxxxA55A,其中xxxx为不确定
前四位,运行多次,都是cccc,换另一台电脑输出还是一样;
输出8位的原因是,t.value是long型,4个字节,16进制每两位一个字节。
如果,输出是t.v是一个结构体(两个char组成),2个字节,输出4位a55a;
csharp
typedef union {
long value;
struct{
char a;
char b;
}v;
}Type;
struct {
char c;
char d;
}v2;
void main() {
Type t;
t.v.a = 0x5A;
t.v.b = 0xA5;
printf("value=%x\n", t.v);
printf("sizeof(t.v)=%d\n", sizeof(t.v));
v2.c = 0x5A;
v2.d = 0xA5;
printf("value=%x\n", v2);
printf("sizeof(v2)=%d\n", sizeof(v2));
}

4.下列转义字将中错误的是
D
csharp
A.'\2'
B. '\14'
C.'\1000'
D.'\x111'
不合法,
x代表16进制,一个char长度8位,也就是两位16进制数,你这都三位了。
6 表达式"100"+88" =
C
csharp
A.188
B.100+88
C.10088
D. 88100
8.以下关于 static关键字描述正确的是?
ABCE (不确定)
csharp
A.C++在类中修饰成员函数。该成员函数限于类实例存在而存在,且只能访问静态成员。
B.c/c++在文件中,使用 static修饰全局变量。该全局变量的作用域改变,只能该文件内访问.
C.c/C++在文件中,使用 static修饰函数。该函数的作用域改变,只能该文件内访问。
D.C++在类中修饰成员变量,该成员变量还需要在类外再声明一次。无论该类的实例有多少个,所有
实例共享一个该成员变量实例。且该成员变量先于类的实例而存在。
E.c/c++在函数内部,使用static修饰同部变量。该变量的生命周期产生变化,并不以复合语句结而结束,其生命与进程相同。
9.设float a = 2, b = 4, c =3;,以下C语言表达式与代数式(a+b)+c计算结果不一致的是
D
csharp
A.(a+b)/2*c
B.c/2*(a+b)
c.(a+b)*c/2
D.(1/2)*(a+b)*c
csharp
float a = 2, b = 4, c =3;
float d = (a + b) + c;
float A, B , C , D;
A = (a + b) / 2 * c;
B = c / 2 * (a + b);
C = (a + b)* c / 2;
D = (1 / 2)* (a + b)* c;
printf("%f\n", d);
printf("%f\n", A);
printf("%f\n", B);
printf("%f\n", C);
printf("%f\n", D);

10 在Linux中也提供了一组函数接口用于使用共享内存,它们声明在头文件sys/shm.h中,关于以下函数描述正确的是?
BD
csharp
A.shmdt函数用来控制共享内存
B.shmget函数用来创建共享内存
C.shmctl函数该函数用于将共享内存从当前进程中分离
D.shmat函数的作用就是用来启动对该共享内存的访问,并把共享内存连接到当前进程的地址空间
共享内存API
csharp
shmget------创建/打开共享内存
shmat------将共享内存与当前进程相关联
shmdt------将当前进程与共享内存间脱离关联
shmctl------操控共享内存
11.已知二叉树后序遍历序列为showmebug,中序遍历序列为sohwgemub,它的前序遍历序列为
C
csharp
A gwohsuemb
B. gwoshuebm
C. gwoshuemb
D. gwsohuemb

12 请写出以下代码的运行结果:
B
csharp
#pragma pack(push, 1)
typedef struct tagNode{
short a;
short b;
long c;
long *d;
struct tagNode* next;
}TNode;
#pragma pack(pop)
int main(int argc, char* argv[]){
TNode *node = (TNode*)0x3000000;
printf("%x, %x, %x, %x, %x\n",
&node->a, &node->b,
&node->c, &node->d, node->next);
return(0);
}

运行出错
csharp
printf("%x\n", &node->a);
printf("%x\n", &node->b);
printf("%x\n", &node->c);
printf("%x\n", &node->d);
printf("%x\n", &node->next);//取地址,否则错
printf("%x\n", node);

csharp
#pragma pack (n) 作用:C编译器将按照n个字节对齐。
#pragma pack () 作用:取消自定义字节对齐方式。
#pragma pack (push,1) 作用:是指把原来对齐方式设置压栈,并设新的对齐方式设置为一个字节对齐
#pragma pack(pop) 作用:恢复对齐状态
14 则表达式2*(N + Y(5+1) )的值是
D
csharp
#define N 3
#define Y(n) ((N + 1)*n)
csharp
A. 54
B.出错
c.42
D.48
15 请指出以下代码的问题,并选择描述正确的选项
ABD
csharp
//c
int gFlag=O;//全局变量
//线程1:
void func1()
{
//...
while(!gFlag);
//..
}
线程2:
void func2()
{
//...
gFlag = 1;
//...
}
//c
csharp
A.volatile 关键字告诉编译器,不要使用寄存器中的备份变量用于计算。
B.这段代码有时候能正确运行,有时候不能正确的运行。
C.int gFlag = 0 应该修改:volatile int gFlag = 1;
D.int gFlag = 0 应该修改:volatile int gFlag= 0;
16.若变量已正确定义,表达式(j=3,j++)的值是
A
csharp
A.3
B.4
c. 5
D.0
csharp
int j;
int c = (j = 3, j++);
printf("%d\n",c);
逗号表达式,从左往右逐个计算表达式,整个表达式的值为最后一个表达式的值。
3+5,6+8)的值是14;
a=(a=35,a 4)的值是60,其中(a=35,a4)的值是60, a的值在逗号表达式里一直是15,最后被逗号表达式赋值为60,a的值最终为60。
上述是有括号,整个表达式的值,逗号表达式本身不难,常常与赋值运算符一起考,易错
csharp
main()
{
int x,y,z;
x=1;
y=1;
z=x++,y++,++y;
printf("%d,%d,%d\n",x,y,z);
}
2,3,1,
z = 1 ? 因为 "="优先级比","运算符级别高,
故 z=x++,y++,++y; 等价于 (z=x++),y++,++y;
如果,逗号表达式整体括号,那么 z = 3
csharp
z = (x++, y++, ++y);

17 C语言中,下列运算符优先级最高的是
D
csharp
A.==
B.>>
c.%
D.!
18 以下关于堆与栈的区别描述正确的是
ABCD
csharp
A堆的空间使用malloc/new 和 free/delete申请释放,程序员手动管理;
B堆是向高地址扩展的数据结构,是不连续的内存区域
C.栈是向低地址扩展的数据结构,是一块连续的内存区域
D栈是在函数调用过程中用于存储局部变量等的存储空间,由编译器自动生成代码管理。

堆区:动态申请内存用。从低向高 地址扩展的数据结构,是不连续的内存区域。
栈区:存储局部变量、函数参数值。栈从高地址向低地址增长。是一块连续的空间。
怎么判断数据分配在栈上还是堆上: 首先局部变量分配在栈上;而通过malloc和new申请的空间是在堆上。
申请响应
- 栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示 栈溢出。
- 堆:首先应该知道操作系统有一个记录空闲 内存地址的 链表,当系统收到程序的申请时,会遍历该链表,寻 找第一个空间大于所申请空间的堆结点,然后将 该 结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外,对于 大多数系统,会在这块内存空间中的 首地址处记录本次分配的大小,这样,代码中的delete语句才能正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲 链表中。
申请限制
-
栈:在Windows下, 栈是 从高向低 地址扩展的数据结构,是一块连续的内存的区域。 这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在 WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。
-
堆:堆是 从低向高 地址扩展的数据结构,是不连续的内存区域。这是由于系统是用 链表来存储的空闲 内存地址的,自然是不连续的,而 链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的 虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。
效率比较
- 栈由系统自动分配,速度较快。但程序员是无法控制的。
- 堆是由new分配的内存,一般速度比较慢,而且容易产生 内存碎片,不过用起来最方便.
19 以下关于多态、继承、私有成员如何使用C++语言实现描述正确的是?
BC (A不确定)
csharp
A继承采用结构体强制类型转换的办法。基类(结构体)作为派生类(结构体)的第一个成
员变量。
B.多态分为三种,一是模板类和模板函数;二是函数重载;三是虚函数。
C.一个类占用一个文件,私有函数和私有变量采用static关键字修饰,即限制了变量和
函数的访问范围。
D模板类和函数重载可以通过函数指针进行强制转换实现。
一个全局变量被关键字static修饰,改变了变量可见性,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使用。
一个函数被关键字static修饰,改变了函数可见性,使得这个函数只能在本源文件内使用,不能在其他源文件内使用。
21 关于c/c++中 const关键字描述正确的是?
ABCD
csharp
A const int*ptr;修饰指针指向的内容是常量,不能被改变;
B. const int value:值不能被改变。
c.const int *function();修饰函数返回指针的内容不能被改变
D.int *const ptr;修饰指针指向的地址是常量,不能被改变;
24 表达式 strcmp(" 3.14"."3.278")的值是一个
D
csharp
A浮点数
BO
c字符
D非零整数
strcmp()
csharp
当s1<s2时,回到为负数;
当s1=s2时,传参= 0;
当s1>s2时,回到正数。
25 数组定义为"int a[4];",表达式()是错误的。
B
a是const int *不能自加
csharp
A.*a
B. a++
C.a[0]
26 执行活句k=7>>1后, k的当前值是
表示将整数7按位右移一位:0111变成0011所以变成3。
也可以理解为将7整除于2,得到3。
28 执行以下程序输出的结果是?
A
csharp
char b[] = "ABCDEF";
void main() {
char* bp;
for (bp = b; *bp; bp += 2)
printf("%s",bp);
printf("\n");
}
csharp
A.ABCDEFCDEFEF
B. ABCDEFABCDEF
c ABCDEFCDEFCD
DABCDEF