C程序员2
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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
答案:
对于#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.内联函数和宏的差别是什么?