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

c和c++面试题探讨(题目以收录时间为序,不以难度排名)

2007-01-12 22:33 369 查看
预处理器(Preprocessor)

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

在网络上收录了这一道题:
#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL

收录者这样评价:
我在这想看到几件事情:
1). #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等)
2). 懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。
3). 意识到这个表达式将使一个16位机的整型数溢出-因此要用到长整型符号L,告诉编译器这个常数是的长整型数。
4). 如果你在你的表达式中用到UL(表示无符号长整型),那么你有了一个好的起点。记住,第一印象很重要。

对于收录者的评价,我认为第二项值得商榷,预处理器将为你计算常数表达式的值吗?请看下面的小例子。

#define sq 10 + 10
void main()
{
int i;
i = 5 * sq * 8;
printf("i = %d/n", i);
}

在Windows 2k server +visual c++下输出是130。可见预处理器没有计算10+10,只是替代。

如果不是,那么,我认为在不同情况下应该有不同的处理,比如,在实时性要求极为严格的嵌入式系统中,如果SECONDS_PER_YEAR 被极为大量频繁地使用,那么,我认为写成#define SECONDS_PER_YEAR 31536000UL更加优化一些,毕竟乘法耗时,让我们的大脑为系统做一点事可以换来系统系能的提高。

2. 求函数返回值,输入x=9999 ;
int func ( unsigned int x )
{
int countx = 0;
while ( x )
{
countx ++;
x = x&(x-1);
}
return countx;
}
答案:这个是统计它的二进制数值中有多少个1的函数。
通常用这个判断x是否为2的幂,所以返回值为8 。

点评:这段程序读起来多少有一点晦涩,对于统计一个数中1的个数可以用如下代码代替,更易于理解:

unsigned int x = 9999;
int i = sizeof(x) * 8,j;
int count = 0;
for(j = 0; j < i; j++)
{
if(((x >> j) & 1) == 1)
count++;
}
printf("/nsize=%d/n",count);

3.static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?

答:全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。
把局部变量改变为静态变量后改变了它的存储方式,非静态局部变量一般存放在栈里面,静态局部变量一般存放在堆里面;也改变了它的生存期,非静态局部变量在函数返回时堆栈自动释放,非静态局部变量也就不存在了,静态局部变量在函数返回后还存在,定义此静态局部变量的函数再次被调用时上一次的值作为此次的初值。把全局变量改变为静态变量后是改变了它的作用域, 限制了它的使用范围。
static函数与普通函数作用域不同。static函数仅在本文件中使用。只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件
static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝

4.如果算术运算的结合性是从右到左结合的,比如 7 + 2 + 4 = (7 + (2 + 4)),那么下面的表达式的值是多少, 7 - (16 / ( 4 - 2 ) * 4 - 4):

答案:9
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