C结构中定义函数

1. 函数指针
一般的函数指针可以这么定义:
int(*func)(int,int);
表示一个指向含有两个int参数并且返回值是int形式的任何一个函数指针. 假如存在这样的一个函数:
int add2(int x,int y)
{
return x+y;
}
那么在实际使用指针func时可以这样实现:
func=&add2; //指针赋值,或者func=add2; add2与&add2意义相同
printf("func(3,4)=%d\n",func(3,4));

事实上,为了代码的移植考虑,一般使用typedef定义函数指针类型.
typedef int(*FUN)(int,int);
FUN func=&add2;
func();

2.结构体中包含函数指针

其实在结构体中,也可以像一般变量一样,包含函数指针变量.下面是一种简单的实现.
#include "stdio.h"
struct DEMO
{
int x,y;
int (*func)(int,int); //函数指针
};
int add2(int x,int y)
{
return x+y;
}
void main()
{
struct DEMO demo;
demo.func=&add2; //结构体函数指针赋值
printf("func(3,4)=%d\n",demo.func(3,4));
}
上面的文件保存为mytest.c,在VC6.0和gcc4中编译通过.

3.结构体中的函数

既然C++在介绍类的时候说过,类是取代结构体的.可见结构体的功能并非我们平时用到的这么简单,没有太多人知道结构体中也可以有自己的函数成员.
举个例子:
#include "stdio.h"
struct DEMO
{
int m;

DEMO(int k) //构造函数
{
this->m=k;
printf("after init,m=%d\n",m);
}

void func()//一般函数
{
printf("function of struct.\n");
}
};

void main()
{
struct DEMO demo(33);
demo.func();
}

保存为mytest1.c , VC6.0和gcc编译都会出错. 这可能说明标准C是不支持结构体包括函数成员形式的(因为后缀.c使得VC或gcc选择c编译器). 但是如果将文件后缀改为.cpp(也就是选择c++编译),就不再有错误了,得到结果:
after init,m=33
function of struct.

也就是说,在C++中允许结构体包含函数成员,而标准C不支持. 进一步发现,c++中甚至允许结构体中含有构造函数、重载、public/private等等.这样看来,结构体真的与类越来越靠近相似了!

C++扩充了结构体的功能。但C++中为了介绍面向对象的类,却淡化了同样精彩的结构体。当我们写一些小程序而觉得没有必要去构造类的时候,选择结构体确实会方便很多.


========================================
函数指针的说明:

   已知函数指针定义声明 float (*h)();
   怎么理解语句? (*(void (*)())0)();
   这是一个C语句,表示(*p)(); 其中p指向0, 0被强制转换成(void (*)())格式。
   或者用typedef将上面式子分成两步:
   typedef void (*pFUNC)(); //pFUNC表示一种函数指针类型,这样的函数式void fun()形式.
   (*(pFunc)0)();

对于这一点,在unix编程signal方面用到过,如下:
    signal函数原型: void (*signal(int signo,void (*func)(int)))(int);
    其第二个参数func是一个void型函数指针(该函数参数为int),并且返回一个void型函数指针(该函数参数为int),简化这个定义, 可以typedef void Sigfunc(int); 然后signal函数原形写为 Sigfunc* signal(int,Sigfunc*);
     三个常量用于替代这样的指针。定义如下:
#define SIG_ERR (void (*)())-1
#define SIG_DFL (void (*)())0
#define SIG_IGN (void (*)())1

函数应用
if(signal(SIGUSR1,sig_func)==SIG_ERR)
    err_sys("can't catch SIGUSR1");

中断调用

 

