TCL集团校园招聘C/C++方向笔试题
“小莓”通过精心收集,向本站投稿了9篇TCL集团校园招聘C/C++方向笔试题,下面是小编给大家带来的TCL集团校园招聘C/C++方向笔试题,以供大家参考,我们一起来看看吧!
篇1:TCL集团校园招聘C/C++方向笔试题
提示:本测试题总分100分,请60分钟内完成测试,
一、判断题(正确的打√,错误的打×,每题1分,合计1x10=10分)
1. C语言中,016218表示为一个八进制整数。
2. switch(c)语句中,c可以是int, long, unsigned char, char, unsigned int类型。()
3. 有数组定义int a1[2][2]={{1,2},{2}};则a1[1][1]的值为不确定的。()
4. 有#define MYPRINT(x) printf(“#x”) 则MYPRINT(test)的输出结果为test.()
5. a=(b=4)+(c=6)是一个合法的赋值表达式。()
6. 自增运算符(++)和自减运算符(--)只能用于变量,不能用于常量和表达式。()
7. 若有说明static int a[3][4];?则数组a中各元素可在程序的编译阶段得到初值0。()
8. char const * const p;与const char * const p;是一样,但是char * const p;与char const *p;是不一样的。()
9. C++中const成员函数对于任何本类的数据成员都不能进行写操作。()
10. C++中所有的函数都是纯虚函数的才是纯虚类。()
二、填空题(20分)
注:以下填空题目都是以32位机为主
1. 给定结构
#pragma pack(4)
struct A{
int a1:30;
char a2:2;
int a3:16;
int a4:16;
char a5;
int a6:3;
};
union B{
int b1:16;
char b2:2;
};
则
sizeof(A)= _____________
sizeof(B)= _____________
(5分)
2、下面代码实现统计一个整数二进制格式中包含多少个'1'请补充完整(5分)
int GetBitNumber(int number)
{
int cnt=0;
while(number!=0)
{
__________________________;
__________________________;
}
return cnt;
}
3、有如下定义
char *a1[]={“hello!”,“tclmob”};
char a2[]=“\thello\0”;
char a3[][8]={“hello!”,“tclmob”};
char *p1=“hello”;
char **p2=a1;
char a4[]={'h','e','l','l','o','\0'};
int a5[]={'h','e','l','l','o','\0'};
请问
sizeof(a1)= _____________
sizeof(a2)= _____________
strlen(a2)= _____________
sizeof(a3)= _____________
sizeof(p1)= _____________
sizeof(p2)= _____________
sizeof(a4)= _____________
sizeof(a5)= _____________
(4分)
4、在一棵二叉树上第8层的结点数最多是____个。(2分)
5、进程之间通信的.途径有____._____._____._____.(4分)
三、单/多项选择题(每题2分,合计2*15=30分)
1、对于浮点变量f,能实现对f中的值在小数点后第三位进行四舍五入的表达式有_____
A)f=(f*100+0.5)/100.0 B)f=(f*100+0.5)/100
C)f=(int)(f*100+0.5)/100.0 D)f=((int)(f*100+0.5))/100.0
2、若x、b、m、n均为int型变量,执行下面语句后b的值为_____
m=20;n=6;
x=(--m==n++)?--m:++n
b=m++;
A)11 B)6 C)19 D)18
3、下列选项中可以将变量n清零的表达式有____
A)n=~n&~n B)n=n&~n C)n=n^n D)n=n|n
4、若有以下说明int a[5][9]; 则下列选项中对数组元素a[i][j]的正确引用有________(0<=i<4,0<=j<0)
A)*(&a[0][0]+9*i+j) B)*(a+i)(j)
C)*(*(a+i)+j) D)*(a[i]+j)
5、下列选项中没有构成死循环的程序段有______
A)int i=100; B)for( ; ; )
while(1)
{ i=i%100+1;
if(i>=100) break;}
C)int k=0; D)int s=36; while(s);--s;
do{++k;}while(k>=0);
6、有如下程序:
void fun(int i)
{
printf(“%d,”,i);
}
void main()
{
int i=5;
fun(i);
fun;
}
则运行结果是_____
A)5,0, B)5, C)5,5, D)5,随机值 E)可能出现运行异常
7、若变量已正确定义,要求程序段完成求5!的计算,下列选项中能完成此操作的程序段
A)for (i=1,p=1;i<=5;i++) p*=i;
B)for (i=1;i<=5;i++) {p=1;p*=i;}
C)i=1;p=1;while(i<=5) p*=i;i++;
D)i=1;p=1;do{p*=i;i++;}while(i<=5);
8、有如下代码:
int a,b,c;a=b=c=0;
0>1?a++:1>0?b++:c++;
printf(“%d%d%d\n”,a,b,c);
则输出结果是_________
A)010 B)110 C)111 D)语法错误
9、OSI模型中,会话层的主要任务有______
A)向用户提供可靠的端到端服务,透明地传送报文
B)组织两个会话进程之间的通信,并管理数据的交换
C)处理两个通信系统中交换信息的表示方式
D)确定进程之间通信的性质,以满足用户的需要
10、有以下程序
main()
{
int x=102,y=012;
printf(“%2d,%2d\n”,x^y,x|y);
}
执行后输出结果是是()
A)4,110 B)002,112 D)108,110 D)106,110
11、设有如下的程序段:
char str[]=“Hello”;
char *ptr;
ptr=str;
执行上面的程序段后,*(ptr+5)的值为______
A)'o' B)'\0' C)不确定的值 D)'o'的地址
12、一个栈的输入序列为1 2 3,则可能是栈的输出序列的是_____
A)231 B)321 C)312 D)123
13、下面关于完全二叉树的叙述中,正确的有______
A)除了最后一层外,每一层上的结点数均达到最大值,
B)可缺少若干个左右叶子结点
C)完全二叉树一般不是满二叉树
D)具有结点的完全二叉树的深度为[log2n]+1
14、下面概念中,属于面向对象方法的有___________
A)对象、消息 B)继承、多态 C)类、封装 D)过程调用
15、在下列几种排序方法中,要求内存量最大的是__________.
A)插入排序 B)选择排序 C)快速排序 D)归并排序
四、简答题(每题5分,合计5x4=20分)
1、写出程序执行结果,并解释原因(5分)
void getstr(char *p)
{
p=(char *)malloc(100);
strcpy(p,“TCL”);
}
void main()
{
char *str;
getstr(str);
if(str)
{
str[3]='0';
printf(“%s,%d\n”,strlen(str));
free(str);
}
}
2、写一个“标准”宏,这个宏返回一个数组最高维的下标(如数组a[2][4][6],执行宏之后结果是2)。(5分)
3、比较说明什么是Big-Endian,Little-Endian,网络字节序。(5分)
4、下面程序
main()
{
char *p1=“abc”, *p2=“ABC”, str[8]=“xyz”;
strcpy(str+2,strcat(p1,p2));
printf(“%s \n”,str);
}
运行结果是什么?为什么?(5分)
五、编程题(20分)
有两个单向链表,函数find_node作用是判断两个链表是否有交点(两个链表有相同的节点),如果有返回第一个交点。请编程实现。
type struct tag_node
{
int key;
struct tag_node *next;
}node;
函数原型:
node* find_node(node *head1,node *head2)
入参说明:
head1,head2:待检查的两个链表
返回:
相交的节点
篇2:TCL集团软件开发方向校园招聘笔试题
TCL集团软件开发方向校园招聘笔试题
一.填空题
1.C语言的程序总是从_______函数开始执行,从_____函数结束执行,
2.注释语句从_______________开始,到________________结束。
3.用户自定义标识符可以由字母、下划线或________________组成。
4.a或b中至少有一个大于1,其C语言表达式是_________________。
5.表达式‘a’-‘A’-6的值是______________。
6.表达式199/200的数据类型是_____________,它的值是______________。
7.使用数学函数时,需要在程序头部写入__________________命令。
8.完善下列语句,是以下程序段输出10个整数,请填入一个整数。
for(i=1;i<=______________;i++)
printf(“%d”,i++);
9.下列程序段的执行结果是_______________。
int n=0;
while(n++<=2);printf(“%d”,n);
10.判断字符串s1是否大于字符串s2,应使用语句_________________。
11. 多重继承指一个派生类可以有________ 。
12. 保护继承下,基类中所有公有成员在派生类中的访问属性是______ 。
13. 假定要访问一个对象指针p所指对象中的b成员,则表示方法_________。
14. 若需要把一个函数“void F();”定义为一个类AB的友元函数,则应在类AB的定义中加入一条语句:_____________。
二、选择题
1. 定义一个变量使之保存值的范围是0-65535,应该选择( )类型。
A.unsigned short int B. int
C.short int D.long int
2. ( )不是构造函数的特征
a.构造函数的函数名与类名相同
b.构造函数可以重载
c.构造函数可以设置缺省参数
d.构造函数必须指定类型说明
3. 设x、y、z都是整型变量,x、y的初值都是5,执行z=(++x)+(y- -)+1后,x、y、z三变量的值按顺序是( )。
A.5, 5, 11 B.6, 6, 13 C.4, 6, 12 D.6, 4, 12
4.下列字符中不属于转义字符的是( )
A. \n B.\t C.\b D.\k
5.下列不正确的标识符是( )
A._char B.a?b C.x D.st2_flag
6. C语言的源程序( )主函数
A. 可以没有 B.可以有多个
C.有且只有一个 D.若有,只有一个
7. 在内存中应该开辟( )多少个字节来存放字符‘\n’.
A. 1 B. 2 C. 3 D. 4
8. 下面的( )不是合法的c语言常量,
A. 123 B.‘M’ C.0892 D. “Flag”
9. 下面( )对变量的说明是错误的。
A. char c1, int x; B. int a,b; float x, y;
C. int a; int b; D. char c1; int x;
10. 有变量说明int a=3;, 则表达式a<1&&--a>1的运算结果和a的值应该是( )
A. 0和2 B. 0和3 C. 1和2 D. 1和3
11. 设int x=12;, 则执行完语句a+=a-=a*a; 后,a的值是( )
A. 552 B. 264 C. -264 D. 144
12. c语言中,运算对象必须是整型数的运算符是( )
A. % B. / C. %和\ D. %和/
13. 以下关于break语句的描述,只有( )是正确的。
A. 在循环语句中必须使用break语句。
B. break语句只能用于switch语句中。
C. 在循环语句中可以根据需要使用break语句。
D. break语句可以强制跳出所有循环。
14. 下面的叙述中,不正确的`是( )
A. 在main函数中说明的变量的作用域是整个程序。
B. 全局变量在程序运行期间一直占用分配给它的存储单元。
C. 形式参数是局部变量。
D. return()语句中括号内可以是常量、有确定值的变量或表达式。
15. 定义函数时,默认的函数类型是( )
A. auto B. register C. static D. extern
16. c语言中的函数( )
A. 可以嵌套定义 B. 嵌套调用和递归调用均可
C. 不可以嵌套调用 D. 可以嵌套调用,但不可以递归调用
17. 已知:print( )函数是一个类的常成员函数,它无返回值,下列表示中,( )是正确的。
a.void print( ) const;
b.const void print( );
c.void const print( );
d.void print(const);
18. 关于虚函数的描述中,( )是正确的。
a.虚函数是一个static类型的成员函数
b.虚函数是一个非成员函数
c.基类中说明了虚函数后,派生类中将其对应的函数可不必说明为虚函数
d.派生类的虚函数与基类的虚函数具有不同的参数个数和类型
19. 关于new运算符的下列描述中,( )是错的。
a.它可以用来动态创建对象和对象数组
b.使用它创建的对象和对象数组可以使用运算符delete删除
c.使用它创建对象时要调用构造函数
d.使用它创建对象数组时必须指定初始值
20. 在一个函数中,要求通过函数来实现一种不太复杂的功能,并且要求加快执行速度,选用( )。
a.内联函数
b.重载函数
c.递归调用
d.嵌套调用
篇3:c招聘笔试题
1. 改错(5分)
void test
{
char str[10];
char* str1 = “0123456789”; strcpy(str, str1); }
2.改错(5分)
void test
{
char str[10], str1[10]; for( int = 0; i < 10; i++) {
str = 'a';
}
strcpy(str, str1); }
3.读程序,写出结果(5分) int sum(int a)
{
int c = 0;
static int b = 3;
c += 1;
b += 2;
return (a + b + c); }
int main
{
int a = 2;
for(int i = 0; i < 5; i++) {
printf(“%d,”, sum(a)); }
return 0;
}
4.读程序,写出结果(5分) int main
{
int a[3];
a[0] = 0;
a[1] = 1;
a[2] = 2;
int *p, *q;
p = a;
q = &a[2];
int c = a[q - p];
printf(“value c = %d\n”, c++);
printf(“value c = %d\n”, c);
return 0;
}
篇4:c招聘笔试题
1.读程序,写出结果(10分,选做)
#define STRCPY(a, b) strcpy(a ## _p, #b)
int main
{
char var1_p[20];
char var2_p[30];
strcpy(var1_p, “aaaa”;
strcpy(var2_p, “bbbb”;
STRCPY(var1, var2);
STRCPY(var2, var1);
printf(“var1 = %s\n”, var1_p);
printf(“var2 = %s\n”, var2_p);
return 0;
}
2.(10分)不用除法(即不能使用“/”号)和库函数,计算285 / 16的商和余数, 要求效率尽量高.
3.(15分)编写字符串反转函数:strrev.要求时间和空间效率都尽量高.
(测试用例:输入“abcd”,输出应为“dcba”
函数原型为:
char* strrev(char* dest, char* src);
提示:dest和src可能是同一个字符串.
4.(15分)编写将字符串转换成整数的函数atoi,只处理输入字符串仅由0-9,'-','+',和空格的情况.
函数原型为:
int atoi(char* str);
提示:如果字符串不能构成一整数,可以直接返回0.但是对于以空格开始的字符串应特殊处理.
5.(30分)编写一组单链表操作函数.链表的结构如下:
struct ListNode
{
long id;
struct ListNode* next;
};
链表节点以id的从小到大排列,当id相等时,节点顺序没有约定,谁在前都可以.
要求编写的函数有:
遍历函数:返回cur下一个节点, 如果没有更多的节点, 返回0;
struct ListNode* ListNext(struct ListNode* cur);
插入函数:将newNode插入到head链表中,然后返回newNode的前一节点,
如果newNode已经在链表中,返回0.
struct ListNode* ListInsert(struct ListNode* head, struct ListNode* newNode);
删除函数:从head中删除theNode节点.返回theNode的前一节点.
如果theNode不在链表中,返回0;
struct ListNode* ListRemove(struct ListNode* head, struct ListNode* theNode);
嵌入式c语言试题 [转]
1 . 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)
#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL
我在这想看到几件事情:
我在这想看到几件事情:
#define 语法的基本知识(例如:不能以分号结束,括号的使用,等等)
懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。
意识到这个表达式将使一个16位机的整型数溢出-因此要用到长整型符号L,告诉编译器这个常数是的长整型数。
如果你在你的表达式中用到UL(表示无符号长整型),那么你有了一个好的起点。记住,第一印象很重要。
2 . 写一个“标准”宏MIN ,这个宏输入两个参数并返回较小的一个。
#define MIN(A,B) ((A) <= (B) ? (A) : (B))
这个测试是为下面的目的而设的:
标识#define在宏中应用的基本知识。这是很重要的,因为直到嵌入(inline)操作符变为标准C的一部分,宏是方便产生嵌入代码的唯一方法,对于嵌入式系统来说,为了能达到要求的性能,嵌入代码经常是必须的方法。
三重条件操作符的知识。这个操作符存在C语言中的原因是它使得编译器能产生比if-then-else更优化的代码,了解这个用法是很重要的。
懂得在宏中小心地把参数用括号括起来
我也用这个问题开始讨论宏的副作用,例如:当你写下面的代码时会发生什么事?
least = MIN(*p++, b);
3. 预处理器标识#error的目的是什么?
预处理器标识#error的目的是什么?
如果你不知道答案,请看参考文献1。这问题对区分一个正常的伙计和一个书呆子是很有用的。只有书呆子才会读C语言课本的附录去找出象这种问题的答案。当然如果你不是在找一个书呆子,那么应试者最好希望自己不要知道答案。
死循环(Infinite loops)
4. 嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢?
嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢?
这个问题用几个解决方案。我首选的方案是:
while(1)
{
?}
一些程序员更喜欢如下方案:
for(;
{
?}
这个实现方式让我为难,因为这个语法没有确切表达到底怎么回事。如果一个应试者给出这个作为方案,我将用这个作为一个机会去探究他们这样做的基本原理。如果他们的基本答案是:“我被教着这样做,但从没有想到过为什么。”这会给我留下一个坏印象。
第三个方案是用 goto
Loop:
...
goto Loop;
应试者如给出上面的方案,这说明或者他是一个汇编语言程序员(这也许是好事)或者他是一个想进入新领域的BASIC/FORTRAN程序员。
5. 用变量a给出下面的定义
a) 一个整型数(An integer)
b)一个指向整型数的指针( A pointer to an integer)
c)一个指向指针的的指针,它指向的指针是指向一个整型数( A pointer to a pointer to an intege)r 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
人们经常声称这里有几个问题是那种要翻一下书才能回答的问题,我同意这种说法。当我写这篇文章时,为了确定语法的正确性,我的确查了一下书。但是当我被面试的时候,我期望被问到这个问题(或者相近的问题)。因为在被面试的这段时间里,我确定我知道这个问题的答案。应试者如果不知道所有的答案(或
至少大部分答 案),那么也就没有为这次面试做准备,如果该面试者没有为这次面试做准备,那么他又能为什么出准备呢?
6. 关键字static的作用是什么?
人们经常声称这里有几个问题是那种要翻一下书才能回答的问题,我同意这种说法。当我写这篇文章时,为了确定语法的正确性,我的确查了一下书。但是当我被面试的时候,我期望被问到这个问题(或者相近的问题)。因为在被面试的这段时间里,我确定我知道这个问题的答案。应试者如果不知道所有的答案(或至少大部分答 案),那么也就没有为这次面试做准备,如果该面试者没有为这次面试做准备,那么他又能为什么出准备呢?
6. 关键字static的作用是什么?
这个简单的问题很少有人能回答完全。在C语言中,关键字static有三个明显的作用:
这个简单的问题很少有人能回答完全。在C语言中,关键字static有三个明显的作用:
在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。
在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。
大多数应试者能正确回答第一部分,一部分能正确回答第二部分,同是很少的人能懂得第三部分。这是一个应试者的严重的缺点,因为他显然不懂得本地化数据和代码范围的好处和重要性。
7.关键字const有什么含意?
我只要一听到被面试者说:“const意味着 常数”,我就知道我正在和一个业余者打交道。去年Dan Saks已经在他的文章里完全概括了const的所有用法,因此ESP(译者:Embedded Systems Programming)的每一位读者应该非常熟悉const能做什么和不能做什么.如果你从没有读到那篇文章,只要能说出const意味着“只读”就可以了。尽管这个答案不是完全的答案,但我接受它作为一个正确的答案。(如果你想知道更详细的答案,仔细读一下Saks的文章吧。)
如果应试者能正确回答这个问题,我将问他一个附加的问题:
我只要一听到被面试者说:“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呢?我也如下的几下理由:
前两个的作用是一样,a是一个常整型数。第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。第四个意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。如果应试者能正确回答这些问题,那么他就给我留下了一个好印象。顺带提一句,也许你可能会问,即使不用关键字 const,也还是能很容易写出功能正确的程序,那么我为什么还要如此看重关键字const呢?我也如下的几下理由:
关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。如果你曾花很多时间清理其它人留下的垃圾,你就会很快学会感谢这点多余的信息。(当然,懂得用const的程序员很少会留下的垃圾让别人来清理的。)
关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。如果你曾花很多时间清理其它人留下的垃圾,你就会很快学会感谢这点多余的信息。(当然,懂得用const的程序员很少会留下的垃圾让别人来清理的。)
通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。
合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少bug的出现。
8. 关键字volatile有什么含意?并给出三个不同的例子。
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:
并行设备的硬件寄存器(如:状态寄存器)
一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
多线程应用中被几个任务共享的变量
并行设备的硬件寄存器(如:状态寄存器)
一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
多线程应用中被几个任务共享的变量
回答不出这个问题的人是不会被雇佣的。我认为这是区分C程序员和嵌入式系统程序员的最基本的问题。搞嵌入式的家伙们经常同硬件、中断、RTOS等等打交道,所有这些都要求用到volatile变量。不懂得volatile的内容将会带来灾难。
假设被面试者正确地回答了这是问题(嗯,怀疑是否会是这样),我将稍微深究一下,看一下这家伙是不是直正懂得volatile完全的重要性。
一个参数既可以是const还可以是volatile吗?解释为什么。
一个指针可以是volatile 吗?解释为什么。
下面的函数有什么错误:
int square(volatile int *ptr)
{
return *ptr * *ptr;
}
下面是答案:
是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。
是的。尽管这并不很常见。一个例子是当一个中服务子程序修该一个指向一个buffer的指针时。
这段代码有点变态。这段代码的目的是用来返指针*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;
}
9. 嵌入式系统总是要用户对变量或寄存器进行位操作。给定一个整型变量a,写两段代码,第一个设置a
的bit 3,第二个清除a 的bit 3。在以上两个操作中,要保持其它位不变。
对这个问题有三种基本的反应
不知道如何下手。该被面者从没做过任何嵌入式系统的工作。
用bit fields。Bit fields是被扔到C语言死角的东西,它保证你的代码在不同编译器之间是不可移植的,同时也保证了的你的代码是不可重用的。我最近不幸看到 Infineon为其较复杂的通信芯片写的驱动程序,它用到了bit fields因此完全对我无用,因为我的编译器用其它的方式来实现bit fields的。从道德讲:永远不要让一个非嵌入式的家伙粘实际硬件的边。
用 #defines 和 bit masks 操作。这是一个有极高可移植性的方法,是应该被用到的方法。最佳的解决方案如下:
#define BIT3 (0x1 << 3)
static int a;
void set_bit3(void) {
a |= BIT3;
}
void clear_bit3(void) {
a &= ~BIT3;
}
一些人喜欢为设置和清除值而定义一个掩码同时定义一些说明常数,这也是可以接受的。我希望看到几个要点:说明常数、|=和&=~操作。
篇5:c招聘笔试题
1. 嵌入式系统经常具有要求程序员去访问某特定的内存位置的特点。在某工程中,要求设置一绝对地址为0x67a9的整型变量的值为0xaa66。编译器是一个纯粹的ANSI编译器。写代码去完成这一任务。
这一问题测试你是否知道为了访问一绝对地址把一个整型数强制转换(typecast)为一指针是合法的。这一问题的实现方式随着个人风格不同而不同。典型的类似代码如下:
这一问题测试你是否知道为了访问一绝对地址把一个整型数强制转换(typecast)为一指针是合法的。这一问题的实现方式随着个人风格不同而不同。典型的类似代码如下:
int *ptr;
ptr = (int *)0x67a9;
*ptr = 0xaa55;
A more obscure approach is:
一个较晦涩的方法是:
*(int * const)(0x67a9) = 0xaa55;
即使你的品味更接近第二种方案,但我建议你在面试时使用第一种方案。
2. 中断是嵌入式系统中重要的组成部分,这导致了很多编译开发商提供一种扩展—让标准C支持中断。具代表事实是,产生了一个新的关键字 __interrupt。下面的代码就使用了__interrupt关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码的。
__interrupt double compute_area (double radius)
{
double area = PI * radius * radius;
printf(“\nArea = %f”, area);
return area;
}
这个函数有太多的错误了,以至让人不知从何说起了:
ISR 不能返回一个值。如果你不懂这个,那么你不会被雇用的。
ISR 不能传递参数。如果你没有看到这一点,你被雇用的机会等同第一项。
在许多的处理器/编译器中,浮点一般都是不可重入的。有些处理器/编译器需要让额处的寄存器入栈,有些处理器/编译器就是不允许在ISR中做浮点运算。此外,ISR应该是短而有效率的,在ISR中做浮点运算是不明智的。
与第三点一脉相承,printf经常有重入和性能上的问题。如果你丢掉了第三和第四点,我不会太为难你的。不用说,如果你能得到后两点,那么你的被雇用前景越来越光明了。
3 . 下面的代码输出是什么,为什么?
void foo(void)
{
unsigned int a = 6;
int b = -20;
(a+b >6) ? puts(“>6” : puts(“<= 6”;
}
这个问题测试你是否懂得C语言中的整数自动转换原则,我发现有些开发者懂得极少这些东西。不管如何,这无符号整型问题的答案是输出是 ”>6”。原因是当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。因此-20变成了一个非常大的正整数,所以该表达式 计算出的结果大于6。这一点对于应当频繁用到无符号数据类型的嵌入式系统来说是丰常重要的。如果你答错了这个问题,你也就到了得不到这份工作的边缘。
篇6:C笔试题
C笔试题
1) 读文件file1.txt的内容(例如):
12
34
56
输出到file2.txt:
56
34
12
(逆序)
2)输出和为一个给定整数的所有组合
例如n=5
5=1+4;5=2+3(相加的数不能重复)
则输出
1,4;2,3,
第一题,注意可增长数组的应用.
#include
#include
int main(void)
{ int MAX = 10;
int *a = (int *)malloc(MAX * sizeof(int));
int *b;
FILE *fp1;
FILE *fp2;
fp1 = fopen(“a.txt”,”r”);
if(fp1 == NULL)
{printf(“error1″);
exit(-1);
}
fp2 = fopen(“b.txt”,”w”);
if(fp2 == NULL)
{printf(“error2″);
exit(-1);
}
int i = 0;
int j = 0;
while(fscanf(fp1,”%d”,&a[i]) != EOF)
{i++;
j++;
if(i >= MAX)
{
MAX = 2 * MAX;
b = (int*)realloc(a,MAX * sizeof(int));
if(b == NULL)
{printf(“error3″);
exit(-1);
}a = b;
}}
for(;–j >= 0;)
fprintf(fp2,”%d\n”,a[j]);
fclose(fp1);
fclose(fp2);
return 0;
}
第二题.
#include
int main(void)
{unsigned long int i,j,k;
printf(“please input the number\n”);
scanf(“%d”,&i);
if( i % 2 == 0)
j = i / 2;
else
j = i / 2 + 1;
printf(“The result is \n”);
for(k = 0; k < j; k++)
printf(“%d = %d + %d\n”,i,k,i – k);
return 0;
}
#include
void main
{unsigned long int a,i=1;
scanf(“%d”,&a);
if(a%2==0)
{ for(i=1;i printf(“%d”,a,a-i);
}
else
for(i=1;i<=a/2;i++)
printf(” %d, %d”,i,a-i);
}
兄弟,这样的.题目若是做不出来实在是有些不应该, 给你一个递规反向输出字符串的例子,可谓是反序的经典例程.
void inverse(char *p)
{ if( *p = = ‘\0′ )
return;
inverse( p+1 );
printf( “%c”, *p );
}
int main(int argc, char *argv[])
{
inverse(“abc\0″);
return 0;
}
借签了楼上的“递规反向输出”
#include
void test(FILE *fread, FILE *fwrite)
{ char buf[1024] = {0};
if (!fgets(buf, sizeof(buf), fread))
return;
test( fread, fwrite );
fputs(buf, fwrite);
}
int main(int argc, char *argv[])
{ FILE *fr = NULL;
FILE *fw = NULL;
fr = fopen(“data”, “rb”);
fw = fopen(“dataout”, “wb”);
test(fr, fw);
fclose(fr);
fclose(fw);
return 0;
}
在对齐为4的情况下
struct BBB
{ long num;
char *name;
short int data;
char ha;
short ba[5];
}*p;
p=0×1000000;
p+0×200=____;
(Ulong)p+0×200=____;
(char*)p+0×200=____;
解答:假设在32位CPU上,
sizeof(long) = 4 bytes
sizeof(char *) = 4 bytes
sizeof(short int) = sizeof(short) = 2 bytes
sizeof(char) = 1 bytes
由于是4字节对齐,
sizeof(struct BBB) = sizeof(*p)
= 4 + 4 + 2 + 1 + 1/*补齐*/ + 2*5 + 2/*补齐*/ = 24 bytes (经Dev-C++验证)
p=0×1000000;
p+0×200=____;
= 0×1000000 + 0×200*24
(Ulong)p+0×200=____;
= 0×1000000 + 0×200
(char*)p+0×200=____;
= 0×1000000 + 0×200*4
你可以参考一下指针运算的细节
篇7:c经典笔试题
有两个磁盘文件A和B,各存放一行字母,要求把这两个文件中的信息合并(按字母顺序排列),输出到一个新文件C中.
#include
#include
int main(int argc,char* argv)
{
FILE* fp;
int i,j,k,num,NUM;
char c[50],t,ch;
if((fp=fopen(“A”,“r”))==NULL)
/*can be replaced by open
* int fd=open(“A”,O_RDONLY|O_CREAT);*/
{
printf(“fileA cannot be opened\n”);
exit(0);
}
printf(“\nA contents are:\n”);
for(i=0;(ch=fgetc(fp))!=EOF;i++)/*一个字符一个字符读*/
{
c[i]=ch;
putchar(c[i]);
}
num=i+1;
fclose(fp);
if((fp=fopen(“B”,“r”))==NULL)
{
printf(“fileB cannot be opened\n”);
exit(0);
}
printf(“\nB contents are :\n”);
for(i=0;(ch=fgetc(fp))!=EOF;i++)
{
c[num+i]=ch;
putchar(c[num+i]);
}
fclose(fp);
NUM=num+i+1;
for(k=0;k
{
for(j=0;j
{
if(c[j]>c[j+1])
{
t=c[j];
c[j]=c[j+1];
c[j+1]=t;
}
}
}
printf(“\nC fileis:\n”);
fp=fopen(“C”,“w”);
for(i=0;i
{
putc(c[i],fp);/*将字符一个个写入文件中*/
putchar(c[i]);/*一个个输出字符*/
}
fclose(fp);
return 1;
}
篇8:c经典笔试题
有一浮点型数组A,用C语言写一函数实现对浮点数组A进行降序排序,并输出结果,要求要以数组A作为函数的入口.(建议用冒泡排序法)
#include
#include
void BubbleSort(int arr, int n)
{
int i,j;
int exchange = 1;//交换标志,提高算法效率;
int temp;
for(i=0;i
{
exchange=0;//本趟排序开始前,交换标志应为假
for(j=0;j
{
if(arr[j+1] >arr[j])
{
temp=arr[j+1];
arr[j+1]=arr[j];
arr[j]=temp;
exchange=1; //发生了交换,故将交换标志置为真
}
}
if(!exchange) //本趟排序未发生交换,提前终止算法
return;
}
}
int main(int argc,char* argv)
{
int arr[5]={1,4,2,6,5};
int i;
BubbleSort(arr, 5);
printf(“after sort,arr is :\n”);
for(i=0;i<5;i++)
{
printf(“%3d”,arr[i]);
}
return 1;
}
篇9:c经典笔试题
写出二分查找的代码:
Int binary_search(int* arr,int key,int size)
{
Intmid;
Intlow=0;
Int high=size-1;
While(low<=high)
{
Mid=(low+high)/2;
If(arr[mid]>key)
High=mid-1;
ElseIf(arr[mid]
Low=mid+1;
Else
Return mid;
}
Return -1;
}
请编写一个C 函数,该函数在一个字符串中找到可能的最长的子字符串,该字符串是由同一字符组成的。
#include
#include
#include
int ChildString(char*p)
{
char* q=p;
int stringlen=0, i=0,j=1,len=0,maxlen=1;
//stringlen=strlen(p);
while(*q!='\0') //不能用strlen,求得长stringlen
{
stringlen++;
q++;
}
while( i< stringlen)
{
if(*(p+i)==*(p+j)&&j< stringlen)
{
len++; //统计子串长度
i++;
j++;
}
else
{
if(len>=maxlen) //统计最大子串长度
{
maxlen=len+1;
len=0;
}
else
len=0;
i++;
j++;
}
}
return maxlen;
}
int main(int argc,char* argv)
{
char arr[11];
int len;
printf(“please input chararr(10):\n”);
scanf(“%s”,arr);
len=ChildString(arr);
printf(“the len of childarr is:%d\n”,len);
return 1;
}
【TCL集团校园招聘C/C++方向笔试题】相关文章:
1.C/C++笔试题
4.C字符串笔试题
5.C语言笔试题
7.联想集团校园招聘
8.C语言指针笔试题
10.某银行招聘笔试题






文档为doc格式