您的位置:首页 > 编程语言 > C语言/C++

C语言经典笔面试题(下)

2020-08-30 10:54 1511 查看

C语言经典笔面试题—下

1、已知一个数组table,用一个宏定义,求出数据的元素个数。

#define NTBL(table) (sizeof(table)/sizeof(table[0]))

2、对于一个频繁使用的短小函数,在C语言中应用什么实现,在C++ 中应用什么实现?

c用宏定义,c++ 用inline函数

3、用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)

#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL

注意末尾的UL。

4、以下为Linux下的32位C程序,请计算sizeof的值。

char str[] = “Hello” ;
char *p = str ;
int n = 10;
void Func ( char str[100])
{
}
void * p = malloc( 100 );

请计算
(1)sizeof (str ) =
(2)sizeof ( p ) =
(3)sizeof ( n ) =
(4)sizeof( str ) =
(5)sizeof ( p ) =
答案:
(1)6、(2)4 、(3 )4 (4)4 (5)4

5、请写出bool flag 与“零值”比较的if 语句

if ( flag )    if ( !flag )

6、请写出int 变量n 与“零值”比较的if 语句

if ( n == 0 )   if ( n != 0 )

7、请写出char *p 与“零值”比较的if 语句

if (p == NULL)    if (p != NULL)

8、以下是求一个数的平方的程序,请找出错误

#define SQUARE(a) ((a)*(a))
int a = 5;
int b;
b = SQUARE(a++);

宏在预编译时会以直接替换的形式展开。涉及到宏的地方,谨慎使用+±- ,该程序的结果为42。

9、有符号数转无符号数

#define Max_CB 500
void LmiQueryCSmd(StructMSgCB * pmsg)
{
unsigned char ucCmdNum;
......
for(ucCmdNum=0;ucCmdNum<  Max_CB;ucCmdNum++)
{
......;
}
}

这段代码执行有什么问题?
死循环。

unsigned char //无符号字符型表示范围0~255
char // 有符号字符型 表示范围-128~127

10、怎么判断单向链表中是否有环?

答:用两个指针来遍历这个单向链表,第一个指针p1,每次走一步;第二个指针p2,每次走两步;当p2 指针追上p1的时候,就表明链表当中有环路了。

int testLinkRing(Link *head)
{
Link *t1=head,*t2=head;
while( t1->next && t2->next)
{
t1 = t1->next;
if (NULL == (t2 = t2->next->next))
return 0; // 无环
if (t1 == t2)
return 1;
}
return 0;
}

11、下面的代码输出是什么,为什么?

void foo(void)
{
unsigned int a = 6;
int b = -20;
(a+b> 6)? puts("> 6") : puts("<= 6");
}

这个问题测试你是否懂得C语言中的整数自动转换原则,

当表达式中存在有符号类型和无符号类型时,所有的数都自动转换为无符号类型。因此-20 变成了一个非常大的正整数,所以该表达式计算出的结果大于6 。这一点对于应当频繁用到无符号数据类型的嵌入式系统来说是丰常重要的。

12、switch()的参数类型可以是实型吗?

不可以。

13、头文件包含

参考阅读:#include使用引号“”和尖括号<>的区别

#include <filename.h> 和#include “filename.h” 有什么区别?
对于#include <filename.h> ,编译器从标准库路径开始搜索filename.h ;
对于#include “filename.h” ,编译器从用户的工作路径开始搜索filename.h 。

14、头文件中的ifndef/define/endif 干什么用?

防止该头文件被重复引用。

15、嵌入式系统经常要求程序员去访问某特定的内存位置。在某工程中,要求设置一绝对地址为0x67a9的整型变量的值为0xaa66。

int * ptr;
ptr=  (int *)0x67a9;
*ptr = 0xaa66;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: