常规的C程序笔试题

时间:2025年01月09日

/

来源:yyhncu

/

编辑:本站小编

收藏本文

下载本文

以下是小编为大家准备的常规的C程序笔试题,本文共11篇,仅供参考,大家一起来看看吧。本文原稿由网友“yyhncu”提供。

篇1:常规的C程序笔试题

常规的C程序笔试题

一些常规中举的C考题

第一题:写出下述程序结果:

int m[][3] = {1,4,7,2,5,8,3,6,9};

int i, j, k = 2;

for (i = 0; i < 3; i++) {

printf(“%d”, m[k][i]);

}

问题所在:本题考点一眼就可以看出,二重数组啦!

第二题:下列哪个引用是不正确的?

int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, *p = a;

(A) a[p-a]; (B) *(&a[i]); (c) p[i]; (D) *(*(a+i));

第三题:下列4个选项中,哪个结果为6?

int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, *p = a;

(A) *p + 6; (B) *(p+6); (C) *p += 5; (D) p+5;

第四题:关于二叉树的',给你前序与中序,让你画出二叉树图形;

第五题:关于操作系统方面的,具体题目记不清了,大概意思如下:

在多任务操作系统中,任务间的通信方式有哪几种?如何任务间互斥(并举例说明);

漏了一个考点,记不起来了,想起来再补上吧!

篇2: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;

}

篇3: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;

}

篇4: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;

}

篇5:不常见的C程序笔试题

不常见的C程序笔试题

1、写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个,

2、给定一个整型变量a,写两段代码,第一个设置a的bit 3,第二个清除a 的bit 3。在以上两个操作中,要保持其它位不变。