C语言中有多个调用DOS和BIOS中断的语句,它们各有特色。下面以在屏幕坐标100,100处画一个点为例,逐一介绍。
一、asm语句
1、特点:
可以用来编写汇编语句,使程序更简捷。
2、例程:
main(){
asm{ //用的是Turbo C++的格式,Turbo C可以改成相应格式
mov ah,0;
mov al,0x12;
int 0x10;
mov ah,0x0c;
mov al,14;
mov cx,100;
mov dx,100;
int 0x10;
mov ax,0;
int 0x16;
}
}
二、int86语句
1、特点:
可以使用结构的量变REGS,REGS有输入和输出。
2、例程:
main(){
union REGS regs;
regs.h.ah=0;
regs.h.al=0x12;
int86(0x10;&regs,&regs);
regs.h.ah=0x0c;
regs.h.al=14;
regs.x.cx=100;
regs.x.dx=100;
int86(0x10,&regs,&regs);
regs.x.ax=0;
int86(0x16,&regs,&regs);
}
三、geninterrupt语句
1、特点:
可以直接使用C语言提供的寄存器_AX,_AH,_AL,_BX,_BH,_BL,_CX,_CH,_CL,_DX,_DH,_DL,_SI,_ES,_DI,_SS,_BP,_CS,_SP,_DS等。
2、例程:
main(){
_AH=0;
_AL=0x12;
geninterrupt(0x10);
_AH=0x0c;
_AL=14;
_CX=100;
_DX=100;
geninterrupt(0x10);
_AX=0;
geninterrupt(0x16);
}
四、另外还有int86x与intdos等,与上面几例大同小异,不再赘述。

堆与栈有什么区别

 

 

一、预备知识—程序的内存分配 
一个由c/C++编译的程序占用的内存分为以下几个部分 
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。 
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放 
4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放 
5、程序代码区—存放函数体的二进制代码。 

二、例子程序 
这是一个前辈写的,非常详细 
//main.cpp 
int a = 0; 全局初始化区 
char *p1; 全局未初始化区 
main() 

int b; 栈 
char s[] = "abc"; 栈 
char *p2; 栈 
char *p3 = "123456"; 123456在常量区,p3在栈上。 
static int c =0; 全局(静态)初始化区 
p1 = (char *)malloc(10); 
p2 = (char *)malloc(20); 
分配得来得10和20字节的区域就在堆区。 
strcpy(p1, "123456"); 123456放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。 

二、堆和栈的理论知识 
2.1申请方式 
stack: 
由系统自动分配。 例如,声明在函数中一个局部变量 int b; 系统自动在栈中为b开辟空间 
heap: 
需要程序员自己申请,并指明大小,在c中malloc函数 
如p1 = (char *)malloc(10); 
在C++中用new运算符 
如p2 = (char *)malloc(10); 
但是注意p1、p2本身是在栈中的。 
2.2 
申请后系统的响应 
栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。 
堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时, 
会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的delete语句才能正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。 
2.3申请大小的限制 
栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在 WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。 
堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。 
2.4申请效率的比较: 
栈由系统自动分配,速度较快。但程序员是无法控制的。 
堆是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便. 
另外,在WINDOWS下,最好的方式是用VirtualAlloc分配内存,他不是在堆,也不是在栈是直接在进程的地址空间中保留一快内存,虽然用起来最不方便。但是速度快,也最灵活 
2.5堆和栈中的存储内容 
栈: 在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈的。 
当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。 
堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容有程序员安排。 
2.6存取效率的比较 

char s1[] = "aaaaaaaaaaaaaaa"; 
char *s2 = "bbbbbbbbbbbbbbbbb"; 
aaaaaaaaaaa是在运行时刻赋值的; 
而bbbbbbbbbbb是在编译时就确定的; 
但是,在以后的存取中,在栈上的数组比指针所指向的字符串(例如堆)快。 
比如: 
#include <stdio.h> 
void main() 

char a = 1; 
char c[] = "1234567890"; 
char *p ="1234567890"; 
a = c[1]; 
a = p[1]; 
return; 

对应的汇编代码 
10: a = c[1]; 
00401067 8A 4D F1 mov cl,byte ptr [ebp-0Fh] 
0040106A 88 4D FC mov byte ptr [ebp-4],cl 
11: a = p[1]; 
0040106D 8B 55 EC mov edx,dword ptr [ebp-14h] 
00401070 8A 42 01 mov al,byte ptr [edx+1] 
00401073 88 45 FC mov byte ptr [ebp-4],al 
第一种在读取时直接就把字符串中的元素读到寄存器cl中,而第二种则要先把指针值读到edx中,在根据edx读取字符,显然慢了。 


2.7小结: 
堆和栈的区别可以用如下的比喻来看出: 
使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。 
使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。 

堆和栈的区别主要分: 
操作系统方面的堆和栈,如上面说的那些,不多说了。 
还有就是数据结构方面的堆和栈,这些都是不同的概念。这里的堆实际上指的就是(满足堆性质的)优先队列的一种数据结构,第1个元素有最高的优先权;栈实际上就是满足先进后出的性质的数学或数据结构。 
虽然堆栈,堆栈的说法是连起来叫,但是他们还是有很大区别的,连着叫只是由于历史的原因。

人类创造思维的语言——编程

 

“人们总是害怕改变。电被发明出来的时候他们害怕电,是不是?他们害怕煤,害怕蒸汽机车。无知无所不在,并导致恐惧。但随着时间推移,人们终究会接受最新的科技。”
 
正 如比尔盖茨曾经警告过一样,计算机已经真正成为我们的最新科技,几乎遍布我们日常生活的每一方面。所以,我们这个时代的某些最伟大的头脑开始思索起计算机 和软件对于人类的重要性来了。以下就是101条有关计算机的伟大名言,不得不说编程最能表达人类的思维的语言。
 
计算机
 
1、“计算机没什么用。他们只会告诉你答案。”——(巴勃罗·毕加索,画家)
 
2、“计算机就跟比基尼一样,省去了人们许多的胡思乱想。”——(萨姆·尤因,作家)
 
3、“他们拥有计算机,他们也还可能拥有其他的大规模杀伤性武器。”——(珍内特·雷诺,美国前女司法部长)
 
4、“跟计算机工作酷就酷在这里,它们不会生气,能记住所有东西,还有,它们不会喝光你的啤酒。”——(保罗·利里,吉他手)
 
5、“如果汽车能赶上计算机的发展周期的话,一辆今天的劳斯莱斯仅值100美元,每加仑要跑100万英里,每年还得爆炸一次,把里面的人杀个精光。”——(Robert X. Cringely,技术作家)
 
计算机智能
 
6、“计算机总是越来越智能的。科学家告诉我们说不久它们就能跟我们对话了。(这里的“它们”,我指的是“计算机”。我怀疑科学家永远都不能跟我们对话。)”——(Dave Barry,幽默作家)
 
7、“我最近注意到,在共同文化中,那种对计算机变得智能化并最终掌控世界的妄想恐惧症几乎彻底消失了。据我所知,这跟MS-DOS的发布基本是同步的。”——(Larry DeLuca)
 
8、“计算机会不会思考这个问题就像问潜水艇会不会游泳一样。”——(Edsger W. Dijkstra,图灵奖获得者)
 
9、“活了一百年却只能记住30M字节是荒谬的。你知道,这比一张压缩盘还要少。人类境况正在变得日趋退化。”——(Marvin Minsky,人工智能研究的奠基人)
 
信任
 
10、“这座城市的中央计算机告诉你的?R2D2,你不该相信一台陌生的计算机!”——(C3PO,星球大战中的翻译机器人)
 
11、“永远不要相信一台不能扔掉一扇窗户*的计算机”——(斯蒂夫·沃兹尼亚克,苹果联合创始人) *译者:暗指微软的wINDOWS操作系统
 
硬件
 
12、“硬件:计算机系统中可被踢的部分。”——(Jeff Pesis)
 
软件
 
13、“今天大部分的软件都很像上百万块砖堆叠在一起组成的埃及金字塔,缺乏结构完整性,只能靠强力和成千上万的奴隶完成。”——(阿伦·凯,图灵奖获得者,面向对象创始人)
 
14、“我终于明白‘向上兼容性’是怎么回事了。这是指我们得保留所有原有错误。”——(Dennie van Tassel)
 
操作系统
 
15、“有两样重要产品出自伯克利:LSD和BSD*。我们不相信这是个巧合。”——(Jeremy S. Anderson)
 
*译者:LSD是一种药力至强的迷幻剂,BSD-BSD(Berkeley Software Distribution,伯克利软件套件)是Unix的衍生系统
 
16、“2038年1月19日,凌晨3点14分07秒”——(UNIX中的世界末日*–1970年1月1号之后的2^32秒)
 
*译者:word跟world同音,UNIX用4个字节(WORD)表示时间,所以最多只能计时2^32秒
 
17、“每个操作系统都差不多… 我们都一样的烂。”——(微软的高级副总裁布莱恩·瓦伦蒂尼这样描述操作系统的安全状况,2003)
 
18、“微软有出了个新版本,Windows XP,据大家说是‘有史以来最稳定的Windows‘, 对我而言, 这就好像是在说芦笋是‘有史以来发音最清脆的蔬菜一样‘ “——(Dave Barry)
 
互联网
 
19、“互联网?那个东西还在吗?” ——(Homer Simpson)
 
