游戏开发论坛

 找回密码
 立即注册
搜索
楼主: typ77

程序面试试题(节选)

[复制链接]

1

主题

78

帖子

82

积分

注册会员

Rank: 2

积分
82
 楼主| 发表于 2006-11-16 10:06:00 | 显示全部楼层

Re: Re:程序面试试题(节选)

ddoq2008: Re:程序面试试题(节选)

新手一个试着来回答一下 楼主看对不?大家也给打个分,不及格再重新修炼
1.#define为编译器预处理,define...

呵呵~~貌似答得还不错,但是个人感觉还不是很全面。因为没有答案,所以我也只能靠我自己的经验和知识来说说。

这里只说1和3题。
第一题,感觉7楼答的怪怪的。不是很全面。#define是在C语言里的预定义,而const是C++的常量定义。
#define不单可以定义常量,还可以定义公式。但是一般在C++中不用来定义常量,而是用const。原因就是因为每次调用#define都会给它分配一次空间(调用10次分配10个空间)。而且其定义的常量是没有数据类型的,被称为不安全。。。

第三题,据我所了解。匈牙利命名法,其命名规则和其命名长度都是比较复杂和长的。不容易被人所记住。而我们现在所用的匈牙利命名法都是其简化版本。优点就是被世人所认识,多人用。。。而对程序编写能统一写法之类的


1

主题

78

帖子

82

积分

注册会员

Rank: 2

积分
82
 楼主| 发表于 2006-11-16 10:13:00 | 显示全部楼层

Re: Re:程序面试试题(节选)

lwevil: Re:程序面试试题(节选)

strlen题目没有意思,怀疑出题人水平!

strlen有什么高校实现?? 实在想不出来!linux kernel src里也是...

这个题目是靠算法的问题。如果连你认为这么简单的算法也不能写出来,到底是你水平问题还是出题人水平问题呢?
----------------------------------------------------------------------------------------
如果你愿意去研究一下,你就会发现这些所谓经典的算法是多么有趣的。而这些有趣的东西可能是我们自己无法想到的。学习别人的思想也是一种提升

15

主题

129

帖子

129

积分

注册会员

Rank: 2

积分
129
QQ
发表于 2006-11-16 10:56:00 | 显示全部楼层

Re:程序面试试题(节选)

每次调用#define都会给它分配一次空间
这倒是不知道,又学了招。
C++里面指出只为定义变量和小型函数时最好就不用,有其他的法子可以更好的代替。不过我最近写一个库的时候却碰到了一个稀奇古怪的事情,在一个Global.h的文件里面定义了templete<class T> Release(T t)
{
if(t) {t->Release();t=0}
}
这是个游戏中很常用的,可实际调用的时候却不一定成功。我郁闷呃,后来改了半天,全部在cpp文件里面用define定义函数,然后再把Global.h里面的这个去掉了。到现在还没想明白~

52

主题

637

帖子

1420

积分

金牌会员

Rank: 6Rank: 6

积分
1420
发表于 2006-11-16 12:02:00 | 显示全部楼层

Re:程序面试试题(节选)

#define 增加分配空间? 这编译器什么牌子的阿?这么强

#define怎么可能分配空间呢? 它的符号仅仅在预编译阶段有效,编译完后都成"查找替换"了,map文件里面找不到, debug时候用watch也没的看.

const才会增加分配空间,而且也分情况

全局的const跟define一样,不增加分配空间

局部的const增加分配空间, 而且其const 有作用域

#define无所谓的作用域,无论放在哪都不占分配空间

int test()
{
#define ddff 20
    int ff= ddff;
}

void aaa()
{
    int ddd= ddff;
}

这个是正确的

1

主题

78

帖子

82

积分

注册会员

Rank: 2

积分
82
 楼主| 发表于 2006-11-16 12:11:00 | 显示全部楼层

Re: Re:程序面试试题(节选)

neelkey: Re:程序面试试题(节选)

#define 增加分配空间? 这编译器什么牌子的阿?这么强

#define怎么可能分配空间呢? 它的符号仅仅在预编译...

郁闷呀~~~~郁闷的想死。估计你是学C语言太多了。我现在是说C++,请再次注意是 C++
在一定程度上,#define是没有分配到空间。但是我是说每次调用的时候,编译器都会为其分配一个储存空间(具体的请自己看C++之类的书籍)。而const是在定义时分配一次空间。简单来说,其内存空间只占用一个。而不会重复创建内存空间。

52

主题

637

帖子

1420

积分

金牌会员

Rank: 6Rank: 6

积分
1420
发表于 2006-11-16 12:15:00 | 显示全部楼层

Re:程序面试试题(节选)

另外一方面, #define 比 const 更灵活, 是优点也是缺点,define不代表它一定是个常量,有可能#define的是个变量!千万不能认为看见一个define就以为它是常量了.

比如我可以这样用

#define num 100;
int bbb= num;

#pragma push_macro("num")
#undef num
#define num 88888

int ccc = num;

#pragma pop_macro("num")

int ddd = num;

52

主题

637

帖子

1420

积分

金牌会员

Rank: 6Rank: 6

积分
1420
发表于 2006-11-16 12:22:00 | 显示全部楼层

Re:程序面试试题(节选)

另外const也能干很多define 不能干的事情,因此说#define定义公式什么的就很没意思.把define能干而const不能干的,和const能干而define不能干的都列举出来差不多是本说明书了

52

主题

637

帖子

1420

积分

金牌会员

Rank: 6Rank: 6

积分
1420
发表于 2006-11-16 12:26:00 | 显示全部楼层

Re:程序面试试题(节选)

另外还有个重定义的问题

const int x= 100;
void tt()
{ const int = 100 ; if(1) {const int = 100 ;}}

这么写完全没问题

如果用define ,会有警告

20

主题

465

帖子

472

积分

中级会员

Rank: 3Rank: 3

积分
472
QQ
发表于 2006-11-16 12:33:00 | 显示全部楼层

Re:程序面试试题(节选)

我是惨了,基础从来就不重视的,虽然我在程序中使用了面向对象技术,对OO也有深刻的理解,不过我有时候写虚函数的时候还是搞不清楚那个关键字怎么写(那个vis...什么的),反正没记下来。
我的观点就是记住对自己有用的东西,其它的东西只要记住概念,等要用的时候就去查。所以像我这种人考试就最不行了,不想成为考试(好像应该叫应试教育应试评价)的牺牲品的话,就只有拿出自己的作品了。
LZ的题一个都答不上,但是那些东西都在程序中使用过。哦,匈牙利标记以前用的,现在不用了。

20

主题

465

帖子

472

积分

中级会员

Rank: 3Rank: 3

积分
472
QQ
发表于 2006-11-16 12:45:00 | 显示全部楼层

Re:程序面试试题(节选)

#define 增加分配空间不是他本身的作用,比如说

#define xxx (300)

void main(void)
{
int x = xxx * xxx * xxx;
}

这种写法和
void main(void)
{
int x = 300 * 300 * 300;
}
这种写法是没有区别的。问题就在这里了,三个300虽然值是一样,但是存储的空间是不一样的,也就是说要3个单位的存储空间。#define 中使用的常量越多,空间就越多。因为每个都被替换成了数字,而每个数字要分配不同的存储空间。

而写成
const int xxx = 300;
void main(void)
{
int x = xxx * xxx * xxx;
}

这样的话,三个xxx都使用的同样一个存储空间,所以不管使用多少次,存储空间都不会增加。就是这个原因。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-25 22:13

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表