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
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
相关文章推荐
- 我们公司原来C++招聘考试题,题目难度正常,没有稀奇古怪的题,如果答对60分以上,恭喜你基本算一个合格的网络开发工程师了。
- 剑指offer 面试题13:在O(1)时间删除链表结点(C++版)
- 372. 在O(1)时间复杂度删除链表节点 (delete-node-in-the-middle-of-singly-linked-list)(c++)----lintcode面试题之链表
- 有点难度的C++面试题
- 【编程题目】求单向链表的倒数第k个节点——关于代码鲁棒性的探讨(C++实现)
- C/C++笔试、面试题目大汇总 Visual C++常见面试题 王牌7
- 【编程题目】数值的整数次方——关于代码完整性及错误处理方式的探讨(C++实现)
- 百度和谷歌更新日期时间,让你网站收录加快以及排名上升
- moto & google笔试题目-STL/C++面试题
- 题目273 字母小游戏 时间限制:1000 ms | 内存限制:65535 KB 难度:0
- 【编程题目】打印1到最大的n位数——关于大数问题的探讨(C++实现)
- 题目:C++中两种常用的记录程序运行时间的方法的总结
- C++字符串编程面试题常见题目源程序
- PAT乙级1004题目:成绩排名 C++
- 【编程题目】二进制中1的个数——三种解法的探讨(C++实现)
- 【c++】面试题:----根据Unix时间戳计算时间
- 14-9-11 C/C++课程设计--图书馆管理系---<time.h>中时间数据类型的学习记录
- C++面试题目集合(持续跟新)
- 面试题13:在O(1)的时间删除链表结点
- c++面试题整理之常见问答题