面试题(一)

选择题

1:下述程序执行后的输出结果是(A
#include <stdio.h>
int main()
{
int x=‘f’;
printf(“%c\n”,‘a’+(x-‘a’+1));
}
A.g B.h C.i D.j

解析:这题没难度。

2:执行语句“ k=7>>1; ”后,变量 k 的当前值是(C)
A.15 B.31 C.3 D.1

7>>1 等于 3。
解析:先左移,后赋值。

3:若有宏定义:#define MOD(x,y) x%y
则执行以下语句后的输出结果是int a=13,b=94; printf(″%d\n″,MOD(b,a+4)); (B)
A.5 B.7 C.9 D.11

解析:MOD(b,a+4),先取余后加法 。即b%a+4 值为94%13+4 = 3+4 =7

4:下列各个错误中,哪一个不属于编译错误( )
A.改变 x 原值 3 为 5 ,写作“ x==5 ;”
B.花括号不配对
C.复合语句中的最后一条语句后未加分号
D.变量有引用、无定义

解析:

A, B, C为语法错误
D为是一个链接错误,不属于编译错误。
语法错误:缺少分号,括号不匹配,注释不完整等。
类型错误:赋值类型不匹配、函数参数类型不匹配等。
语义错误:逻辑错误、变量未定义等。
运行时错误:访问非法内存、除零错误等。
链接错误:找不到函数实现、重复定义等。
编译器错误:编译器本身存在问题导致无法编译。

5:下列程序段运行后, x 的值是( ) a=1;b=2;x=0;
if(!( – a))x – ;
if(!b)x=7;else ++x;
A.0 B.3 C.6 D.7

解析:
	if(!( -- a))x -- ;		//执行结果如下
	!(--a) = 1	,执行x--,x=-1。
	if(!b)x=7;else ++x;	//执行结果如下
	!(b) = 0, 执行else ++x = 0;

6.设
#define N 3
#define Y(n) ((N+1)n)
则表达式 2
(N+Y(5+1))的值是(B)
A.42 B.48 C.54 D.出错

解析:2*(N+Y(5+1)) = 2*(N+Y((3+1)5+1))
值为:2
(3+21) = 48

7:若定义了 char ch[]={″abc\0def″},*p=ch;则执行 printf(″%c″,*p+4);语句的输出结果是(C)
A.def B.d C.e D.0

解析:\0为一个字符,p+4指向第五个元素

8: 设 float a=2, b=4, c=3;,以下 C 语言表达式与代数式 (a+b)+c 计算结果不一致的是(B
A.(a+b)c/2
B.(1/2)
(a+b)c
C.(a+b)c1/2
D.c/2
(a+b)

解析:1/2整数类型相除向下取整

9:表达式 strcmp( “ 3.14 ”,“ 3.278 ” ) 的值是一个(A)
A.非零整数 B.浮点数 C.0 D.字符

解析:strcmp比较的是每个字符的大小返回值为0(字符串相等) 1(前一个大于后一个) -1(后一个大于前一个)

10:设
struct
{
short a; char b; float c;
}cs;
则 sizeof(cs)的值是(D)
A.4 B.5 C.7 D.8

解析:4+4=8

简答题

  1. 已定义的数组名为array,如何求出该数组的元素个数。

答:sieof(arr)/sizeof(数据类型)

  1. 用预处理指令#define 声明一个常数,用以表明1年(365天)中有多少秒

答:#define N (365 * 24 * 60 * 60)

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

答:#define MIN(a,b) b>a?a:b

  1. 说明以下定义的指针所指向的类型
    int *ptr; //指针所指向的类型是:

答:int

char *ptr; //指针所指向的的类型是:

答:char

int **ptr; //指针所指向的的类型是:

答:int类型的二位数组

int (*ptr)[3]; //指针所指向的的类型是:

答:数组指针,存储地址的数组

int (*ptr)() //指针所指向的的类型是:

答:函数指针,int ptr ()

  1. 下面的函数有什么错误:
int square(volatile int *ptr) 
{ 
return ptr *ptr; 
} 

返回值为int类型,参数是一个地址,ptr是一个地址,不能进行*运算,可以进行++,- -操作

  1. 给定一个整型变量a,编写代码实现如下功能,第一个设置a的bit 3,第二个清除a 的bit 3。

答:设置a的第三位意思是将第三位置为1:a|=a<<2 a&=~(1<<2)

  1. 某项目中,要求设置一绝对地址为0x67a9的整型变量的值为0xaa66,请写代码去完成这一任务。

答:*(0x67a9) = (int)(0xaa66)

  1. 中断是嵌入式系统中重要的组成部分,这导致了很多编译开发商提供一种扩展—让标准C支持中断。具代表事实是,产生了一个新的关键字__interrupt。下面的代码就使用了__interrupt关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码。
    __interrupt double compute_area (double radius)
    {
    double area = PI * radius * radius;
    printf(” Area = %f”, area);
    return area;
    }

答:说实话没看懂。
这段代码存在一些问题。首先,中断服务子程序(ISR)通常不应该返回值,因为中断处理完毕后,控制权应该立即返回到中断发生之前的位置,不应该将控制权交给ISR返回的地方。其次,ISR一般应该尽量简洁,不应该包含过多的代码,否则会影响系统的实时性。最后,如果这个ISR用于响应硬件中断,那么它必须在处理完成后清除中断标志位,否则系统将不会知晓这个中断已经被处理过了。

  1. 下面的代码输出是什么,为什么?
    Void foo(void)
    {
    unsigned int a = 6;
    int b = -20;
    (a+b > 6) ? puts(“> 6”) : puts(“<= 6”);
    }

答:输出是"> 6"。

因为表达式(a+b > 6)的值为真,即:6 + (-20) > 6,即 -14 > 0,这是一个真值,所以会输出"> 6"。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值