20、“网络就像是个母夜叉。我每转到一处都会看见小个的按钮命令我提交。”——(Nytwind)
 
*译者注:Submit:提交,另一层意思是要求屈服
 
21、“想想看吧,已经有一百万只猴子坐在一百万台打字机旁,可Usenet就是比不上莎士比亚。”——(Blair Houghton)
 
软件产业
 
22、“计算机软件产业最为惊人的成就,是其持续不断地放弃硬件产业的惊人成果和稳定性。”——(Henry Petroski)
 
23、“真正的创新经常来自于那些贴近市场、但无力拥有市场的的小型初创公司。”——(Timm Martin)
 
24、“人们常说,伟大的科学学科就像是站在其它巨人肩膀上的巨人。人们也说过,软件产业正如站在其他侏儒脚上的侏儒。”——(Alan Cooper,交互设计之父)
 
25、“这无关比特、字节和协议,而关乎利润和损益。”——(郭士纳,IBM前CEO)
 
26、“我们是微软。反抗是徒劳的。你会被同化的。”——(保险杠贴纸)
 
软件演示
 
27、“不管演示在彩排的时候有多好,一旦在观众面前展示时,演示不出错的几率与观众人数成反比,与投入的金钱总额成正比。”——(Mark Gibbs)
 
软件专利
 
28、“专利大多数都是垃圾。浪费时间去阅读这些专利是愚蠢的。只有专利持有人才会这么干,还得强迫自己才会看。”——(Linus Torvalds,LINUX创始人)
 
复杂性
 
29、“控制复杂性是计算机编程的本质。”——(Brian Kernigan)
 
30、“复杂性杀死一切。它把程序员的生活给搞砸了,它令产品难以规划、创建和测试,带来了安全挑战,并导致最终用户和管理员沮丧不已。”——(Ray Ozzie)
 
31、“进行软件设计有两种方式。一种是让它尽量简单,让人看不出明显的不足。另一种是弄得尽量复杂,让人看不出明显的缺陷。”——(C.A.R. Hoare)
 
32、“好的软件的作用是让复杂的东西看起来简单。” ——(Grady Booch,UML创始人之一)
 
易用性
 
33、“不管那些计算机书籍如何宣称,只需记住,你并非‘傀儡’。真正的傀儡是那些无法设计出易于使用的硬件和软件的那些人,尽管他们是技术专家,因为这是普通消费者赖以生活的东西。”——(Walter Mossberg,科技专栏记者)
 
34、“软件供应商在努力尝试让他们的软件更‘易于操作’… 迄今为止,他们最好的办法就是翻出所有的老手册,然后在封面盖上‘易于操作’这几个字。”——(比尔·盖茨)
 
35、“有个老套的故事说有人希望他的计算机能像他的电话机一样好用。他的愿望实现了,因为我已经不知道该如何使用自己的电话了。”——(Bjarne Stroustrup,C++之父)
 
用户
 
36、“任何一个傻瓜都会用电脑。很多都会。”——(Ted Nelson)
 
37、“只有两个行业把客户称为‘用户’*。”——(Edward Tufte,信息设计大师)
 
*译者注:一个是计算机设计,另一个是毒品交易,computer design and drug dealing
 
程序员
 
38、“程序员在跟宇宙赛跑,他们在努力开发出更大更好的傻瓜程序,而宇宙则努力培养出更大更好的白痴。到目前为止,宇宙领先。”——(Rich Cook)
 
39、“你们当中很多人都知道程序员的美德。当然啦,有三种:那就是懒惰、急躁以及傲慢。”——(Larry Wall,Perl发明者)
 
40、“程序员的问题是你无法预料他在做什么,直到为时已晚。”——(Seymour Cray,超级计算机之父)
 
41、“那就是这些自认为痛恨计算机的人的真实面目。他们实际上真正痛恨的是糟糕的程序员。”——(拉瑞·尼文,科幻作家)
 
42、 “很长时间以来我一直困惑不已,为什么一些又贵又先进的东西会一点用都没有。直到我突然想起,计算机不就是一台愚蠢之至却拥有难以置信的做聪明事能力的机 器嘛,而程序员不就是聪明绝顶却拥有难以置信的干蠢事的能力的人嘛。一句话,他们简直就是天生绝配。”——(比尔·布莱森,旅游文学作家)
 
