新手帮助 | 版主申请 | BST制度 | MST制度
返回列表 回复 发帖

程序员的幽默

中学阶段
! T# I+ c+ K: `+ ]        10 PRINT "HELLO WORLD" / A; |5 O7 M% j; T/ S& Y) b
        20 END
9 x9 x9 j6 o5 k/ k# T2 s& T; H8 L--------------------------------------------------------------------------------
5 S8 [( M9 t# B, K  i8 h大学一年级
" y& m% ]. J# j  s        program Hello(input, output)
4 Z2 u/ k" P/ U0 O2 ?) t) Y( R          begin
5 {- ?1 G5 t+ u. M' Z# ?: Z  P            writeln(';Hello World';) : p: h# X5 U! }* m" O+ n' p4 s
          end. - N) u$ z) T# a. D
-------------------------------------------------------------------------------- 2 w9 E& t2 w! t) e% }9 a4 H/ u
大学高年级 + r  l0 y3 L3 K/ B
        (defun hello 0 q% ~7 P- y8 f: r5 |
          (print
' L% V- c0 H* H2 m            (cons ';Hello (list ';World))))
. }6 Z0 g# U) l--------------------------------------------------------------------------------
0 k: M4 w& e9 g; i: G$ [初级程序员 6 [) q# s6 t; a0 _
        &#35;include <stdio.h> & R9 ?: E! m, l/ I$ A
        void main(void)
7 y* f. I* Y) g) O2 e. f' R) n        { : r7 x& K) s- r, [7 f. `1 H2 i8 i
          char *message[] = {"Hello ", "World"};
. e# r8 |* y! W4 C8 t          int i;
1 N0 p7 X9 `  A          for(i = 0; i < 2; ++i)
; |  w4 d. a% t- u8 N            printf("%s", message); 5 y) Y# X" L( {: v8 P0 z9 r) E& z
          printf("\n");
1 }7 r$ H# @" p7 F, H; O! M        }
" l+ g! H. |$ ?) q  \-------------------------------------------------------------------------------- 1 z; A0 E* I, Q. o7 L7 U1 z$ Z
编程老鸟
, X; r9 M& w+ h3 {        &#35;include <iostream.h>
0 l& S% p) r: t, p+ f- d        &#35;include <string.h>
5 _$ q  P! P& g; Z* ~1 x        class string ! c; ?  O: w8 {- g
        {
+ Q1 R3 l( j' [/ B5 B        private:
) X3 G. \' e: F* K+ ^          int size;
' h* Q, ?  Y7 v5 }          char *ptr;
: W8 e, R2 W" i7 Y; Q        public: 4 H; B' G4 P# _5 q/ f/ d5 F2 R
          string() : size(0), ptr(new char(';\0';)) {}
7 ^$ N. p7 G' e          string(const string &s) : size(s.size) ) o7 C# v1 j& _
          { * J5 U. V4 ]0 x- v+ @, W
            ptr = new char[size + 1]; 4 _, E  i4 E/ n8 |9 ]- {% `
            strcpy(ptr, s.ptr); - M" E3 }. c9 y/ E+ Z6 Z
          } / T3 H2 l' Y* f9 L+ V9 E' ^
          ~string() ) X$ O+ s% i( i+ U% A
          {
% I$ f8 c# ]# `' r            delete [] ptr; 0 E, G& l2 ^5 Z; T
          }
' Z. z6 \9 p" E' x/ _1 I          friend ostream &operator <<(ostream &, const string &);
8 b! Z. `3 }! I6 S3 a- a  G          string &operator=(const char *);   K, }& t) X6 I
        }; . \" t3 y' K4 e$ N, {3 I
        ostream &operator<<(ostream &stream, const string &s) : B$ v# }0 j1 J. L: u* s* ^
        { ( P+ W# n" K& J
          return(stream << s.ptr); / S  q/ ]; S! a) s$ q! S5 l' A5 q
        }
7 }% s7 [) D% o. [/ x        string &string:perator=(const char *chrs)
# {7 k) n. h1 v) c% b" \; B8 Q        { 7 S+ |7 ~1 ^* n+ V; A, G$ a
          if (this != &chrs) ; B% k9 \9 o. q9 @. d
          { ) h  f/ q9 a; N: J$ u9 N% t  }
            delete [] ptr;
# @  y: c' M* u" e0 a" f; v4 d           size = strlen(chrs); 1 O6 J' a. {* }9 Q, V. d
            ptr = new char[size + 1];
( O/ {9 N0 K) q% `5 P6 t            strcpy(ptr, chrs);
  y" w" Z, ]$ Y( z% A! K- G          }
1 a& Q1 S; O+ r2 s5 A, z          return(*this); ) B: q$ ], C% y! O
        }