3、在某工程中,要求设置一绝对地址为0x67a9的整型变量的`值为0xaa66,

写代码去完成这一任务。(注:这一题稍微改了改,呵呵,改的地方就是文字变了个说法,变长了,^_^,嗯,地址也应该变了吧,唉,记不清了!)

还有一道《高质量C++-C编程指南》中的题目

头文件中的 ifndef/endif 干什么用?(呵呵,与原题相比只是少了define)!

还有一些就是关于结构体、++、--等一系列试题;

篇6:c指针笔试题

1. 变量的指针,其含义是指该变量的_________.

a)值 b)地址

c)名 d)一个标志

2.若有语句int *point,a=4;和point=&a;下面均代表地址的一组选项是_____. a)a,point,*&a b)&*a,&a,*point

c)*&point,*point,&a d)&a,&*point ,point

3.若有说明;int *p,m=5,n;以下正确的程序段的是________.

a)p=&n; b)p=&n;

scanf(“%d”,&p); scanf(“%d”,*p);

c)scanf(“%d”,&n); d)p=&n;

*p=n; *p=m;

4. 以下程序中调用scanf函数给变量a输入数值的方法是错误的,其错误原因是________.

main

{

int *p,*q,a,b;

p=&a;

printf(“input a:”);

scanf(“%d”,*p);

……

}

a)*p表示的是指针变量p的地址

b)*p表示的是变量a的值,而不是变量a的地址

c)*p表示的是指针变量p的值

d)*p只能用来说明p是一个指针变量

5. 已有变量定义和函数调用语句:int a=25; print_value(&a); 下面函数的正确输出结果是________.

void print_value(int )

{ printf(“%d\\n”,++);}

a)23 b)24 c)25 d)26

6.若有说明:long *p,a;则不能通过scanf语句正确给输入项读入数据的程序段是

A) *p=&a; scanf(“%ld”,p);

B) p=(long *)malloc(8); scanf(“%ld”,p);

C) scanf(“%ld”,p=&a);

D) scanf(“%ld”,&a);

7.有以下程序

#include

main

{ int m=1,n=2,*p=&m,*q=&n,*r;

r=p;p=q;q=r;

printf(“%d,%d,%d,%d\\n”,m,n,*p,*q); }

程序运行后的输出结果是

A)1,2,1,2

C)2,1,2,1

篇7:c指针笔试题

1. 有以下程序

main { int a=1, b=3, c=5; int *p1=&a, *p2=&b, *p=&c; *p =*p1*(*p2); printf(“%d\\n”,c); }

执行后的输出结果是

A)1

2. 有以下程序

main

{ int a,k=4,m=4,*p1=&k,*p2=&m;

a=p1==&m;

printf(“%d\\n”,a);

}

程序运行后的输出结果是

A)4

B)1 C)0 D)运行时出错,无定值 B)2 C)3 D)4 B)1,2,2,1 D)2,1,1,2

3. 在16位编译系统上,若有定义int a={10,20,30}, *p=a;,当执行p++;后,下列说法错误的是

A)p向高地址移了一个字节

C)p向高地址移了两个字节

4.有以下程序段

int a[10]={1,2,3,4,5,6,7,8,9,10},*p=&a[3],b;

b=p[5];

b中的值是

A)5 B)6 C)8 D)9

5.若有以下定义,则对a数组元素的正确引用是_________.

int a[5],*p=a;

a)*&a[5] b)a+2 c)*(p+5) d)*(a+2)

6.若有以下定义,则p+5表示_______.

int a[10],*p=a;

a)元素a[5]的地址 b)元素a[5]的值

c)元素a[6]的地址 d)元素a[6]的值

7.设已有定义: int a[10]={15,12,7,31,47,20,16,28,13,19},*p; 下列语句中正确的是

A) for(p=a;a<(p+10);a++);

B) for(p=a;p<(a+10);p++);

C) for(p=a,a=a+10;p

D) for(p=a;a

篇8:c指针笔试题

1.有以下程序段

#include

int main

{ int x = {10, 20, 30};

int *px = x;

printf(“%d,”, ++*px); printf(“%d,”, *px);

px = x;

printf(“%d,”, (*px)++); printf(“%d,”, *px);

px = x;

printf(“%d,”, *px++); printf(“%d,”, *px);

px = x;

printf(“%d,”, *++px); printf(“%d\\n”, *px);

return 0; B)p向高地址移了一个存储单元 D)p与a+1等价

}

程序运行后的输出结果是( )

A)11,11,11,12,12,20,20,20 B)20,10,11,10,11,10,11,10

C)11,11,11,12,12,13,20,20 D)20,10,11,20,11,12,20,20

2.设有如下定义:

int arr={6,7,8,9,10};

int *ptr;

ptr=arr;

*(ptr+2)+=2;

printf (“%d,%d\\n”,*ptr,*(ptr+2));

则程序段的输出结果为

A)8,10 B)6,8 C)7,9 D)6,10

3.若有定义:int a={2,4,6,8,10,12},*p=a;则*(p+1)的值是______. *(a+5)的值是_________.

4.若有以下说明和语句,int c[4][5],(*p)[5];p=c;能正确引用c数组元素的是______.

A) p+1 B) *(p+3) C) *(p+1)+3 D) *(p[0]+2)

5.若有定义:int a[2][3],则对a数组的第i行j列元素地址的正确引用为______. a)*(a[i]+j) b)(a+i) c)*(a+j) d)a[i]+j

6.若有以下定义:int a[2][3]={2,4,6,8,10,12};则a[1][0]的值是_____. *(*(a+1)+0)的值是________.

7.有以下定义

char a[10],*b=a;

不能给数组a输入字符串的语句是

A)gets(a) B)gets(a[0]) C)gets(&a[0]); D)gets(b);

8.下面程序段的运行结果是_________.

char *s=“abcde”;

s+=2;printf(“%d”,s);

a)cde b)字符'c' c)字符'c'的地址 d)无确定的输出结果

9.以下程序段中,不能正确赋字符串(编译时系统会提示错误)的是

A) char s[10]=“abcdefg”; B) char t=“abcdefg”,*s=t;

C) char s[10];s=“abcdefg”; D) char s[10];strcpy(s,“abcdefg”);

10.设已有定义: char *st=“how are you”; 下列程序段中正确的是

A) char a[11], *p; strcpy(p=a+1,&st[4]);

B) char a[11]; strcpy(++a, st);

C) char a[11]; strcpy(a, st);

D) char a, *p; strcpy(p=&a[1],st+2);

篇9: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;

}

篇10:C程序员笔试题

1、不正确的附值或赋初值方式为__

a、char str=“string”;

b、char str[10]; str=“string”;

c、char *p=“string”; c

d、char *p; p=“string”;

2、对于以下的变量定义,表达式___是正确的

struct node {

char s[10];

int k;

} p[4];

a、p->k=2;

b、p[0].s=“abc”;

c、p[0]->k=2;

d、p->s='a';

3、在64位高档机中,long占字节数为

a、4 b、8 c、32 d、64 b

4、函数中局部变量生成于__中

a、堆 b、栈 c、静态存储区 d、代码存储区 c

5、下面程序的输出__

#pragma pack(1) //如果#pragma pack(4)

void main

{

struct test {

char c;

short s1;

short s2;

int i;

};

cout<

}

a、9 b、10 c、12 d、16

6、下面的程序段:

char a[3],b=“china”;

a=b;

printf(“%s”,a);

a、输出china b、ch c、chi d、编译出错

篇11: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;

}

一些人喜欢为设置和清除值而定义一个掩码同时定义一些说明常数,这也是可以接受的。我希望看到几个要点:说明常数、|=和&=~操作。

电信c笔试题

神州程序类笔试题

国二c语言笔试题

关于C语言游戏开发笔试题

网易校园招聘C/C++笔试题

下载常规的C程序笔试题(精选11篇)
常规的C程序笔试题.doc
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档
最新范文更多
点击下载本文文档