43、“不像学学涂涂画画也能让某人成为专家级画家,计算机科学教育不会让任何人成为一名编程大师。”——(埃里克·雷蒙,开源运动领袖)
 
44、 “一个程序员是经历以下事情后仍能证明自己是严格的专家的人:他可以历经数不清的捶打,可取材于无关紧要的文档,用上面的争议数据作出模糊假设,并以此计 算出测微精度的无数片面理解的答案,并由一个不可靠、脑袋充满质疑、公开宣称要让一个倒霉透顶、没有指望、毫无防备,要求第一时间获得信息的部门狼狈不 堪、令人生厌的人使用一台准确度有问题的仪器去实施。”——(IEEE网格新闻杂志)
 
45、“运气好的黑客能用几个月的时间 – 生产出一个小规模的开发团体(比如说,7-8人)历尽艰辛一起工作了一年多才能做出来的东西。IBM经常报告说某些程序员的生产力要比其它工人高百倍,甚至更多。”——(Peter Seebach,黑客)
 
46、“最好的程序员跟好的程序员相比可不止好那么一点点。这种好不是一个数量级的,取决于标准怎么定:概念创造性、速度、设计的独创性或者解决问题的能力。”——(兰德尔·E·斯特劳斯,科技作家)
 
47、“伟大的车工值得给他几倍于普通车工的薪水,但一个伟大的软件代码作家,其价值则要等同于一个普通的软件写手的价格的1万倍。”——(比尔·盖茨)
 
编程
 
48、“就算它工作不正常也别担心。如果一切正常,你早该失业了。” ——(Mosher的软件工程定律)
 
49、“靠代码行数来衡量开发进程就好比用重量来衡量飞机制造的进度。”——(比尔·盖茨)
 
50、“写代码的社会地位比盗墓的高,比管理的低。”——(杰拉尔·德温伯格,软件与系统思想家)
 
51、“首先学习计算机科学及理论。接着形成自己编程的风格。然后把这一切都忘掉,尽管改程序就是了。”——(George Carrette,杰出软件工程师,开源推广者)
 
52、“先解决问题再写代码。”——(John Johnson)
 
53、“乐观主义是编程行业的职业病;用户反馈则是治疗方法。”——(Kent Beck)
 
54、“迭代者为人,递归者为神。”——(L. Peter Deutsch)
 
55、“布尔值最好的一点是,就算你错了,也顶多错了一位而已。”——(无名氏)
 
56、“数组的下标是从0开始好还是从1开始好呢?我的0.5的折衷方案,以我之见,没有经过适当考虑就被否决掉了。”——(Stan Kelly-Bootle)
 
编程语言
 
57、“只有两种编程语言:一种是天天挨骂的,另一种是没人用的。”——(Bjarne Stroustrup,C++之父)
 
58、“PHP是不合格的业余爱好者创建的,他们犯做了个小恶;Perl是娴熟而堕落的专家创建的,他们犯了阴险狡诈的大恶。”——(Jon Ribbens)
 
59、“COBOL的使用摧残大脑;其教育应被视为刑事犯罪。”——(E.W. Dijkstra)
 
60、“把良好的编程风格教给那些之前曾经接触过BASIC的学生几乎是不可能的。作为可能的程序员,他们已精神残废,无重塑的可能了。”——(E. W. Dijkstra)
 
61、“我想微软之所以把它叫做.Net,是因为这样它就不会在Unix的目录里显示出来了。”——(Oktal)
 
62、“没有一种编程语言能阻止程序员写出糟糕的程序来,不管这种语言结构有多良好。”——(Larry Flon)
 
63、“计算机语言设计犹如在公园里漫步。我是说侏罗纪公园。”——(Larry Wall)
 
C/C++
 
64、“搞了50年的编程语言的研究,我们难道就以C++告终啦?”——(Richard A. O’Keefe)
 
65、“写C或者C++就像是在用一把卸掉所有安全防护装置的链锯。”——(Bob Gray)
 
66、“在C++里你想搬起石头砸自己的脚更为困难了,不过一旦你真的做了,整条腿都要报销。”——(Bjarne Stroustrup)
 
67、“C++ : 友人可造访你的私有成员之地也。”——(Gavin Russell Baker)
 
译 者:Friends:C++的友元,是一种定义在类外部的普通函数,但它需要在类体内进行说明,为了与该类的成员函数加以区别,在说明时前面加以关键字 friend。友元不是成员函数,但是它可以访问类中的私有成员。友元的作用在于提高程序的运行效率,但是,它破坏了类的封装性和隐藏性,使得非成员函数 可以访问类的私有成员。
 