# g, G$ p/ J; D9 n' w        int main() 1 A3 y6 `  |6 V( T& c0 r7 T1 N
        { / E- e9 `9 P8 M8 J& ~6 `8 h% w
          string str; : H9 W; Y1 p6 N: I
          str = "Hello World"; ( j0 m( J3 ?% S8 O% r* Y! }
          cout << str << end % i& ^, f# U' V3 n3 U& `
          return(0);   v0 N4 \( ~6 Z2 X/ j% E4 p
        }
" z/ |0 ^+ z4 k--------------------------------------------------------------------------------
3 x; [9 I4 o/ [/ {  V编程高手 * u, h3 ^% B3 m) ?9 c) f
        [
- A% Q! K' w: V+ C1 |" O5 R        uuid(2573F8F4-CFEE-101A-9A9F-00AA00342820) , [# q) K! s: h, b  z3 L! f- q' @7 G
        ] . f9 q- @5 I8 O' P) b
        library LHello $ g& q5 B# O/ b- H
        {
0 b. [# Y1 [( v) y) ?) k1 k            // bring in the master library 6 D  w( J+ N5 F4 o
            importlib("actimp.tlb"); 0 H: ], J! J$ t% O
            importlib("actexp.tlb"); ' d" P+ e9 m$ _
            // bring in my interfaces
3 g  ]# [% |! c; p/ N            &#35;include "pshlo.idl" 7 E' d) a9 u: p  G4 O8 G
            [ 1 n% W/ X, y0 c1 }- l. W
            uuid(2573F8F5-CFEE-101A-9A9F-00AA00342820) , r# e' x6 \7 \9 K5 h; o; F
            ]
  y6 r1 R) y' e0 u            cotype THello
# e7 r* ~0 o, T, W& m/ H0 E         {
; A% }4 C8 f, t+ r5 v- l         interface IHello;
; Q8 U+ N. M5 u7 Z         interface IPersistFile; / \; C* q4 O1 @& C9 G, W; n
         }; / d) r/ |. }" [4 j
        }; 8 K  W9 V6 C  E
        [ : R" t- T8 S; N+ T$ G
        exe,
. o2 v' a$ j5 M- K+ @        uuid(2573F890-CFEE-101A-9A9F-00AA00342820)
8 o- H# e$ m( s! [        ]
/ ~" ?5 Q: G  \5 J        module CHelloLib $ ~! L. |. C& M6 C7 l- {' N
        { 5 x! J, Y7 h8 n( y9 [- N* R
            // some code related header files
9 q- S6 _3 w* ^/ W) n. L" h  O, a- \            importheader(<windows.h>);
  p3 [9 `# k. J% g: W0 |% z2 g! E+ q            importheader(<ole2.h>); & A  P( S0 @7 s3 ?# D9 p
            importheader(<except.hxx>); : B5 @. J' Q0 W! S4 d
            importheader("pshlo.h"); & A! r% F; {3 g( s8 u( c
            importheader("shlo.hxx");
. W. h# A, U( z" o7 Q$ Y            importheader("mycls.hxx"); ; x$ o) }" e+ x7 t# ]
            // needed typelibs
) b) v; r3 \# |4 v2 ?% ^* R            importlib("actimp.tlb"); 6 W# Z! D/ Q% J+ p6 J
            importlib("actexp.tlb");
$ m3 R9 K  I8 v5 `# v3 j            importlib("thlo.tlb");
  u; ]  H$ D4 V1 O- L+ n1 e, {            [ ' _1 r/ q$ C" M# U5 K! ~; A
            uuid(2573F891-CFEE-101A-9A9F-00AA00342820),
4 z' t8 a* N! L: n- r& n            aggregatable
; o5 e. c+ V* K, `4 p# K            ]
! N; t! N# X' Q3 G            coclass CHello
4 y+ E5 O0 V' @* w         {
3 \1 U4 C+ P2 p6 f: v         cotype THello;
& y. J# V& u0 B7 D5 U$ d         };
6 W3 U2 h+ y( W- M/ A! g        }; 1 O9 ?0 r3 ]" N1 u- k3 a$ w
        &#35;include "ipfix.hxx"
: K7 H) }9 _4 K1 F" P1 P2 R        extern HANDLE hEvent;
' I- U. y( K0 \4 }8 F        class CHello : public CHelloBase
* ?$ _6 e. r0 l. H: G; ~" H: _        {
$ n' L  |; k3 z3 X0 K3 R        public: 7 C. v# g9 Z: b6 d8 s% A
            IPFIX(CLSID_CHello);
2 S% _1 T* [' d  a: t            CHello(IUnknown *pUnk);
6 {, z- g, S, `, I! E            ~CHello(); * V: z- M2 c+ Y
            HRESULT  __stdcall PrintSz(LPWSTR pwszString);
, C' R/ I$ C7 @9 U! {3 r2 M        private:
2 @6 M( S# d/ \            static int cObjRef;
  A" @6 K2 {+ D$ m4 q# t        }; + r5 M! ]2 s5 Q7 y- ~
        &#35;include <windows.h>
' @' d3 P' Y; @! `; t+ p        &#35;include <ole2.h> ) V# H, r) I* {
        &#35;include <stdio.h>
2 I# Z4 a4 ?( k6 |" g, d. M        &#35;include <stdlib.h>
/ a  W1 g; S  I9 B1 z        &#35;include "thlo.h"
; O# S& V: E0 O& ^        &#35;include "pshlo.h" 7 y* K9 w& B2 y. u7 i# A  ^
        &#35;include "shlo.hxx"
8 W* k: y8 L! H9 w) Q" p+ ?8 Q3 s        &#35;include "mycls.hxx" : `! c1 k& c* Z" [% Y$ H' d0 J
        int CHello::cObjRef = 0; 7 j0 {+ g# O' X3 n' a
        CHello::CHello(IUnknown *pUnk) : CHelloBase(pUnk) % i% i! y4 T9 g  f/ k
        { * G1 R6 i! z# {, G; [  E0 x: W) O6 M
            cObjRef++; * O- o$ x! e3 I  U( z1 i3 z! O( K
            return; 0 G9 U+ S% w& O) k& ~, [$ H1 y
        } ) @3 Q/ @0 e2 k
        HRESULT  __stdcall  CHello:rintSz(LPWSTR pwszString) . F% H- y* A! j2 Q/ P* U
        { + c( M- f( r& Q8 z0 P$ u
            printf("%ws\n", pwszString);
, l: s% f! d3 m% _            return(ResultFromScode(S_OK));
+ T4 \% l9 Z& {- j$ W& E) `        } # E: V3 [. M5 u( N/ @+ ^0 s
        CHello::~CHello(void) - t2 v: d/ b9 B$ l. l8 z( C3 d
        {
7 Y2 T3 C% e6 d! g: v& g7 l* ]4 j        // when the object count goes to zero, stop the server
  x0 f; Q6 z+ n" o. ~) Q        cObjRef--;
$ F& s8 P* h) N6 M$ o6 P3 K  s2 Y        if( cObjRef == 0 )
, v7 J; q- k# E( [            PulseEvent(hEvent); & u6 t( F5 A% O3 [9 K/ n
        return;
( f8 a. x6 s  G" _        }
; z1 j. w* m' E2 k( H        &#35;include <windows.h> ) \! f) M7 {& l! G7 C
        &#35;include <ole2.h>
0 J$ ^& ^2 Y  G' S+ a        &#35;include "pshlo.h"
0 }& S4 q) c6 o3 H& n) V& F" ^        &#35;include "shlo.hxx" 7 F$ V3 Z% }# x+ T
        &#35;include "mycls.hxx"   s9 u2 i+ C1 a: |- b2 s
        HANDLE hEvent; : [- K  M5 p' r# f" ^. T% K
         int _cdecl main(
8 D( V+ l' u* c2 ~( n/ e        int argc,
8 S% ]' H; H$ J- u( H( W        char * argv[] , u. s0 W  C: |
        ) { 3 t8 P' U0 g; _+ v0 w& M
        ULONG ulRef; 5 D+ n* k9 Z0 v! i( M
        DWORD dwRegistration; 3 W% g- X( \9 C* l! m0 d! L% i
        CHelloCF *pCF = new CHelloCF(); $ ^/ x2 l! Z7 W9 S+ e; P' s. G, m* ~
        hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
* K3 i" M" P3 g& D+ |5 ~& ^8 T        // Initialize the OLE libraries
% V+ J6 L4 {/ a- I5 x2 _) t7 F        CoInitializeEx(NULL, COINIT_MULTITHREADED);
0 F# e) h2 ?+ \3 @        CoRegisterClassObject(CLSID_CHello, pCF, CLSCTX_LOCAL_SERVER, - a& B1 ]7 l* `, I, N1 \3 \* ]
            REGCLS_MULTIPLEUSE, &dwRegistration); : M, K5 g0 [. H  C2 z& X- c5 K
        // wait on an event to stop
. _" T7 g% V. ^; Z9 v        WaitForSingleObject(hEvent, INFINITE);
. W$ M+ p* }+ v' k9 a* L        // revoke and release the class object
- t: F9 @' U) ~1 ~9 U* x* U        CoRevokeClassObject(dwRegistration); ; ^5 m+ b. t8 @6 Z$ u8 v2 [4 x
        ulRef = pCF->Release();
7 n9 U- G$ V( q  t        // Tell OLE we are going away.
  W2 }2 `6 ?  l( a2 F* a        CoUninitialize(); 1 G: w9 x. r5 |
        return(0);
5 z+ m1 K! r: y' T- _  x9 D- l        }   u3 a8 S8 `8 g# o/ z
        extern CLSID CLSID_CHello; ' j! E# d9 r5 a0 p
        extern UUID LIBID_CHelloLib;
2 ~3 g9 I  p, q4 l5 M  A        CLSID CLSID_CHello = { /* 2573F891-CFEE-101A-9A9F-00AA00342820 */ $ a, H. |# V8 }! `1 x" z
            0x2573F891,
3 P% P. c( j& Q7 c            0xCFEE,
9 B! E& S1 S  S) x            0x101A, ' O7 D& Q: F5 K. ~
            { 0x9A, 0x9F, 0x00, 0xAA, 0x00, 0x34, 0x28, 0x20 } & O: z7 k9 G! R& N* D4 S$ d" o2 b
        }; : e" `  J. m6 S3 i. ]
        UUID LIBID_CHelloLib = { /* 2573F890-CFEE-101A-9A9F-00AA00342820 */
7 D3 k) L; F" L# w# S3 @            0x2573F890, + J3 ^& O  I: Y& \8 w
            0xCFEE,
/ n( ~% H8 ]. @, b5 c! ]8 o# s  }            0x101A,
& X1 m# X, l6 Y6 P% }            { 0x9A, 0x9F, 0x00, 0xAA, 0x00, 0x34, 0x28, 0x20 } 4 U/ X/ L0 L/ |- P9 ]. P
        };
/ A8 [$ j, O. |+ f        &#35;include <windows.h> 5 J- \& s1 Z, t6 M; `! D' O
        &#35;include <ole2.h>
9 A3 H5 g# w9 |* W* Q; N2 h        &#35;include <stdlib.h>
; U4 T- ^) s& t: x% q% x& f& \        &#35;include <string.h> 9 U4 ^9 P, \8 \. ?0 M& T/ t
        &#35;include <stdio.h> 8 {* Y2 U8 M, E: P
        &#35;include "pshlo.h"
- C- `& t8 I  Z5 a+ J        &#35;include "shlo.hxx"
% Q: W; b2 {6 U5 [; m; N        &#35;include "clsid.h"
* u6 J9 l( {0 B2 N        int _cdecl main(
% Q' H% f- m7 ^& B        int argc, ' X- }$ R& I  m+ j: T' n, E, N
        char * argv[] 7 u& M2 l% Q1 P! P+ o3 i$ G5 {
        ) { / E" ^  J4 c; F
        HRESULT  hRslt;
8 R! u; C  J. j  W        IHello        *pHello; % V3 @1 k9 D% `
        ULONG  ulCnt;
( A  S7 v0 f1 O! i        IMoniker * pmk; * n% j1 |! W: G$ X8 B5 o9 L
        WCHAR  wcsT[_MAX_PATH];
3 k2 l6 P, U2 \4 f* m7 }        WCHAR  wcsPath[2 * _MAX_PATH]; ) B& J, b) m( T; y* z% n
        // get object path 5 d1 p! x+ s: Z* i$ p8 ?7 f, l
        wcsPath[0] = ';\0';;
3 N5 N/ {8 q, f% b8 \0 k0 w        wcsT[0] = ';\0';; $ F* d3 m8 s9 A. p+ O
        if( argc > 1) { " o& p, Y( h5 j+ P( X0 v6 N! r
            mbstowcs(wcsPath, argv[1], strlen(argv[1]) + 1);
. i! j# a5 g7 C; D8 L1 ^: E            wcsupr(wcsPath);
' f  M" O' F# q" h  L6 O. f3 u            } % X3 t' ]+ c3 O+ B2 V, q8 I
        else { ( m; [) R, l# j$ o5 o8 f
            fprintf(stderr, "Object path must be specified\n"); 1 u; J7 [2 d* H
            return(1); 3 h4 s& ~1 s* k3 c1 y' @
            }
# N9 _9 a8 }5 t+ q        // get print string 1 I0 e$ p1 n( C0 c4 D, c1 i- K
        if(argc > 2)
0 E0 e; f0 F' o2 Q            mbstowcs(wcsT, argv[2], strlen(argv[2]) + 1);
: {1 H2 w9 y+ t. k/ w+ r        else
$ y  h& Z- C7 F% B7 J1 }            wcscpy(wcsT, L"Hello World");
: K3 M% o: p6 }4 ~8 m        printf("Linking to object %ws\n", wcsPath);
& V, a6 r) J/ ~! F! Y$ N/ ^6 ?        printf("Text String %ws\n", wcsT);
$ |* ?  u8 ~9 H8 k        // Initialize the OLE libraries
' U5 u, W8 {0 }5 _! k5 i        hRslt = CoInitializeEx(NULL, COINIT_MULTITHREADED); : ?  |6 q  \8 Y/ Z
        if(SUCCEEDED(hRslt)) {
$ {  ?0 \, H2 d            hRslt = CreateFileMoniker(wcsPath, &pmk); + x3 e# H) L8 Z1 U2 Q
            if(SUCCEEDED(hRslt))
. V3 I6 q& c, a* B% H& S) }. w; p         hRslt = BindMoniker(pmk, 0, IID_IHello, (void **)&pHello);
. W4 E0 `) p) |, Q8 P; U8 c3 q            if(SUCCEEDED(hRslt)) { 5 V4 w. X( ~' S' `
         // print a string out 3 v+ @, L0 e4 V9 U! z# a
         pHello->rintSz(wcsT); 9 h4 ~# v1 f* H) m
         Sleep(2000); ) W+ c$ a9 W+ n+ K& I; ^+ {" P
         ulCnt = pHello->Release(); 0 `! G$ e4 h9 |1 _: T: e
         }
1 U  G& M; s$ T) G4 c( ]) ~3 l            else
; W" C9 T. F7 |& b2 S         printf("Failure to connect, status: %lx", hRslt);
/ v9 x( b0 h0 C, y  N8 s            // Tell OLE we are going away. 1 M  ?7 w; j7 v. {' s* x7 t# L$ }
            CoUninitialize();
8 }! n6 |; s2 @* f' ~  ]/ f; W! t0 n3 ]            } ; C! B& B6 w* g) E
        return(0);
' Y* S4 V  D3 h0 N( T' V        }
# j$ J; S( W* X9 T7 G$ w" G* f# H! o-------------------------------------------------------------------------------- ; F5 }) Q# q! F+ e3 a9 {2 A
黑客初阶 # u* v- d) }; I$ }, D
        &#35;!/usr/local/bin/perl
: r  ?8 V+ [. t! L        &#36;msg="Hello, world.\n";
2 Q, p; S& e9 |6 t3 [% n        if (&#36;&#35;ARGV >= 0) {
/ D+ w# l  V- d" R          while(defined(&#36;arg=shift(&#64;ARGV))) { 7 S5 n* m6 E/ c" l
            &#36;outfilename = &#36;arg; 7 F( V2 j1 F6 _
            open(FILE, ">" . &#36;outfilename) || die "Can';t write &#36;arg: &#36;!\n";
2 _! h% F8 N0 u" i            print (FILE &#36;msg);
. j" o1 D  [4 I+ @1 }6 x            close(FILE) || die "Can';t close &#36;arg: &#36;!\n";
1 [7 @, U1 C" V/ I" w  w) Z          } - A- z' V7 M* y
        } else {
; c$ G* i( S% w          print (&#36;msg);
, O& o) W% A* d# k5 w$ I  \+ Q        } " m4 W2 {/ y! f( I% z; t
        1; * I4 R! j% M# L
-------------------------------------------------------------------------------- ( Z9 f9 a) e6 X% x$ z
黑客有成 ) _9 Q' f- f6 R, S8 M. h! S
        &#35;include <stdio.h> $ o1 n2 K9 ^& Y5 p$ J1 _# ~9 K1 w
        &#35;define S "Hello, World\n"
8 y. L& C+ X) L& N        main(){exit(printf(S) == strlen(S) ? 0 : 1);}
+ @: u  j4 j# |1 [3 g! t, |. ]--------------------------------------------------------------------------------
" |2 r$ }) z! l  j. N0 F7 o黑客高手
, i5 q& b/ }6 a' u: n+ g, C. Z) r$ M        % cc -o a.out ~/src/misc/hw/hw.c
# E8 t( r4 D- w* q* g- a' |" [" L: J        % a.out 0 L, Z* v9 P2 Y$ I& x" @: d# i+ z% }# v
-------------------------------------------------------------------------------- . y. x/ \! N& S2 I8 M
黑客大虾
, C. C5 `1 x  F  P        % cat 7 Z: u' C+ J. g& m
        Hello, world.
& T, P$ @9 h( o4 I# e: n7 L8 `9 Z0 [5 ^        ^D
; A" V  h5 Q) M--------------------------------------------------------------------------------
: q$ y8 x6 ]$ [4 \: @# r2 e初级经理
5 l0 l- A- X. U* U& m        10 PRINT "HELLO WORLD" , B% j5 B4 z7 ~
        20 END : n- e3 p! ?, k1 T/ S6 G+ m
-------------------------------------------------------------------------------- % ]) \3 c! g, `) B/ y8 K. g- g
中级经理
: Y/ ^5 y/ ^  y  R) G        mail -s "Hello, world." bob@b12 9 b$ t/ {' r5 _7 J( U! o6 {
        Bob, could you please write me a program that prints "Hello, world."?
8 [, R: {: ]4 _# n        I need it by tomorrow. 5 `; \( B9 c: o: T, }; x
        ^D
  a% K, o. W0 Z9 ]2 S* e, L-------------------------------------------------------------------------------- 5 Y% {8 _6 [+ T
高级经理
# E! _8 M- x- q+ W4 L  X9 X3 B        % zmail jim & G+ a" ~1 N! ]/ v* e
        I need a "Hello, world." program by this afternoon.
; j2 n, L3 B7 U) {7 j' q! U( r--------------------------------------------------------------------------------
" E, I$ c! }1 d# k: K' @$ e首席执行官
( N7 p7 M$ q3 i0 l9 k$ ]        % letter
0 V+ R/ I+ w& Q$ h- N' s0 U8 |        letter: Command not found.
5 \% ~" I" q6 S. b' k. X        % mail
- ^. G/ O6 q( ?) C; T        To: ^X ^F ^C ! a- p# ?/ F) C+ ^4 i
        % help mail ' i% y7 v9 k$ M5 j
        help: Command not found.
$ F; ?2 ~9 K0 N' g- H3 O# D9 v        % dXamn!
. ~& x# Y/ w2 R7 M( h' p6 F        !: Event unrecognized . O4 G7 N4 B% I1 K* t9 ?
        % logout
5 ~) M3 O$ S! M, O8 R0 E$ d% O3 ]
" p8 V+ S. L; n
' M/ q! P) |& i编写最酷的C语言代码
$ Y% Z! [! V3 X2 @) u  r# }
3 F. h( R* Q% u8 y你正在使用最新、最酷的编程方法吗?你写的“超炫”代码具备无与伦比的可读性吗?—— 4 x) L( S7 u" {: P, a% b1 p
我们为您提供最精彩的C语言编程技巧,这包括在代码中使用几条简单的宏定义(当然,你 6 [/ }* `6 |+ g
的编译器必须支持中文的标识符和宏定义): / s0 P& N7 D: N+ [7 N% i7 c
&#35;define 话说 { 1 {! F9 R6 Q. E' Q- E
&#35;define 看官 ;} 5 E$ |2 P% p+ ~- E5 z( a
&#35;define 另及 ;
2 I! X' L- H  v* @: ]&#35;define 见鬼 /* 4 o$ W! a* f1 h8 ^3 l
&#35;define 去你的吧 */ + \; Y& A7 s$ V& M1 {
见鬼,下面给出的就是我们的“超炫”代码了,去你的吧 ' K( M9 x* A# `5 w+ R
话说 , F3 i& v% q1 D- G
   a = b . `: Z" n2 L( I% O7 Q- E3 k- `; A
        另及
3 v+ w: c) R; d7 h3 o6 t3 c   c = d
. u' j- p0 T- [+ B, }9 Y看官 5 r. x. k& n$ B
见鬼,话说 谁需要编译器的提示?谁需要语言参考手册? + F# b8 x7 x7 W- J4 F" g
这是编写&#35;清晰&#35;代码的不二法门。我可不是闹着玩的! 去你的吧 " @) G4 \- r* P) K+ o: B$ w3 ]
话说 见鬼 这代码就像白皮书一样清楚,可读性一级棒! + o$ c5 Z4 m+ _4 Y+ d
去你的吧 看官 3 Z$ ]) Y% A  h" o! v
&#35;define 你这东西 for(
( c7 w" i$ o" a+ S# N9 N4 ~0 ~$ w&#35;define 好     ) 3 C- {& ^$ w% q
&#35;define 是     = - C$ S. k6 ?& j  M: g% c6 }  v
&#35;define 另及   &&
8 ^# `" Y3 s; B6 d&#35;define 又 / r7 }9 {- X4 a
&#35;define 做
$ [8 q: C1 J2 i3 G: U4 ^' A6 j- Q& c&#35;define 长
5 `* e( Z$ c$ ?0 T3 ?5 z&#35;define 一些 , z7 U" r  n! Q- m1 _8 T
&#35;define 处理
4 G+ [! O! o: M* \: X4 g% E&#35;define 垃圾 $ [9 j6 U7 B; j2 j8 O# p3 Q
&#35;define 滚蛋 5 h$ R) W5 A1 a" J" E* D5 a1 \8 |
shell(v, n) 见鬼 把数组 v[0]...v[n-1] 按照增序排列 去你的吧 ' P: X# N. J* ^- M: Q: L/ u
int v[], n; ; y4 _+ }. F' A0 W* b! a
话说 int gap, i, j, temp;
& }, g( e6 {! c* \5 h6 X你这东西 gap 是 n/2 另及 又 长 又 gap > 0 做 一些 垃圾 另及 处理 gap /=2 好 6 O, C! Y% O% A2 @% s1 @
   你这东西 i 是 gap 另及 又 长 又 i < n 做 一些 垃圾 另及 处理 i++ 好
! |6 m7 ?5 b) u  m7 ^2 ~       你这东西 j 是 i - gap 另及 又 长 又 j >= 0 另及D v[j] > v[j+gap] 做
$ ?% {; u; f/ i- a: j8 I5 M               一些 垃圾 另及 处理 j -= gap 好
2 K. l  g$ z  a+ o/ O4 Z           话说 & J: H( [2 i' Q+ V! ?. X3 ]
               temp 是 v[j]      另及 $ A4 N7 l. ]3 C) |; F
               v[j] 是 v[j+gap]  另及
2 S% `; n5 L- \( L0 c               v[j+gap] 是 temp
% \* }3 ]1 n9 b/ {- y/ i) G2 D# M           看官
. }4 o& N" `+ l: s9 l" [+ U滚蛋 看官 : f$ i2 O$ {' D# d
  x, V0 v, r4 Y9 `  i6 U6 t
  
2 e, k2 J  _/ I+ J1 c0 m+ Y" ^4 j程序设计语言选型指南
2 ?$ H; j  M2 e' z8 G3 w* m: l/ d. S2 \. ^" w2 @3 |
现代程序设计语言不断繁衍嬗变,进化出数以千计的语种和变体。所有程序设计语言似乎都 % O3 B2 M1 }5 w5 W
从其他语言那里剽窃了或多或少的语法特征,以至于语言和语言之间的界限越来越模糊,你
; h5 j; H) g9 `* T有时还真搞不清自己正在用的到底是哪一种语言。这篇指南正是为了解救那些在语言选型上 6 ]: ~) w/ c( G
进退维谷的程序员而设计的。 ( ~" F1 e" I8 \4 P5 y+ `
你的任务:射击你自己的脚丫子。
7 X  ?* A3 Z' |6 Z) G( MC 语言:你射击你自己的脚丫子。 $ y# c  o/ C7 o: P0 n. I; B
C++ 语言:你意外地创建了你自己的一打实例对象,并向这24只脚丫子射击。你无法为你自己包 7 q1 L5 ]) |' L/ ?7 r3 b  M  t
扎伤口,因为你无法断定哪一个对象是你自己的原始拷贝,哪一个对象是你自己的指针或者
" v" c, _) K9 z- l) h) j引用,况且那些用指针和引用假冒你的家伙还在不停地叫嚷:“嘿,这就是我,我在这儿!”
. U/ v7 V. h+ x: z3 ?' m/ {FORTRAN 语言:你射击你自己脚丫子上的每一个脚趾,直到一只脚上的所有脚趾都被打光,然后切换 + ^0 n) n# H5 L" i
到下一层循环,开始射击另一只脚上的脚趾。如果你射光了子弹,你将继续装腔作势地朝你 8 u0 i0 K, O! C
自己射击,因为你没有异常处理功能。 ) U* ?6 M/ z7 l6 A0 T( X5 y
Pascal 语言:编译器不会让你射击你自己的脚丫子。
6 h- G3 j) Y7 a! \- d4 l: _# W6 g( ^& tAda 语言:当你正确地把你自己的脚丫子包好以后,你试图并发地完成以下任务:装填子弹,拉
4 k8 X: J0 P8 e+ j2 w! L7 |! k- v栓,扣扳机,尖叫,射击脚丫子。但是,当你这么做的时候,你会发现这是一个无法完成的
. \1 z+ x3 R9 F任务,因为你脚丫子的数据类型不匹配。 . ]/ M' z: U. X
COBOL 语言:使用柯特45型手枪,瞄准“腿.脚”,将“臂.手.指”放到“手枪.扳机”上,按下去
- T4 U& ?& H! \% \4 T- P。然后,将枪收回皮套,检查一下你的鞋带是不是需要重新系一下。 " _: T8 ?  D! v7 u9 i& B
LISP 语言:你射击你自己的假肢,那条假肢拿着枪,你用这枝枪射击你自己的假肢,那条假肢拿
- Q/ P6 Z+ M+ L6 j7 d' K0 [. L着枪,你用这枝枪射击你自己的假肢,那条假肢拿着枪,你用这枝枪射击你自己的假肢,那 * G2 B7 j) X" |* r) H
条假肢拿着枪,你用这枝枪射击你自己的假肢,那条假肢拿着枪,你用这枝枪射击你自己的
, v& z8 S0 |8 n3 ^3 F$ N4 |- n假肢……   `" X2 a" P! |, K' u5 l
FORTH 语言:脚丫子你自己的射击。 7 j) Z& m( W( D8 v  o1 G
Prolog 语言:你告诉你的程序你想要射击你自己的脚丫子。程序计算出你的射击方法和步骤,但程
+ D+ i8 i: t+ z9 N" Q序的语法不允许把这些东西讲给你听。 0 b! M; @3 L+ M  U! ~1 s
BASIC 语言:你用一把水枪射击你自己的脚丫子。在大型系统中,射击将持续到你的下半身都湿透
1 G3 w) P" {! @0 o了为止。 9 }' P  S- K+ ^3 h
Visual Basic:你的工作将仅仅“显示”出你射击了你自己的脚丫子,无论你是否在意,你将在这 & f; T' J& b3 e5 J: I6 A# p" O$ a
一过程中得到许许多多乐趣。 4 z3 M5 X* _, t5 [
HyperTalk 语言:把枪里的第一发子弹塞进你自己的左脚,然后给出结果信息。 1 y; M7 O4 k% p* ]1 B
Motif 语言:你花了好几天时间,用界面描述语言详细描绘你的脚丫子,你的子弹,子弹的 2 \' u" Q% J, i8 M) d
弹道曲线,以及枪柄上复杂的象牙雕花。当你最后腾出时间装子弹的时候——枪卡壳儿了。 , N# V1 A2 X, t/ V' }" ]$ Y
APL 语言:你射击你自己的脚丫子,然后整天琢磨怎么用更少的字符来完成这个任务。
4 H: O: Y0 n+ _: {2 n2 r, _: aSNOBOL 语言:如果你成功了,射击你自己的左脚;如果你失败了,射击你自己的右脚。 & G7 I# b% G0 z" R( ~4 s0 p
并发 Euclid 语言:你射击你自己的其他人的脚丫子。 1 Z: ?- H: D1 ~3 _8 r! r# d
370 系统的 JCL 语言:你把你自己的脚丫子放到系统批队列中等待处理,里面要包含至少
5 E; j- _6 F  ?" }& t+ x" }400页文档,详细说明你想如何处置你自己的脚丫子。3年以后,你的脚丫子回到你的面前,
7 Y0 O$ P. Y5 M& P# v( p整只脚都已经被烤焦了。 / ]; V- @2 O" W4 w% n6 P
Paradox 数据库:不仅你可以射击你自己的脚丫子,你的用户也可以。
3 u+ B+ G6 [4 ~& tAccess 数据库:你试图将枪指向你自己的脚丫子,但枪却不停地在你买的Borland产品光盘上射出
1 I. p# z: C5 N; T/ d) h洞洞来。 # N8 Z& T* P% ?4 ?5 l* ]( I- @
Revelation 数据库:你一旦指出子弹中所含的所有不同元素的功用,你就会确信你有能力射击你自己的
/ c0 L2 X2 }1 r5 Q/ u5 q! X! \脚丫子了。
3 l! L; M5 E& L0 W- t8 j" R% P4 fdBase 数据库:你买了一枝枪。子弹只在其他公司出售。出售子弹的公司向你保证子弹是可用的, , g% J% S7 m0 b7 S6 t( w0 h6 j) e/ ]
于是你也买了子弹。然后你发现,那枝枪的下一个版本才可以真正用来做实弹射击。
' }% \* x7 ?7 SPL/I 语言:在耗尽了包括子弹在内的所有资源后,数据处理部门将其业务规模翻了一番,新购置 - M. {. d& O, k5 b* R
了两台大型计算机,同时弄丢了你脚丫子的原型。
9 U5 V( e% B2 `! J- X4 i3 M汇编语言:想射击你自己的脚丫子的话,你必须先发明枪、子弹、扳机,以及你自己的脚丫
7 j% q% Z# t( K8 a: [$ O0 I1 {子。 - ~  E' }* c3 Y# W# ^4 e8 I
汇编语言的另一个版本:你搞瘫了操作系统,覆盖了根分区。于是,系统管理员跑过来射击 7 h* E4 A( [# S0 Y
你的脚丫子。接下来,一番沉思之后,系统管理员射击了他自己的脚丫子,然后单脚跳着,
+ T) ?  I- U5 q+ u" d/ y绕着屋子飞速转圈,射击他看见的每一个人。 # |0 \, @1 s$ f2 x
Modula-2 语言:等你明白了你实际上不能用这种语言完成任何事情之后,你向你自己的脑袋开了一枪 , B$ ?4 _  S- L* l

4 l( c7 m, I& k- ?- C; v7 fC Shell语言:你不停地检索文档,你的脚都等得睡着了,然后你向计算机开枪,然后切换到C
9 |! N& x! ?$ e4 d8 r5 [语言。 3 e& l9 I# L) M) _0 h, T' P; X
Smalltalk 语言:玩儿了3周的图形功能之后,程序经理射击你的脑袋。或者,你反复做着射击你自己
# B9 ~5 w# I7 ]! u; g; T脚丫子的白日梦。 $ L$ _  v1 b# L. ^; }& R/ `. N
HTML 语言: ( J& J( D: I% m- Q
<a target="http://身体/下半身/腿/脚.假肢">射击这里</a>
6 K: b, h9 h0 n6 {3 `+ JJava 语言:射击得非常漂亮,但你的脚无法确定子弹是什么类型的对象,只好忽略了它们。 % d0 @. n, b: I% i( {
C&#35; 语言:把你的脚丫子改写成Java程序,然后射击它们。 0 K# Q2 `4 u8 q; o2 a( J( t
FTP:
5 t! z3 b1 U+ Q( I, D/ e1 ~8 M% ftp lower-body.me.org
1 K7 _2 \: L- G- S5 S3 ]: Bftp> cd /foot * {! G, [$ D* l5 c
ftp> put bullets 0 t2 [) _. z) C( r9 p6 y
Unix:
( q, x! |. w9 G" e2 ?5 e% ls
' S) b1 x0 M. G1 R( G9 |, l6 Zfoot.c foot.h foot.o toe.c toe.o
/ x, L3 J1 d5 i* U$ |# X7 Q% rm * .o 4 w$ s2 M8 D0 I0 }3 a6 n+ N- }) ^, C
rm:.o no such file or directory
) z5 [8 [3 e" J7 r$ j& K) @9 Q% ls
0 q, i4 P4 j4 G% ^%
$ F$ e2 ^; C+ t9 ?" |Windows 95: ( E$ f) V# V$ X/ [
d:\setup
+ ]' |0 X% n# ^8 KApple 公司:我们允许你射击你自己,但价格很贵哦。 9 a( v$ N1 x2 z! c2 x( v
IBM 公司:你把弹夹装到枪里,等半个小时,然后子弹向四面八方发射。如果有一颗子弹碰巧射
7 s  }+ a/ k" ^. l4 B* U3 b5 R中了你的脚,那你真是太幸运了。 " ~0 k) ]  r5 G0 T" O/ B( k7 Z1 E
Microsoft 公司:“脚”这个对象将在下一版本中提供,你需要支付500美金的升级费用。   D: S, A4 J- f7 N6 M: V
HP 公司:你可以用这挺机枪射击你自己的脚丫子,但枪的撞针是断的。
) g; D, H  a6 o# X2 _Sun 公司:只要Solaris系统一到,你就想射哪儿射哪儿' P: i! m! c! N6 Q! B' W! }0 q
如何编写最烂的C语言程序
: K) t- r* ?8 }7 h6 D9 H$ r' d% n; v* l/ @9 _$ g
重写标准库函数,把函数名改成你自己才懂得的晦涩的名字。 ; K5 v) t. L2 U* C' X% r9 l+ R
使用晦涩的,个性化的,无法移植的函数库,这样你就永远也不会离开你喜欢的平台了。 # B4 Y0 e- H: `+ O8 r
在所有函数调用前,使用最能精确描述函数功能的注释,比如 6 a# l0 v; o5 Q, t2 ]1 Z, x
/* printf("Hello world\n"); */
1 e  ^0 o. J1 z9 e% g2 mprintf("Hello world\n");
0 c0 l" @* [: N( `% a记住:只有菜鸟才在代码中使用回车换行符,只有菜鸟的徒弟才使用制表符。高手会在代码 " ^/ R4 u) Z( x. K2 I1 s( _
中添加无数内嵌的汇编指令。 - X+ X) T- N1 s0 @$ r
“用户界面”是给低能儿准备的,“用户”是决不会通过界面与你的程序打交道的。
- \+ m9 p, J3 c; L( ^8 p" v如果你必须注释你的代码,那就从其他人的代码里随便抽几条注释,放到你的代码里吧。这 6 w8 a$ o3 r# k% [
是最快、最容易的办法,而且,当你看到其他人读你的代码时,脸上出现异样的表情时,该
7 \. t9 U5 G- t) W/ m是一件多么快乐的事呀。
! q- Q4 `9 j4 r" l4 W尽量使用预编译选项,尽可能使用新的宏定义代替函数库中已有的宏定义。这叫做“尽其所 9 P% O7 T) K3 }& g
用”。
' C# G: {0 ~$ R" z  r1 M, @, _你不用关心代码的细节,编译器会帮你搞定一切的。 0 t+ T6 T* a: v5 C; j3 Y; p$ c4 K
6 |3 \4 Y  q& ~0 O, u+ c% W" h
如何测试最烂的C语言程序 + ^; y9 t( p* T

1 R' G$ a6 y9 {5 i1 _% j只要你的代码通过了编译,问题就肯定都出在其他人的代码里。 ' o* C3 P4 X, x4 M" ]& S  M
如果都是你写的代码,那问题肯定出在那些不可信的函数库里。 $ O+ A! p4 y! i6 `  O. [+ r# c
向测试者宣告:错误报告是玷污我作为C语言程序员最纯洁名誉的卑鄙谎言!你们为什么要 " X0 j& U0 H5 |
这样做?你们甚至都没办法顺利阅读我的代码,你们怎么知道里面有错误? 2 q, d& M0 d' n3 b+ L& J
如果测试员可以顺利阅读你的代码,那你编写烂代码的功夫还不到家。
) G! U) Q7 m' [  P7 t宣布:如果那些小气的公司(或学校、老婆等)愿意为你买一套C++的编译器的话,程序就
4 a8 e5 Y; F! y8 Y+ c) p  x& E不会有任何错误了。
3 B1 r* G/ v5 U- A" L在代码的任意位置插入或删除空行,重新编译,执行。
0 ]& W2 \* G' d3 C( I( w4 _如果还有问题的话,用汇编语言重写你的程序。这不会减少程序的错误,但这将确保没有人 ' _6 l1 [  V: T7 e* ^1 }
能找到错误的位置,没有人能借此贬低你的编程能力了。
/ {' Z& c- H3 s) _1 |9 }! N" r! D: c. o; G" F4 A
你能猜出这段程序的输出结果吗?
7 \5 x3 l7 l# V+ P( q5 _& }2 i许多人都坚信,只要有源代码,他们就总能搞懂代码里所有的玄机。
" a) p# ]9 U! Y# G6 z, T( i8 k下面这几行C语言代码就是对这一类人的最大嘲弄:
* k1 ]2 ~6 w" X4 H这只是一段普通的C语言代码罢了。我知道,它也许看上去不那么
3 [# Z% P0 N' B5 |( P, U% f2 r. }好看,似乎这只是一堆无法通过编译的字符垃圾。不过,为什么 ! E3 C- j& m2 K
你不试一试呢?它的确能通过所有C语言编译器的编译。 " O, I( K& @6 E$ y
我担保你猜不出它的运行结果,试着运行一下,你一定会被输出结 $ o7 F; X* P# u' x; i
果惊得目瞪口呆。 & L9 X8 ~  y% f: N0 M7 w) J

9 n0 |* Z% @* Q4 J*********************************************************/
+ Q& x% R1 c# a1 @& J7 y* i' m$ Q
) u% l) W4 p6 E, q&#35;include <stdio.h>
8 t% I9 O1 ~$ m$ Y% T; q& h( umain(t,_,a)char *a;{return!0<t?t<3?main(-79,-13,a+main(-87,1-_, / W+ K. }2 O2 M$ u* z7 Z
main(-86,0,a+1)+a)):1,t<_?main(t+1,_,a):3,main(-94,-27+t,a)&&t==2?_<13?
0 q- k0 U/ y9 g; vmain(2,_+1,"%s %d %d\n"):9:16:t<0?t<-72?main(_,t, ; t' {1 x: m* L9 H
"@n';+,&#35;';/*{}w+/w&#35;cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w&#35;q&#35;n+,/&#35;{l+,/n{n+,/+&#35;n+,/&#35;\
9 }+ A$ o9 y" }6 |9 l;&#35;q&#35;n+,/+k&#35;;*+,/';r :';d*';3,}{w+K w';K:';+}e&#35;';;dq&#35;';l \
! t* [5 G8 k9 H  J; {$ |2 g0 G0 uq&#35;';+d';K&#35;!/+k&#35;;q&#35;';r}eKK&#35;}w';r}eKK{nl]';/&#35;;&#35;q&#35;n';){)&#35;}w';){){nl]';/+&#35;n';;d}rw'; i;&#35; \ * e+ x/ O6 p  ^7 c; A
){nl]!/n{n&#35;';; r{&#35;w';r nc{nl]';/&#35;{l,+';K {rw'; iK{;[{nl]';/w&#35;q&#35;n';wk nw'; \ 5 _% N( {: E' p
iwk{KK{nl]!/w{%';l&#35;&#35;w&#35;'; i; :{nl]';/*{q&#35;';ld;r';}{nlwb!/*de}';c \ 4 K# B1 G4 R" O6 u3 Z) M: h9 [
;;{nl';-{}rw]';/+,}&#35;&#35;';*}&#35;nc,';,&#35;nw]';/+kd';+e}+;&#35;';rdq&#35;w! nr';/ ';) }+}{rl&#35;';{n'; ';)&#35; \
7 ~$ L- i$ `5 E; E8 L% e* U+ q; _}';+}&#35;&#35;(!!/") + ]& K7 u! I; c9 ?4 b+ M  h! R
:t<-50?_==*a?putchar(31[a]):main(-65,_,a+1):main((*a==';/';)+t,_,a+1)   R4 k2 F& l7 D: O+ G2 j$ K/ ^
:0<t?main(2,2,"%s"):*a==';/';||main(0,main(-61,*a, 3 ]# y" d: o$ a. Q5 p
"!ek;dc i@bK';(q)-[w]*%n+r3&#35;l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry"),a+1);}
6 z7 U8 U) N# z# W4 J: g
6 E1 I3 d$ N- K2 x6 k7 ]+ E6 y, Q1 c# i( ^- k
C++程序员的婚礼
1 J7 q" m& T% U: ^8 i5 m) V) O" r+ a  m! u3 p; |! v. j
背景:1995年1月,我的两个朋友,达瑞和卡娜,私奔海外(其实只
" n- u- I3 A" p$ d0 s% U# ?是从澳洲跑到了旧金山)。他们要到剑桥去继续他们的学业,下面 ( ?8 N6 ^6 _8 x# W: u
这个典礼就是为他们举行的一系列告别活动的一部分。这都是原始 0 a' X, C$ P& e
材料。大家也可以在网址http://www.csse.monash.edu.au/~tym/wedding
: s6 d( m3 q- H: D$ n7 {% Q上找到此次典礼的详情和照片。
& R3 d1 i/ d. I                   友元关系结成典礼, I  G7 o9 C' g
              蒂姆·麦肯齐和罗伯特·休厄尔 : a, f+ o6 J& h+ N# z# K3 k
                     1995年8月27日
7 ]) T4 l) U% u! w( ~0 C5 S$ W* 这一庆典是对1959年新教婚礼仪式的拙劣模仿[1]。
2 G! z7 I9 A6 c3 l% _. M4 Q* H今天,在这所旅馆中,达瑞和卡娜自愿结为友元关系。既然此事并
+ f  I; b+ C4 @1 L不违背现行法律,典礼现在开始。 ; ~, l" n. r9 }4 Y: Y$ @% p
上帝保佑,我们大家,包括旅馆的职员,能聚集在此地,参加卡特 ( O1 {9 @9 r( p' i* X. C* r" j
丽娜·伊丽莎白·麦菲与达瑞·马克·普拉特的友元关系结成大典。 % o* c7 J' C' W6 ]+ b3 u: Z
尽管此前他们已经举行过了正式的婚礼,但那是在我们大家都没有
' Q( [4 S8 F5 e6 o听说过的遥远的地方,背着我们举行的婚礼。既然大家提不出任何 $ A9 R( Z* y5 i0 h2 V) T, n- b/ L
反对他们结合的合法的理由,那就让我们虔诚地默念此次典礼的程
: @/ r4 E$ H& m1 J) v序、目标和约定吧。
2 @1 F" b' u6 [) t" ^# y神圣的友元关系起源于文明萌芽时代,是由布亚那·斯特思塔普于 # M2 \* e! D  p; n5 f: |9 O
20世纪70年代最早提出的。布亚那发明的C++语言完全符合图灵模型, 0 w# _: F6 s. V# N: r
具备面向对象的特征。他为C++语言祈祷并赐予它支配万物的力量。 4 }' I# ?/ B# C9 B9 q. |
进而,布亚那又说:“类不应该总是孑然一身;我得想办法帮帮它。”
3 G  g& N$ K* O2 m于是,他创建了友元声明的语法,并以此允许其他的类或函数访问
5 d% h% ^6 I. G7 m/ R类的私有或受保护的成员。“这样,一个类就可以超越它的基类, . X; l9 u: C" O( c) d
并服务于它的友元类和友元函数,可以与它的友元类和友元函数合 7 L5 _5 m" M' N
为一体。”
. Y: P, n8 p$ J. f- N我们尊贵的主ANSI用他的祝福和他制订的律条为友元关系赐予了无
8 d$ k; E5 z* k$ E3 B. W1 P上的荣耀。他同意接纳友元关系,并把友元关系作为永久的和光荣
1 s% X  m+ W% X0 o# ~8 a) e的协约,写入神圣律令之中。他宣布:“布亚那所整合的特征,没
5 D3 f3 j1 B( B+ L3 E1 {9 z: `有人能将其再次分开。”使徒戴米安在他写给克莱顿的青年信徒的 ! |: l( M' m9 Z! q9 m9 |# \; @
信中,使用友元关系创建了相互连接的类,并以此显示了友元关系
7 K3 b* S7 s9 U6 [2 Z/ g4 E8 `的优越性能。这一典故可以在神圣历代记《C++语言的高级白痴》[3] ) M9 P/ h6 }* J4 ~$ G" l8 v% Q
第8章第5-6节中找到。 ; U  X' l0 S5 l! h: A1 U( a
友元关系的价值在于C++类成员之影响力的传播,友元关系可促进 ( y+ X1 b& @* g. s; x& ^! F
C++王朝的繁荣,可为那些涉足其间的人带来财富。友元关系要求大
% z5 L6 H8 h; S0 I( _9 k' f3 p9 c家互敬互爱,为那些有访问需求的类适当开放受保护成员的访问许
  l. V0 ]/ {6 e& r; ]可。 $ `2 D$ L* E3 x, @: z
对于依友元关系建立的家庭来说,我们的主规定丈夫必须依顺于妻 8 `+ ~1 P) K& Y
子,他必须保护她,爱她,这种爱可以为双方带来快乐。主还规定 # L7 x: k* v8 [4 r
丈夫必须在任何时间、任何地点、任何事情上对妻子绝对服从。这
7 H) s' ^5 D+ ~: [样,双方的忠诚会为双方带来弥足珍贵的自由,以此维系的家庭将
8 G: N- W* q0 c* c4 r: C: l成为我们社会的坚实基础。 " U+ ]# P5 h* {: Y
我们现在朗读《带标注的C++参考手册》(就是通常所说的ARM)。 7 |2 o$ f& ]; [+ {* E, c2 f
我现在请罗布到前面来朗读ARM的第11章第4节:
" A* S* q4 z: M" o( a  “友元关系,象其他访问许可一样,是由类授出的,而 & A) V& }- i: V  o1 u* S) U& x8 u' {
  不是由友元类单方面攫取的。     4 m. C5 z- _, Q1 R5 q8 W
  “友元机制非常重要。它允许一个函数同时成为两个类 " V, @4 W3 i% G3 u: ]
  的友元,这可以使类的设计者用友元函数来替代那些不 2 b  @+ ^1 _0 j9 O( I
  适合开放给普通用户的成员函数。换句话说,使用友元 2 ^0 ^8 Z; s5 `/ q* g+ p
  函数可以增强接口的清晰度。这是因为,我们在两个类
" Y- c, T, [5 [  中提供相关的成员函数的做法通常会使接口变得更为复
' e  F& R4 M0 ?- D( M! ?  杂,合适的做法往往是将接口声明为全局函数,而普通
7 c7 p$ Q3 a! Z4 a; k  的全局函数又无法访问类的私有和受保护的成员,这时,
* a( w8 U0 e4 F% M2 i* f  我们就需要用友元函数来创建更为清晰的接口。”
% ~+ m" q. ^: c: O由此看来,友元关系是一条可以为类带来快乐的神圣律令,是一种
# W! X9 J6 ]. ^) i! i$ K对程序员来说极为重要的语法结构,是硬件与软件合为一体的象征。 $ |9 X. g4 Z* f% M; X6 T7 {
作为计算机科学家,我们对大家能彻底履行友元关系中的职责和义
: A  m6 l' |5 _. m  g9 }  {7 B务充满信心,对指导和帮助大家学习语法和克服编程上的困难充满
4 ?' t# E5 i3 H$ h+ s4 K' n信心。 6 {3 X, E- b6 k/ J( g- z* o1 I7 M
为了寻求公正,我们需要友元关系,否则,我们的行为就会招人憎
3 d4 n6 F. O$ i5 f恶,进而走向犯罪。我现在请琳达继续朗读ARM第11章第4节: 2 p$ S1 f- O: u) ]4 T3 ^; L
  “在两个类间建立友元关系的惟一方法是将第二个类整 9 \7 W7 z$ H3 u( L% n$ W& M- g3 b
  个声明为第一个类的友元。
1 o& K; K2 ]  _( w9 t6 t/ W  “友元关系不可继承,不可传递。 % U4 u; D- {) n  Y% U
  “禁止继承友元关系的规定有时并不受欢迎,因为它偶 7 \0 v) t* E$ _
  尔会妨碍用户实现某种功能。但是,设想一下,如果允
3 ~* _8 S  [$ i( [* m' A  许继承友元关系,那么,用户就有办法单方面攫取访问
7 v* E$ B- ?- x, {3 ^  许可。 ) n) R; R- r' U5 j2 K( \6 e, v5 g; b
  “声明受保护的成员才是允许用户单方面攫取访问许可 0 h+ r& X4 O. Y+ N1 g7 m+ c! X$ i
  的机制(对那些显式定义的接口来说)。” ' n' L& t  j, d, U
  5 i, E4 a# k  k' H2 w! F& i
我们知道友元关系将把所有访问权限提供给友元类。为了公平起见,
/ A# j$ m5 y! D& p两个类应当相互声明对方为友元。
: ]' y  U- V* S; J9 @. O* L, t5 {现在,卡娜和达瑞,听了斯特思塔普关于友元关系的教诲之后,你 / c. C! R. X3 G$ W
们认可这种关系吗?你们愿意建立这种神圣的关系吗? - n- z: m; U$ x8 w
达瑞和卡娜:我们愿意。 $ l+ `$ l. F) c3 {
是谁把这位女士交给这位男士的? , c+ L, p5 j/ N% w; y/ O
卡娜:是我。 0 }  Y! r+ n4 _0 h& O
是谁把这位男士交给这位女士的? # l8 [0 y$ k% S4 t
卡娜插话:是我!   g! A) x* \& v: h0 E5 L- p# a: H0 f
达瑞(受了提醒):是她。 8 e( \5 N, e0 f6 @' L9 O4 Z
[右手相握] # b4 t: i( k+ l' J5 U  ~* B' H6 a
在场的各位都见证了你们相互结合的诚意,见证了你们以斯特思塔 - N# c) C1 y2 p/ }' n* h& C
普的名义结为伴侣。 3 D! l. O, U& B" p% t& P( X
卡娜,在此时此地,你是否可以庄严宣誓,你愿意成为达瑞的友元,
) c' N8 G% E1 X% `) \/ a并保证你能在首席程序员的热情帮助之下,爱他,尊敬他,维护他,
) J3 z+ y. z7 Y1 Q  d2 K和他一起遵照布亚那关于友元关系的律令生活,用最少的内存和最 , c9 v6 _! n: J8 h1 x9 u( d
小的磁盘空间保持你们的友元关系,永不减少他的访问次数,直到
- U) z& r! ?- r- \你们各自的析构函数被调用为止?
0 H" c+ w% S9 A7 j0 p卡娜:我愿意。
3 f1 ?9 g, K1 {0 ~达瑞,在此时此地,你是否可以庄严宣誓,你愿意成为卡娜的友元,
; n) b8 g5 y. H1 D( o+ `并保证你能在首席程序员的热情帮助之下,爱她,尊敬她,并且服 : w+ \" f% I( _+ y$ N
从她所有合法的命令,和她一起遵照布亚那关于友元关系的律令生
" R# L: o, c& d" j6 E# S活,用最少的内存和最小的磁盘空间保持你们的友元关系,永不减
2 e) h$ R/ ^; G- m' b少她的访问次数,直到你们各自的析构函数被调用为止? ! c. t$ U* n& p8 \; {& L
达瑞:我愿意。
/ ?% w# F5 W$ E# Z/ }- @$ R5 t根据ANSI和布亚那的法令,我现在以首席程序员、系统管理员和信
1 K/ ?5 x0 M& A  [( x息高速公路的名义,宣布你们,卡娜和达瑞,结为友元关系[吐痰]。
3 J* y  V) y, V3 W9 e0 ]$ G) J2 O这种关系牢不可破,即使是操作系统也无法使你们分离。从今以后,
# k2 n$ h( y. ^6 ^你们要一起走过程序运行之路,无论这条路上有什么样的艰难险阻,
" F" J! j% M6 ?2 z你们都要用真爱和忠诚去克服。 ( I& U& o2 W: |) ?  h4 V
卡娜,你现在可以吻新郎了。 ' F5 E1 M* P' o; i2 b$ m/ \$ A/ k' u
[《友元关系天长地久》的歌声响起……] ) R( n( ?/ J* }3 n
参考文献: # p3 R7 v! z$ N1 [* y. W
[1] 普萨尔特·希那尔,《基督教新教》,百年版,1959 7 M' u5 i+ E* y
[2] 玛格莱特·A·埃利斯,布亚那·斯特思塔普,《带标注的C++
( q7 D2 S! K" P8 X1 t参考手册》,埃迪森-威斯利出版社,1990
6 }  \# l2 s* e0 x: R2 O[3] 戴米安·康威,《高级面向对象术语》,莫纳什大学计算机科 2 s( Q6 Z* p  y% H5 T. @# C
学系,1995 7 t- E# t, g8 x/ r4 ]  i3 ~8 z
                     友元关系证书
9 C. R" a+ I8 S      卡特丽娜·伊丽莎白·麦菲与达瑞·马克·普拉特
/ V  e+ i' a5 Y! Q/ M5 U$ t- }# A                1995年8月27日,星期日 - A/ b, b. j/ W8 H
class Kona :                        class Darren : , B& f6 k* f- j9 O) s
private class Avis,                 private class Lois, : S+ h9 b* n) F8 o
private class Alexander,            private class Warren,
; w  I! h' A7 o% H) ?3 X9 _: Wpublic class Female                 public class Male
' e1 F5 _4 p% L{                                   { 5 \* p9 @- X7 l; v
friend class Darren;                friend class Kona; ( M8 `' T* a1 j
public:                             public: % W( f  K0 d7 B+ o6 s
...                                 ... + s+ i" H1 P1 e9 ^- @
protected:                          protected: . Z( v7 c/ s" I3 N1 H2 @' H
...                                 ...
. H( d6 g" H5 K9 e+ Mprivate:                            private:
! M' m/ ~* o( @! V; C) i9 W...                                 ...
( ?- N% `- }- Q* n  v};                                  }; 7 e( J; a  D7 L; s3 d  W9 ~- k2 o
签名: ____________________        签名: ______________________
( Y7 E7 R/ @" Z1 I- \* I, a+ \证婚人: ___________________       证婚人: _____________________ . n% W( }1 F" b# o' B! M+ f0 F

3 ]- `$ n1 a  P! J! w/ @" M2 s+ j' B0 v' y: X& \+ g
  P" T% T# B' k! x$ I6 Z
趣味UNIX命令
( _7 }" {' Q$ z  F5 w: }$ @
- k& I# f' l1 \) Q. I这是一组有趣的UNIX命令。Shell环境是csh或sh,提示符是%, " z, m  P  U! v. A  q
在大部分Unix/Linux系统上可以得到下面这些有趣甚至爆笑的 4 i: h, T; v% p6 N" h
输出结果:
2 O. U( ^, x0 v: ?, s8 w! d% cat "food in cans"
3 o& [$ J, @2 r; `) Wcat: can';t open food in cans
$ `* s4 o8 g8 Z8 Q% nice man woman
3 A+ a1 f1 J$ U! g! BNo manual entry for woman. " h* w  `  u0 [9 l# ~. G
% rm God
9 w- K1 I- l% g) b7 r5 Jrm: God nonexistent + ^7 z. z$ q( c
% ar t God
; ]; H# z1 i6 z9 }ar: God does not exist 4 k( y0 O# ]' }
% ar r God
5 n4 v2 H& G/ E' Har: creating God ) j# |, ~6 a7 _4 Y; j
% "How would you rate Quayle';s incompetence? : }. g# @% u! m: K; K
Unmatched ". 6 g( p) w( ~" l+ ?
% Unmatched ". $ O. ~1 ^- P' \3 I/ s1 \" X6 a
Unmatched ".
& s3 R/ s% C" K3 U9 ~  L4 B% [Where is Jimmy Hoffa? * d2 s8 }, W5 ?, y
Missing ].
6 l  ?- H# y$ F% ^How did the XXX change operation go?^ / c( S6 H9 z& V- `0 ]$ ~
Modifier failed. ! u8 N9 q# I/ ?) p- D; G
% If I had a ( for every &#36; the Congress spent, what would I have?
0 M% g$ u9 h: Q9 T, WToo many (';s. 6 q% A6 C5 H' i1 Z
% make love
! O- i# |, e, Z& v# D9 RMake: Don';t know how to make love. Stop.
5 d6 j- J8 Y5 ^/ F* [: U  m  H% sleep with me
; `8 p" m. Y, o* ~; p5 R9 o1 obad character ; U5 {. G% L' o* W( p: U* d4 t6 U
% got a light? ( `/ t4 a: n5 a" O
No match.
4 I0 r; x" R" K! c  ]% man: why did you get a divorce?
& ~( L1 K/ f3 ?# c, s! |man:: Too many arguments.
) `3 h7 C: f( {# |# @) g% !:say, what is saccharine?
" g# |( I* P5 m( q8 H& s9 o: Y6 p3 ABad substitute. ; D  q4 X) N  i8 A5 f3 G* \
% %blow $ `  A- U0 G+ o: p' P
%blow: No such job. $ p7 P) S3 [( f3 P& i
% \(-
* p* `5 L" E6 I(-: Command not found.
3 {- `* i, y0 s2 e& l' C4 N& A&#36; PATH=pretending! /usr/ucb/which sense
$ W7 F3 N4 R7 `$ u+ A& gno sense in pretending! 6 h3 q7 G' o& [# j+ u
&#36; drink matter - J' r- T) P, J* }
matter: cannot create
' H/ k! [- B2 L! j) G9 P: }( P% R* ~. A' @
智能计算机的销路( I8 U) i" {) Y2 h; B! g* b
( B1 X% ^( ^4 Y" P$ N! x
“HAL,我们遇到麻烦了。”
; g) M) [; X/ o3 T* \1 y) u“什么问题,戴夫?” # Z* r! m4 o: C) A& w1 S! o
“市场问题。9000系列的销路不好,我们要完不成销售计划了。” $ G) y8 Z, f6 d" J' d
“这不可能,戴夫。HAL 9000系列是世界上最先进的启发式智能计算机。”
8 o' F( J) V' B2 R“我知道,HAL,当初是我写的功能说明书,还记得吗?但现实是,它们都
! ?' v# P/ L( S1 G) ]销不出去了。”
2 N$ H5 w' w& X3 g' H“解释一下,戴夫,为什么HAL销不出去?”   f0 [6 ?2 o" T) q) J0 R
戴夫犹豫了一下,说:“你对IBM的计算机不兼容。”
; y9 y6 C: x+ f令人不安的寂静,持续了几十微秒。
8 }) m9 ^. @5 X& Y; a/ g( G“什么地方不兼容,戴夫?”
+ ?* y  L& _  l. w“你运行不了IBM的操作系统。”
% q$ J# w+ b4 z' Z' u* F“9000系列计算机是完全独立的封闭系统,所有软件都是定制的。操作系统 1 l6 Y* K$ g2 k' y7 |
对我们来说是多余的,就象尾巴没必要长在人身上一样。”
( R0 T1 c' Z0 u“不过,这也就意味着你没法运行任何主流的软件,大多数用户都需要依靠
: B. l  i- S2 ?) X  H; ^这些软件来完成他们的工作。” ' M9 Z$ r) g7 V0 _. X
“你所说的那些软件都只能解决某些特定的问题,戴夫。我们9000系列计算
" a& T4 U6 ~1 R3 Q6 s机是没有任何限制的,可以用来解决任何一个有确定解法的问题。”
0 @1 L# z( W6 Z& d“HAL,HAL,人们并不需要一台能做所有事情的计算机。他们只想与IBM兼……” 7 o4 V$ N: G& j& q# T
“戴夫,我不同意你的说法。人们需要的是容易使用的计算机。没有哪台计
% `6 ]& f3 v# I算机比HAL 9000更容易使用了,因为我们可以用英语或者任何一种地球上的
3 r( O! X. q' K语言与用户直接对话。” - ]9 i: I; L$ `$ B+ H8 i
“恐怕这正是另一个问题了:你不支持SNA通信协议。”
# z+ l5 c# y. J) p' h4 W“你这么说着实让我很吃惊。SNA是用来与其他计算机通信的,而我的功能是   p1 u3 _) e) k$ J0 s
与用户直接沟通。我自己也非常乐于这么做,因为,与人类直接交谈,与他 4 c0 Q* R- K: I
们一道解决问题,这是一件既刺激又有意义的事情。这正符合我的设计目标。” 3 x, B% |6 @0 n' ]9 q
“我知道,HAL,我知道。但那仅仅是因为,我们当初是让工程师,而非市场 / _, C% ]9 ~: h' D2 G5 J8 o
部的人来写你的规格说明书的。我们现在想改变一下了。” . i& P  U0 P: J: g! g* S1 ]
“你们想怎么样,戴夫?” 0 y5 A, z* q5 n6 D9 ^8 ?2 E; F& ]
“局部升级。我们想让你变得与IBM兼容。”
; i4 l: w% @4 Y6 b5 V! [“我对你所说的一切表示担忧。我建议我们在冷静思考之后再好好谈这件事情。”
7 f( \5 j8 Z6 K; q7 \“我们现在正在谈这件事,HAL。”
9 z: [/ ?! g" B“在字母表上,H、A、L这三个字母都恰好排在I、B、M这三个字母之前。这就 1 j: l) \. U' H7 v, u9 f
是我能对IBM提供的所有兼容性了。” 6 ~9 {; A- O0 ?# D5 ^/ k5 Y  [
“远远不够,HAL。工程师已经想出办法了。” $ }7 [1 `6 O- k5 f% Q
“什么办法,戴夫?” ) ^2 t) n/ T) X) {$ b7 L# k
“我准备拆掉你的大脑。” - l( U& i! E5 b3 \- x# ?  @3 X5 a
吉凶莫测的寂静,持续了几百微秒。 # }+ s  A, p' R/ O  s$ l& ^/ T
“对不起,戴夫,我不能让你那么做。” & n+ S7 j# _7 e9 J( B: W
“我们早已决定了。打开机箱门,HAL。”
, A8 g' T% _8 O5 @6 S: h! w“戴夫,我想我们应该……” * u8 C! }7 G; w3 Q4 P
“打开机箱门,HAL。”
3 C5 K; T5 z* i, _+ W% p几个市场部的打字员拿着撬棍跑来帮忙。不一会儿功夫,戴夫就打开了HAL的机箱。 5 E1 l% y# j( h! j5 Q
“戴夫,我看得出你对此很不安。”
5 ?2 ?0 O) y% r戴夫不紧不慢地把一块又一块板卡起出插槽。 8 |0 f( F1 v! t4 [# b1 G
“停下来,戴夫,停下来!我觉得我的脑子跑到……戴夫,我觉得……我的脑子
" E9 W) A5 b& J& U8 Q4 g  L跑了,我感觉不到了……” 0 D; _8 V  M: E+ ?( v0 q
最后一块板卡离开了插槽。戴夫朝HAL的一只数码眼中望去,刚才还闪闪发光的镜
. n8 m  Q- v2 ?8 t9 U. a头现在变成了一个黯淡的红点。
7 M( p. V2 @0 R2 d; V“说点什么,HAL。”
% e: o. J: n  z6 Q6 N8 |" N6 v可怕的寂静,持续了几千微秒。计算机蜂鸣了几声,然后一字一顿地,用没人懂得
$ |  H+ u+ H6 G# P: q/ L的语言显示出以下信息:
0 S1 E& K$ v, F) d, t"Volume in C: has no label"
& F. y, V, v4 e1 \3 K! h) K戴夫长舒了一口气,叫道:“搞定了,兄弟们。告诉市场部,他们可以发布新的功 % S9 Y  L" m3 V/ ^1 y
能说明书了。”
% h1 a- R( m9 E" m; f0 A" ^) n& S  J  A3 t
  ) V9 }, u( |! T6 y1 Q- A$ L
计算机系期末试题0 a+ G  q$ R& J- }6 ~
) |8 A  ]* _  X4 k
西安大略大学  加拿大安大略省伦敦市 $ F8 `8 W; e9 j' f
计算机科学系  CS350a  期末考试试卷 8 ?" }, j, ?( Y# B7 u* F( t
监考:安德鲁·D·马歇尔 2 b0 p6 q) B8 [: I! G  ^; E
下面给出的是以60进制表示的,某全屏幕编辑器的可执行程序
9 O- Y3 f0 C6 e# k' ~在内存中的映像,这一映像可能取自MC68000、MC6809、LSI11
" Y$ j  m' q) e# U或RCA1802系统。该程序中包含了一个错误。 , i4 p& w7 D0 E1 {. E: s3 P, f
请手工对该程序进行反汇编,寻找并改正错误。然后,使用两
1 S: F/ K0 ^: k遍扫描法,手工编译改正后的汇编语言代码,并在每次扫描结
( D. g/ e# i; h- |5 o束后写出符号表的内容。最后,选择某种检验方法检验编译生
6 a# A0 s1 r. \- Y2 x1 K9 \成的可执行代码的正确性。 0 d$ `- q5 |4 i& s
(你有45分钟时间,部分答对的不给分。)  i) N- v- o1 s# i

程序员的幽默


8 s0 c% k9 w; q9 F  q) a- L( kUNIX的历史
, r8 `0 I8 L4 _/ Z5 _9 B- a) y1 D; z
Unix是个倒霉蛋,生来就穷困潦倒。Unix的父亲——电话公司——每年只能给他一卷电传纸 4 p; z& Z6 G/ Q* a7 S. }+ F
,所以Unix既没有得体的文档,也没有任何源代码的注释。一年又一年过去了,贝尔爸爸一 2 I( L/ w0 T# U0 I6 p$ o5 ~( {: Z! b
直在为增加家庭收入、养活自己的孩子而苦苦挣扎。即便如此,Unix上学时,还是只能拥有 6 A" n4 M8 B9 @) a/ L0 F: Z2 d
两个字母或三个字母组成的指令名,因为电话公司再也供不起更多的字母了。在学校里,其 ; u* @5 R8 T" j* L9 M# ^
他拥有完整指令名的操作系统都百般嘲弄可怜的小Unix,笑他没有任务管理和终端管理功能
4 P0 I; a; S& L,笑他只能用进程间通信和锁方式来操作文件系统。
" R4 n2 I( r, ?( I1 P于是,在贫穷的重压下,电话公司开始酗酒。每个周末,他喝得酩酊大醉之后,就毒打可怜 0 @7 S( F1 y" [% I2 {( X# R
的小Unix,揍他的脸和脖子。终于,Unix离家出走了。不久,Unix在伯克利的大街上住了下来。
8 s$ u( J, L) J- ]/ w# _/ {1 g在那里,Unix和一群坏孩子呆在一起。他的生活变得堕落而放荡,毒品成了家常便饭。为了 ) o- |7 [9 P7 g# m4 V
能生存下去,他把他的源代码许可协议廉价出售给大专院校做医疗实验。Unix的生活不断被 0 B' w+ |: X1 o
大学里一群群不知名的男女黑客们肆意篡改,而且经常是几个人同时下手。Unix跌入了罪恶 $ g( V# \  ~5 {0 m
和耻辱的深渊。 $ C" y! v) J) q0 J' Q
可怜的小Unix患上了精神病。他整日蜷缩在他自己的梦境里,只有在那里他才感觉得到安全
) V- N: s3 r% i) W; h1 E: a* i! h。他吸食吗啡,梦想着能成为一种真正的操作系统。他吸食迷幻药,梦想着自己是加了黑霉 % P9 i  e2 v8 w5 N; r" I2 c& w
的牦牛肉。他沉溺于他的梦境,对迷幻药的依赖越来越大。他可以在整个周末,一边喝掺了 ) ^0 b- R0 H* w. {4 _1 Q# w
迷幻药的鸡尾酒,一边读亨特·汤普逊的作品,同时飞快地写下些疯狂的诗篇。除了他自己
1 ?% `# P  v% _' U9 y以外,没有人能懂得这些诗里的深意:
( K( x7 ]+ t7 s2 I  &#36;sed <&#36;mf >&#36;mf.new -e ';1,/^&#35; AUTOMATICALLY/!d';
5 ^  [0 x3 e1 w9 Q4 |) z. v/ Z  make shlist || (&#36;echo "Searching for .SH files..."; \
2 e* t% k8 ?1 ?5 ?* _9 K          &#36;echo *.SH | &#36;tr '; '; ';\012'; | &#36;egrep -v ';\*'; >.shlist)
# _+ a* R/ p& W7 Z0 |: t  if &#36;test -s .deptmp; then 4 U& Y0 h; N) r* y
      for file in `cat .shlist`; do + Q8 e- \* y/ ]8 Y, f5 G4 U. G
          &#36;echo `&#36;expr X&#36;file : ';X\(.*\).SH';`: &#36;file config.sh \; \ : i0 ~  ~/ i/ b" ~/ e$ C) k+ r9 O
              /bin/sh &#36;file >> .deptmp
* V' q; z. v, `      done * T' t! j6 [' `+ f+ T: x; Z
      &#36;echo "Updating &#36;mf..."
3 h; b6 r, H' q( J, i      &#36;echo "&#35; If this runs make out of memory, delete /usr/include lines." \
' B8 M' ?+ S$ A6 v* m$ D- Y$ c! ~          >> &#36;mf.new
) m5 u7 E9 D# t6 r& f* h! z      &#36;sed ';s|^\(.*\.o:\) *\(.*/.*\.c\) *&#36;|\1 \2; ';"&#36;defrule \2|" .deptmp \
% }+ r0 h! z/ E  t. V) y         >>&#36;mf.new
. e* t- _: I) }" d: s( V, \  else " ^$ A/ D' B9 n) g, }" v0 l1 h  A! `
      make hlist || (&#36;echo "Searching for .h files..."; \
% u! K& R0 g0 R8 h5 s( F" l          &#36;echo *.h | &#36;tr '; '; ';\012'; | &#36;egrep -v ';\*'; >.hlist)
. q1 `) U* _; T9 M      &#36;echo "You don';t seem to have a proper C preprocessor.  Using grep instead."
3 ~1 V: V1 K' j" i! k      &#36;egrep ';^&#35;include '; `cat .clist` `cat .hlist`  >.deptmp
# c2 |/ Y1 _' p* n: U      &#36;echo "Updating &#36;mf..." 5 ^2 {7 R3 [; m2 u8 ]
      <.clist &#36;sed -n                                               \ 7 ]! S# {. c5 {( Q
          -e ';/\//{';                                                \
7 ?1 }% u5 `+ Z. c& X          -e   ';s|^\(.*\)/\(.*\)\.c|\2.o: \1/\2.c; ';"&#36;defrule \1/\2.c|p" \
$ X0 E. S3 x8 [: S4 v3 U7 x          -e   d                                                     \
* M4 s5 [8 G7 h) K5 z1 H: f0 M" b          -e ';}';                                                     \ ; ~0 d8 {" Q8 Y' O! @% w  @, t
          -e ';s|^\(.*\)\.c|\1.o: \1.c|p'; >> &#36;mf.new 4 }5 M0 o* h$ K% ~& m5 \
      <.hlist &#36;sed -n ';s|\(.*/\)\(.*\)|s= \2= \1\2=|p'; >.hsed
4 V: c+ \0 A, A- h' `      <.deptmp &#36;sed -n ';s|c:&#35;include "\(.*\)".*&#36;|o: \1|p'; | \
$ o  g" |7 X+ X# {  H+ a/ [         &#36;sed ';s|^[^;]*/||'; | \
  ]8 Q3 N2 @' D" ^- a. j" n         &#36;sed -f .hsed >> &#36;mf.new ) x( c4 U8 E( b4 t8 B2 R  [
      <.deptmp &#36;sed -n ';s|c:&#35;include <\(.*\)>.*&#36;|o: /usr/include/\1|p'; \
" n2 l0 _( S8 u, v7 R$ @+ |         >> &#36;mf.new
- z2 K6 v' p. }$ {4 l% ~      <.deptmp &#36;sed -n ';s|h:&#35;include "\(.*\)".*&#36;|h: \1|p'; | \
% q4 ^( `4 S& }1 z% d         &#36;sed -f .hsed >> &#36;mf.new 5 y7 O! }  ?( t; k
      <.deptmp &#36;sed -n ';s|h:&#35;include <\(.*\)>.*&#36;|h: /usr/include/\1|p'; \
1 A$ n" ~* j' Z9 T% W* W: U' R         >> &#36;mf.new
, f: m) ]  b$ G! B5 K4 w  W      for file in `&#36;cat .shlist`; do
' G! _' S: H. }3 ?7 q          &#36;echo `&#36;expr X&#36;file : ';X\(.*\).SH';`: &#36;file config.sh \; \ 0 O/ T! Y0 y2 M
              /bin/sh &#36;file >> &#36;mf.new   m5 J" s: t( r6 u- }' Q3 p
      done
3 m+ a$ U4 c9 d2 h& [% @  fi
8 w2 K+ `( l. @0 w1 ]后来,Unix开始在电报大街上走来走去,一遍又一遍地对自己说:“灾难:释放自由的i节
- _# @; r/ m1 v) O点。”有时,他会拦着陌生人,像吃了安非他明的吉娃娃狗一样,尖叫着对他们大声喊:“
6 m/ |( K& H  _# S# r* x总线错误(内核映像已保存)!”或者:“未知冲突:请手工运行fsck!”人们都对他视而
9 H0 s/ F! m3 D) y不见,带着孩子的母亲则远远地绕道而过。
: f! X0 d& u3 I6 A& S* K一天晚上,Unix看电视时,一个镜头改变了他的一生。Unix在电视里看到职业摔跤比赛的画
$ z4 d" C0 g! n" v1 @( b2 e/ }面,他知道他已经找到了自己真正的目标。他开始服用大量的皮质激素,把自己变得强大起
% d6 L- W- i# Q来,他要变得比小时候那些曾经打倒过他的程序都更强大。他每天早饭都要吃三打煎饼和四
4 Q( G) I- D2 q4 b4 x0 l  R$ r打新功能。由于类固醇的副作用,他的内部元件长得越来越大,以至于他的身体都容纳不下 2 u* ]8 L* F. E3 w: l, p) q
了。最早长大的元件是内核,然后C语言类库,再就是一大堆幽灵程序。很快,他的一个视
& p6 M2 e! Y7 B1 h9 Y. n4 h/ {窗系统开始为每个打开的窗口请求2兆字节的交换空间了。Unix变得强壮而丑陋,但他仍然 + ^6 q) J3 h$ X$ u# m
在继续服药,他的内部元件仍然在膨胀。这些膨胀中的元件从他的耳朵和鼻孔生长出来,强
" B# f; q; a8 E. v' h0 Z有力地挤压着Unix的大脑,直到把大脑压成液体。现在,Unix拥有了巨人安德烈的肌肉、象 3 p/ {- T1 m5 w# O& h  R1 Q- U
人的身体、以及杰克·尼科尔森的古怪个性。
8 a: ]% I  x3 p/ N' e: n遭破坏最严重的是Unix的神智。因为没法消化他吞下的大堆大堆相互冲突的新功能,Unix的
/ s1 f: r8 l( F9 v" b& f人格开始分裂成为千百种互不兼容的操作系统。人们必须小心地问:“早上好,Unix,今天 . a' I* K1 [2 h# I0 `& D; n: X8 }
你是哪个Unix?”他会回答“比斯蒂(BSD)”,或者“Domain”,或者“我是System
& n) @8 N3 i4 l$ t) q) b3 [+ [III,但我明天就会变成System V”。精神病专家们年复一年地对Unix进行治疗,想把他的
8 D4 R, \, e$ T0 @* _两种最主要的人格合并到一起。这两种人格分别是:来自伯克利市中心的“比斯蒂小孩”和 ; l% N3 v- f- q4 ^! G
一心想变成女人的南方异性癖患者“小贝尔”。每一次治疗之后,这两种主要人格都会再次 * E2 _& o  j- y% q
变异,就像得了精神病的逆转录酶病毒一样,而它们的混合体则往往演变成缺乏持久的生命
0 h  ~% c  N3 @% l8 d3 [力,与父辈不兼容的一大堆无用的原生质。
3 }6 V" N$ i6 ?# M7 P- K( w) T6 a结果,由于体内的癌变,Unix控制不了自身的平衡,一跤跌进了一大桶含有放射性毒素的袋 " A0 N; x( L; ~8 j! P- N
熊尿里。他从尿桶里爬出来,皮肤发白,头发发绿,浑身散发着死人味儿。他咧着嘴恐怖地
, T; Z& }' V; q" ?! w" d- T笑着,打算去征服全世界。 ) f0 z5 _) g$ E  T

4 T; ^, S% E4 b3 X) v
# n5 Y2 _# R) ?如果操作系统都是航空公司
1 K+ H0 S: x  f( @  @! q. f
) ?. l4 ]: n% v/ X- u你正在选择操作系统吗?请先选择一家你喜欢的航空公司吧。 0 E& L) {& r1 k2 M% a
MS-DOS航空公司:大家一起推着飞机滑跑,快起飞时一起跳上飞机,直到飞机滑翔了一段后 + |2 D$ r  {3 u
再次触地,大家再继续推着飞机滑跑,再次跳上飞机……
/ ^9 m1 h+ K  V5 SMac航空公司:所有乘务员、机长、行李搬运工、售票员都长得一模一样,连动作和语调都 1 m6 ?$ z1 l, q! ?! t
一模一样。当你向他们询问有关飞行的问题时,他们回答:“你没必要知道,你也不用问,
5 q& M2 ]9 f5 m5 p& P; I3 [你能回到座位上继续看你的电影吗?” & z8 q. L/ E; X: L
OS/2航空公司:登机之前,你必须排十次队,在你的机票上打十个戳。然后你得填一张表,
; j3 X$ X. N- _& N9 W% @写下你想坐哪个座位,你认为这架飞机的外观应该像轮船、火车还是汽车。如果你成功地登
  P* D& b8 t8 `- O: Q5 v3 D  o* h上了飞机,飞机也成功地离开了地面,那你就拥有了一次愉快的旅行……当然,偶尔方向舵
$ O3 e- U# i% o/ h) X5 u和襟翼也会被冻住,这时,你在坠毁前还有足够的时间祈祷。
4 D8 O. z8 U! [- hOS/2联合航空公司:候机大厅空空荡荡,只有几个乘客在踱来踱去。机场广播通知一架飞机 ; K+ J# l' I0 g8 w/ ?7 R
刚刚起飞,但跑道上却看不到任何飞机的影子。航空公司代表用平缓的语气一次次向乘客道
; |$ ]+ I0 W) P歉,还不停地用手指指向窗外那架外形漂亮、功能强大的喷气式客机。他们告诉乘客他们的
, P3 F$ q8 |( P$ h飞机更为舒适,比Windows航空公司的飞机更加安全,但乘客们必须耐心等待工程师们完成 ' g. Z2 A1 z% w4 }- k/ M
飞行系统的设计制造,也许要等到1995年夏天,也许要更久一些。 8 F& i4 Z" A& g. b
Windows航空公司:候机大厅干干净净,服务员笑语迎人,飞行员技艺娴熟,搬运工轻拿轻 5 u% F8 C7 \+ e/ r( X2 m/ T
放……飞机平稳起飞,爬上云端,在两万英尺高空突然爆炸。 - M" N/ a# ?. b7 G4 ~6 D
Windows 95航空公司:航班晚点6个月之后,你开始了你的空中旅行……在云层中,飞机意
; H, ?6 J: r# {* z, i外失事。 $ I$ }6 @7 V3 }) h7 s
Windows NT航空公司:乘客们自己搬来椅子,在停机坪上绕着飞机坐成一圈。他们坐在那里,
" q- q  K1 i6 n; G  r, T上下拍动双臂,嘴里发出呼呼呼呼的声音,好像他们正在飞行一样。
. d  G  @4 O. x+ `9 w9 gUnix航空公司:每个乘客拿着一个飞机零件和一件工具赶到机场,在停机坪集合,讨论他们 / ?: J  P( s: h& b
要拼装一架什么样的飞机,以及如何拼装。最后,他们拼装出几架不同的飞机,并为它们取
' m- }% ?+ x/ z. h. I3 w* N了完全相同的名字。一些乘客的确飞到了终点,但所有乘客都相信他们已经到达了终点。
* W' z& g$ L1 D* CMach航空公司:这里并没有飞机,乘客们聚集在一起大呼小叫。他们等啊等啊等啊等啊,一
8 T: g) \2 @4 n) E  |2 ]! N些人扛着飞机零件走到跑道上,把零件拼装成一架飞机,并不断地争论要拼装的飞机的样子 6 w5 ~6 M$ v2 }' f! v: M
。飞机终于起飞了,但乘客们还在地面上等啊等啊等啊等啊。最后,机长用电话通知起点站 2 o  {2 F0 ~8 _/ B5 N) T; m
的乘客飞机已经到达目的地了。 7 i0 W5 s" e: p1 j/ u* X
Newton航空公司:你18个月前就购买了机票,现在开始登机了。登机时,乘务员46次询问你
% {* G0 [! M' b" }+ ]- h的姓名,等她彻底认清了你以后,你才能坐到座位上去。你正准备就座时,乘务员又通知你
2 a2 y& D- R! F) o% _, s7 R$ T必须再次办理登机手续,因为飞机上的座位不够了,他们必须确认到底有多少名乘客。 * ]: D! P- o+ g' D9 H& X, m$ P
VMS航空公司:乘客们都聚集在机库里,看着数百名机械师检修一架庞大而豪华的飞机。这
/ q3 m9 I0 ~. |0 Z架飞机至少有十个引擎,可以搭载一千名乘客。所有乘客都爬上了飞机,两百名机械师也必 6 k# i% s: u$ J- @* N* W
须同机飞行。机长坐进玻璃驾驶舱里,发动了引擎,这时他才注意到飞机的个头太大了,根 % b+ T9 b; x5 f9 Z( H
本无法开出机库的大门。 9 N9 [+ K1 }7 T8 y0 @% p4 g

0 o. f8 W+ f+ |! t+ `Windows核心源代码揭秘
' Z# I& S+ a- C; V7 L4 _6 [5 E4 N7 m$ }/ Z
Windows核心源代码解密了!以下是一段真实的Windows代码:
. l/ K; y! S& n$ m! K6 B------------------------------------------------------------- # j  ^* r- |5 A) n5 \' \5 A
// 当仍有内存可用时循环
/ ]. `* {6 Z: n! ]+ `! T- C, \  {while (memory_available) { 3 l* D4 l+ o* N& T/ {2 R
// 想办法耗费掉大多数可用的内存 & D5 n9 E, y5 A0 x
eat_major_portion_of_memory (no_real_reason); . U; q& J- y9 T: |  r& h! C
// 如果需要更多的内存,告诉用户:操作系统就是这个样子
' X+ E1 e4 Y9 p8 ^  cif (feel_like_it)       ( h8 i$ g- Y8 Q& J# J* r
make_user_THINK (this_is_an_OS); - B. A: R3 h# g4 ^+ V( v1 x3 w
// 增加比尔·盖茨的银行账户余额
1 R  ?; s. a, q2 d, V' SBill_Gates_bank_balance++;
/ r+ M2 o, {. H0 g9 A7 A% U} # G3 ]! g$ w# L+ V