¥»³¹½d¨Ò¥u¦³°w¹ï GNU C compiler ©M GNU C++ compiler §@»¡©ú¡A ³o¨âÓ¦b FreeBSD base system ¤¤´N¦³¤F¡A ª½±µ¥´ cc ©Î gcc ´N¥i¥H°õ¦æ¡C ¦Ü©ó¡A¦p¦ó¥Îª½Ä¶¾¹²£¥Íµ{¦¡ªº»¡©ú¡A³q±`¥i¦bª½Ä¶¾¹ªº¤å¥ó©Î½u¤W¤å¥ó§ä¨ì»¡©ú¡A¦]¦¹¤£¦AÂØz¡C
·í§A¼g§¹§Aªº³Ç§@«á¡A±µ¤U¨Ó«K¬OÅý³oÓµ{¦¡¥i¥H¦b FreeBSD ¤W°õ¦æ¡A ³q±`³o¨Çn¤@¨Ç¨BÆJ¤~¯à§¹¦¨¡A¦³¨Ç¨BÆJ«h»Ýn¤£¦Pµ{¦¡¨Ó§¹¦¨¡C
¹w¥ý³B²z(Pre-process)§Aªºµ{¦¡½X¡A²¾°£µ{¦¡¤ºªºµù¸Ñ¡A©M¨ä¥L§Þ¥©¡A ¹³¬O expanding(ÂX¤j) C ªº marco¡C
½T»{§Aªºµ{¦¡»yªk¬O§_½T¹ê¿í·Ó C/C++ ªº³W©w¡A¦pªG¨S¦³²Å¦Xªº¸Ü¡A½s;¹·|¥X²{ĵ§i¡C
±Nì©l½XÂন²Õ¦X»y¨¥ ¡X¡X ¥¦¸ò¾÷¾¹»y¨¥(machine code)«D±`¬Ûªñ¡A¦ý¤´¦b¤HÃþ¥i²z¸Ñªº½d³ò¤º(¾Ú»¡À³¸Ó¬O³o¼Ë)¡C [1]
§â²Õ¦X»y¨¥Âন¾÷¾¹»y¨¥ ¡X¡X ¬Oªº¡A³o¸Ì»¡ªº¾÷¾¹»y¨¥´N¬O±`´£¨ìªº bit ©M byte¡A¤]´N¬O 1 ©M 0¡C
½T»{µ{¦¡¤¤¥Î¨ìªº¨ç¦¡©I¥s¡B¥þ°ìÅܼƬO§_¥¿½T¡AÁ|¨Ò¨Ó»¡¡G¦pY©I¥s¤F¤£¦s¦bªº¨ç¦¡¡A½s;¹·|Åã¥Üĵ§i¡C
¦pªGµ{¦¡¬O¥Ñµ{¦¡½XÀɮרӽsĶ¡A½s;¹·|¾ã¦X°_¨Ó¡C
½s;¹·|t³d²£¥ÍªF¦è¡AÅý¨t²Î¤Wªº run-time loader ¥i¥H§âµ{¦¡¸ü¤J°O¾ÐÅ餺°õ¦æ¡C
³Ì«á·|§â½sͧ¹ªº°õ¦æÀɦs¦bµwºÐ¤W¡C
³q±` ½sĶ(compiling) ¬O«ü²Ä 1 ¨ì²Ä 4 Ó¨BÆJ¡C ¡X¡X ¨ä¥L¨BÆJ«hºÙ¬° ³sµ²(linking)¡A ¦³®ÉÔ¨BÆJ 1 ¤]¥i¥H¬O«ü ¹w¥ý³B²z(pre-processing)¡A ¦Ó¨BÆJ 3 ¨ì¨BÆJ 4 «h¬O ²ÕĶ(assembling)¡C
©¯¹Bªº¬O¡A§A¥i¥H¤£¥Î²z·|¥H¤W²Ó¸`¡A½s;¹³£·|¦Û°Ê§¹¦¨¡C ¦]¬° cc ¥u¬O¬OÓ«eºÝµ{¦¡(front end)¡A¥¦·|¨Ì·Ó¥¿½Tªº°Ñ¼Æ¨Ó©I¥s¬ÛÃöµ{¦¡À°§A³B²z¡C ¥u»Ý¥´¡G
% cc foobar.c
¤Wz«ü¥O·|§â foobar.c ¶}©l½sĶ¡A¨Ã§¹¦¨¤Wz°Ê§@¡C ¦pªG§A¦³³\¦hÀÉ®×»Ýn½sĶ¡A¨º½Ð¥´Ãþ¦ü¤U¦C«ü¥O§Y¥i¡G
% cc foo.c bar.c
°O¦í»yªk¿ù»~Àˬd´N¬O ¡X¡X ¯ÂºéÀˬd»yªk¿ù»~»P§_¡A ¦Ó¤£·|À°§AÀË´ú¥ô¦óÅÞ¿è¿ù»~¡A¤ñ¦p¡GµL°j°é¡A©Î¬O±Æ§Ç¤è¦¡·Q¥Î binary sort «o§Ë¦¨ bubble sort¡C [2]
cc ¦³«D±`¦hªº¿ï¶µ¡A³£¥i³z¹L½u¤W¤â¥U¨Ó¬d¡C ¤U±¥u´£¤@¨Ç¥²n¥B«nªº¿ï¶µ¡A¥H§@¬°¨Ò¤l¡C
-o ÀɦW
-o
½sĶ«áªº°õ¦æÀÉÀɦW¡A¦pªG¨S¦³¨Ï¥Î³o¿ï¶µªº¸Ü¡A
½sͦnªºµ{¦¡¹w³]ÀɦW±N·|¬O a.out [3]
-c
¨Ï¥Î -c
®É¡A¥u·|½sĶì©l½X¡A¦Ó¤£§@³sµ²(linking)¡C
·í¥u·Q½T»{»yªk¬O§_¥¿½T©Î¨Ï¥Î Makefile ¨Ó½s͵{¦¡®É¡A³oÓ¿ï¶µ«D±`¦³¥Î¡C
³o·|²£¥Í¥s°µ foobar ªº object file(«D°õ¦æÀÉ)¡C ³oÀÉ¥i¥H»P¨ä¥Lªº object file ³sµ²¦b¤@°_¡A¦Ó¦¨°õ¦æÀÉ¡C
-g
-g
±N·|§â¤@¨Çµ¹ gdb
¥Îªº°£¿ù°T®§¥]¶i¥h°õ¦æÀɸ̱¡A©Ò¿×ªº°£¿ù°T®§¨Ò¦p¡G
µ{¦¡¦b²Ä´X¦æ¥X¿ù¡B¨ºÓµ{¦¡²Ä´X¦æ°µ¤°»ò¨ç¦¡©I¥sµ¥µ¥¡C°£¿ù¸ê°T«D±`¦n¥Î¡C
¦ý¯ÊÂI´N¬O¡G¹ï©óµ{¦¡¨Ó»¡¡AÃB¥~ªº°£¿ù°T®§·|Åý½sĶ¥X¨Óªºµ{¦¡¤ñ¸ûªÎ¨Ç¡C -g
ªº¾A¥Î®É¾÷¦b©ó¡G·íµ{¦¡ÁÙ¦b¶}µo®É¨Ï¥Î´N¦n¡A ¦Ó·í§AnÄÀ¥X§Aªº
¡§µo¦æª©¥»(release version)¡¨ ©ÎªÌ½T»{µ{¦¡¥i¹B§@¥¿±`ªº¸Ü¡A´N¤£¥²¥Î -g
³o¿ï¶µ¤F¡C
³o°Ê§@·|²£¥Í¦³§t°£¿ù°T®§ªº°õ¦æÀÉ¡C [4]
-O
-O
·|²£¥Í³Ì¨Î¤Æªº°õ¦æÀÉ¡A
½s;¹·|¨Ï¥Î¤@¨Ç§Þ¥©¡A¨ÓÅýµ{¦¡¥i¥H¶]ªº¤ñ¥¼¸g³Ì¨Î¤Æªºµ{¦¡ÁÙ§Ö¡A ¥i¥H¦b¤j¼g O
«á±¥[¤W¼Æ¦r¨Ó«ü©ú·Qnªº³Ì¨Î¤Æ¼h¯Å¡C ¦ý¬O³Ì¨Î¤ÆÁÙ¬O·|¦³¤@¨Ç¿ù»~¡AÁ|¨Ò¨Ó»¡¦b FreeBSD
2.10 release ¤¤¥Î cc ¥B«ü©w -O2
®É¡A¦b¬Y¨Ç±¡§Î¤U·|²£¥Í¿ù»~ªº°õ¦æÀÉ¡C
¥u¦³·ínÄÀ¥Xµo¦æª©¥»¡B©ÎªÌ¥[³tµ{¦¡®É¡A¤~»Ýn¨Ï¥Î³Ì¨Î¤Æ¿ï¶µ¡C
³o·|²£¥Í foobar °õ¦æÀɪº³Ì¨Î¤Æª©¥»¡C
¥H¤U¤TӰѼƱN·|±j¢ cc ½T»{µ{¦¡½X¬O§_²Å¦X¤@¨Ç°ê»Ú¼Ð·Çªº³W½d¡A ¤]´N¬O³q±`»¡ªº ANSI ¼Ð·Ç¡A ¦Ó ANSI ÄY®æ¨ÓÁ¿ÄÝ ISO ¼Ð·Ç¡C
-Wall
-Wall
Åã¥Ü cc
ºûÅ@ªÌ©Ò»{¬°È±oª`·Nªº©Ò¦³Äµ§i°T®§¡C ¤£¹L³o¦W¦r¥i¯à·|³y¦¨»~¸Ñ¡A¨Æ¹ê¤W¥¦¨Ã¥¼§¹¥þÅã¥Ü
cc ©Ò¯àª`·N¨ìªº¦U¶µÄµ§i°T®§¡C
-ansi
-ansi
Ãö³¬ cc ¯S¦³ªº¬Y¨Ç¯S®í«D
ANSI C ¼Ð·Ç¥\¯à¡C ¤£¹L³o¦W¦r¥i¯à·|³y¦¨»~¸Ñ¡A¨Æ¹ê¤W¥¦¨Ã¤£«OÃÒ§Aªºµ{¦¡·|§¹¥þ²Å¦X ANSI
¼Ð·Ç¡C
-pedantic
¥þ±Ãö³¬ cc ©Ò¯S¦³ªº«D ANSI C ¼Ð·Ç¥\¯à¡C
°£¤F³o¨Ç°Ñ¼Æ¡Acc ÁÙ¤¹³\§A¨Ï¥Î¤@¨ÇÃB¥~ªº°Ñ¼Æ¨ú¥N¼Ð·Ç°Ñ¼Æ¡A¦³¨ÇÃB¥~°Ñ¼Æ«D±`¦³¥Î¡A ¦ý¬O¹ê»Ú¤W¨Ã¤£¬O©Ò¦³ªº½s;¹³£¦³´£¨Ñ³o¨Ç°Ñ¼Æ¡C ·Ó¼Ð·Ç¨Ó¼gµ{¦¡ªº³Ì¥Dn¥Øªº´N¬O¡A§Æ±æ§A¼g¥X¨Óªºµ{¦¡¥i¥H¦b©Ò¦³½s;¹¤W½sĶ¡B°õ¦æµL»~¡A ·íµ{¦¡¥i¥H¹F¦¨¤Wz¥Øªº®É¡A´NºÙ¬° portable code(²¾´Ó©Ê¨}¦nªºµ{¦¡½X)¡C
¤@¯ë¨Ó»¡¡A¦b¼¶¼gµ{¦¡®É´NÀ³nª`·N¡y²¾´Ó©Ê¡z¡C §_«h¡C·í·Q§âµ{¦¡®³¨ì¥t¥~¤@¥x¾÷¾¹¤W¶]ªº®ÉÔ¡A´N¥i¯à±o»Ýn«¼gµ{¦¡¡C
¤Wz«ü¥O·|½T»{ foobar.c ¤ºªº»yªk¬O§_²Å¦X¼Ð·Ç¡A ¨Ã¥B²£¥Í¦W¬° foobar ªº°õ¦æÀÉ¡C
-llibrary
§i¶D gcc ¦b³sµ²(linking)µ{¦¡®É§A»Ýn¥Î¨ìªº¨ç¦¡®w¦WºÙ¡C
³Ì±`¨£ªº±¡ªp´N¬O¡A·í§A¦bµ{¦¡¤¤¨Ï¥Î¤F C ¼Æ¾Ç¨ç¦¡®w¡A ¸ò¨ä¥L§@·~¥¥x¤£¤@¼Ëªº¬O¡A³o¨ç¥Ü¾Ç¨ç¦¡³£¤£¦b¼Ð·Ç¨ç¦¡®w(library)¤¤¡A ¦]¦¹½s;¹¨Ã¤£ª¾¹D³o¨ç¦¡®w¦WºÙ¡A§A¥²¶·§i¶D½s;¹n¥[¤W¥¦¤~¦æ¡C
³W«h«Ü²³æ¡A¦pªG¦³Ó¨ç¦¡®w¥s°µ libsomething.a¡A ´N¥²¶·¦b½sͮɥ[¤W°Ñ¼Æ -lsomething
¤~¦æ¡C
Á|¨Ò¨Ó»¡¡A¼Æ¾Ç¨ç¦¡®w¥s°µ libm.a¡A ©Ò¥H§A¥²¶·µ¹ cc ªº°Ñ¼Æ´N¬O -lm
¡C
¤@¯ë±¡ªp¤U¡A³q±`·|§â³o°Ñ¼Æ¥²¶·©ñ¦b«ü¥Oªº³Ì«á¡C
¤W±³o«ü¥O·|Åý gcc ¸ò¼Æ¾Ç¨ç¦¡®w§@³sµ²¡A¥H«K§Aªºµ{¦¡¥i¥H©I¥s¨ç¦¡®w¤º§tªº¼Æ¾Ç¨ç¦¡¡C
¦pªG§A¥¿¦b½sĶªºµ{¦¡¬O C++ µ{¦¡½X¡A§AÁÙ¥²¶·ÃB¥~«ü©w -lg++
©ÎªÌ¬O -lstdc++
¡C ¦pªG§Aªº FreeBSD ¬O 2.2(§t)¥H«áª©¥»¡A
§A¥i¥H¥Î«ü¥O c++ ¨Ó¨ú¥N cc¡C ¦b
FreeBSD ¤W c++ ¤]¥i¥H¥Î g++ ¨ú¥N¡C
% cc -o foobar foobar.cc -lg++ ¾A¥Î FreeBSD 2.1.6 ©Î§ó¦´Áªºª©¥» % cc -o foobar foobar.cc -lstdc++ ¾A¥Î FreeBSD 2.2 ¤Î¤§«áªºª©¥» % c++ -o foobar foobar.cc
¤Wz«ü¥O³£·|±qì©lÀÉ foobar.cc ½sͲ£¥Í¦W¬° fooboar ªº°õ¦æÀÉ¡C ³oÃän´£¿ôªº¬O¦b UNIX® ¨t²Î¤¤ C++ µ{¦¡¶Ç²Î³£¥H .C¡B .cxx ©ÎªÌ¬O .cc §@¬°°ÆÀɦW¡A ¦Ó«D MS-DOS® ¨ººØ¥H .cpp §@¬°°ÆÀɦWªº©R¦W¤è¦¡(¤£¹L¤]¶V¨Ó¶V´¶¹M¤F)¡C gcc ·|¨Ì°ÆÀɦW¨Ó¨M©w¥Îþ¤@ºØ½s;¹½sĶ¡A µM¦Ó¡A²{¦b¤w¸g¤£¦A¨î°ÆÀɦW¤F¡A ©Ò¥H¥i¥H¦Û¥Ñªº¨Ï¥Î .cpp §@¬° C++ µ{¦¡½Xªº°ÆÀɦW¡I
sin()
¨ç¥Ü¼¶¼g§Úªºµ{¦¡¡A ¦ý¬O¦³Ó¿ù»~°T®§(¦p¤U)¡A³o¥NªíµÛ¡H2.4.1.2. ¦n§a¡A§Ú¸ÕµÛ¼g¨Ç²³æªºµ{¦¡¡A¨Ó½m²ß¨Ï¥Î -lm ¿ï¶µ(¸Óµ{¦¡·|¹Bºâ 2.1 ªº 6 ¦¸¤è)
µM«á¶i¦æ½sĶ¡G
½sĶ«á°õ¦æµ{¦¡¡A±o¨ì¤U±³oµ²ªG¡G
«Ü©úÅ㪺¡Aµ{¦¡µ²ªG¤£¬O¥¿½Tµª®×¡A¨ì©³¬OþÃä¥X¿ù¡H
·í½s;¹µo²{§A©I¥s¤@Ó¨ç¥Ü®É¡A¥¦·|½T»{¸Ó¨ç¥Üªº¦^¶ÇÈÃþ«¬(prototype)¡A ¦pªG¨S¦³¯S§O«ü©ú¡A«h¹w³]ªº¦^¶ÇÈÃþ«¬¬° int(¾ã¼Æ)¡C «Ü©úÅ㪺¡A§Aªºµ{¦¡©Ò»Ýnªº¨Ã¤£¬O¦^¶ÇÈÃþ§O¬° int¡C
¼Æ¾Ç¨ç¥Üªº¦^¶ÇÈÃþ«¬(prototype)·|©w¸q¦b math.h¡A ¦pªG§A¦³ include ³oÀÉ¡A½s;¹´N·|ª¾¹D¸Ó¨ç¥Üªº¦^¶ÇÈÃþ«¬¡A¦p¦¹¤@¨Ó¸Ó¹Bºâ´N·|±o¨ì¥¿½Tªºµ²ªG¡I
¥[¤F¤Wz¤º®e¤§«á¡A¦A«·s½sĶ¡A³Ì«á°õ¦æ¡G
¦pªG¦³¥Î¨ì¼Æ¾Ç¨ç¦¡¡A½Ð½T©wn¦³ include math.h ³oÀÉ¡A ¦Ó¥B°O±on©M¼Æ¾Ç¨ç¦¡®w§@³sµ²¡C
2.4.1.5. ¦n¡A¦³Ó½sͦnªºµ{¦¡¥s°µ foobar¡A ¥Î ls «ü¥O®É¥i¥H¬Ý¨ì¡A ¦ý°õ¦æ®É¡A°T®§«o»¡«o¨S¦³³oÀɮסC¬°¤°»ò¡H
»P MS-DOS ¤£¦Pªº¬O¡A°£«D¦³«ü©w°õ¦æÀɪº¸ô®|¡A §_«h UNIX ¨t²Î¨Ã¤£·|¦b¥Ø«eªº¥Ø¿ý¤U´M§ä§A·Q°õ¦æªºÀɮסC ¦b«ü¥O¦C¤U¥´ ./foobar ¥Nªí ¡§°õ¦æ¦b³oӥؿý©³¤U¦W¬° foobar ªºµ{¦¡¡¨¡A ©ÎªÌ¤]¥i¥H§ó§ï PATH Àô¹ÒÅܼƳ]©w¦p¤U¡A¥H¹F¦¨Ãþ¦ü®ÄªG¡G
¤W¤@¦æ³Ì«áªº "." ¥Nªí¡§¦pªG¦b«e±¼gªº¨ä¥L¥Ø¿ý§ä¤£¨ì¡A´N§ä¥Ø«eªº¥Ø¿ý¡¨¡C
2.4.1.7. ·í°õ¦æ§Ú¼gªºµ{¦¡®Éè¶}©l¥¿±`¡A ±µ¤U¨Ó«o¥X²{ ¡§core dumped¡¨ ¿ù»~°T®§¡C³o¿ù»~°T®§¨ì©³¥Nªí¤°»ò¡H
Ãö©ó core dumped ³oÓ¦WºÙªº¥Ñ¨Ó¡A ¥i¥H°l·¹¨ì¦´Áªº UNIX ¨t²Î¶}©l¨Ï¥Î core memory ¹ï¸ê®Æ±Æ§Ç®É¡C °ò¥»¤W·íµ{¦¡¦b«Ü¦h±¡ªp¤Uµo¥Í¿ù»~«á¡A §@·~¨t²Î·|§â core memory ¤¤ªº¸ê°T¼g¤J core ³oÀɮפ¤¡A ¥H«KÅý programmer ª¾¹Dµ{¦¡¨ì©³¬O¬°¦ó¥X¿ù¡C
½Ð¥Î gdb ¨Ó¤ÀªR core µ²ªG(¸Ô±¡½Ð°Ñ¦Ò Section 2.6)¡C
2.4.1.9. ·íµ{¦¡¤w¸g§â core memory ¸ê®Æ dump ¥X¨Ó«á¡A ¦P®É¤]¥X²{¥t¤@Ó¿ù»~ ¡§segmentation fault¡¨ ³o·N«ä¬O¡H
°ò¥»¤W¡A³oÓ¿ù»~ªí¥Ü§Aªºµ{¦¡¦b°O¾ÐÅ餤¸ÕµÛ°µ¤@ÓÄY«ªº«Dªk¹B§@(illegal operation)¡A UNIX ´N¬O³Q³]p¨Ó«OÅ@¾ãÓ§@·~¨t²Î§K©ó³Q´c½èªºµ{¦¡¯}Ãa¡A©Ò¥H¤~·|§i¶D§A³oÓ°T®§¡C
³Ì±`³y¦¨¡§segmentation fault¡¨ªºì¦]³q±`¬°¡G
¸ÕµÛ¹ï¤@Ó NULL
ªº«ü¼Ð(pointer)§@¼g¤Jªº°Ê§@¡A¦p
char *foo = NULL; strcpy(foo, "bang!");
¨Ï¥Î¤@Ó©|¥¼ªì©l¤Æ(initialized)ªº«ü¼Ð¡A¦p¡G
char *foo; strcpy(foo, "bang!");
©|¥¼ªì©l¤Æªº«ü¼Ðªºªì©lȱN·|¬OÀH¾÷ªº¡A¦pªG§A°÷©¯¹Bªº¸Ü¡A ³oÓ«ü¼Ðªºªì©lÈ·|«ü¦V kernel ¤w¸g¥Î¨ìªº°O¾ÐÅé¦ì¸m¡A kernel ·|µ²§ô±¼³oÓµ{¦¡¥H½T«O¨t²Î¹B§@¥¿±`¡C¦pªG§A¤£°÷©¯¹B¡A ªì©l«ü¨ìªº°O¾ÐÅé¦ì¸m¬O§Aµ{¦¡¥²¶·n¥Î¨ìªº¸ê®Æµ²ºc(data structures)ªº¦ì¸m¡A ·í³oÓ±¡§Îµo¥Í®Éµ{¦¡±N·|·íªº¤£ª¾¨ä©Ò¥HµM¡C
¸ÕµÛ¼g¤J¶W¹L°}¦C(array)¤¸¯ÀӼơA¦p¡G
int bar[20]; bar[27] = 6;
¸ÕµÛŪ¼g¦b°ßŪ°O¾ÐÅé(read-only memory)¤¤ªº¸ê®Æ¡A¦p¡G
char *foo = "My string"; strcpy(foo, "bang!");
UNIX compilers often put string literals like "My string" into read-only areas of memory.
Doing naughty things with malloc()
and
free()
, eg
char bar[80]; free(bar);
or
char *foo = malloc(27); free(foo); free(foo);
Making one of these mistakes will not always lead to an error, but they are always bad practice. Some systems and compilers are more tolerant than others, which is why programs that ran well on one system can crash when you try them on an another.
2.4.1.10. Sometimes when I get a core dump it says ¡§bus error¡¨. It says in my UNIX book that this means a hardware problem, but the computer still seems to be working. Is this true?
No, fortunately not (unless of course you really do have a hardware problem...). This is usually another way of saying that you accessed memory in a way you should not have.
2.4.1.11. This dumping core business sounds as though it could be quite useful, if I can make it happen when I want to. Can I do this, or do I have to wait until there is an error?
Yes, just go to another console or xterm, do
% ps
to find out the process ID of your program, and do
% kill -ABRT pid
where pid
is
the process ID you looked up.
This is useful if your program has got stuck in an infinite loop, for instance. If
your program happens to trap SIGABRT
, there are several
other signals which have a similar effect.
Alternatively, you can create a core dump from inside your program, by calling the
abort()
function. See the manual page of abort(3) to learn more.
If you want to create a core dump from outside your program, but do not want the process to terminate, you can use the gcore program. See the manual page of gcore(1) for more information.
[1] |
ÄY®æ»¡°_¨Ó¡A¦b³oÓ¶¥¬q cc ¨Ã¤£¬O¯uªº§âì©lµ{¦¡Âন²Õ¦X»y¨¥¡A ¦Ó¬OÂର machine-independent ªº p-code¡C |
[2] |
è©Ò»¡ªº binary sort ©M bubble sort °ÝÃD¡A ¦b¤w±Æ§Ç¦nªº§Ç¦C¤¤¡Abinary sort ·j¯Á®Ä²v·|¤ñ bubble sort ¦n¡C |
[3] |
¦Ü©ó |
[4] |
½Ðª`·N¡A¦]¬°¤W¨Ò¨S¥Î |
¥»¤å¤Î¨ä¥L¤å¥ó¡A¥i¥Ñ¦¹¤U¸ü¡Gftp://ftp.FreeBSD.org/pub/FreeBSD/doc/¡C
Y¦³ FreeBSD ¤è±ºÃ°Ý¡A½Ð¥ý¾\Ū FreeBSD ¬ÛÃö¤å¥ó¡A¦p¤£¯à¸Ñ¨Mªº¸Ü¡A¦A¬¢¸ß
<questions@FreeBSD.org>¡C
Ãö©ó¥»¤å¥óªº°ÝÃD¡A½Ð¬¢¸ß <doc@FreeBSD.org>¡C