68、“罗马帝国灭亡的其中一个主要原因是他们没有0 – 这样他们就没法给自己的C程序指明成功退出的路径了。”——(Robert Firth)
 
Java
 
69、“Java从许多方面来说就是C++–。”——(Michael Feldman)
 
70、“说Java好就好在运行于多个操作系统之上,就好像说肛交好就好在不管男女都行。”——(Alanna)
 
71、“好吧,Java也许是编程语言的好榜样。但Java应用则是应用程序的坏榜样。”——(pixadel)
 
72、“要是Java真的有垃圾回收的话,大部分程序在执行的时候就会把自己干掉了。”——(Robert Sewell)
 
开源
 
73、“软件就像性事:免费/自由更好。”——(Linus Torvalds)
 
74、“唯一对免费软件感到害怕的人,是自己的产品还要不值钱的人。”——(David Emery)
 
代码
 
75、“好代码本身就是最好的文档。”——(Steve McConnell)
 
76、“你自己的代码如果超过6个月不看,再看的时候也一样像是别人写的。”——(伊格尔森定律)
 
77、“前面90%的代码要占用开发时间的前90%。剩下的10%的代码要占用开发时间的另一90%。”——(Tom Cargill)
 
软件开发
 
78、“好的程序员会用脑,但是好的向导救我们于样样都要想到。”——(Francis Glassborow)
 
79、“在软件里面,我们鲜有有意义的需求。就算有,衡量成功的唯一尺度也取决于我们的解决方案是否解决了客户对问题是什么的观念的转变。”——(Jeff Atwood)
 
80、“想想我们计算机程序的糟糕现状吧,很显然软件开发仍是黑箱艺术,还不能称之为工程学科。”——(Bill Clinton,前美国总统)
 
81、“没有伟大的团队就没有伟大的软件,可大部分的软件团队举止就像是支离破碎的家庭。”——(吉姆·麦卡锡,微软VC++总监)
 
调试
 
82、“一旦我们开始编程,就会惊讶地发现让程序正常没想象中那么简单。调试不可避免。那一刻我认记忆犹新,当时我就意识到,从今往后我生活的大部分时间都要花在寻找自己程序的错误上面了。”——(莫里斯·威尔克斯 调试探索, 1949)
 
83、“调试难度本来就是写代码的两倍。因此,如果你写代码的时候聪明用尽,根据定义,你就没有能耐去调试它了。”——(Brian Kernighan)
 
84、“如果调试是除虫的过程,那么编程就一定是把臭虫放进来的过程。”——(Edsger W. Dijkstra)
 
质量
 
85、“我才不管它能不能在你的机器上运行呢!我们又没装到你的机器上!”——(Vidiu Platon,罗马尼亚的微软最佳学生合作伙伴MSP)
 
86、“编程就像性一样:一时犯错,终生维护。”——(Michael Sinz)
 
87、“有两种写出无错程序的办法;只有第三种有用。”——(Alan J. Perlis)
 
88、“软件质量与指针算法不可兼得。”——(Bertrand Meyer)
 
89、“如果麦当劳像软件公司那样运作的话,每一百个巨无霸就会有一个令你食物中毒,而他们的回应是,‘真对不起,这是一张额外附送两个的赠券。’ “——(Mark Minasi)
 
90、“永远要这样写代码,好像最终维护你代码的人是个狂暴的、知道你住在哪里的精神病患者。”——(Martin Golding)
 
91、“是人都会犯错,不过要想把事情彻底搞砸还得请电脑出马。”——(Paul Ehrlich)
 
92、“计算机比人类历史上的任何发明都更快速地导致你犯更多的错误–可能除了手枪和龙舌兰酒是例外。”——(Mitch Radcliffe)
 
预测
 
93、“能发明的东西都发明出来了。”——(查尔斯·杜埃尔, 美国专利局局长,1899年)
 
94、“我认为全球市场约需5台计算机。”——(托马斯·沃森, IBM董事长, 约1948年)
 
95、“看上去我们已经到达了利用计算机技术可能获得的极限了,尽管下这样的结论得小心,因为不出五年这听起来就会相当愚蠢。” ——(约翰·冯·诺伊曼,约1949年)
 
