当岁月积淀,留下了睿智与淡定
  • 2011-04-27

    《高质量程序设计指南》 - [C/C++]

    差不多半年前做的一个笔记。现收集在这里。

    这里,我并没有对这本书做主客观的一些评价,但这是一本好书。对于不熟悉的知识点,我做下读书笔记。

    在图书馆借书的时候,无意间想起林锐的《高质量C++/C程序设计》,于是在图书馆中搜索,发现找不到,后来还是通过在搜索条件中从责任者中搜林锐才找出,一看才知道原来这本书叫《高质量程序设计指南》,只不过大家都喜欢称它《高质量C++/C程序设计》罢了。快速看了一下简介,提到的书后附的林锐博士的《大学十年》,特别吸引我。遂花了一两个小时读完了这篇短篇小说,林锐博士精彩的大学十年,奋斗的十年,多样的十年,看的我一腔热血,一身无奈。热血的是人生原来可以如此精彩如此充实,无奈的是感叹自己大学期间读的书太少,学海茫茫,要走的路还有很长。看完《大学十年》,我就知道,这本书这几天我必定读完它。我知道,以后,我会像林锐博士一样,努力做一个真实、正直、优秀的人。我知道,我需要恶补的知识太多、太多。

    文中较为经典的一段:“不少人曾对我说:你是做大事的人,不要在小事上浪费精力,更不要为了别人而贻误了自己。

    很多人总以为自己将来是伟大人物而不愿做小事,从而到死也没做成什么有价值的事。也有很多人希望自己成功后再去帮助别人,无论他最终成功还是失败,一辈子也没有帮助过人。还有很多人略有权势或略有名气后,便觉得自己吃喝玩乐、放屁、上厕所都是重要的事,在他们最能够帮助别人的时候却以“太忙”“没空”为理由不去做好事。

    我也在忙碌、在奋斗,也渴望成为伟大人物,但我希望让有意义的小事充实一生。

    我还要讲另一件我常干的小事。

    很多受过高等教育的人保留了随地扔垃圾的“风俗习惯”,这恶习就像脚气那样虽然不置人死地,但能遗臭万年。即便像浙江大学这等风雅的地方,你都经常可以看见草坪、校门口的废纸、果皮和塑料袋等,垃圾就如同天使脸上的一坨狗屎那样鲜艳,人们竟然无动于衷。我记不清自己多少次当众、当道捡垃圾,可是几年来我都没有在大学里发现第二个做这种事的人。

    我很想讲句话:救人并不只是医生干的事,保护环境也不只是清洁工干的事。只要你多花几秒钟,弯几次腰,就能让环境更加清洁,让心灵更加清洁。我们不必个个道貌岸然,但至少应该坐到“读书明理”。”

    书中提到的,而自己还不足欠缺的一些知识点,做个笔记吧,就当作对自己的犒赏,虽然我不喜欢做笔记,但这个习惯早晚需要改变,没错,就是这个时候。

     

    1.基本数据类型之间的指针转换一般说来必然会造成内存截断或内存访问范围的扩张,除非两种类型具有相同的字节大小。

    示例:

    Double d5=1000.35;

    Int *pInt=(int *)&d5;

    Int i4=100;

    Double *pDbl=(double *)&i4;

    从内存访问角度来说,通过Pint访问它指向的double类型变量d5是安全的(可访问内存范围缩小),但是其值是位于d5开头4个字节中的内容,并解释为int类型数,这个数是不可预料的;同样通过pDbl访问int类型变量i4,得到的数据不一定就是100,况且造成了可访问内存范围的“扩张”,比int*多访问了4个字节。如果往里写数据就会产生运行时错误。

    2.在多重嵌套循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,这样可以减少CPU跨切循环层的次数,从而优化程序的性能。

    示例:

    For(i=0; i<N; ++i)                                  if(condition)

    {                                               {

    If(condition)                                      for(i=0; i<N; ++i)

        DoSomething();                                   DoSomething();  

    else                                         } else      

        DoOtherthing();                           {

    }                                                   for(i=0;i<N;++i)

                                                            DoOtherthing();

                                                    }

    3.goto语句至少有一处可显神通,它能从多层嵌套的循环体中嗖地一下子跳到外面,用不着写很多次的break语句,从而提高了效率。

    示例:for(…)

          {

              for(…)

              {

                  for(…)

                  {

                   

                    goto error;

    }

              }

          } 

    4.在标准C语言中,const符号常量默认是外连接的(分配存储),也就是说你不能在两个(或两个以上)源文件中同时定义一个同名的const符号常量(重复定义错),或者把一个const符号常量定义放在一个头文件中而在多个源文件同时包含该头文件。当在不同的源文件中同时包含该头文件时,编译器认为它们是不同的符号常量,因此每个编译单元独立编译时会分别为它们分配存储空间,而在连接时进行常量折叠。

    5.可以取一个const符号常量的地址:对于基本数据类型的const常量,编译器会重新再内存中创建它的一个拷贝,通过其地址访问到的就是这个拷贝而非原始符号常量。

    示例:

    const long lng=10;

    long *pl=(long *)&lng; //强制转换,出去常量性

    *pl=1000;  //

    cout<<*pl<<endl;  //1000,修改的是拷贝

    cout<<lng<<endl;  //10,原始常量并没有变

    6.狭义的“回调函数”就是由用户来实现,而由系统帮你安排调用的函数,这是与API函数或库函数不同的地方。回调函数最典型的例子是系统定时器回调函数和线程函数。首先为一个定时器注册一个回调函数,当定时器每次超时的时候系统就会自动触发对这个回调函数的调用。普通函数使用的是函数堆栈,线程函数使用的是线程的堆栈。

    7.如果一个标识符能够在其它编译单元和在定义它的编译单元中的其他范围内被调用,那么它是外连接的。外连接的标识符需要分配运行时的存储空间。非静态的全局函数和全局变量是外连接的。而全局的ADT/UDT定义是内连接的,即在其它编译单元中不能被调用。

     

    8.rigister定义的变量会被直接加载到CPU寄存器中,把那些经常使用的变量例如循环计数器等直接放到CPU寄存器中可以避免在寄存器和内存之间频繁的数据交换,因此能够提高程序的运行效率。现在一些聪明的编译器,它们会对程序中出现的变量进行使用频率的评估,把使用频率较高、体积较小的变量放入CPU寄存器中,因此一般情况下不需要程序员显示地使用register说明符。

    9.请给assert语句加注释,告诉人们assert语句究竟要干什么。

    10.如果参数用于输出,不论它是什么数据类型,也不论它采用“指针传递”还是“引用传递”,都不能加const修饰,否则该参数将失去输出功能。const只能修饰输入参数。

    11.标准C++/C不会对用户访问数组是否越界进行任何检查,无论是静态的(编译时)还是动态的(运行时)检查。为什么?

    理论上讲,C++/C可以在运行时进行数组的越界访问检查,这是因为数组大小的信息保存在程序中的某个地方,一般就是放在数组第一个元素位置的前面,占用一个int变量的字节数,它的地址为a-sizeof(int)。但是如果在每次访问数组元素的时候都要去这个地方取数组的大小并与下标值比较,这会极大地增加运行时开销(增加了代码长度和运行时时间)。另外,C++/C允许通过同类型指针来访问数组的每一个元素,此时又如何确定指针是否越界了呢?显然,毫无办法。所有C++/C不对用户访问数组是否越界进行任何检查。

    12.数组不能从函数的return语句返回,但是数组可以作为函数的参数。

    13.对于多维数组作为参数传递给函数时,必须指出除第一维之外的所有维的长度。并且,C++/C并不是像一维数组那样可以简单地转换为同类型指针,而是转换为与其等价的数组指针。例如int a[m][n]就转换为int (*a)[n]。以二维数组为例,示例:

    void output(const int a[][20], int line)

    {

    for(int i=0; i<line; i++)

    {

        for(int j=0; j<20; j++)

    {

    }

    }

    }

    //main

    int x[10][20]={ {100} };

    output(x,10);

    14.数组默认按地址传递,如果想按值传递,可以封装到结构或类当中,因为结构和类默认是按值传递。

    15.可以通过函数指针数组实现同类型函数的批量调用。在C++中的虚拟机制中使用的vtable就是一个用来保存虚成员函数的地址的函数指针数组。

    示例:

    double (*fp[5])(double)={ sqrt,fabs,cos,sin,exp };

    for(int k=0; k<5; k++)

    {

        cout<<”Result:”<<fp[k](10.25)<<endl;

    }

    16.不允许使用指针类型或浮点类型作为位域的成员类型,因为它们可能导致无效的值。signed int类型数据的正负符号要占用一个bit,因此该类型的位域成员长度应该至少为2

    17.可以定义长度为0的位域成员,其作用是迫使下一个成员从下一个完整的机器字(WORD)开始分配空间。示例:

    struct DateTime

    {

    unsigned int day:5;

    unsigned int :0;

    unsigned int hour:5;

    };

    cout<<sizeof(DateTime)<<endl;  //8

    18.当源文件用#include包含一个头文件的时候,编译预处理器用头文件的内容取代#include伪指令。这就是说,头文件的所有内容最终都会被合并到某一个或某几个源文件中。

    19使用前置声明的好处是,不需要再编译这个文件时再处理包含的头文件,这样可以节省编译时间。不过在使用前置声明时该文件里只能存在声明的类的指针或引用,也就是说不需要为这个类的对象在编译期分配内存,这样就不需要了解对象的具体定义了。提供前向声明的目的就是要让编译器知道怎么解释B这个符号。如果已包含的头文件里已经有了B这个类的声明,那当然就不需要再声明一次了。不过,有时候你不一定能确定头文件里是否包含了你需要的声明,那就再声明一次好了。反正C++允许多次声明。另外,出现前向声明一般都是因为两个类需要互相包含,而这种情况通常可以通过重新设计类之间的关系来避免。

    20.如果程序中需要内联函数,那么内联函数的定义应当放在头文件中,因为内联函数调用语句最终被扩展开来而不是采用真正的函数调用机制。

    Tag:
  • 2011-04-10

    三十而立 - [生活]

    刚从linki博客上看到这篇“三十而立”,原文链接如下:http://blog.sciencenet.cn/home.php?mod=space&uid=5275&do=blog&id=431414。颇有感觉,就像一股青烟,冉冉升起。成功总是青睐坚持的那群人的。不过,我们并不是太喜欢“成功”这个字眼,分量太重,太轻。

    在学校的日子就要结束,最后的2个月,唔,我会干些什么呢?

    可能,可能真的也没法做多少事情了,让我理一理思路:

    1.读完《C专家编程》,并做好笔记。

    2.4月份认真完成实验,写好论文。

    3.如果可以,还想去旅游一趟。但不知能否实现,到时候再看看。

    4.顺利拿到毕业证、学位证,这是最重要的,当然还得拿下驾照。

    5.《敏软》可能读不完了,唉,炸弹啊炸弹。只能工作了再补了。

    努力学习,修炼情操,30岁,我一定要“而立”!

    Tag:
  • 2010-02-07

    百慕大三角 - [生活]

    我承认我标题党了,我不是来科学研究百慕大三角现象的。我昨天终于把电影《百慕大三角》看了,之前朋友极力推荐,可惜PPStream上没有,所以拖到昨晚才看。本人阅好片不少,这部确实不错。我想,以后向友人推荐电影时,我又能再加上这部,而不仅仅是《生死狙击》和《八面埋伏》,亦或是《霸王别姬》了。

    电影大致讲述的是,一位亿万富翁拿出一笔诱人的资金组织一个由无神论专家,新闻记者,航海专家,科学家,心里学家和医学专家组成的分队,试图前往神秘的百慕大魔鬼三角洲调查其原因,发生了一系列诡异的事件。
    --What is science?
    --Evidence through observation.
    这是影片唯一让我影响至深的台词了。所谓科学,眼见为实。但是,小分队成员们却出现了各种幻觉,其实不能简单的说是幻觉,比较诡异,使得眼见并不为实。所以科学便无法解释,因此,有了超自然一说。其实,我并不是要解释科学跟超自然的异同,还没这么深入,只是顺便提到,随便聊聊。我们不得不佩服美国导演们的想象力,磁场、轮回、穿梭、突变,拍的就像是部纪实片,让你觉得,这。。一切皆有可能。

    我是如此着迷,以至于睡意全无,接着又看了《王牌对王牌》,直至凌晨4点。早上7点35分起床,收拾,回家。

    最近喜欢一首歌,陈小春《独家记忆》。

    Tag:百慕大
  • 2010-02-06

    Ⅱ零①〇 - [生活]

    外面正下着雨,今天应该是牛年在学校的最后一天了,明天的车票。

    中午强刚走,泉州旅行,现在应该到了吧,天公不作美,刚走就来了场大雨啊。

    昨天晚上,强、鸟凡、冬冬、冬冬高中同学和我玩了一晚上桌游,K了一下午歌,假期生活缩影。

    昨天早上,强来厦大,我过去南门接他,那时候买的车票。

    每次写日志总感觉时间过的很快,不知从何说起,从何结束。

    魏翀过来取包裹了,就写到这里。

    Tag:
  • 2009-07-11

    玩吧玩吧 - [生活]

    早上睡到9点多,起来,开电脑,看《离散数学》。中午吃完饭,准备去K歌,晚上喝酒。好吧,就这样吧。

    松练13号早上走人,开始了人生的工作旅程。大伙聚一下,HIGH一把。

     昨天晚上11点多从实验室回来,居然在关东煮遇到施晓峰同学,哈哈,好久不见,提一个。

    暑期将至,有点松懈,不知道能否再次跟自己说:这。。。很正常啦,人生总得得到偶尔的休息,才能对生活有另样的思考。不管如何,不能松懈,没有任何理由,更没有任何时间让自己松懈。生活,常常会让我们陷入惯性,所以,永远别停下自己的脚步。

    下午K歌,记得什么时候,我曾告诉自己:以后每次K歌,都让自己充满激情,认真去唱。

    晚上喝酒,记得什么时候,我曾告诉她:不管以后怎么样,在什么地方,都不要让自己喝太多。

    记得什么时候,我是那么的幼稚,是那么的让你伤心,噢,那是什么时候的事情了,我已记不清,我也不愿意去记了。

    不管什么时候,不管在什么地方,不管做什么事情,你都要记得,让自己快乐地生活,不要对比,知足常乐。

    Tag:
  • 2009-07-11

    堆和栈(转载) - [C/C++]

    堆和栈的区别
    一、预备知识—程序的内存分配
    一个由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\0在常量区,p3在栈上。
    static int c =0; 全局(静态)初始化区
    p1 = (char *)malloc(10);
    p2 = (char *)malloc(20);
    分配得来得10和20字节的区域就在堆区。
    strcpy(p1, "123456"); 123456\0放在常量区,编译器可能会将它与p3所指向的"123456"
    优化成一个地方。
    }

    二、堆和栈的理论知识
    2.1申请方式
    stack:
    由系统自动分配。 例如,声明在函数中一个局部变量 int b; 系统自动在栈中为b开辟空

    heap:
    需要程序员自己申请,并指明大小,在c中malloc函数
    如p1 = (char *)malloc(10);
    在C++中用new运算符
    如p2 = new char[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
    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小结:
    堆和栈的区别可以用如下的比喻来看出:
    使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就
    走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自
    由度小。
    使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由
    度大。 (经典!)

    Tag:
  • 2009-07-10

    矩阵乘法 - [数学]

    算法 之 矩阵乘法

    假定 m*n矩阵C=c[i][j] 是 m*k矩阵A 和 k*n矩阵B 的乘积。

    伪码如下:

    procedure matrix multiplication(A,B:矩阵)
    for i:=1 to m
     for j:=1 to n
     begin
      c[i][j] := 0
      for q:=1 to k
       c[i][j] := c[i][j]+a[i][q]*b[q][j]   //@
     end
    {C=c[i][j]是A和B的乘积}

    对于矩阵布尔积,其算法类似,只需在上面第@行改成

    c[i][j] := c[i][j] || (a[i][q] && b[q][j])

    即可。

    Tag:矩阵
  • 2009-07-09

    《西游记》管理矛盾(转载) - [笑话人生]

    《西游记》中有这样一个矛盾,我以前一直百思不得其解:齐天大圣孙悟空在大闹天宫时战无不胜,要不是如来佛祖出手相援,整个天庭简直面临“亡国”的危险,但是在取经途中,大圣却好像很难一帆风顺,当年的那帮手下败将以及败将的跟班坐骑都成了高手,不是让大圣无计可施,就是要由大圣请出山帮忙,让人感觉这是吴承恩写书的漏洞。最近我在做项目的时候,突然茅塞顿开——吴承恩这么写恰恰反映了他对封建王朝管理体系和人文背景的深刻了解。各位如若不信,且听我细细道来。
        
        大闹天宫前后,孙大圣、天兵天将以及妖怪们的能力都没有变化,但是交战双方和双方的心态都发生了很大的改变。
      
        大闹天宫是孙大圣和天庭众神的战斗,是妖与神的战斗。
      
        那时的孙大圣还只是得道的妖精,无所畏惧,身无牵绊,连阎王殿也不敢索拿他,打赢了是无上的荣光,甚至有自己重新界定天庭秩序的可能性,打败了的后果他又没有考虑过,所以,在孙大圣心中,他进行的是高收益、无风险的事业,自然全力以赴,出手毫不留情。
      
        而天庭众神的心态却不同。孙大圣反的只是玉皇大帝,目的只是想打败天庭以求出口恶气,对待众神并没有深仇大恨,所以干的都只是些偷食酒菜、仙丹的事情,充其量也不过是影响重要会议召开这样的小错误,即便后来打上天宫,也没有强烈的破坏欲,去干诸如烧杀抢掠的勾当。因此,孙大圣与众神并无利益上的冲突。
      
        同时,孙大圣的杀伤力很强,他手中的武器可以使所有被触碰的对手受伤。所以,众神对孙大圣的围剿行动实际上是风险很高的项目,是迫于其领导玉皇大帝的压力而进行的工作,可以想象,在此情况下天庭一方的战斗力是处于什么状态,所谓十万天兵天将也必然各怀鬼胎,瞻前顾后。
      
        有人会说,众神为什么不靠打败孙大圣来加官进爵呢,这就牵涉到天庭的所有制结构和激励机制问题。
      
        从原文来看,天庭里尽管都是高素质的精英分子,实行的仍是封建君主制度,玉皇大帝作为统治者,对作为臣子的众神是具有生杀予夺大权的,所以,众神的生活质量就只能寄希望于这位领导的个人素质了。但文中提到凤仙郡太守只因为祈天时不敬,就连累全郡大旱了三年,卷帘大将军只因打破一个琉璃盏,就被贬为小河妖,可见这位领导十分暴戾,而这位皇帝和众神又长生不老,可见众神真是“此罪绵绵无绝期”了。按中国的传说规定,成为神是非常艰难的事情,很难想象众神历尽苦难的修炼只是为了换取一个更大的制度枷锁,所以,除了真正的既得利益者,众神在心底是必然反感这样一个制度的,是非常希望自由自在的生活的。君不见众神中只有杨戬的团队最拼命卖力,原因就是他与玉皇大帝有裙带关系,当初杨戬力劈桃山救母虽然英勇异常,说到底还是个凡人,后来突然成了可以不服封建礼数的神仙,其中必有隐情,想必是玉皇大帝把天庭弄成了家族企业,给了外甥杨戬一个不用工作又可以享受人间供奉的美差,你让其余的神仙怎么能够信服?
      
        这样再回到前面的问题,某些神仙即便打败了孙大圣,获得了升迁又怎样呢,他最多也只能成为权力最大的臣子,仍然摆脱不了被统治的命运,而且“伴君如伴虎”,由于以后能面对的永远是这个领导,就算他再圆滑事故,说不定几千几万年后的哪天就因为一个错误而前功尽弃。所以太上老君的金钢琢,明明可能收掉金箍棒的,却只用来打打人;太白金星的玉瓶,明明可以吸人的,老头儿却躲得远远的不见踪影。
      
        而做一个普通的天神又如何呢?神首先是长生不老的,而且又不存在光宗耀祖、封妻荫子的问题,所以无功远比有功的生存压力小,根本犯不着为了一个没有实质内容的头衔而冒伤残的危险。
      
      众神与孙大圣的对抗收益于是成为了负数,风险却成为了无穷大。众神都是绝顶聪明,这个算盘哪里会打不清楚,在战斗中为避免领导怪罪,肯定披挂整齐、杀声震天,但是贴身大战是没有记载的,也没有使出什么绝活,即所谓出工不出力。
      
        其实,书中还有一处反映了相同的问题,狮陀岭中的狮子精也吓退过天庭十万天兵,其间有没有发生激烈的战斗呢?没有,他只是张开大嘴吓唬了一下,天兵就退让了,反正狮子精只想要一个名分,众神并无实际利益损失,能不打仗就不打了吧。
      
        但在孙大圣取经的过程中,情况发生了变化,孙大圣这时候已经是“散仙”了,也即身份不再是妖怪,距离成仙只有小小的差距了。而他的对手却转为了彻头彻尾的妖精。
      
      
        妖精对抗孙大圣的目的是为了吃唐僧肉或吸唐僧的元阳,其相关收益是长生不老——神仙的基本特征。这项工作的风险也是巨大的 ——被孙大圣消灭掉。对于妖怪来说,这是一项高收益、高风险的事业,按照马克思《资本论》的论述,人们为了300%的利润,就敢于冒绞首的危险。而一步登天成为神仙的收益恐怕远远超过300%,可以想象妖怪们为了达成目的会有多么的狂热和勇敢。
      
        最厉害的还是那些有一定背景的妖怪,他们知道自己的主子不同凡响,自己就算有过错也不用担心被惩处。书中多次出现类似的章节:众神的下属或坐骑违规犯错,但是众神道貌岸然的解释说,唐僧取经必然要受劫难,下属的袭击正是这些劫难的一部分,所以,尽管下属的目的很阴暗,但是间接上为如来佛祖的考验工作出了不少力,帮助唐僧完成了受罪的任务,因此从本质上讲,他们的工作属于帮助性质,不是敌我关系,可以既往不咎、保留原职重新录用。如此高论,为所有有实力、有背景的妖精提供了绝佳的机遇,他们的工作风险已经下降为零,而收益仍然很高,这样有杀无赔的买卖能不让妖怪们竭尽全力、前赴后继?
        与此相对应的是孙大圣,他并无成佛的野心,对抗妖怪的目的不是杀尽天下妖魔鬼怪,只是为了保护师傅去西天取经。他与妖怪以前也无血海深仇,只有在妖怪袭击唐僧时才出手相救,所以工作属于被动反击性质。军事上称进攻是最好的防御,单纯防御是十分危险的行为,因此孙大圣在战斗中已经先输了一着。
      
        同时,由于被保护人唐僧缺少自我保护意识和抵御风险的能力,经常被妖怪扣为人质,使得孙大圣在援救工作中常常处于投鼠忌器的状态,在工作中不能放开手脚,于是又输了一着。

    加上唐僧十分迂腐,经常怀疑孙大圣滥杀无辜,并以酷刑“紧箍咒”进行频繁地打击,不但严重挫伤了孙大圣的工作积极性,而且使之不能有效地做好危机前的准备工作,更不能主动出击消除隐患,信息的前馈工作陷于僵局,只好通过反馈工作解决问题,战斗力再输一着。
      
        因此,在这场孙大圣和妖怪的竞争中,妖怪知己知彼、充分准备,而孙大圣畏首畏尾、束手束脚,尚未交战锐气已弱了一半,战斗胜利的可能性当然急剧减小。
      
        再看此时出手相援的众神,他们都是奉旨帮忙,所以第一是任务关乎天庭荣誉,必须完成,第二是性质属于天庭组织的无偿援助,有天庭作为后盾。因此,在妖怪没有大闹天宫的前提下,他一方面要提防自己失败后孙大圣和玉皇大帝都拿自己出气,同时又明白即使自己失败,整个组织——天庭失败的概率也很小——大不了再请如来佛祖出山,肯定手到擒来。所以,每个相援的神仙都会使出浑身解数,亮出绝活一展身手,只要自己尽力,孙大圣和玉皇大帝都没有口实怪罪,当然,拼命是不可能的,就像对付青牛怪一仗中,众神失去武器后不是继续进攻,而是徒呼奈何后就坐等更厉害的神仙来帮忙。
      
        那天写到这里,我感觉对情况的分析已经基本清楚,于是倒头便睡,不想当晚众神托梦于我,皆感叹天庭生存不易,人情世故与人间并无二致,未料想苦苦修行却只换来如此下场,真是可悲可叹……此时玉皇大帝突然现身,对我大发雷霆,说此文严重影响天庭形象,是对其管理能力的否定,要求我承担所有不良后果云云,我只是一介草民,哪里见过这种场面,不由又惊又怕,梦醒方知是为一梦,为避免人神共愤,在此特别申明,本文仅代表个人观点,且只为学术探讨,绝无借古讽今、否定名著之意,请各位姑妄听之,权当一笑。


    网友经典回复:
      猴子刚开始大闹天宫是因为刚从学校毕业,初入社 会,不懂的处理人际关系,后来在山下被压了五百年知道了,以后遇到了问题,出工不出力,尽量靠走关系,走后门来解决,这样做有几大好处:1、不会把自己置于过于危险的境地,2、不会轻易得罪人,3、体现领dao的重要性及对领dao的尊重。还有可以借求援之名逃避工作到处旅游。
        
        
      看了一些帖子,这么总结吧:
      
      1)天宫乃大锅饭体制,天兵天将出工不出力;
      
      2)天宫的官员选拔制du,造成了天兵天将办不了正事,但放出去则能为非作歹,祸害一方;
      
      3)各路神仙出场费很高,获胜奖金低,商业性的比赛不肯出力;
      
      4)孙悟空被整500年,武艺荒废不少,练功的等级已经不够使了;
      
      5)由于科技进步,500年前的大规模杀伤性武器---金箍棒,已不能适应现代战争的需要了;
      
      6)取经遇到妖怪,有后台老板的得放生,没主的还得防观音唐僧发慈悲,影响战斗力;
      
      7)取经阵容太差:领队观世音,教练唐僧,队友猪无能,傻无劲;
      
      8)因中国人的劣根性的原因,一个猴子闹天宫,三个徒弟一条虫;
      
      9)因体制的原因,唐僧领导下的孙悟空,打不赢孙悟空领导下的唐僧;
      
      10)闹天宫为一农民,取经则一农民工,而三无人员六耳弥猴,更在收rong时活生生被打死;
      
      11)遇妖怪搬救兵,一不冒险,二不贪功,三给领 导面子,四不得罪各路神仙,五顺道出国旅游。
      
        

    猪八戒还算是挺聪明的,人家以前就是神仙,深知天庭的腐败勾当。所以早日下得民间,傍个大款,经营实业。可惜神仙不放过他哦。


      所以八戒从取经一开始就洞悉这是个出力不讨好的差使,偷懒就不必说啦,还时刻提醒大家早日散伙,回去自己开公司~

      天宫腐bai,就如科极gan部----天棚元帅天天就想着泡文工团的PLMM,哪有战斗力,加之豆zha工cheng(老君的破炉子等)伪劣武器(老李的破塔等),银子都花在搞面子工cheng(蟠桃园、baoma等),林林总总,估计唐增上来也可大闹一把。
      
      前几年偶看电视连续剧《西游记》,忽然神经被触动:原来西天取经之路上的大多妖魔鬼怪,都TMD是“高gan子弟”,孙悟空这个护法使者自然常常是无可奈何了。吴承恩老先生也许是有意埋伏隐喻,借以说古论今,联想今日之社hui现zhuang,不由人对吴老先生陡增敬佩之心。

  • 2009-07-08

    临近暑假 - [生活]

          这周周日得交《扩频通信》期末论文了,烦,很烦啊。浑浑噩噩的约摸有2个月没看通信类的书了,闷头学了2个月的C++,不过收获也挺多的。近2个月来,最开心的莫过于完成了导师布置的任务——“三节点网络串口通信”项目了。

          这几天,临近暑假了,心开始有点小浮躁,唉。MS这也是有原因的。一方面,好哥们浩过来厦门了,很开心帮他找了份家教。上周六,浩、加、超一起过来公寓打了篮球,实在是爽到家了。不过,更HIGH的是,第二天(上周日)一起去加住的地方,殿前那边,松炼也过来了,又打篮球,哈哈,跟这群人一起是有一种莫名的感情在内心荡漾的,永远都是充满激情的。这天,见到了老同学晓玲跟文林,真的是非常久非常久不见了,估计也有7年左右了。后来,我们5个跟晓玲晚上在那边吃了烧烤,喝了20瓶啤酒。难得大家一块喝个痛快,以后,机会就难得了。另一方面,估计是临近暑假了,走了不少人,读书的劲头少了一些。

          松炼过两天就要走了,上船工作了。唉,走了小猪,现在是松炼。不知道明天是否能够聚聚,一起打场篮球,吃个饭。刚收到消息,明天,超得去南靖信用社面试了,听他说是政审,过阵子再面试,哈哈,不得不恭喜这家伙了,他人生的第二次高考也不算失败了。

          暑假,调整好心态,努力完成自己的看书计划。《C++ Primer》《汇编语言》《C++数据结构》,COME ON!

    Tag:暑假
  • 2009-07-08

    释迦牟尼 - [笑话人生]

          耶稣和释迦牟尼猜拳。输了就让对方弹一下脑袋,耶稣总是赢,释迦牟尼就被弹得满头包。终于,释迦牟尼赢了一回,耶稣一看自己输了说:“你等我一会,回来之后你再弹我。”耶稣就再也没回来,所以几千年来,释迦牟尼的一只手就一直保持着那个准备弹耶稣脑袋的姿势。

  • 2009-07-08

    只能看 不能读 - [笑话人生]

    http://blog.csdn.net/hikaliv/archive/2009/06/22/4289941.aspx

    看看可以,想读的话,还是算了。

    1、赵元任《施氏食狮史》
        
      石室诗士施氏,嗜狮,誓食十狮。施氏时时适市视狮。十时,适十狮适市。是时,适施氏适市。氏视是十狮,恃矢势,使是十狮逝世。氏拾是十狮尸,适石室。石室湿,氏使侍拭石室。石室拭,氏始试食是十狮。食时,始识是十狮,实十石狮尸。试释是事。

    2、杨富森<<于瑜与余欲渔遇雨>>

        于瑜欲渔,遇余于寓。语余:“余欲渔于渝淤,与余渔渝欤?”
        余语于瑜:“余欲鬻玉,俞禹欲玉,余欲遇俞于俞寓。”
      余与于瑜遇俞禹于俞寓,逾俞隅,欲鬻玉于俞,遇雨,雨逾俞宇。余语于瑜:“余欲渔于渝淤,遇雨俞寓,雨逾俞宇,欲渔欤?鬻玉欤?”
      于瑜与余御雨于俞寓,俞鬻玉于余禹,雨愈,余与于瑜踽踽逾俞宇,渔于渝淤。

    3、《季姬击鸡记》

      季姬寂,集鸡,鸡即棘鸡。棘鸡饥叽,季姬及箕稷济鸡。鸡既济,跻姬笈,季姬忌,急咭鸡,鸡急,继圾几,季姬急,即籍箕击鸡,箕疾击几伎,伎即齑,鸡叽集几基,季姬急极屐击鸡,鸡既殛,季姬激,即记《季姬击鸡记》。

    4、《遗镒疑医》

      伊姨殪,遗亿镒。伊诣邑,意医姨疫,一医医伊姨。翌,亿镒遗,疑医,以议医。医以伊疑,缢,以移伊疑。伊倚椅以忆,忆以亿镒遗,以议伊医,亦缢。噫!亦异矣!
      
    5、《易姨医胰》

      易姨悒悒,依议诣夷医。医疑胰疫,遗意易姨倚椅,以异仪移姨胰,弋异蚁一亿,胰液溢,蚁殪,胰以医。易胰怡怡,贻医一夷衣。医衣夷衣,怡怡奕奕。噫!以蚁医胰,异矣!以夷衣贻夷医亦宜矣!
      
    6、 赵元任《熙戏犀》

      西溪犀,喜嬉戏。席熙夕夕携犀徙,席熙细细习洗犀。犀吸溪,戏袭熙。席熙嘻嘻希息戏。惜犀嘶嘶喜袭熙。
      
    7、《饥鸡集矶记》

      唧唧鸡,鸡唧唧。几鸡挤挤集矶脊。机极疾,鸡饥极,鸡冀己技击及鲫。机既济蓟畿,鸡计疾机激几鲫。机疾极,鲫极悸,急急挤集矶级际。继即鲫迹极寂寂,继即几鸡既饥,即唧唧。
      
    8、《侄治痔》

        芝之稚侄郅,至智,知制纸,知织帜,芝痔炙痔,侄至芝址,知之知芷汁治痔,至芷址,执芷枝,蜘至,踯侄,执直枝掷之,蜘止,侄执芷枝至芝,芝执芷治痔,痔止。
      
    9、 最后也是最变态的:

      《羿裔熠邑彝》
      羿裔熠①,邑②彝,义医,艺诣。
      熠姨遗一裔伊③,伊仪迤,衣旖,异奕矣。
      熠意④伊矣,易衣以贻伊,伊遗衣,衣异衣以意异熠,熠抑矣。
      伊驿邑,弋一翳⑤,弈毅⑥。毅仪奕,诣弈,衣异,意逸。毅诣伊,益伊,伊怡,已臆⑦毅矣,毅亦怡伊。
      翌,伊亦弈毅。毅以蜴贻伊,伊亦贻衣以毅。
      伊疫,呓毅,癔异矣,倚椅咿咿,毅亦咿咿。
      毅诣熠,意以熠,议熠医伊,熠懿⑧毅,意役毅逸。毅以熠宜伊,翼逸。
      熠驿邑以医伊,疑伊胰痍⑨,以蚁医伊,伊遗异,溢,伊咦。熠移伊,刈薏⑩以医,伊益矣。
      伊忆毅,亦呓毅矣,熠意伊毅已逸,熠意役伊。伊异,噫,缢。
      熠癔,亦缢。

      注解:
      ①熠:医生,据说为后羿的后裔。
      ②邑:以彝为邑,指居住在一个彝族聚居的地方。
      ③伊:绝世佳丽,仪态万方,神采奕奕。
      ④意:对伊有意思,指熠爱上了伊。
      ⑤翳:有遮蔽的地方,指伊游弋到了一个阴凉的地方。
      ⑥毅:逍遥不羁的浪人,善于下棋,神情坚毅,目光飘逸。
      ⑦臆:主观的感觉,通“意”,指对毅有好感。
      ⑧懿:原意为“懿旨”,此处引申为要挟,命令。
      ⑨胰痍:胰脏出现了疮痍。
      ⑩刈:割下草或者谷物一类。薏:薏米,白色,可供食用,也可入药。

    Tag:
  • 2009-07-08

    《起初他们追杀共产主义者》 - [笑话人生]

    http://blog.csdn.net/hikaliv/archive/2009/06/13/4266427.aspx

    德国牧师马丁·尼默勒

    Als die Nazis die Kommunisten holten,
    habe ich geschwiegen;
    ich war ja kein Kommunist.
    Als sie die Sozialdemokraten einsperrten,
    habe ich geschwiegen;
    ich war ja kein Sozialdemokrat.

    Als sie die Gewerkschafter holten,
    habe ich nicht protestiert;
    ich war ja kein Gewerkschafter.

    Als sie die Juden holten,
    habe ich geschwiegen;
    ich war ja kein Jude.

    Als sie mich holten,
    gab es keinen mehr, der protestieren konnte.

    起初他们追杀共产主义者
    我不说话
    因为我不是共产主义者
    接着他们追杀社会民主主义者
    我不说话
    因为我不是社会民主主义者

    后来他们追杀工会成员
    我不说话
    因为我不是工会成员

    之后他们追杀犹太人
    我还是不说话
    因为我不是犹太人

    最后他们要追杀我

    但再也没有人站起来为我说话了

  • 2009-07-08

    同余幂与康托展开 - [数学]

    读Kenneth H.Rosen的《离散数学》,遇到两个算法,觉得不错。

    一、同余幂

        如何有效地求bn mod m(这里bn是表示b的n次方),其中b,n,m都是大整数。先计算bn,再求bn除以m德余数,这显然不可行,因为bn是非常大的数。因此,可采取一种利用指数n的二进制展开(比如n=(A(k-1)...A1A0)2)的算法。这个算法依次求b mod m, b2 mod m, b4 mod m,...,b2(k-1) mod m(2(k-1)表示2的k-1次方),把其中Aj=1的那些项b2j mod m乘起来,在每次乘法后求乘积除以m的余数。这个算法的伪码如下:

    以下是代码片段:
    procedure modular exponentiation(b:整数,n=(A(K-1)A(K-2)...A1A0)2(表示2进制展开),m:正整数)
    x := 1
    power := b mod m
    for  i :=0  to  k-1
    begin
            if  Ai=1  then  x :=(x·power) mod m
            power := (power · power) mod m
    end
    {x 等于 bn mod m}

    二、康托展开

           a[n]n!+a[n-1](n-1)!+...+a[2]2!+a[1]1!

    算法伪码如下:

    以下是代码片段:

    procedure Cantor(x:正整数)

    n:=1; f:=1
    while (n+1)*f<=x
    begin
         n := n+1
         f := f*n
    end
    y :=x
    while n>0
    begin
      a[n] := [y/f] //向下取整
      y := y-a[n]*f
      f := f/n
      n := n-1
    end
    {x=a[n]n!+a[n-1](n-1)!+...+a[1]1!}

  • 2009-07-08

    const用法详解 - [C/C++]

    const用法详解
    面向对象是C++的重要特性
    .
    但是c++c的基础上新增加的几点优化也是很耀眼的

    const直接可以取代c中的
    #define
    以下几点很重要,学不好后果也也很严重


    const
    1.
    限定符声明变量只能被读

      const int i=5;
      int j=0;
      ...
      i=j;  //
    非法,导致编译错误

      j=i;  //
    合法

    2.
    必须初始化

      const int i=5;    //
    合法

      const int j;      //
    非法,导致编译错误

    3.
    在另一连接文件中引用const常量

      extern const int i;    //
    合法

      extern const int j=10;  //
    非法,常量不可以被再次赋值

    4.
    便于进行类型检查

     
    const方法可以使编译器对处理内容有更多了解。

      #define I=10
      const long &i=10;  /*dapingguo
    提醒:由于编译器的优化,使

         
    得在const long i=10; i不被分配内存,而是已10直接代入

         
    以后的引用中,以致在以后的代码中没有错误,为达到说教效

         
    果,特别地用&i明确地给出了i的内存分配。不过一旦你关闭所

         
    有优化措施,即使const long i=10;也会引起后面的编译错误。
    */
      char h=I;      //
    没有错

      char h=i;      //
    编译警告,可能由于数的截短带来错误赋值。

    5.
    可以避免不必要的内存分配

      #define STRING "abcdefghijklmn\n"
      const char string[]="abcdefghijklm\n";
      ...
      printf(STRING);  //
    STRING分配了第一次内存

      printf(string);  //
    string一次分配了内存,以后不再分配

      ...
      printf(STRING);  //
    STRING分配了第二次内存

      printf(string);
      ...
     
    由于const定义常量从汇编的角度来看,只是给出了对应的内存地址,

     
    而不是象#define一样给出的是立即数,所以,const定义的常量在

     
    程序运行过程中只有一份拷贝,而#define定义的常量在内存中有
     
    若干个拷贝。

    6.
    可以通过函数对常量进行初始化

      int value();
      const int i=value();
      dapingguo
    说:假定对ROM编写程序时,由于目标代码的不可改写,

     
    本语句将会无效,不过可以变通一下:

      const int &i=value();
     
    只要令i的地址处于ROM之外,即可实现:i通过函数初始化,而其

     
    值有不会被修改。

    7.
    是不是const的常量值一定不可以被修改呢?

     
    观察以下一段代码:

      const int i=0;
      int *p=(int*)&i;
      p=100;
     
    通过强制类型转换,将地址赋给变量,再作修改即可以改变const常量值。

    8.
    请分清数值常量和指针常量,以下声明颇为玩味:

      int ii=0;
      const int i=0;            //i
    是常量,i的值不会被修改

      const int *p1i=&i;        //
    指针p1i所指内容是常量,可以不初始化

      int  * const p2i=&ii;    //
    指针p2i是常量,所指内容可修改

      const int * const p3i=&i; //
    指针p3i是常量,所指内容也是常量

      p1i=&ii;                  //
    合法

      *p2i=100;                //
    合法

    关于C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,参考了康建东兄的const使用详解一文,对其中进行了一些补充,写下了本文。


    1.      const
    常量,如
    const int max = 100; 
    优点:const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换时可能会产生意料不到的错误(边际效应)


    2.      const
    修饰类的数据成员。如:

    class A
    {
        const int size;
        …
    }
    const
    数据成员只在某个对象生存期内是常量,而对于整个类而言却是可变的。因为类可以创建多个对象,不同的对象其const数据成员的值可以不同。所以不能在类声明中初始化const数据成员,因为类的对象未被创建时,编译器不知道const 数据成员的值是什么。如

    class A
    {
    const int size = 100;    //
    错误

    int array[size];        //
    错误,未知的
    size
    }

    const
    数据成员的初始化只能在类的构造函数的初始化表中进行。要想建立在整个类中都恒定的常量,应该用类中的枚举常量来实现。如

    class A
    {…
    enum {size1=100, size2 = 200 };
    int array1[size1];
    int array2[size2];
    }
    枚举常量不会占用对象的存储空间,他们在编译时被全部求值。但是枚举常量的隐含数据类型是整数,其最大值有限,且不能表示浮点数。


    3.      const
    修饰指针的情况,见下式:

    int b = 500;
    const int* a = &          [1]
    int const *a = &          [2]
    int* const a = &          [3]
    const int* const a = &    [4]
    如果你能区分出上述四种情况,那么,恭喜你,你已经迈出了可喜的一步。不知道,也没关系,我们可以参考《Effective c++Item21上的做法,如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。因此,[1][2]的情况相同,都是指针所指向的内容为常量(const放在变量声明符的位置无关),这种情况下不允许对内容进行更改操作,如不能*a = 3 [3]为指针本身是常量,而指针所指向的内容不是常量,这种情况下不能对指针本身进行更改操作,如a++是错误的;[4]为指针本身和指向的内容均为常量。


    4.    const
    的初始化

    先看一下const变量初始化的情况

    1)
    非指针const常量初始化的情况:
    A b;
    const A a = b;
    2)
    指针const常量初始化的情况:


    A* d = new A();
    const A* c = d;
    或者:
    const A* c = new A();
    3
    )引用const常量初始化的情况:

    A f;
    const A& e = f;      //
    这样作e只能访问声明为const的函数,而不能访问一
               
    般的成员函数;

        [
    思考1] 以下的这种赋值方法正确吗?

        const A* c=new A();
        A* e = c;
        [
    思考2] 以下的这种赋值方法正确吗?

        A* const c = new A();
        A* b = c;

    5.   
    另外const 的一些强大的功能在于它在函数声明中的应用。在一个函数声明中,const 可以修饰函数的返回值,或某个参数;对于成员函数,还可以修饰是整个函数。有如下几种情况,以下会逐渐的说明用法:
    A& operator=(const A& a);
    void fun0(const A* a );
    void fun1( ) const; // fun1( )
    为类成员函数

    const A fun2( );

    1
    修饰参数的const,如
    void fun0(const A* a ); void fun1(const A& a);
    调用函数的时候,用相应的变量初始化const常量,则在函数体中,按照const所修饰的部分进行常量化,如形参为const A* a,则不能对传递进来的指针的内容进行改变,保护了原指针所指向的内容;如形参为const A& a,则不能对传递进来的引用对象进行改变,保护了原对象的属性。

    [
    注意]:参数const通常用于参数为指针或引用的情况,且只能修饰输入参数;若输入参数采用值传递方式,由于函数将自动产生临时变量用于复制该参数,该参数本就不需要保护,所以不用const修饰。


    [
    总结]对于非内部数据类型的输入参数,因该将值传递的方式改为“const引用传递,目的是为了提高效率。例如,将void Func(A a)改为
    void Func(const A &a)

         
    对于内部数据类型的输入参数,不要将值传递的方式改为“const引用传递。否则既达不到提高效率的目的,又降低了函数的可理解性。例如void Func(int x)不应该改为
    void Func(const int &x)

    2
      修饰返回值的const,如
    const A fun2( ); const A* fun3( );
    这样声明了返回值后,const按照"修饰原则"进行修饰,起到相应的保护作用。
    const Rational operator*(const Rational& lhs, const Rational& rhs)
    {
    return Rational(lhs.numerator() * rhs.numerator(),
    lhs.denominator() * rhs.denominator());
    }
    返回值用const修饰可以防止允许这样的操作发生
    :Rational a,b;
    Radional c;
    (a*b) = c;
    一般用const修饰返回值为对象本身(非引用和指针)的情况多用于二目操作符重载函数并产生新对象的时候。

    [
    总结
    ]

    1.   
    一般情况下,函数的返回值为某个对象时,如果将其声明为const时,多用于操作符的重载。通常,不建议用const修饰函数的返回值类型为某个对象或对某个对象引用的情况。原因如下:如果返回值为某个对象为constconst A test = A 实例)或某个对象的引用为constconst A& test = A实例) ,则返回值具有const属性,则返回实例只能访问类A中的公有(保护)数据成员和const成员函数,并且不允许对其进行赋值操作,这在一般情况下很少用到。


    2.     
    如果给采用指针传递方式的函数返回值加const修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const 修饰的同类型指针。如:

    const char * GetString(void);
    如下语句将出现编译错误:

    char *str=GetString();
    正确的用法是:

    const char *str=GetString();

    3.   
    函数返回值采用引用传递的场合不多,这种方式一般只出现在类的赙值函数中,目的是为了实现链式表达。如:

    class A
    {…
    A &operate = (const A &other);  //
    负值函数

    }
    A a,b,c;              //a,b,c
    A的对象


    a=b=c;            //
    正常

    (a=b)=c;          //
    不正常,但是合法

    若负值函数的返回值加const修饰,那么该返回值的内容不允许修改,上例中a=b=c依然正确。(a=b)=c就不正确了。

    [
    思考3] 这样定义赋值操作符重载函数可以吗?

    const A& operator=(const A& a);

    6.   
    类成员函数中const的使用

    一般放在函数体后,形如:
    void fun() const;
    任何不会修改数据成员的函数都因该声明为const类型。如果在编写const成员函数时,不慎修改了数据成员,或者调用了其他非const成员函数,编译器将报错,这大大提高了程序的健壮性。如:

    class Stack
    {
    public:
          void Push(int elem);
          int Pop(void);
          int GetCount(void) const;  //const
    成员函数

    private:
          int m_num;
          int m_data[100];
    };

    int Stack::GetCount(void) const
    {
      ++m_num;              //
    编译错误,企图修改数据成员
    m_num
      Pop();                    //
    编译错误,企图调用非const函数
     
     Return m_num; 
    }


    7.
    使用const的一些建议
    1
    要大胆的使用const,这将给你带来无尽的益处,但前提是你必须搞清楚原委;

    2
    要避免最一般的赋值操作错误,如将const变量赋值,具体可见思考题;

    3
    在参数中使用const应该使用引用或指针,而不是一般的对象实例,原因同上;

    4 const
    在成员函数中的三种用法(参数、返回值、函数)要很好的使用;

    5
    不要轻易的将函数的返回值类型定为
    const;
    6
    除了重载操作符外一般不要将返回值类型定为对某个对象的const引用
    ;
    [
    思考题答案
    ]
    1
    这种方法不正确,因为声明指针的目的是为了对其指向的内容进行改变,而声明的指针e指向的是一个常量,所以不正确;

    2
    这种方法正确,因为声明指针所指向的内容可变;

    3
    这种做法不正确;

    const A::operator=(const A& a)中,参数列表中的const的用法正确,而当这样连续赋值的时侯,问题就出现了:

    A a,b,c:
    (a=b)=c;
    因为a.operator=(b)的返回值是对aconst引用,不能再将c赋值给const常量。

    Tag:const
  • 2009-05-17

    技术帖子 - [C/C++]

    void main 与 int main的区别(转)

    “void main与int main之间的区别是什么?”这是一个常见的问题。我们来探讨一下这个问题,并深入研究一些有关main()函数不同版本的更多的东西。

    C与C++在main()函数方面的标准有所不同,所以我们要分开讨论。

    对于C语言:

    在C89标准中,main() 的形式是可以接受的,当然使用如下的C99标准更明智,因为在这个标准中只有如下格式才能被接受:

    int main ( void )
    int main ( int argc, char *argv[] )

    我们可以对main函数做轻微的改变,比如我们可以用一个自定义的类型代替int(当然这个类型必须被定义为int型),还可以把*argv[]改为**argv,等等。

    如果我们不想在命令行下对程序输入参数,可以选择第一种形式。

    其实第二种形式的两个参数argc,argv的名称是可以改变的,但保持原样是更明智的选择。

    main()函数的返回类型必须为int;返回的整形值作为传递给调用者的一个返回码。(this allows a return code to be passed to the invoker)

    对于C++:

    以下是可以接受的格式:

    int main ( int argc, char *argv[] )
    int main ()

    第一种格式遵从C99标准;第二种格式在不需要通过命令行向程序传递参数时使用,与C99标准中规定的格式int main(void)效果相同。

    (C)int main()与int main(void)之间的区别:

    很多C程序员都曾搞错的一个概念,就是以为这样一个函数不接受任何参数:

    int foo();

    事实上,这个函数被认为可以接受未知个数的参数(译:可接受任意多的参数!)。正确的用法是在括号内添加关键字void。

    void main()函数是如何处理的?

    在C/C++正规的调用/返回函数中,如果你不想让一个函数返回任何值,你可以使用void定义返回类型。比如,一个不接受任何参数并且无任何返回值的函数原型可以像这样:

    void foo(void);

    一个常见的误解是,这种逻辑同样适用于main()函数。呵呵,事实并非如此,main()函数是很特殊的,无论何时你都应该依照标准定义main()函数(译:即使用int main()的形式!),并把返回值定义为int。有时void main()的例外形式是可以出现的,但这仅限于某些特定的系统。如果你不敢肯定正在使用这些系统,那么答案很简单,不能使用void main()的形式。

    如果你在论坛上写了像“void main”这样的代码而被警告,那么最好改过来。不要用"我的老师告诉我这么做是对的"之类的话来为自己开脱;老师们总是习惯犯错误(teachers have a bad habit of being wrong)。写安全的,合乎标准的代码,大家就可以专注于你程序中其它的问题而不是在这种规范方面的东西上浪费时间。

    但是int main(int argc, char *argv[], char *envp[])又是怎么回事呢?

    好比是标准的扩展版,main()函数可以在一些系统中提取一个额外的参数用来访问环境变量。这个用法不能保证在每个编译环境中都行得通,所以使用 envp 这个参数是还是谨慎为妙。

    最后,关于为什么void main(void)是一种错误的用法,这个链接提供了一些更细节化的背景资料:

    http://users.aber.ac.uk/auj/voidmain.shtml

    后记:

    这篇从cprogramming.com上摘下的FAQ几乎没有任何高深的理论,但是它向我们传达了一种精神:要编写规范的程序。经常在国内很多论坛上看到一些不加任何注释(有时甚至连缩进也没有)的代码,这种代码在实际中是会被当作垃圾代码处理的。如这篇文章所述,不规范的代码有时甚至会导致系统出错。如果纯心要编写混乱代码,不如参加国际混乱代码大赛,:> 但平时写东西还是规范点好。

    Tag:main
  • 2009-03-20

    我的崇拜 - [笑话人生]

    Saying : "I can accept failure, but could not accept to give up. "

    名人对乔丹的评价
    2008-09-19 09:40

    1. 比尔盖茨:“是他证明了人类可以飞。”
    2. 美国总统克林顿:“我们也许再也看不到像乔丹那样的精彩表演了,他将永远受到人们的怀念。”“在我的一生中,我还从没有看到有其他的运动员能将头脑、身体和精神诸素质结合 得像他那样精美。”“我要看他的比赛,而且我要亲自买票,对了~我还要帮我儿子要到他的签名。”
    3. 朝鲜总理金正日,最喜欢的球员是乔丹,美国的朝鲜专家表示:“金正日的书柜里保存着乔丹在公牛期间的几乎所有比赛录像带。”2000年美国前国务卿奥尔布赖特访问平壤时,
    向金正日赠送了乔丹亲笔签名的篮球,这个篮球目前陈列在位于妙香山的国际亲善展览馆里。受到金正日影响,朝鲜高层也都喜欢NBA和乔丹。1990年代初与美方会谈时,朝鲜 高层人士曾表示:“今天的会就开到这里,马上要转播乔丹比赛。”
    4. 沙特阿拉伯王子:我想买下公牛队,但芝加哥政府不允许。我想在乔丹退役后让他出任我们石油公司的美国总代理,如果他喜欢,我还想送他几口油井。
    5. 马拉多纳:“哪里都有他的球迷,他是一个被神化的人。”“乔丹是我愿意以一切换取他一张照片的人,与他见面,给他一个拥抱是我的梦想,”他说,“我常说如果我能见到他,和 卡斯特罗,我愿做一切事情。”
    6. 球王贝利:“他统治着整个篮球界,他似乎比我出名,OH,天哪。”“乔丹使我知道除了用双脚外,还有其他办法能使皮球产生魔力。”
    7. 罗伯特-巴乔:“乔丹绝对是一个不平凡的人,我很喜欢他,但乔丹的职业生涯比我成功,这是我所羡慕的!”
    8. 贝克汉姆:“他是我的偶像,我真的崇拜他!”“他来英国时,我和妻子为他做了导游,哈哈,现在仍记忆犹新。”当时乔丹并不认识小贝,还问旁边的记者他是谁,弄的贝帅哥满脸 通红,跟个孩子似的。
    9. 皮耶罗:“他是我一生中的偶像,我也学他在最兴奋的时候吐舌头,去打高尔夫。”
    10. 小罗纳尔多:“我从小就是他的球迷,是他的精神激励着我前进。”小罗当年与乔丹会见时,略带害羞,握手时手臂一直在颤抖,太激动了。
    11. 齐达内:“我根本不能和乔丹相比,他是神,只有马拉多纳的伟大才能与之相提并论。”
    12. 托蒂:足球之外,篮球和网球是托蒂最喜爱的运动,桑普拉斯和乔丹是托蒂最喜爱的运动员。
    13. 劳尔:1999年,乔丹赴西班牙马德里为耐克公司做宣传,临行前,乔丹的小儿子、皇家马德里的球迷央求老爸给他弄一件偶像劳尔签名球衣。到达马德里后,耐克公司的工作人员 向皇马打了招呼,受宠若惊的劳尔马上托人送来一件最新款的队服,上面签着“献给尊敬的乔丹陛下,劳尔.冈萨雷斯”。
    14. 老虎伍兹:“我们是好友,他经常约我打高尔夫,但我却不敢和他打篮球。”
    15. 费德勒:“除了网球,我最崇拜的运动员是乔丹,他打破了那么多的纪录,他本身就已经是个奇迹了。”
    16. 罗迪克:“迈克尔·乔丹,在我小时候,他是我心目中最伟大的体育英雄。”
    17. 柳比西奇:如果有机会,最想见的是谁?为什么?“迈克尔·乔丹,他是一个那么完美的运动员。”
    18. 泰森:“我见过他,他是个不凡的人,我想我应该去看他的比赛。”
    19. 菲尔普斯,美国游泳天才:“他是球队领袖,即使发着高烧也全力付出,是他改变了篮球运动。”对于菲尔普斯来说,他希望自己在游泳项目上的影响力如乔丹之于篮球。
    20. 刘翔:“把乔丹作为偶像是一种时尚,他的精神一直激励着我!我会一直尊敬他!”
    21. NBA总裁斯特恩 :“乔丹永远能为全世界篮球迷带来欢乐,不管在多困难的情况下,他的回归意味着我们生命中又多了些乐趣。”“乔丹可以代表整个NBA,他是史上最好的,没有他就没有现在的 NBA。”
    22. 张伯伦:“拿我和乔丹相比,就等于用螺旋桨飞机和现在的超音速战斗机相抗衡。”
    23. 比尔拉塞尔:“天哪,他退役了!你知道,美国民众宁愿总统下台,也不愿看乔丹离去。”
    24. 拉里·伯德:“如果说张伯伦是上帝派到人间的篮球之神,那么乔丹就是穿着球衣的上帝本人。”
    25. 魔术师约翰逊:“在NBA,一半是乔丹的,剩下的才是我们的。” 。乔丹第一次退出时,这位前NBA巨星竟然在电视节目里双膝跪下,双手合并来祷告,希望乔丹能回归NBA。
    26. 菲尔杰克逊:“乔丹并不需要什么教练,他的威信和威严已经超过了任何教练。对公牛而言,战术和技术已不是最重要的,乔丹已经超越了一切。”“他是最伟大的人,他可以赢得整 个世界。”
    27. 罗德曼:“恩,你知道的,他是场上的主宰,我只是为他抢篮板的打工仔,希望我们新赛季一切都好,不希望出现上赛季的一些不快!”
    28. 奥拉朱旺:“对于我们这些老家伙们来说,都盼望他能离开NBA,呵呵,这是真的,我们谈论过这些,在他第一次离开的时候,我抓住了机会,我想这应该是上天的恩赐。”
    29. 巴克利:“我是这个地球上最会打篮球的人,乔丹?他是外星人!”
    30. 奥尼尔:“我奶奶和乔丹一起打球也能拿6个总冠军戒指!”
    31. 艾佛森:“是乔丹教会我如何打球的!艾佛森小时候搬家时,他自己的房间门板上有张乔丹的挂像,为了不破坏这张挂像的完整性,直接把门板卸下搬走了。
    32. 曼努·吉诺比利: “我最崇拜的球员是迈克尔-乔丹和马拉多纳。”
    33. 帕克:1991年6月,正好让9岁大的帕克,亲眼目睹了芝加哥公牛队夺得队史上第一座总冠军奖杯的荣景,尤其是“飞人”乔丹的神乎其技,更是让帕克佩服得一塌糊涂。帕克启 程返回法国时,心里只剩下了一个念头:我以后要打NBA。于是,世界上又少了个足球运动员。
    34. 韦德:“乔丹是我的第二个父亲!”“乔丹是我最崇拜的偶像,看他的比赛录像,感觉自己是他的一部分。把我和乔丹比较是一种表扬,但我总是觉得这种比较越少越好,因为乔丹只 有一个。”
    35. 科比:尽管科比不喜欢总被人拿来和乔丹比较,但不可否认,乔丹也是他的偶像,他也尊敬乔丹!科比小时候为了和一个足球守门员争抢一张乔丹的海报,大打出手!
    36. 詹姆斯:“我之所以选择23号,就是因为我的偶像是乔丹,因为他场上对待篮球的态度,就是一定要赢,他做任何事情都是为了赢球,他对待篮球以及在球场外的态度都是值得学习 和值得尊敬的。”
    37. 安东尼:“最崇拜的偶像是乔丹,从小就梦想像他一样打球。”
    38. 姚明:“乔丹需仰视!”在姚明的心中,“飞人”乔丹就像一尊高不可攀的神。姚明曾说过,自己有两个偶像,一个是奥拉朱旺,一个是巴克利。乔丹高高在上,过于缥缈,连身高2 米26的姚明都需仰视才见。
    39. 麦格雷迪:乔丹第二次复出奇才,麦迪写信给乔丹中说:“去年在华盛顿全明星赛上,我见到了你,但是我一直没有机会告诉你你在我们年轻球员心目中的分量,对于我们来说,你依 旧意味着一切,依旧!”
    40. 井上雄彦:现年40,手冢奖得主,灌篮高手的作者,曾获得过小学馆漫画赏,他曾是北条司的助手,他为人正直,是一个疯狂的乔丹迷,他的灌篮高手风靡亚洲,更是影响了不少中 国青少年喜欢上篮球,灌高的中流川和花道甚至是湘北的红色队服,都让人想起乔丹,大虫,和公牛队。
    41. 施瓦辛格:“他是人类的奇迹,他无所不能!”
    42. 小甜甜布兰尼:我们的小甜甜从小就爱打篮球,还参加过校队,只可惜身高……她最喜欢飞人乔丹,理由?因为他是最棒的!
    43. 玛丽亚凯莉:“为他演唱送别的歌曲,我十分荣幸,他是美国的英雄!”
    44. 迈克尔杰克逊:“他是最棒的,他愿意为我出演新MTV,一定会畅销的。”
    45. 法兰西国家报:“乔丹来到巴黎了,上帝降临。”

    Tag:乔丹
  • 2009-03-11

    年轻的心 - [生活]

    Support the strong, give courage to the timid, remind the indifferent, and warn the opposed---Whitney M.Young,American civil rights leader.
    支持强者,鼓励怯者,提醒冷淡之人,警告敌对之人---惠特尼.M.杨,美国民权运动领袖。

    现在每天都告诉自己:天才从不浪费时间睡觉。自从看了《隐形人》后,就很喜欢这句话。是的,现在的我,正处于人生中的黄金岁月,浪费时间无异于慢性自杀。

    每天都在忙导师许肖梅给的任务,惭愧,从大四下学期入门到现在都没能认认真真地、真真正正地去专研。常常是得过且过。想起刚进研一时,曾经激情澎湃,可是坚持不了多久,又开始玩上游戏,浪费了太多太多时间,囧。

    为什么我的觉悟每次都来的这么晚?高三,也是后悔曾经高一高二的散漫。教训,却总是得不到吸取。

    如今,次贷危机引发了席卷全球的金融风暴,全球经济遭受重创。高校就业变得及其困难,就业率奇低。未来的我,何去何从,确是要好好深思。

    不好好练就一身本领,在成功者眼中,也许我们只是一群废物、蠢材。像《中国周刊》的招聘启事曰:如果你是蝇营苟苟,或者只是无所事事的媒体混混,请不要投简历自取其辱。

    年轻的心,飞扬吧。但要记住:持之以恒,拒绝诱惑。

    伟大的管理者首先要管好自己。

  • 2009-02-12

    持之以恒 - [生活]

    First they ignore you, then they laugh at you, then they fight you, then you win---Mahatma Gandhi.
    他们先是忽视你,然后嘲笑你,然后与你抗争,然后你就赢了---圣雄甘地。

    2009,我说过,我要做一个合格的研究生。在此立志。本期主题:持之以恒。

    虽然很难,很辛苦。但是,不管如何,都要记得自己的Rules。

    口说无凭,一切都需要等待着...

    春天,农民们播下了种子;

    ...

  • 2008-12-22

    激情岁月 - [生活]

    Wishing to be friends is quick work, but friendship is a slow ripening fruit---Aristotle,Greek philosopher.
    交朋友容易,不过友谊本身是个成熟缓慢的水果---亚里士多德,古希腊哲学家。

    兴加回厦门,住小猪那,在SM找了份工作。昨天,我叫他们过来玩,三人一同赶往超住的地方——很nice的地方。过去后,超已煮好一切,我们大吃大喝,我早说过,相对我们来说,超的手艺已达化境。

    吃完后,大伙坐着聊天,看电视。兴加跟小猪开始抢遥控器— —!,抢来抢去,一会看这台,一会又看那台,我很无语啊哈哈,索性开电脑玩了会,不过电脑也是无聊。

    4点,我们4个跑到对面打篮球,之前,超说这边水平菜,经常虐他们,呵呵。当然,我们4个一队。这这群人一起打球,this feeling is so different,so fantasy,soperfect.看来,感情还是积淀下来的。想起以前一起在中学时的激情岁月,内心总是激情荡漾,热情洋溢。以前,时间少,哥们总是周六考完试,就亟不可待的跑到上面的篮球场打到8-9点,然后一起外面吃饭,吃完洗完澡,就到我小叔的房玩通宵玩的尽兴,OMG,our experience is so passionate and precious.

    后来,我们队表现也真是一般,唉,我是腿的要命,2个月没打了,欲哭无泪啊。在这群人面前,我是多么想好好表现一番,可往往不尽人意,而且关键是体力不支,唉这个状态怎么跑马拉松啊。后来,被虐了几盘,我再不敢乱来了,我就负责篮板跟防守,不过跟他们一起打,就是有激情,那种激情实在难能可贵,for me.不得不说,志超变猛了,突破往往easy得手。兴加,球队“科比”,绝对灵魂啊,防守,篮板,得分,样样压迫的对手喘不过气,哈哈,超说,这家伙,跟熊一样。原来牛A牛C之间的人就是这样的。呵呵。

    现在,聚在一起机会有了,哈哈,期待 and High.

  • 2008-12-17

    预备党员 - [生活]

    To know how to say what others only know how to think is what makes men poets or sages; and to dare to say what others only dare to think makes men martyrs or reformers - or both. -Elizabeth Charles, writer (1828-1896)
    会说别人仅会想的东西能把人变成诗人或圣人;敢说别人只敢想的东西能让人变成烈士或改革家-或者两者---伊丽莎白.查尔斯,作家。

    通知
    支部拟在下周三(12月17日)晚7点海洋楼A座515召开支部大会,讨论穆茜、刘守海同志的转正和李作川、吴昭军、苗馨同志的发展事宜。请全体党员、预备党员准时参加。鉴于本学期开的支部大会已经很少了(只有一次),故原则上不允许请假。另外请大家有党费证的把党费证带上,缴纳本学期的党费,每人一个月一块前,交四个月的。

    经过一个晚上的折腾,我就这样被发展成为预备党员,称为中国共产党坚实力量的一分子。我将始终贯彻全心全意为人民服务的宗旨。经过这次会议,终于看到自己的缺点,其实我应该略知一二,只是不愿去改懒的去改,但是,我坚信,幼稚的想法经过时间的历练始终能升华为稳健的理性认识的。于是,终有一天,我成功的改掉了这些缺点,成为一个小小的成功人士。——自恋。

    漫漫长路,我独自一人在追求的人生的完美人格的道路上,这一刻,早在这一刻,在我内心萌芽的那一刻,就从我幼小脆弱的心灵开始了,这必定会历经无数内心的痛苦,但我将一一克服,无欲无求,成为生活的强者。

    恩,生活的强者。轻于鸿毛,重于泰山。

     

  • 2008-12-16

    霸王别姬 - [笑话人生]

    Nature can provide for the needs of people; [she] can"t provide for the greed of people. -Mohandas K. Gandhi (1869-1948)

    刚看完《霸王别姬》,很遗憾,2CD没有连在一起看,CD1之前的一个晚上看完,由于时间太晚,没能看CD2就匆匆躲进被窝。我实在不得不如此敬佩张国荣——我之前不是很了解的一位巨星,他所扮演的程蝶衣把虞姬的一颦一笑表达的如此传神。不愧是“一个罕有的艺术天才,而且不但没有浪费这份天才,反而用了数倍的努力做到更多更好。”当然,里面其他大牌的表演也是入木三分,怎一个“赞”字了得。看完影片,还是有很多不解。于是乎,上网看了很多影评,才有了整体性的理解,再次被影片的很多细节所折服。

    陈凯歌在本片充满激情地叙述这个延续半个世纪的故事,但他却不满足于仅仅动人地讲故事。片中一些镜头,极具张力,具有相当大的历史涵盖面,发人深省。这部影片,在华丽的背后,蕴含着深刻的哲理。

    其中,里面最让我印象深刻的镜头和台词:

    【31:16】 关全发:讲这出戏,是里边有个唱戏和做人的道理,人得自个儿成全自个儿。

    @关师父的严厉,变态体罚,实在让我印象深刻,对其手法真的是充满愤怒,同时伴随着少量理解。@

    【46:02】 程蝶衣受到戏迷的热情欢迎,在龙凤楼大戏院外,正要进去的时候,一声"冰糖葫芦"的叫卖声,使得蝶衣停下脚步,怔在那里半晌。

    @其实,从程蝶衣一出场,作为观众,我们第一反应应该都是认定:他就是小豆儿。不过,我更感兴趣的是,陈凯歌如何在电影里面给我们这一提示。@

    【2:04:04】 面对狂喜的腰鼓队和布衣军人风酒朴的队伍,陈凯歌安排了小楼、蝶衣与张公公的重逢。两人分坐在张公公的身边,在为一座 石阶所充任的观众席上,目击著这一现当中国历史的关键时刻。飘过的烟雾,遮断了画面的纵深感,将这幅三人全景呈现为一幅扁平的画面;仿佛在这一历史剧变的时刻,旧日的历史不仅永远失去了它伸延的可能,而且被挤压为极薄且平的一页:昔日显赫一时的公公与永恒的"戏子",此时已一同被抛出了新历史的轨道,成为旧历史间不值一文的点缀。

    @我只是一般观众,很不专业,没有如此专业的体会。@

    【2:07:50】 这段葛优的表演相当出彩,形容枯瘦,眼中常锁着奇异的光,这要比在电影《活着》中的那个"龙二"要精彩的多,这万恶的"戏霸",在他的最后关头终于没有走完霸王的七步,事实上他刚抬脚就被旁边的人无情的推搡,无奈之下只能以猥琐的碎步了结自己残生。

    @第一遍看影片,我丝毫没注意到这个细节,看了影评后才回头看了这里,的确如此,所谓经典,大抵如此。@

    【02:14:09】在讨论戏剧改革与现代戏的一幕中,菊仙的一声高喊打断了段小楼原本打算认同程蝶衣的、不合时宜的发言,她从看台上掷下的一柄红伞("遮风蔽雨"的暗喻)终于驱使段小楼作出了一番违心的言词。

    @第一次看,这里没看明白。@

    重要的道具
    1. 宝剑
    【38:07】 小石头:霸王要是有这把剑,早就把刘邦给宰了,当上了皇上,那你就是正宫娘娘了。
    小豆子:师哥,我准送你这把剑。
    【45:50】 程蝶衣:我昨儿刚去过(张公公旧府邸)
    段小楼:又去找那把剑,是不?
    那 爷:早不知卖哪儿去了
    【1:12:10】 蝶衣在袁四爷家发现宝剑
    【1:15:44】 蝶衣给新婚的小楼送宝剑,叫小楼认认这剑,而小楼已完全不识,只说这是好剑。令蝶衣大感失望,他已完全忘记当日所说"正 宫娘娘"之事,伤心之下,蝶衣留下了"小楼,以后你唱你的,我唱我的"决绝之词。在日本人进城的铁骑声中,蝶衣离开了段 家的宅门。而菊仙则把意欲离开家门找寻蝶衣的小楼一把拽了回来,并且匆忙紧紧关闭了宅门,这一扇门几乎彻底将师兄弟彻底 分开。
    【1:50:30】 菊仙拿着宝剑到袁四爷府上,一番话让袁四爷乖乖的去救人。
    @不得不赞叹,这些细节刻画的如此经典。@

     

    ——程蝶衣之为虞姬
    程蝶衣是导演在这部影片中所要着力凸显的人物,就我的看法,更愿意认为他的霸王从根本上来讲,是他执著了一辈子的京剧艺术,他沉浸了一辈子的"从一而终"的人生与文化理想。
    在影片开始时小豆子被母亲生生剁下一只六指,此后又因为唱错《思凡》被师哥用烟锅捅了满口鲜血,这两个场景连同其后被张公公凌辱一节,通常被认为是促使小豆子成为程蝶衣的三次或精神或肉体的阉割,是种种外在的暴力在年少的主人公身上的肆虐,小豆子因此而屈服,被迫实现了意识上的性别指认的转换,从而写就了程蝶衣这一段影片中美丽的诗行。
    而我认为,事实上小豆子的转变并不完全是屈服于种种外来的暴力,小豆子是一个倔强的小豆子,一如程蝶衣也是一个倔强的程蝶衣。在种种表面上的暴力压迫下,小豆子的主观意志不应被忽视。从影片中来看,师傅的多番责打,甚至所谓"打通堂"都没有在小豆子身上起到真正的作用,这可以从影片中小豆子和小癞子出逃回来后的那段情节中看出。小豆子一声不吭,既不向师傅讨饶,也不听师哥的劝告,倔强至此。事实上他第一次真正的转变并不是被割去六指或是被师哥在口中捣出血来,而是逃出喜福成科班以后见到了当时名嘈一时的"角儿"。看台中的小豆子,引颈而望,目光迷离,完全被舞台上的名角风采所征服,被叱咤英武的霸王所征服,被京剧艺术所征服,被一个绚烂华丽的苦孩子的梦想所征服。他"选择"了京剧,而不是被逼着走向京剧。正是这种强烈的向往和独立的自主意愿使小豆子自己重回科班。可以说,是从这个时候起,小豆子为自己选择了京剧这一条路,并用一生坚定地走下去。
    其后的一切则几乎是预设好般的顺理成章:由于长得面目俊美骨架清秀,他成了科班里唯一的旦角人才。既已认定,便只有走下去。当师哥的棍杆在小豆子的口中一阵乱捣之时,他终于看清只有这样一条前路,于是,镜头前失魂地坐在太师椅里的小豆子也就只有仪态万方地站起身来,行云流水般,面带一丝微笑地唱:"我本是女娇娥,又不是男儿郎"。至此,小豆子的性别指认转换完成。
    在这里,我想插上一点似乎经常被忽略的信息,影片中小豆子年少求艺一章中,不应该仅仅关注其性别指认的转变,在小豆子的少年生活中,导演跟我们讲述了两件大事,除了性别转换之外,便是他从一而终的信念的确认。这两件大事同样重要,并且在理解程蝶衣这一人物时有着最为重要的作用。
    小豆子从一而终最早的诱因是低贱的身世和师兄的情谊。低贱的身世平添了小豆子的无助感,而师兄的处处关怀恰好给了他一个爱和保护的归宿。直到后来师傅讲述霸王别姬的故事时,说"人要自个成全自个",说到了虞姬的"从一而终",可以说对小豆子而言是人生重要的一课,它把小豆子同师哥间长久以来的情感完全定义化,概念化了。我们看到影片中的小豆子一边哭,一边打自己的耳光,"从一而终"这个做人的道理从此在他心里扎下了根。"从"艺术,"从"京剧,"从"师哥,这几个概念在"从一而终"四个字中得到了最好最直接也是最简单的注释。
    再回到性别转换上来。在唱对了《思凡》之后,小豆子已经大致确定了他作为程蝶衣的人生道路,其后的张公公一节,我认为与其说是强调性别指认的最后变换与确立,不如说是导演在向我们昭示小豆子成为程蝶衣后的苦难人生的开始。张公公,代表着那个时代已经没落的势力,而这个没落的势力在这新出生的生命上犹能纵情肆虐,由此,程蝶衣一生的悲苦也冉冉拉开序幕。在那个欲曙还阴的凌晨,脸上还带着油彩的小豆子从张府默默出来,他此后的人生历程在那一刻已经基本定下了格调。"虞姬怎么演,也都有个一死",正是程蝶衣一生的伏笔和注脚。
    但是,我们看到,此时的小豆子依然倔强,在他发现了襁褓中的小四时,他置师傅的那一句"一个人有一个人的命"于不理,固执地把小四抱了回来。仿佛那襁褓中的婴儿正是他自己,仿佛一言不发负气般的收养是力所能及的最激烈的反抗,对一个人宿命的反抗。
    影片进行到这里,充满了内心世界同外来强力的激烈争斗的童年和少年学艺经历告一终结,镜头中出现了科班小子们合影留念的场景,昭示着一个阶段过去,和一个新的阶段的来临,闪光灯响过,程蝶衣登场了。
    果真是名旦风流,程蝶衣一登场,便给人惊艳之感。小豆子年少时的理想终于实现了,风华绝代的虞姬,满堂喝彩的舞台,灯一亮起来,音乐一响起来,踩着鼓点他就成了故事中不死的美人。可以说从一而终贯穿了程蝶衣的一生,他属于京剧,属于霸王别姬这个古老传说。恰恰是这个倔强的小豆子,或者程蝶衣,把自己认定的、师傅教导的那个信条,最当真地、最彻底地内在化了。这种内在化中,我们依然能窥看到程蝶衣或者小豆子对自己人生的强烈的自主意识。而同时,这种内在化也使程蝶衣的人生历程完全走上了英雄气短的永恒困境。

    因此,是程蝶衣,而非段小楼,成了真正意义上的霸王。

    不疯魔不成活。这是小楼两次用以评价蝶衣的一句话。说这话的当时,一次是在蝶衣发疯似地凄喊:“我要跟你唱一辈子戏。少一年,一个月,一天,一个时辰,都不是一辈子!”一次是在文革中,实行“现代戏大改革”之时,坚持“情境”的蝶衣在讨论会上独排众议反对现代戏(实际上反对的是对京戏的粗糙化和政治化),然后闭门不出。当小楼说“你一辈子就知道唱戏,你也不出来看看这世上的戏都唱到哪一出了”的时候,门里传来蝶衣幽幽的声音:“虞姬她为什么要死?”——小楼骂出了那句话,愤然离去。

    ——张国荣,虞姬,从一而终。《霸王别姬》,堪称经典。——


     

  • 2008-12-15

    突然想到 - [笑话人生]

    All art is autobiographical; the pearl is the oyster"s autobiography. -Federico Fellini, film director, and writer (1920-1993)

        下午写入党志愿,突然想到初中(初三)上物理第二课堂,4班物理老师讲过,古时候,人们——应该指的就是仓颉,喝醉酒了,把射和矮二字抄错。射,寸身应为矮;矮,委矢应为射。那时候上课,觉得有道理,就姑且听之信之了。还一直把这个讲给其他人听,津津乐道。

        直到刚才,才想到上网查下这个典故(早有这个想法要去查个究竟,没想到拖到现在,实在罪过)。今天查阅了网上相当多的品评,才发现二者并非古时候汉字的错位,而是汉字从诞生至今4000多年的不断演绎造成的自然结果,这个说法看来更有说服力。

    射与矮

    整子/2005/12/15/

     

       前几天看到有人在网上撰文说,射与矮字可能是古代演化过程中的一个错位。射是[身]和寸组合而成。而矮则是矢和委组合而成。矮是委矢,即把箭委弃出去。因此说,矮应该是射,而射应该是矮。我考察了这些字的意义与来源。其实二个字的相关并不是很大。

      射的甲骨文是一把箭在一个弓上。经过演化后,成了一个今天的射字。在这个过程中,身的原字形是像弓形的。而寸字实际上像弓上的箭尾。身的中间一横和寸字中的横在古字中是连在一起的。像一枚放在弓上的箭。后来的金文,小篆等都做了分离。在[说文]中,古字的射是做身旁加一个矢字。是从矢的。说明原先的这个字还是从箭,而不是从寸。而身字想必就是弓字的讹写。既然从了寸字。人们仍有相当的理由予以解释。寸从手。手持箭拉弓。弓古字的意义解释是[穷]的意思。用箭射向远方,也就说在[穷远],或达到远处。这种解释似乎也是合理的。由此可见,射字被古代讹形实际上是在附义的基础上演变的。人们认为寸身为矮,故此不符合射字的本来象形之说站不住脚。

     射字在古代本来读音为[ye}。一般情况,是北方读射[she],南方和除中原外的地区则读[ye]。二者读音之间只一声之转。还有个音是读{yi},可能是周人的读音。这些读音都做去声[第四声重音]。

      射字意义的来源来自于狩猎时代。他做动词使用。而矮则做形容词使用。古代有一种动物叫射干。这个动物的名称实际就是人们在打猎时看到对这个动物的称呼。后来的演化的意义就十分多了。古代射箭狩猎都是由男人来进行的。女人拉不动弓弦。射箭技术好的人会被选为射官。后羿就是有穷国的君主。他在当时的天子下面就是一个射官。后来射渐渐成了儒家的六艺之一。另一个射的意义就是被人们用来表示一种娱乐的 称呼。如射覆。

      矮的来源比较复杂。但可以肯定也是同箭相关的。作为一种形容词的特征,肯定是有一个具体的象形起源的。先来看一看[委]字。

      委字起源古代的一个祭祀的行为。看字形我们就知道,下面一个女字,上面一个禾字。说明一个女人头上顶着一个谷物的东西进行献祭。具体情形是该女人双手高高地举着谷物超过头部。根据我们中国古代对女人曾经不参与[应该说很少]狩猎与耕作的传统研究,女字的造型是下跪状。这个下跪并非是说明古代女人卑微。恰恰相反的情况是,它真正来源于古代人的祭祀行为和宗教崇拜大部分都是女人创造的。社会中巫的人物和职位基本上都是由女人来承担的。因此,古代的女字实际上就起源于女人做为祭祀的巫的角色而形成的。它象形一个女巫跪着向上天祈求并献祭。委字同样也来自于这种情形。

      [礼,学记]中记载,三王之祭川也,皆先河而后海,或原也,或委也,此之谓务本。原委这个字的意义就来自于此。实际上,这里的委就表示一种祭祀。原指一种精神的社会历史溯源,委即指向上天或神灵进行祈祷祭祀。这都是一个经过抽象化的,对事件行为的一种描述。

      为什么古代的人先祭祀河呢?因为人类进入农耕时代,谷物需要水来灌溉。故此,祭祀的时候也因此献上谷物[禾]。故此叫做[委]。

      从矢的字的出现,说明了古人已经进入狩猎和农耕并举的时代。可能的情况是在于说明了农耕比不上拉弓射箭的狩猎。这得意于古人弓箭的发明。古书记载[挥作弓,牟夷制矢]。此时,献祭的时候就不仅要献上谷物,还要献上箭。以保佑猎物和谷物都有收获。但是,这同矮的意义又有什么相关呢?

     矮的意义在今天指相当于短,低,小三种意义的统一。这些意义都建立在因蹲或 跪而变得短小的基础上。起初的意义就是专指身材短小的意思。献祭的女巫无论是谷物还是弓箭都低于它们。这不但在说明人的身材因跪而底短的形状,而且还在说明一种祭祀的虔诚信仰。古代有一种叫[折箭为誓]的说法。因此矢字有是也做誓义解。

      矮和委的读音也是相似的。只有一声之转。其韵做蟹韵,读为乌蟹切,上。

      根据字形,古代献祭的时候,旁边的箭是插在地上的,或者是放在旁边的。这说明在做这个祭祀的过程中,可能是先献谷物,后献箭。

      我还考虑了一种在比较的量化意义下的矮字的意义。但这种来源的可能性不是很大。即由于古代的箭都是很长的。是用木做的。[木为矢,竹为箭]。金属使用后,便以此为箭头,叫做镝。由于箭的长度大致相当于女人的身高[也许与此无关],或同女巫用谷物献祭 时所形成的高度差不多。与箭相比,低于箭的长度时,就叫做矮。为什么会有这种比量呢?可能的情况是,女人有时也是参与狩猎的。如果女人的身材超出这种情形的高度,大致是允许参与。如果低于这个高度,便叫做矮,则不允许参与背箭狩猎。故此,矮带女字。古代的箭是怎样来的呢?应该她是来自于投镖器,相当于标枪。其之所以长,是因为,如果没有弓的情况下,同样可以做投器和狩猎工具使用。后来随着社会的发展和认识的发展,箭杆为了减少在飞行中的阻力变得越来越细,越来越短。弩的出现所使用的箭就大大缩短了,这便于携带。这种设想的说服力比不上上一种。

    文章来源:http://www.zhengtiwang.com/ZTj/jingxuan1/ZZZ16.htm

    其实在汉字里这种情况很多,汉字从诞生到现在已经有近4千年的历史了,很多字都不是其本来面目了,所以我们不能用现代汉语的标准去望文生义,要看清楚它们的源流。另一组比较类同例子是:出和重。

    “牛”与“半”(“牛”只有半边一撇应为“半”,而“半”字头生两角该为“牛”)、“凤”与“鸭”(“甲鸟”乃天下第一至少也是一类鸟,这应该是“凤”才对啊,怎么倒给“鸭”摊上了;而凤——繁体的“凤”字由“凡”和“鸟”组成——乃鸟中之王,却只落得个“凡鸟”之誉,实属天大的误会)、“炊”与“烟”(“欠火”则“烟”冒,“因火”才可“炊”啊)等等,其原意都并非讹传中的颠倒。

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    突然很想听《心肝宝贝》,OMG,J D I.

    Tag:射,矮
  • 2008-12-11

    深夜徘徊 - [生活]

        刚在译言玩了几个小时,好累,盯这个屏幕盯的我眼睛好模糊。well,“when my time comes...”开这linki的Blog,不自觉的响其了他里面的这首林肯公园的经典之作。世界是安静的。

        我似乎坐太久,背部发酸。本来打算看会《通信原理》,看部电影,然后回去睡觉,可惜泡译言泡太久了,谁叫我英语差劲呢。现在已然4点,没什么时间搞其他东西,眼睛又很累。roz,我应该再多写一些。

        最近的日子,总是颓废。每每不知道自己能做什么。很囧。低落。“Don't be afraid.I have taken my beating...”

        想起小强说的那句:“很多事情,去做的时候或许没什么,但坚持下来,世界必将改变。”突然,很期盼跟他面对面沟通。好久不见了。

        "leave out all the rest.I can be who you are."

        以后,我将在这里续写我的故事。

    Tag:深夜 低落