【08】华汉伟业——华汉伟业 嵌入式 C笔试,校招,题目记录及解析
华汉伟业——华汉伟业 嵌入式 C笔试,校招,题目记录及解析
- 3 请写出以下代码在小端CPU的运行结果:
- 4.下列转义字将中错误的是
- 6 表达式"100"+88" =
- 8.以下关于 static关键字描述正确的是?
- 9.设float a = 2, b = 4, c =3;,以下C语言表达式与代数式(a+b)+c计算结果不一致的是
- 10 在Linux中也提供了一组函数接口用于使用共享内存,它们声明在头文件sys/shm.h中,关于以下函数描述正确的是?
- 11.已知二叉树后序遍历序列为showmebug,中序遍历序列为sohwgemub,它的前序遍历序列为
- 12 请写出以下代码的运行结果:
- 14 则表达式2*(N + Y(5+1) )的值是
- 15 请指出以下代码的问题,并选择描述正确的选项
- 16.若变量已正确定义,表达式(j=3,j++)的值是
- 17 C语言中,下列运算符优先级最高的是
- 18 以下关于堆与栈的区别描述正确的是
- 19 以下关于多态、继承、私有成员如何使用C++语言实现描述正确的是?
- 21 关于c/c++中 const关键字描述正确的是?
- 24 表达式 strcmp(" 3.14".”3.278“)的值是一个
- 25 数组定义为"int a[4];”,表达式()是错误的。
- 26 执行活句k=7>>1后, k的当前值是
- 28 执行以下程序输出的结果是?
华汉伟业——华汉伟业 嵌入式 C笔试,校招,题目记录及解析
3 请写出以下代码在小端CPU的运行结果:
C,运行多次都是cccca55a,故xxxx应该是确定的
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));//测试,自己加的
}
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;
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
A.'\2'
B. '\14'
C.'\1000'
D.'\x111'
不合法,
x代表16进制,一个char长度8位,也就是两位16进制数,你这都三位了。
6 表达式"100"+88" =
C
A.188
B.100+88
C.10088
D. 88100
8.以下关于 static关键字描述正确的是?
ABCE (不确定)
A.C++在类中修饰成员函数。该成员函数限于类实例存在而存在,且只能访问静态成员。
B.c/c++在文件中,使用 static修饰全局变量。该全局变量的作用域改变,只能该文件内访问.
C.c/C++在文件中,使用 static修饰函数。该函数的作用域改变,只能该文件内访问。
D.C++在类中修饰成员变量,该成员变量还需要在类外再声明一次。无论该类的实例有多少个,所有
实例共享一个该成员变量实例。且该成员变量先于类的实例而存在。
E.c/c++在函数内部,使用static修饰同部变量。该变量的生命周期产生变化,并不以复合语句结而结束,其生命与进程相同。
static的用法
9.设float a = 2, b = 4, c =3;,以下C语言表达式与代数式(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
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
A.shmdt函数用来控制共享内存
B.shmget函数用来创建共享内存
C.shmctl函数该函数用于将共享内存从当前进程中分离
D.shmat函数的作用就是用来启动对该共享内存的访问,并把共享内存连接到当前进程的地址空间
共享内存API
shmget——创建/打开共享内存
shmat——将共享内存与当前进程相关联
shmdt——将当前进程与共享内存间脱离关联
shmctl——操控共享内存
11.已知二叉树后序遍历序列为showmebug,中序遍历序列为sohwgemub,它的前序遍历序列为
C
A gwohsuemb
B. gwoshuebm
C. gwoshuemb
D. gwsohuemb
12 请写出以下代码的运行结果:
B
#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);
}
运行出错
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);
#pragma pack (n) 作用:C编译器将按照n个字节对齐。
#pragma pack () 作用:取消自定义字节对齐方式。#pragma pack (push,1) 作用:是指把原来对齐方式设置压栈,并设新的对齐方式设置为一个字节对齐
#pragma pack(pop) 作用:恢复对齐状态
14 则表达式2*(N + Y(5+1) )的值是
D
#define N 3
#define Y(n) ((N + 1)*n)
A. 54
B.出错
c.42
D.48
15 请指出以下代码的问题,并选择描述正确的选项
ABD
//c
int gFlag=O;//全局变量
//线程1:
void func1()
{//...while(!gFlag);//..
}
线程2:
void func2()
{//...gFlag = 1;//...
}
//c
A.volatile 关键字告诉编译器,不要使用寄存器中的备份变量用于计算。
B.这段代码有时候能正确运行,有时候不能正确的运行。
C.int gFlag = 0 应该修改:volatile int gFlag = 1;
D.int gFlag = 0 应该修改:volatile int gFlag= 0;
16.若变量已正确定义,表达式(j=3,j++)的值是
A
A.3
B.4
c. 5
D.0
int j;int c = (j = 3, j++);printf("%d\n",c);
逗号表达式,从左往右逐个计算表达式,整个表达式的值为最后一个表达式的值。
3+5,6+8)的值是14;
a=(a=35,a4)的值是60,其中(a=35,a4)的值是60, a的值在逗号表达式里一直是15,最后被逗号表达式赋值为60,a的值最终为60。
上述是有括号,整个表达式的值,逗号表达式本身不难,常常与赋值运算符一起考,易错
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
z = (x++, y++, ++y);
17 C语言中,下列运算符优先级最高的是
D
A.==
B.>>
c.%
D.!
18 以下关于堆与栈的区别描述正确的是
ABCD
A堆的空间使用malloc/new 和 free/delete申请释放,程序员手动管理;
B堆是向高地址扩展的数据结构,是不连续的内存区域
C.栈是向低地址扩展的数据结构,是一块连续的内存区域
D栈是在函数调用过程中用于存储局部变量等的存储空间,由编译器自动生成代码管理。
堆区:动态申请内存用。从低向高 地址扩展的数据结构,是不连续的内存区域。
栈区:存储局部变量、函数参数值。栈从高地址向低地址增长。是一块连续的空间。
怎么判断数据分配在栈上还是堆上: 首先局部变量分配在栈上;而通过malloc和new申请的空间是在堆上。
对堆栈中分析的比较好的文章进行的总结
申请响应
- 栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示 栈溢出。
- 堆:首先应该知道操作系统有一个记录空闲 内存地址的 链表,当系统收到程序的申请时,会遍历该链表,寻 找第一个空间大于所申请空间的堆结点,然后将 该 结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外,对于 大多数系统,会在这块内存空间中的 首地址处记录本次分配的大小,这样,代码中的delete语句才能正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲 链表中。
申请限制
-
栈:在Windows下, 栈是 从高向低 地址扩展的数据结构,是一块连续的内存的区域。 这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在 WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。
-
堆:堆是 从低向高 地址扩展的数据结构,是不连续的内存区域。这是由于系统是用 链表来存储的空闲 内存地址的,自然是不连续的,而 链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的 虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。
效率比较
- 栈由系统自动分配,速度较快。但程序员是无法控制的。
- 堆是由new分配的内存,一般速度比较慢,而且容易产生 内存碎片,不过用起来最方便.
19 以下关于多态、继承、私有成员如何使用C++语言实现描述正确的是?
BC (A不确定)
A继承采用结构体强制类型转换的办法。基类(结构体)作为派生类(结构体)的第一个成
员变量。
B.多态分为三种,一是模板类和模板函数;二是函数重载;三是虚函数。
C.一个类占用一个文件,私有函数和私有变量采用static关键字修饰,即限制了变量和
函数的访问范围。
D模板类和函数重载可以通过函数指针进行强制转换实现。
一个全局变量被关键字static修饰,改变了变量可见性,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使用。
一个函数被关键字static修饰,改变了函数可见性,使得这个函数只能在本源文件内使用,不能在其他源文件内使用。
21 关于c/c++中 const关键字描述正确的是?
ABCD
A const int*ptr;修饰指针指向的内容是常量,不能被改变;
B. const int value:值不能被改变。
c.const int *function();修饰函数返回指针的内容不能被改变
D.int *const ptr;修饰指针指向的地址是常量,不能被改变;
24 表达式 strcmp(" 3.14".”3.278“)的值是一个
D
A浮点数
BO
c字符
D非零整数
strcmp()
当s1<s2时,回到为负数;当s1=s2时,传参= 0;当s1>s2时,回到正数。
25 数组定义为"int a[4];”,表达式()是错误的。
B
a是const int *不能自加
A.*a
B. a++
C.a[0]
26 执行活句k=7>>1后, k的当前值是
表示将整数7按位右移一位:0111变成0011所以变成3。
也可以理解为将7整除于2,得到3。
28 执行以下程序输出的结果是?
A
char b[] = "ABCDEF";
void main() {char* bp;for (bp = b; *bp; bp += 2)printf("%s",bp);printf("\n");
}
A.ABCDEFCDEFEF
B. ABCDEFABCDEF
c ABCDEFCDEFCD
DABCDEF