C程序员2

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1.x=x+1,x+=1,x++,哪个效率最高,为什么?

解析:

x=x+1;最低,因为它的执行过程如下:

(1)读取右x的地址。

(2)x+1。

(3)读取左x的地址。

(4)将右值传给左边的x(编译器并不认为左右x的地址相同)。

x+=1;其次,其执行过程如下:

(1)读取右x的地址。

(2)x+1。

(3)将得到的值传给x(因为x的地址已经读出)。

x++;效率最高,其执行过程如下:

(1)读取右x的地址。

(2)x自增1。

2.下面程序的结果是什么?

char foo(void)

{

unsigned int a = 6;

int b = -20;

char c;

(a+b>6) ? (c=1) : (c=0);

return c;

}

解析:

unsigned int类型的数据与int类型的数据相运算后,自动转

为unsigned int类型。因此a-b的值不是-14,而是一个unsigned int

类型的数4294967382.因此返回值是1。

原因是当表达式中存在有符号类型和无符号类型时,所有的操

作数都自动转换为无符号类型。

3.如何将a、b的值进行交换,并且不使用任何中间变量?

解析:

如果采用:

a = a + b;

b = a - b;

a = a - b;

这样做的缺点就是如果a、b都是比较大的两个数,a=a+b时就会越界。

而采用:

a = a ^ b;

b = a ^ b;

a = a ^ b;

用异或语句无需担心越界问题。

4.在C++程序中调用被C编译器编译后的函数,为什么要加extern "C"?

答案:

C++语言支持函数重载,C语言不支持函数重载。函数被C++编译

后在库中的名字与C语言的不同。C++提供了C连接交换指定符号extern "C" 解决名字匹配问题。

5.头文件中的ifndef/define/endif是干什么用的?

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

6.#include 和#inc lude "filename.h"有什么区别?

答案:

对于#include ,编译器从标准库路径开始搜索

filename.h;

对于#include "filename.h",编译器从用户的工作路径开始

搜索filename.h。

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

(忽略闰年问题)。

解析:

通过这道题面试官想考几件事情:

1)#define语法的基本知识(例如,不能以分号结束,括号的使用,

等等)。

2)意识到这个表达式将使一个16位机的整型数溢出,因此要用到

长整型符号L,告诉编译器这个常数是长整型数。

答案:#define SECONDS_PER_YEAR (60*60*24*365)UL

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

答案:#define MIN(A,B) ((A)<=(B)?(A):(B))

9.const有什么用途?

答案:(1)可以定义const常量。

(2)const可以修饰函数的参数和返回值,甚至函数的定义体。

被const修饰的东西都受到强制保护,可以预防意外的变动,

能提高程序的健壮性。

10.const与#define相比有什么不同?

答案:C语言可以用const定义常量,也可以用#define定义常量,但

是前者比后者有更多的优点:

(1)const常量有数据类型,而宏常量没有数据类型。编译器可以

对前者进行类型安全检查,而对后者只进行字符替换,没有

类型安全检查,并且在字符替换中可能会发生意料不到的错误。

(2)有些集成的调试工具可以对const常量进行调试,但是不能对

宏常量进行调试。

11.说明sizeof和strlen之间的区别。

解析:

第一个例子:

char *ss = "0123456789";

sizeof(ss)结果为4,ss是指向字符串常量的字符指针。

sizeof(*ss)结果为1,*ss是第一个字符。

第二个例子:

char ss[] = "0123456789";

sizeof(ss)结果为11,ss是数组,计算到"\0"位置。

sizeof(*ss)结果为1,*ss是第一个字符。

第三个例子:

char ss[100] = "0123456789";

sizeof(ss)结果为100,ss表示在内存中预分配的大小,100*1。

strlen(ss)结果为10,它的内部实现是用一个循环计算字符串的

长度,直到"\0"为止。

第四个例子:

int ss[100] = "0123456789";

sizeof(ss)结果为400,ss表示在内存中的大小,100*4。

strlen(ss)错误,strlen的参数只能是char*,且必须是以"\0"结尾。

第五个例子:

struct X

{

int i;

int j;

char k;

} x;

sizeof(X)结果为12,内存补齐。

sizeof(x)结果为12,理由同上。

12.以下代码的输出结果是

struct B

{

float f;

char p;

int adf[3];

};

printf("%d",sizeof(B));

解析:

float f占4个字节,char p占1个字节,int adf[3]占12个字节,

总共是17个字节。根据内存对齐原则,要选择4的倍数,所以是20个字节。

13.内联函数和宏的差别是什么?

相关文档
最新文档