96、“但这又有什么好处呢?”——(IBM先进计算机系统部的工程师对微芯片的评论, 1968年)
 
97、“我们没有理由让每一个人在家都拥有一台电脑。”——(肯·奥尔森,数据设备公司(DEC)总裁,1977年)
 
98、“640K对每一个人来说都已足够。”——(比尔·盖茨,1981年)
 
99、“Windows NT的RAM寻址空间可达2G,这比任何应用程序所需都要多。” ——(微软, 谈及Windows NT的开发时所言, 1992年)
 
100、“我们永远也无法真正成为无纸化社会,直到掌上电脑一族发布擦我1.0*(WipeMe 1.0)为止。”——(安迪?皮尔逊,商界领袖)
 
*译者注:意思是说难道你大便不用纸吗?
 
101、“长此以往,除了按键的手指外,人类的肢体将全部退化。”——(弗兰克?劳埃德?赖特,建筑师)

黑客该学什么程序语言

 

1、web page script languages 
    就是网页代码,比如Html、javascript、Css、Asp、Php、Xml都应该属于此类(照蔡的意思,Html不应该属于anguages的,可能他觉得太简单了吧,不过我觉得Html也应该算的,大家爱听谁的就听谁的好了,这个不重要) 
  2、Interpreted Languages(解释型语言) 
    包括Perl、Python、REBOL、Ruby等(后面三个听豆没听过),也常被称作Script语言,通常被用于和底下的操作系统沟通。照蔡的意思,每个人至少应该学会一套这类的语言。这类语言的缺点是效率差、源代码外露——所以不适合用来开发软件产品,一般用于网页服务器。 
  3、Hybrid Laguages(混合型语言) 
    代表是JAVA和C#。介于解释型和编译型之间。蔡认为C#是.NET最重要的语言,值得期待其后续发展;至于JAVA,蔡叫看他的《Sleepless in Java》——我倒! 
  4、COMPILING Languages(编译型语言) 
    C/C++,JAVA都是编译型语言。蔡说C++很复杂,要成为高手没三五年是不行的(就凭这句话,我决定向JAVA投降),虽然如此,但真正要成为高手的都应该懂C/C++。 
    关于Delphi,蔡说如果想要跨Linux和Windows平台的语言,则Delphi似乎是最好的选择。 
  5、Assembly Languages(汇编语言) 
    汇编语言是最接近于硬件的语言,不过现在几乎没多少人用了。 
  程序语言学习顺序建议 
    如果完全没有程序经验,可照这个顺序:javascript——解释型语言——混合型语言——编译型语言——汇编(如果需要的话) 
    用业界流行一句话做结尾“真正的程序员用C++,聪明的程序员用Delphi”,那么,什么样的程序员用JAVA呢? 
  虚怀若谷题外话 
    看在我这么晚了还这么辛苦的敲字的面子上,看到这篇帖子的朋友给点掌声吧,虽然没什么自己的思想。 
    另外,本文完全据蔡学镛先生同名文章精简,所以如果这篇文章给你的程序员生涯有什么不好的作用,那我不介意你去扁他。当然如果这篇文章对你有什么积极影响,我很高兴你能请我吃大餐。 
如果您想学习编程,却又不知从何入手,那么您不妨看看下面的几种学习方案,可能会给您一些启示吧! 
    方案一 Basic语言 & Visual Basic 
    优点 
    (1)Basic 简单易学,很容易上手。 
    (2)Visual Basic 提供了强大的可视化编程能力,可以让你轻松地做出漂亮的程序。 
    (3)众多的控件让编程变得象垒积木一样简单。 
    (4)Visual Basic 的全部汉化让我们这些见了English就头大的人喜不自禁。 
    缺点 
    (1)Visual Basic 不是真正的面向对象的开发文具。 
    (2)Visual Basic 的数据类型太少,而且不支持指针,这使得它的表达能力很有限。 
    (3)Visual Basic 不是真正的编译型语言,它产生的最终代码不是可执行的,是一种伪代码。它需要一个动态链接库去解释执行,这使得Visual Basic 的编译速度大大变慢。 
    综述:方案一适合初涉编程的朋友,它对学习者的要求不高,几乎每个人都可以在一个比较短的时间里学会vB编程,并用VB 做出自己的作品。对于那些把编程当做游戏的朋友来说,VB 是您最佳的选择。 
    方案二 Pascal语言 & Delphi 
    优点 
    (1)Pascal语言结构严谨,可以很好地培养一个人的编程思想。 
    (2)Delphi是一门真正的面向对象的开发工具,并且是完全的可视化。 
    (3)Delphi使用了真编译,可以让你的代码编译成为可执行的文件,而且编译速度非常快。 
    (4)Delphi具有强大的数据库开发能力,可以让你轻松地开发数据库。 
    缺点 
    Delphi几乎可以说是完美的,只是Pascal语言的过于严谨让人感觉有点烦。 
    综述: 方案二比较适合那些具有一定编程基础并且学过Pascal语言的朋友。 
    方案三 C语言 & Visual C++ 
    优点 
    (1)C语言灵活性好,效率高,可以接触到软件开发比较底层的东西。 
    (2)微软的MFC库博大精深,学会它可以让随心所欲地进行编程。 
    (3)VC是微软制作的产品,与操作系统的结合更加紧密。 
    缺点 
    对使用者的要求比较高,既要具备丰富的C语言编程经验,又要具有一定的WINDOWS编程基础,它的过于专业使得一般的编程爱好者学习起来会有不小的困难。 
    综述: VC是程序员用的东西。如果你是一个永不满足的人,而且可以在编程上投入很大的精力和时间,那么学习VC你一定不会后悔的。 
    方案四 C++语言 & C++ Builder 
    优点 
    (1)C++语言的优点全部得以继承。 
    (2)完全的可是化。 
    (3)极强的兼容性,支持OWL、VCL和MFC三大类库。 
    (4)编译速度非常快。 
    缺点 
    由于推出的时间太短,关于它的各种资料还不太多。 
     综述:我认为C++ Builder 是最好的编程工具。它既保持了C++语言编程的优点,又做到了完全的可视化。 
    方案五 SQL语言 & Power Builder 
    对于一些传统的数据开发人员来说,Foxpro系列也许让他们感到更加熟悉。但是对于初学者来说,PowerBuilder也许是最好的数据库开发工具。各种各样的控件,功能强大的PowerBuilder语言都会帮助你开发出自己的数据库应用程序。 
补充:关于网页后台语言和其他语言的关系,一般认为: 
C语言学的好,那么学习PHP会有事半功倍的效果 
VC学的好,那么学习ASP会有事半功倍的效果 
JAVA学的好,那么学习JSP、JAVASCRIPT会有事半功倍的效果 
关于网页后台语言和数据库,通常来说: 
PHP与MYSQL是黄金搭档 
ASP小型网站用ACCESS,大型用SQL 
JSP我就不知道了 
关于电子商务流行的语言,目前 
当当、卓越、6688、igo5、雅宝使用的是asp语言 
易趣、淘宝使用的是php语言 
贝塔斯曼使用的是jsp语言 
4、至少学会以下的其中两种: 
一、网站服务器程序ASP、PHP、CGI、JSP 
我个人认为CGI是最难学的其中一种。 
二、程序语言:C语言、C++、VB、JAVA、PERL、DELPHI、汇编语言 
不过我认为C语言的通用性最好,可以跨平台(操作系统)使用。 
还要试着自己写程序、开发软件等工作。 
三、数据库管理软件:MYSQL、SQL、FOXPRO……等。 
四、几种常用的操作系统:WIN98、WIN2000、WINNT、WINXP、UNIX、LINUX、要是能学到UNIX那是最好不过的了。最最基本的WIN2K、WINNT也要学会吧。 
如果以上的你都会了,那么你已经是个高手了。 

C和汇编嵌入

 

这是个简单例子:
/* C语言程序:a1.c */
  extern asub();
  main()
  { asub(); /* 调用汇编语言子程序 */
  }
  csub(char * str) /* C语言函数,str是地址参数 */ { printf("%s\n",str);
  }
  ; 汇编语言程序:a1s.asm
  .model small,c
  extern csub:near
  .data
  astring db ’OK, Assembly !’,0dh,0ah,’$’
  cstring db ’Good, Turbo C 2.0 !’,0
  .code
  PUBLIC asub
  asub proc
  mov dx,offset astring ;汇编语言子程序显示信息
  mov ah,09h
  int 21h
  mov ax,offset cstring ;得到字符串的偏移地址
  push ax ;压入调用参数
  call csub ;调用C函数
  add sp,2 ;平衡堆栈
  ret
  asub endp
  end