You are on page 1of 701

revision: r685, 2014-07-24

Programming inD
Learn to program in the
D programming language
Ali ehreli
D.ershane Series
Copyright 2009-2012 Ali ehreli
0.1
1C@ >JIO@ION JA OC@ ??DGD.JMB #JMPH <I? 4DFD K<B@N =@GJIB OJ <GG JA OC@ H@H=@MN.
!?DGD.JMB D>@MDBD =T AGD @CM@GD DN GD>@IN@? PI?@M < M@<ODQ@ JHHJIN AOOMD=PODJI-
+JI>JHH@M>D<G-0C<M@ AGDF@ 3.0 2IDO@? 0O<O@N )D>@IN@.
B<N@? JI < RJMF <O ?DBDO<GH<MN.>JH.
-@MHDNNDJIN =@TJI? OC@ N>JK@ JA OCDN GD>@IN@ H<T =@ <Q<DG<=G@ <O COOK://??DGD.JMB/
>JKTMDBCO.COHG.
The PDF version of "Programming in D"
0.2
1C@ G<O@NO -!# Q@MNDJI JA OC@ =JJF ><I =@ ?JRIGJ<?@? <O OC@ AJGGJRDIB <??M@NN:
COOK://??DGD.JMB/?@MN/?.@I/-MJBM<HHDIB;DI;!.K?A
The revisions of the PDF file 0.2.1
t M685, 2014-07-24: 1C@ '*@HJMT *<I<B@H@IO' >C<KO@M.
t M677, 2014-05-29: A?? '1TK@ OM<DON' OJ OC@ 'JI?DODJI<G >JHKDG<ODJI' >C<KO@M.
t M672, 2014-05-20: 1C@ '!<O< 0C<MDIB JI>PMM@I>T' >C<KO@M.
t M646, 2013-11-01: 1C@ '*JM@ #PI>ODJIN', '*DSDIN', <I? '*JM@ /<IB@N' >C<KO@MN.
t M619, 2013-09-19: 1C@ '1PKG@N' <I? '*JM@ 1@HKG<O@N' >C<KO@MN.
t M598, 2013-07-09: 1C@ >J?@ @S<HKG@N DI OC@ '/<IB@N' >C<KO@M <M@ >JINO->JMM@>O <I? OC@T
O<F@ <?Q<IO<B@ JA 2#0.
t M588, 2013-06-28: 1C@ ')<=@GN <I? BJOJ' >C<KO@M.
t M585, 2013-06-26: 1C@ '2IDJIN' >C<KO@M.
t M581, 2013-06-14: 1C@ 'AJM@<>C RDOC 0OMP>ON <I? G<NN@N' >C<KO@M.
t M577, 2013-06-09: 1C@ '#PI>ODJI -JDIO@MN, !@G@B<O@N, <I? )<H=?<N' >C<KO@M.
t M571, 2013-06-03: 1C@ 'DN "SKM@NNDJI' >C<KO@M.
t M566, 2013-06-03: 1C@ 'JI?DODJI<G JHKDG<ODJI' >C<KO@M.
t M559, 2013-05-21: 1C@ 'BDO ,K@M<ODJIN' >C<KO@M.
t M547, 2013-01-31: 1C@ '2IDQ@MN<G #PI>ODJI <GG 0TIO<S (2#0)', '-MJK@MOD@N', 'JIOM<>O
-MJBM<HHDIB AJM 0OMP>ON <I? G<NN@N', '<GD<N', '<GD<N OCDN', <I? '-JDIO@MN' >C<KO@MN.
t M519, 2012-11-09: /@KG<>@ OJ%<NC() <GBJMDOCHN RDOC HJM@ @AAD>D@IO JI@N.
t M514, 2012-11-02: 1C@ 'G<NN@N', '&IC@MDO<I>@', ',=E@>O', '&IO@MA<>@N', '?@NOMJT <I? N>JK@?',
'*J?PG@N <I? )D=M<MD@N', <I? '"I><KNPG<ODJI <I? -MJO@>ODJI AOOMD=PO@N' >C<KO@MN.
t M506, 2012-09-15: 1C@ ',K@M<OJM ,Q@MGJ<?DIB' >C<KO@M <I? KM@QDJPN >C<KO@MN.
1C@ PK?<O@N OJ OC@ =JJF ><I =@ N@@I <O OC@ ??DGD.JMB KMJE@>O K<B@.
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
2
Acknowledgments 1
& RJPG? GDF@ OJ OC<IF HT RDA@ <I? ?<PBCO@M, RCJ @I?PM@? OC@ GJIB CJPMN <N HP>C <N & ?D?
RCDG@ RMDODIB OC@ JMDBDI<G 1PMFDNC Q@MNDJI <N R@GG <N OC@ "IBGDNC OM<ING<ODJI JA OCDN =JJF.
1C@N@ >C<KO@MN C<Q@ JMDBDI<GGT =@@I M@QD@R@? =T OC@ H@H=@MN JA OC@ 1PMFDNC !?DGD #JMPH. &
<H BM<O@APG OJ OC@ 1PMFDNC ! >JHHPIDOT AJM F@@KDIB HT @S>DO@H@IO <I? HJODQ<ODJI CDBC.
*@MO AO<JG, 7<A@M Y@G@IF, <I? 0<GDC !DI\@M C<Q@ BDQ@I A@@?=<>F JI <GHJNO @Q@MT GDI@ JA OC@
=JJF. <I AGK<T YDAO\D <I? #<MPF "M?@H ZI>@G C<Q@ =@@I DINOMPH@IO<G DI OC@ ?@Q@GJKH@IO JA
=JOC OCDN =JJF <I? JA ??DGD.JMB.
1C<IFN OJ OC@ AJGGJRDIB K@JKG@ AJM OC@DM Q@MT Q<GP<=G@ >JMM@>ODJIN, M@>JHH@I?<ODJIN, <I?
D?@<N: "MBDI $`I@T, 'JM?D 0<TJG, !<QD? %@M=@MOC, AI?M@ 1<HKP=JGJI, $JPM-$<?<?C<M< !<N<,
/<KC<^G '<FN@, AI?M@E *DOMJQD>, 'JC<II@N -A<P, '@MJH@ 0ID<O@>FD, '<NJI A?<HN, AGD %.
Y<GdfF<I, -<PG 'PM>U<F, BMD<I /JBJAA, ilrklm jpoksqn, 'JN@KC /PNCOJI 4<F@GDIB, 1JQ@,
%PBJ #GJM@IODIJ, 0<OT< -JOC<HN@OOD, )P_N *<MLP@N, CMDNOJKC 4@I?G@M.
1CDN =JJF C<N =@@I KMJJAM@<? =T "MBDI $`I@T OJ =@ @G@Q<O@? OJ "IBGDNC AMJH HT &IBGDNC.
A5=@AI>769?7@FE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
3
Introduction 2
1CDN =JJF <DHN OJ O@<>C OC@ ! G<IBP<B@ OJ M@<?@MN RCJ <M@ I@R OJ >JHKPO@M KMJBM<HHDIB.
AGOCJPBC C<QDIB @SK@MD@I>@ DI JOC@M KMJBM<HHDIB G<IBP<B@N RJPG? >@MO<DIGT =@ C@GKAPG, OCDN
=JJF NO<MON AMJH OC@ =<ND>N. &A TJP <M@ DIO@M@NO@? DI G@<MIDIB CJR OJ KMJBM<H, & CJK@ TJP RDGG
ADI? OCDN =JJF C@GKAPG.
&I JM?@M AJM OCDN =JJF OJ =@ PN@APG, TJP RDGG I@@? <I @IQDMJIH@IO OJ RMDO@, >JHKDG@, <I? MPI
TJPM ! KMJBM<HN. 1CDN 67H7>AB?7@F 7@H;DA@?7@F HPNO DI>GP?@ <O G@<NO OC@ AJGGJRDIB:
t < O@SO @?DOJM
t < ! >JHKDG@M
&INO@<? JA J=O<DIDIB <I? DINO<GGDIB OCJN@ ORJ N@K<M<O@GT, TJP H<T >JIND?@M PNDIB <I
;@F79D3F76 67H7>AB?7@F 7@H;DA@?7@F (&!"). 6JP ><I ADI? DIAJMH<ODJI <=JPO ! @?DOJMN <I?
&!"N <O OC@ "?DOJMN <I? &!"N K<B@N <O ?G<IB.JMB. 6JP ><IIJO G@<MI OJ KMJBM<H DI ! RDOCJPO <
O@SO @?DOJM JM < >JHKDG@M. 4@ RDGG N@@ CJR OJ DINO<GG OC@ ENE >JHKDG@M <I? CJR OJ >JHKDG@
KMJBM<HN NJJI DI G<O@M >C<KO@MN.
"<>C >C<KO@M JA OCDN =JJF DIOMJ?P>@N <N A@R I@R >JI>@KON <N KJNND=G@. *JNO >C<KO@MN C<Q@ <
IPH=@M JA @S@M>DN@N <O OC@ @I?. 1C@N@ @S@M>DN@N <M@ <>>JHK<ID@? =T OC@DM NJGPODJIN, NJ OC<O
TJP ><I >JHK<M@ TJPM NJGPODJIN OJ HDI@. ,I OC@ R@= Q@MNDJI JA OCDN =JJF, OC@ NJGPODJIN
<KK@<M DI < I@R =MJRN@M RDI?JR. ,I OC@ -!# Q@MNDJI, OC@T <M@ <GG <O OC@ @I? JA OC@ =JJF.
& NPBB@NO OC<O TJP ?J IJO NFDK >C<KO@MN. &A TJP >JH@ <>MJNN >C<KO@MN OC<O TJP ADI? OJ =@
K<MOD>PG<MGT ?DAAD>PGO, DO H<T =@ =@><PN@ OC@ =JJF A<DGN OJ DIOMJ?P>@ <GG JA OC@ I@>@NN<MT
>JI>@KON. -G@<N@ @-H<DG OC@ <POCJM <=JPO NP>C KMJ=G@HN OJ C@GK H<F@ OCDN =JJF HJM@ PN@APG.
1CDN =JJF ?J@N IJO >JQ@M 9D3B:;53> GE7D ;@F7D8357 ($2&) KMJBM<HHDIB. AGOCJPBC H<IT
KMJBM<HN <M@ HJM@ PN<=G@ RDOC < $2&, $2&N <M@ IJO ?DM@>OGT M@G<O@? OJ KMJBM<HHDIB
G<IBP<B@N. #PMOC@MHJM@, OC@ ?@NDBI >CJD>@N <I? KMJBM<HHDIB NOTG@N JA $2&N H<T DIO@MA@M@
RDOC OCJN@ JA OC@ KMJBM<HHDIB G<IBP<B@ <I? DON NO<I?<M? GD=M<MT, <I? H<F@ DO HJM@ ?DAAD>PGO
OJ G@<MI OC@ G<IBP<B@. #JM OC<O M@<NJI, OCDN =JJF DI>GP?@N JIGT 5A@EA>7 KMJBM<HN. ,I>@ TJP
G@<MI ! <I? DON NO<I?<M? GD=M<MT, -CJ=JN, TJP RDGG =@ <=G@ OJ PN@ <IT $2& GD=M<MT OC<O TJP GDF@.
1C@ >C<KO@MN JA OCDN =JJF <M@ H<?@ <Q<DG<=G@ JIGDI@ <N OC@T <M@ OM<ING<O@? AMJH OC@DM 1PMFDNC
JMDBDI<GN. 6JP ><I PN@ OC@ /00 A@@? OJ =@ IJODAD@? <=JPO OC@ <Q<DG<=DGDOT JA I@R >C<KO@MN.
)@<MIDIB OJ KMJBM<H DN HJM@ API RC@I NC<M@? RDOC JOC@MN. $J OJ OC@ !.G@<MI I@RNBMJPK OJ
AJGGJR ?DN>PNNDJIN <I? OJ <NF <I? <INR@M LP@NODJIN.
-G@<N@ @-H<DG OC@ <POCJM RDOC <IT >JHH@ION <I? >JMM@>ODJIN M@B<M?DIB OCDN =JJF. 1C<IF TJP.
Author: AGD Y@CM@GD
t AGD Y@CM@GD'N M]NPH]
t &IO@MQD@RN RDOC CDH <O @QDU.I@O <I? <O cUHDM'?@ 0<I<O
t 6JP ><I ADI? CDH <O @QDU.I@O'N <I? ++ AJMPHN, <O OC@ !?DGD #JMPH, <I? <O OC@ !
I@RNBMJPKN
t 6JP ><I @-H<DG CDH <O <>@CM@GD@T<CJJ.>JH
!@FDA6G5F;A@
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
4
Practice of Programming 3
&O DN NJH@RC<O ?@=<O<=G@ RC<O OC@ KM<>OD>@ JA KMJBM<HHDIB @S<>OGT DN, =PO OC@ 5D38F <NK@>O JA
DO DN Q@MT NOMJIB. 0JH@ OCJPBCON <=JPO KMJBM<HHDIB:
t &O DN OC@ O<NF JA >M@<ODIB KMJBM<HN OC<O H<F@ OC@ >JHKPO@M =@C<Q@ OC@ R<T R@ R<IO.
t AN DO M@LPDM@N OJJGN <I? OC@ PN@ JA OCJN@ OJJGN BPD?@? =T OC@ @SK@MD@I>@ JA H<NO@M
KMJBM<HH@MN, DO DN < >M<AO.
t AN DO DIQJGQ@N NJGQDIB KMJ=G@HN PI?@M >JINOM<DION, DO DN @IBDI@@MDIB.
t &O DN Q@MT API <I? N<ODNATDIB.
t &O DN IJO < ADI@ <MO, =PO <N HP>C <N DO'N KJNND=G@ DI <ITOCDIB OC<O CPH<IN ?J, KMJBM<HN ><I
=@ RJMFN JA <MO.
t &O DN IJO < N>D@I>@, =PO OC@ H@OCJ?N OC<O DO PN@N <M@ >M@<O@? =T >JHKPO@M N>D@I>@.
Programming can be very hard to learn and teach
3.1
-MJBM<HHDIB C<N =@@I O<PBCO NDI>@ OC@ 1950N. 1C@M@ C<NI'O =@@I <I @AAD>D@IO JM NP>>@NNAPG
O@<>CDIB H@OCJ? ?@Q@GJK@? T@O.
2IAJMOPI<O@GT, G@<MIDIB OJ KMJBM<H ><I =@ < ?DAAD>PGO O<NF AJM MJPBCGT C<GA JA <GG NOP?@ION.
A>>JM?DIB OJ < M@N@<M>C K<K@M, OC@ JI@N RCJ ><I G@<MI KMJBM<HHDIB @<NDGT <M@ OCJN@ RCJ <M@
<=G@ OJ >M@<O@ 5A@E;EF7@F ?A67>E OJ ?@N>MD=@ OC@ PIFIJRI NDOP<ODJIN OC<O OC@T A<>@.
0JH@ JA OC@ ?DAAD>PGOT DI KMJBM<HHDIB >JH@N AMJH OC@ <HJPIO JA O@>CID><G ?@O<DGN OC<O I@@?
OJ =@ G@<MI@?.
&D35F;57 A8 &DA9D3??;@9
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
5
The Hello World Program 4
1C@ ADMNO KMJBM<H OJ NCJR DI HJNO KMJBM<HHDIB G<IBP<B@ =JJFN DN OC@ :7>>A IAD>6 KMJBM<H.
1CDN Q@MT NCJMO <I? NDHKG@ KMJBM<H H@M@GT RMDO@N "C@GGJ RJMG?" <I? ADIDNC@N. 1CDN KMJBM<H DN
DHKJMO<IO =@><PN@ DO DI>GP?@N NJH@ JA OC@ @NN@IOD<G >JI>@KON JA OC<O G<IBP<B@.
%@M@ DN < :7>>A IAD>6 KMJBM<H DI !:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
XSJUFMO(")FMMP XPSME!");
^
1C@ EAGD57 5A67 <=JQ@ I@@?N OJ =@ >JHKDG@? =T < ! >JHKDG@M OJ KMJ?P>@ <I @S@>PO<=G@
KMJBM<H.
Compiler installation
4.1
AO OC@ ODH@ JA RMDODIB OCDN >C<KO@M, OC@M@ <M@ OCM@@ ! >JHKDG@MN OJ >CJJN@ AMJH: ENE, OC@
!DBDO<G *<MN >JHKDG@M; HED, OC@ ! >JHKDG@M JA $; <I? MED, OC@ ! >JHKDG@M OC<O O<MB@ON OC@
))3* >JHKDG@M DIAM<NOMP>OPM@.
ENE DN OC@ ! >JHKDG@M OC<O C<N =@@I PN@? ?PMDIB OC@ ?@NDBI <I? ?@Q@GJKH@IO JA OC@ G<IBP<B@
JQ@M OC@ T@<MN. AGG JA OC@ @S<HKG@N DI OCDN =JJF C<Q@ =@@I O@NO@? RDOC ENE. #JM OC<O M@<NJI, DO
RJPG? =@ OC@ @<ND@NO AJM TJP OJ NO<MO RDOC ENE <I? OMT JOC@M >JHKDG@MN JIGT DA TJP C<Q@ <
NK@>DAD> I@@? OJ.
1J DINO<GG OC@ G<O@NO Q@MNDJI JA ENE, BJ OJ OC@ ?JRIGJ<? K<B@ <O !DBDO<G *<MN <I? N@G@>O OC@
>JHKDG@M =PDG? OC<O H<O>C@N TJPM >JHKPO@M @IQDMJIH@IO. 6JP HPNO N@G@>O OC@ ENE =PDG? OC<O
DN AJM TJPM JK@M<ODIB NTNO@H <I? K<>F<B@ H<I<B@H@IO NTNO@H, <I? RC@OC@M TJP C<Q@ <
32-=DO JM < 64-=DO -2. !J IJO DINO<GG < !1 >JHKDG@M. 1CDN =JJF >JQ@MN JIGT D H7DE;A@ FIA.
1C@ DINO<GG<ODJI NO@KN <M@ ?DAA@M@IO JI ?DAA@M@IO @IQDMJIH@ION =PO DO NCJPG? =@ <N @<NT <N
AJGGJRDIB NDHKG@ JI-N>M@@I DINOMP>ODJIN <I? =T >GD>FDIB < >JPKG@ JA =POOJIN.
Source file
4.2
1C@ ADG@ OC<O OC@ KMJBM<HH@M RMDO@N AJM OC@ ! >JHKDG@M OJ >JHKDG@ DN ><GG@? OC@ EAGD57 8;>7.
0DI>@ ! DN < >JHKDG@? G<IBP<B@, OC@ NJPM>@ ADG@ DON@GA DN IJO <I @S@>PO<=G@ KMJBM<H. 1C@
NJPM>@ ADG@ HPNO =@ >JIQ@MO@? OJ <I @S@>PO<=G@ KMJBM<H =T OC@ >JHKDG@M.
AN RDOC <IT ADG@, OC@ NJPM>@ ADG@ HPNO C<Q@ < I<H@. AGOCJPBC OC@ I<H@ ><I =@ <ITOCDIB OC<O DN
G@B<G JI OC@ ADG@ NTNO@H, DO DN >PNOJH<MT OJ PN@ OC@ .E 8;>7 7JF7@E;A@ AJM ! NJPM>@ ADG@N =@><PN@
?@Q@GJKH@IO @IQDMJIH@ION, KMJBM<HHDIB OJJGN, <I? KMJBM<HH@MN <GG @SK@>O OCDN OJ =@ OC@
><N@. #JM @S<HKG@, UFTU.E, HBNF.E, JOWPJDF.E, @O>. <M@ <KKMJKMD<O@ ! NJPM>@ ADG@ I<H@N.
Compiling the hello world program
4.3
JKT JM OTK@ OC@ C@GGJ RJMG? KMJBM<H <=JQ@ DIOJ < O@SO ADG@ <I? N<Q@ DO PI?@M OC@ I<H@
IFMMP.E.
1C@ >JHKDG@M RDGG NJJI >C@>F OC<O OC@ NTIO<S JA OCDN NJPM>@ >J?@ DN >JMM@>O (D.@. DO DN Q<GD?
<>>JM?DIB OJ OC@ G<IBP<B@ MPG@N) <I? H<F@ < KMJBM<H JPO JA DO =T OM<ING<ODIB DO DIOJ H<>CDI@
>J?@. 1J >JHKDG@ OC@ KMJBM<H AJGGJR OC@N@ NO@KN:
):7 7>>A ,AD>6 &DA9D3?
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
6
1. ,K@I < >JINJG@ RDI?JR.
2. $J OJ OC@ ?DM@>OJMT RC@M@ TJP N<Q@? IFMMP.E.
3. "IO@M OC@ AJGGJRDIB >JHH<I?. (!J IJO OTK@ OC@ $ >C<M<>O@M; DO DN OC@M@ OJ DI?D><O@ OC@
>JHH<I? GDI@ KMJHKO.)
$ ENE IFMMP.E
&A TJP ?D? IJO H<F@ <IT HDNO<F@, TJP H<T OCDIF OC<O IJOCDIB C<Q@ C<KK@I@?. 1J OC@ >JIOM<MT,
DO H@<IN OC<O @Q@MTOCDIB R@IO R@GG. 1C@M@ NCJPG? =@ <I @S@>PO<=G@ ADG@ I<H@? IFMMP (JM
IFMMP.FYF PI?@M 4DI?JRN) OC<O C<N EPNO =@@I >M@<O@? =T OC@ >JHKDG@M.
&A OC@ >JHKDG@M C<N DINO@<? KMDIO@? NJH@ H@NN<B@N, TJP KMJ=<=GT C<Q@ H<?@ < HDNO<F@ RC@I
>JKTDIB OC@ KMJBM<H >J?@. 1MT OJ D?@IODAT OC@ HDNO<F@, >JMM@>O DO, <I? M@OMT >JHKDGDIB. 6JP
RDGG MJPODI@GT H<F@ H<IT HDNO<F@N RC@I KMJBM<HHDIB, NJ OC@ KMJ>@NN JA >JMM@>ODIB <I?
>JHKDGDIB RDGG =@>JH@ A<HDGD<M OJ TJP.
,I>@ OC@ KMJBM<H C<N =@@I >M@<O@? NP>>@NNAPGGT, OTK@ OC@ I<H@ JA OC@ @S@>PO<=G@ KMJBM<H OJ
MPI DO. 6JP NCJPG? N@@ OC<O OC@ KMJBM<H KMDION "%@GGJ RJMG?!":
$ ./IFMMP l SVOOJOH UIF QSPHSBN
)FMMP XPSME! l UIF NFTTBHF UIBU JU QSJOUT
JIBM<OPG<ODJIN! 6JPM ADMNO ! KMJBM<H RJMFN <N @SK@>O@?.
Compiler switches
4.4
1C@ >JHKDG@M C<N H<IT >JHH<I? GDI@ NRDO>C@N OC<O <M@ PN@? AJM DIAGP@I>DIB CJR DO >JHKDG@N
OC@ KMJBM<H. 1J N@@ < GDNO JA >JHKDG@M NRDO>C@N @IO@M JIGT OC@ I<H@ JA OC@ >JHKDG@M:
$ ENE l FOUFS POMZ UIF OBNF
%.%64 % $PNQJMFS W2.059
$PQZSJHIU (D) 1999-2012 CZ %JHJUBM .BST XSJUUFO CZ 8BMUFS #SJHIU
%PDVNFOUBUJPO: IUUQ://XXX.EMBOH.PSH/JOEFY.IUNM
6TBHF:
ENE GJMFT.E ... \ -TXJUDI ^
GJMFT.E % TPVSDF GJMFT
...
-VOJUUFTU DPNQJMF JO VOJU UFTUT
...
-X FOBCMF XBSOJOHT
...
1C@ <==M@QD<O@? JPOKPO <=JQ@ NCJRN JIGT OC@ >JHH<I? GDI@ NRDO>C@N OC<O & M@>JHH@I? OC<O
TJP <GR<TN PN@. AGOCJPBC DO H<F@N IJ ?DAA@M@I>@ RDOC OC@ C@GGJ RJMG? KMJBM<H DI OCDN >C<KO@M,
OC@ AJGGJRDIB >JHH<I? GDI@ RJPG? >JHKDG@ OC@ KMJBM<H =T @I<=GDIB R<MIDIBN <I? PIDO O@NON.
4@ RDGG N@@ OC@N@ <I? JOC@M NRDO>C@N DI HJM@ ?@O<DG DI G<O@M >C<KO@MN:
$ ENE IFMMP.E -X -VOJUUFTU
1C@ >JHKG@O@ GDNO JA ENE >JHH<I? GDI@ NRDO>C@N ><I =@ AJPI? <O !*! JHKDG@M
?J>PH@IO<ODJI.
):7 7>>A ,AD>6 &DA9D3?
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
7
,I@ JOC@M >JHH<I? GDI@ NRDO>C OC<O TJP H<T ADI? PN@APG DN -SVO. &O >JHKDG@N OC@ NJPM>@ >J?@,
KMJ?P>@N OC@ @S@>PO<=G@ KMJBM<H, <I? MPIN DO RDOC < NDIBG@ >JHH<I?:
$ ENE -SVO IFMMP.E -X -VOJUUFTU
)FMMP XPSME! l UIF QSPHSBN JT BVUPNBUJDBMMZ FYFDVUFE
IDE
4.5
&I <??DODJI OJ OC@ >JHKDG@M, TJP H<T <GNJ >JIND?@M DINO<GGDIB <I &!" (DIO@BM<O@? ?@Q@GJKH@IO
@IQDMJIH@IO). &!"N <M@ ?@NDBI@? OJ H<F@ KMJBM<H ?@Q@GJKH@IO @<ND@M =T NDHKGDATDIB OC@
NO@KN JA RMDODIB, >JHKDGDIB, <I? ?@=PBBDIB.
&A TJP ?J DINO<GG <I &!", >JHKDGDIB <I? MPIIDIB OC@ KMJBM<H RDGG =@ <N NDHKG@ <N KM@NNDIB <
F@T JM >GD>FDIB < =POOJI JI OC@ &!". & NODGG M@>JHH@I? OC<O TJP A<HDGD<MDU@ TJPMN@GA RDOC
>JHKDGDIB KMJBM<HN H<IP<GGT DI < >JINJG@ RDI?JR.
&A TJP ?@>D?@ OJ DINO<GG <I &!", BJ OJ OC@ &!"N K<B@ <O ?G<IB.JMB OJ N@@ < GDNO JA <Q<DG<=G@ &!"N.
Contents of the hello world program
4.6
%@M@ DN < LPD>F GDNO JA OC@ H<IT ! >JI>@KON OC<O C<Q@ <KK@<M@? DI OCDN NCJMO KMJBM<H:
Core feature: "Q@MT G<IBP<B@ ?@ADI@N DON NTIO<S, API?<H@IO<G OTK@N, F@TRJM?N, MPG@N, @O>. AGG
JA OC@N@ H<F@ OC@ 5AD7 873FGD7E JA OC<O G<IBP<B@. 1C@ K<M@IOC@N@N, N@HD>JGJIN, <I? RJM?N
GDF@ NBJO <I? WPJE <M@ <GG <>>JM?DIB OJ OC@ MPG@N JA !. 1C@N@ <M@ NDHDG<M OJ OC@ MPG@N JA
"IBGDNC: NP=E@>O, Q@M=, KPI>OP<ODJI, N@IO@I>@ NOMP>OPM@, @O>.
Keyword: 0K@>D<G RJM?N OC<O <M@ < K<MO JA OC@ >JM@ A@<OPM@N JA OC@ G<IBP<B@ <M@ =7KIAD6E.
1C@M@ <M@ ORJ F@TRJM?N DI OCDN KMJBM<H: JNQPSU, RCD>C DN PN@? OJ DIOMJ?P>@ < HJ?PG@ OJ OC@
KMJBM<H; <I? WPJE, RCD>C C@M@ H@<IN "IJO M@OPMIDIB <ITOCDIB".
Library and function: 1C@ >JM@ A@<OPM@N ?@ADI@ JIGT OC@ NOMP>OPM@ JA OC@ G<IBP<B@. 1C@T <M@
PN@? AJM ?@ADIDIB API>ODJIN <I? PN@M OTK@N, <I? OCJN@ DI OPMI <M@ PN@? AJM =PDG?DIB GD=M<MD@N.
)D=M<MD@N <M@ >JGG@>ODJIN JA M@PN<=G@ KMJBM<H K<MON OC<O B@O >;@=76 RDOC TJPM KMJBM<HN OJ
C@GK OC@H <>CD@Q@ OC@DM KPMKJN@N.
XSJUFMO <=JQ@ DN < 8G@5F;A@ DI !'N NO<I?<M? >;4D3DK. &O DN PN@? AJM KMDIODIB < GDI@ JA O@SO, <N DON
I<H@ NPBB@NON: RMDO@ GDI@.
Module: )D=M<MT >JIO@ION <M@ BMJPK@? =T OTK@N JA O<NFN OC<O OC@T DIO@I? OJ C@GK RDOC. 0P>C <
BMJPK DN ><GG@? < HJ?PG@. 1C@ JIGT HJ?PG@ OC<O OCDN KMJBM<H PN@N DN TUE.TUEJP, RCD>C
C<I?G@N ?<O< DIKPO <I? JPOKPO.
Character and string: "SKM@NNDJIN GDF@ ")FMMP XPSME!" <M@ ><GG@? EFD;@9E, <I? OC@
@G@H@ION JA NOMDIBN <M@ ><GG@? 5:3D35F7DE. 1C@ JIGT NOMDIB DI OCDN KMJBM<H >JIO<DIN >C<M<>O@MN
')', 'F', '!', <I? JOC@MN.
Order of operations: -MJBM<HN >JHKG@O@ OC@DM O<NFN =T @S@>PODIB JK@M<ODJIN DI < >@MO<DI
JM?@M. 1C@N@ O<NFN NO<MO RDOC OC@ JK@M<ODJIN OC<O <M@ RMDOO@I DI OC@ API>ODJI I<H@? NBJO. 1C@
JIGT JK@M<ODJI DI OCDN KMJBM<H RMDO@N "%@GGJ RJMG?!".
Significance of uppercase and lowercase letters: 6JP ><I >CJJN@ OJ OTK@ <IT >C<M<>O@M
DIND?@ NOMDIBN, =PO TJP HPNO OTK@ OC@ JOC@M >C<M<>O@MN @S<>OGT <N OC@T <KK@<M DI OC@ KMJBM<H.
1CDN DN =@><PN@ GJR@M><N@ QN. PKK@M><N@ DN NDBIDAD><IO DI ! KMJBM<HN. #JM @S<HKG@, XSJUFMO
<I? 8SJUFMO <M@ ORJ ?DAA@M@IO I<H@N.
4@ RDGG >JQ@M <GG JA OC@ A@<OPM@N JA ! DI HJM@ ?@O<DG DI OC@ AJGGJRDIB >C<KO@MN.
):7 7>>A ,AD>6 &DA9D3?
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
8
Exercises
4.7
1. *<F@ OC@ KMJBM<H JPOKPO NJH@OCDIB @GN@.
2. C<IB@ OC@ KMJBM<H OJ JPOKPO HJM@ OC<I JI@ GDI@.
3. 1MT OJ >JHKDG@ OC@ KMJBM<H <AO@M H<FDIB JOC@M >C<IB@N; @.B. M@HJQ@ OC@ N@HD>JGJI <O OC@
@I? JA OC@ GDI@ RDOC XSJUFMO <I? J=N@MQ@ < >JHKDG<ODJI @MMJM.
... F:7 EA>GF;A@E
):7 7>>A ,AD>6 &DA9D3?
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
9
XSJUFMO and XSJUF 5
&I OC@ KM@QDJPN >C<KO@M R@ C<Q@ N@@I OC<O XSJUFMO O<F@N < NOMDIB RDOCDI K<M@IOC@N@N <I?
KMDION OC@ NOMDIB.
1C@ K<MON JA KMJBM<HN OC<O <>OP<GGT ?J RJMF <M@ ><GG@? 8G@5F;A@E <I? OC@ DIAJMH<ODJI OC<O
OC@T I@@? OJ >JHKG@O@ OC@DM RJMF <M@ ><GG@? B3D3?7F7DE. 1C@ <>O JA BDQDIB NP>C DIAJMH<ODJI OJ
API>ODJIN DN ><GG@? B3EE;@9 B3D3?7F7D H3>G7E OJ OC@H. -<M<H@O@MN <M@ K<NN@? OJ API>ODJIN
RDOCDI K<M@IOC@N@N, N@K<M<O@? =T >JHH<N.
Note: ):7 IAD6 K<M<H@O@M 67E5D;47E F:7 ;@8AD?3F;A@ F:3F ;E B3EE76 FA 3 8G@5F;A@ 3F F:7
5A@57BFG3> >7H7>. ):7 5A@5D7F7 ;@8AD?3F;A@ F:3F ;E 35FG3>>K B3EE76 6GD;@9 F:7 7J75GF;A@ A8 F:7
BDA9D3? ;E 53>>76 3@ <MBPH@IO . A>F:AG9: ;@5ADD75F, F:7E7 F7D?E 3D7 EA?7F;?7E GE76
;@F7D5:3@934>K ;@ F:7 EA8FI3D7 ;@6GEFDK.
XSJUFMO ><I O<F@ HJM@ OC<I JI@ <MBPH@IO. &O KMDION OC@H JI@ <AO@M OC@ JOC@M JI OC@ N<H@
GDI@:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
XSJUFMO(")FMMP XPSME!", ")FMMP GJTI!");
^
0JH@ODH@N, <GG JA OC@ DIAJMH<ODJI OC<O DN OJ =@ KMDIO@? JI OC@ N<H@ GDI@ H<T IJO =@ M@<?DGT
<Q<DG<=G@ OJ =@ K<NN@? OJ XSJUFMO. &I NP>C ><N@N, OC@ ADMNO K<MON JA OC@ GDI@ H<T =@ KMDIO@? =T
XSJUF <I? OC@ G<NO K<MO JA OC@ GDI@ H<T =@ KMDIO@? =T XSJUFMO.
XSJUFMO <?Q<I>@N OJ OC@ I@SO GDI@, XSJUF NO<TN JI OC@ N<H@ GDI@:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
// -FU'T GJSTU QSJOU XIBU XF IBWF BWBJMBCMF:
XSJUF(")FMMP");
// ... MFU'T BTTVNF NPSF PQFSBUJPOT BU UIJT QPJOU ...
XSJUF("XPSME!");
// ... BOE GJOBMMZ:
XSJUFMO();
^
<GGDIB XSJUFMO RDOCJPO <IT K<M<H@O@M H@M@GT >JHKG@O@N OC@ >PMM@IO GDI@.
)DI@N OC<O NO<MO RDOC // <M@ ><GG@? 5A??7@F >;@7E JM =MD@AGT 5A??7@FE. A >JHH@IO DN IJO <
K<MO JA OC@ KMJBM<H >J?@ DI OC@ N@IN@ OC<O DO ?J@NI'O <AA@>O OC@ =@C<QDJM JA OC@ KMJBM<H. &ON
JIGT KPMKJN@ DN OJ @SKG<DI RC<O OC@ >J?@ ?J@N DI OC<O K<MOD>PG<M N@>ODJI JA OC@ KMJBM<H. 1C@
<P?D@I>@ JA < >JHH@IO DN <IT=J?T RCJ H<T =@ M@<?DIB OC@ KMJBM<H >J?@ G<O@M, DI>GP?DIB OC@
KMJBM<HH@M RCJ RMJO@ OC@ >JHH@IO DI OC@ ADMNO KG<>@.
Exercises
5.1
1. BJOC JA OC@ KMJBM<HN DI OCDN >C<KO@M KMDIO OC@ NOMDIBN RDOCJPO <IT NK<>@N =@OR@@I OC@H.
C<IB@ OC@ KMJBM<HN NJ OC<O OC@M@ DN NK<>@ =@OR@@I OC@ <MBPH@ION <N DI "%@GGJ RJMG?!".
2. 1MT ><GGDIB XSJUF RDOC HJM@ OC<I JI@ K<M<H@O@M <N R@GG.
ID;F7>@ 3@6 ID;F7
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
10
... F:7 EA>GF;A@E
ID;F7>@ 3@6 ID;F7
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
11
Compiler 6
4@ C<Q@ N@@I OC<O OC@ ORJ OJJGN OC<O <M@ PN@? HJNO DI ! KMJBM<HHDIB <M@ F:7 F7JF 76;FAD <I?
F:7 5A?B;>7D. ! KMJBM<HN <M@ RMDOO@I DI O@SO @?DOJMN.
1C@ >JI>@KO JA >JHKDG<ODJI <I? OC@ API>ODJI JA OC@ >JHKDG@M HPNO <GNJ =@ PI?@MNOJJ? RC@I
PNDIB 5A?B;>76 G<IBP<B@N GDF@ !.
Machine code
6.1
1C@ =M<DI JA OC@ >JHKPO@M DN OC@ HD>MJKMJ>@NNJM (JM OC@ -2, NCJMO AJM 57@FD3> BDA57EE;@9
G@;F). 1@GGDIB OC@ -2 RC<O OJ ?J DN ><GG@? 5A6;@9, <I? OC@ DINOMP>ODJIN OC<O <M@ PN@? RC@I
?JDIB NJ <M@ ><GG@? ?35:;@7 5A67.
*JNO -2 <M>CDO@>OPM@N PN@ H<>CDI@ >J?@ NK@>DAD> OJ OC<O K<MOD>PG<M <M>CDO@>OPM@. 1C@N@
H<>CDI@ >J?@ DINOMP>ODJIN <M@ ?@O@MHDI@? PI?@M C<M?R<M@ >JINOM<DION ?PMDIB OC@ ?@NDBI
NO<B@ JA OC@ <M>CDO@>OPM@. AO OC@ GJR@NO G@Q@G OC@N@ H<>CDI@ >J?@ DINOMP>ODJIN <M@
DHKG@H@IO@? <N @G@>OMD><G NDBI<GN. B@><PN@ OC@ @<N@ JA >J?DIB DN IJO < KMDH<MT >JIND?@M<ODJI
<O OCDN G@Q@G, RMDODIB KMJBM<HN ?DM@>OGT DI OC@ AJMH JA OC@ H<>CDI@ >J?@ JA OC@ -2 DN < Q@MT
?DAAD>PGO O<NF.
1C@N@ H<>CDI@ >J?@ DINOMP>ODJIN <M@ NK@>D<G IPH=@MN, RCD>C M@KM@N@IO Q<MDJPN JK@M<ODJIN
NPKKJMO@? =T OC@ -2. #JM @S<HKG@, AJM <I DH<BDI<MT 8-=DO -2, OC@ IPH=@M 4 HDBCO
M@KM@N@IO OC@ JK@M<ODJI JA GJ<?DIB, OC@ IPH=@M 5 HDBCO M@KM@N@IO OC@ JK@M<ODJI JA NOJMDIB,
<I? OC@ IPH=@M 6 HDBCO M@KM@N@IO OC@ JK@M<ODJI JA DI>M@H@IODIB. ANNPHDIB OC<O OC@ G@AOHJNO
3 =DON <M@ OC@ JK@M<ODJI IPH=@M <I? OC@ MDBCOHJNO 5 =DON <M@ OC@ Q<GP@ OC<O DN PN@? DI OC<O
JK@M<ODJI, < N<HKG@ KMJBM<H DI H<>CDI@ >J?@ AJM OCDN -2 HDBCO GJJF GDF@ OC@ AJGGJRDIB:
0QFSBUJPO 7BMVF .FBOJOH
100 11110 -0"% 11110
101 10100 4503& 10100
110 10100 */$3&.&/5 10100
000 00000 1"64&
B@DIB NJ >GJN@ OJ C<M?R<M@, H<>CDI@ >J?@ DN IJO NPDO<=G@ AJM M@KM@N@IODIB CDBC@M G@Q@G
>JI>@KON GDF@ 3 B>3K;@9 53D6 JM 3 EFG67@F D75AD6.
Programming language
6.2
-MJBM<HHDIB G<IBP<B@N <M@ ?@NDBI@? <N @AAD>D@IO R<TN JA KMJBM<HHDIB < -2, ><K<=G@ JA
M@KM@N@IODIB CDBC@M-G@Q@G >JI>@KON. -MJBM<HHDIB G<IBP<B@N ?J IJO C<Q@ OJ ?@<G RDOC
C<M?R<M@ >JINOM<DION; OC@DM H<DI KPMKJN@N <M@ @<N@ JA PN@ <I? @SKM@NNDQ@I@NN. -MJBM<HHDIB
G<IBP<B@N <M@ @<ND@M AJM CPH<IN OJ PI?@MNO<I?, >GJN@M OJ I<OPM<G G<IBP<B@N:
JG (B@DBSE@IBT@CFFO@QMBZFE()) \
EJTQMBZ@UIF@DBSE();
^
%JR@Q@M, KMJBM<HHDIB G<IBP<B@N <?C@M@ OJ HP>C HJM@ NOMD>O <I? AJMH<G MPG@N OC<I <IT
NKJF@I G<IBP<B@.
CA?B;>7D
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
12
Compiled languages
6.3
&I NJH@ KMJBM<HHDIB G<IBP<B@N, OC@ KMJBM<H DINOMP>ODJIN HPNO =@ >JHKDG@? =@AJM@
=@>JHDIB < KMJBM<H OJ =@ @S@>PO@?. 0P>C G<IBP<B@N KMJ?P>@ A<NO @S@>PODIB KMJBM<HN =PO
OC@ ?@Q@GJKH@IO KMJ>@NN DIQJGQ@N ORJ H<DI NO@KN: RMDODIB OC@ KMJBM<H <I? >JHKDGDIB DO.
&I B@I@M<G, >JHKDG@? G<IBP<B@N C@GK RDOC ><O>CDIB KMJBM<HHDIB @MMJMN =@AJM@ OC@ KMJBM<H
@Q@I NO<MON MPIIDIB.
! DN < >JHKDG@? G<IBP<B@.
Interpreted languages
6.4
0JH@ KMJBM<HHDIB G<IBP<B@N ?JI'O M@LPDM@ >JHKDG<ODJI. 0P>C G<IBP<B@N <M@ ><GG@?
;@F7DBD7F76 >3@9G397E. -MJBM<HN ><I =@ @S@>PO@? ?DM@>OGT AMJH OC@ C<I?-RMDOO@I KMJBM<H.
0JH@ @S<HKG@N JA DIO@MKM@O@? G<IBP<B@N <M@ -TOCJI, /P=T, <I? -@MG. B@><PN@ OC@M@ DN IJ
>JHKDG<ODJI NO@K, KMJBM<H ?@Q@GJKH@IO ><I =@ @<ND@M AJM OC@N@ G<IBP<B@N. ,I OC@ JOC@M
C<I?, <N OC@ DINOMP>ODJIN JA OC@ KMJBM<H HPNO =@ K<MN@? OJ =@ DIO@MKM@O@? @Q@MT ODH@ OC@
KMJBM<H DN @S@>PO@?, KMJBM<HN OC<O <M@ RMDOO@I DI OC@N@ G<IBP<B@N <M@ NGJR@M OC<I OC@DM
@LPDQ<G@ION RMDOO@I DI >JHKDG@? G<IBP<B@N.
&I B@I@M<G, AJM <I DIO@MKM@O@? G<IBP<B@, H<IT OTK@N JA @MMJMN DI OC@ KMJBM<H ><IIJO =@
?DN>JQ@M@? PIODG OC@ KMJBM<H NO<MON MPIIDIB.
Compiler
6.5
1C@ KPMKJN@ JA < >JHKDG@M DN OM<ING<ODJI: &O OM<ING<O@N KMJBM<HN RMDOO@I DI < KMJBM<HHDIB
G<IBP<B@ DIOJ H<>CDI@ >J?@. 1CDN DN < OM<ING<ODJI AMJH OC@ G<IBP<B@ JA OC@ KMJBM<HH@M OJ
OC@ G<IBP<B@ JA OC@ -2. 1CDN OM<ING<ODJI DN ><GG@? 5A?B;>3F;A@. "Q@MT >JHKDG@M PI?@MNO<I?N <
K<MOD>PG<M KMJBM<HHDIB G<IBP<B@ <I? DN ?@N>MD=@? <N < >JHKDG@M JA OC<O G<IBP<B@, <N DI "< !
>JHKDG@M".
Compilation error
6.6
AN OC@ >JHKDG@M >JHKDG@N < KMJBM<H <>>JM?DIB OJ OC@ MPG@N JA OC@ G<IBP<B@, DO NOJKN OC@
>JHKDG<ODJI <N NJJI <N DO >JH@N <>MJNN ;>>793> DINOMP>ODJIN. &GG@B<G DINOMP>ODJIN <M@ OC@ JI@N
OC<O <M@ JPOND?@ OC@ NK@>DAD><ODJIN JA OC@ G<IBP<B@. -MJ=G@HN GDF@ < HDNH<O>C@? K<M@IOC@NDN,
< HDNNDIB N@HD>JGJI, < HDNNK@GG@? F@TRJM?, @O>. <GG ><PN@ >JHKDG<ODJI @MMJMN.
1C@ >JHKDG@M H<T <GNJ @HDO < 5A?B;>3F;A@ I3D@;@9 RC@I DO N@@N < NPNKD>DJPN KD@>@ JA >J?@
OC<O H<T ><PN@ >JI>@MI =PO IJO I@>@NN<MDGT <I @MMJM. %JR@Q@M, R<MIDIBN <GHJNO <GR<TN
DI?D><O@ <I <>OP<G @MMJM JM =<? NOTG@, NJ DO DN < >JHHJI KM<>OD>@ OJ >JIND?@M HJNO JM <GG
R<MIDIBN <N @MMJMN.
CA?B;>7D
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
13
Fundamental Types 7
4@ C<Q@ N@@I OC<O OC@ =M<DI JA < >JHKPO@M DN OC@ -2. *JNO JA OC@ O<NFN JA < KMJBM<H <M@
K@MAJMH@? =T OC@ -2 <I? OC@ M@NO <M@ ?DNK<O>C@? OJ JOC@M K<MON JA OC@ >JHKPO@M.
1C@ NH<GG@NO PIDO JA ?<O< DI < >JHKPO@M DN ><GG@? 3 4;F, RCD>C ><I C<Q@ OC@ Q<GP@ 0 JM 1.
0DI>@ < OTK@ JA ?<O< OC<O ><I CJG? JIGT OC@ Q<GP@N 0 <I? 1 RJPG? C<Q@ Q@MT GDHDO@? PN@, OC@
-2 ?@ADI@N G<MB@M ?<O< OTK@N OC<O <M@ >JH=DI<ODJIN JA HJM@ OC<I JI@ =DO. AN <I @S<HKG@, <
4KF7 >JINDNON JA 8 =DON. 1C@ HJNO @AAD>D@IO ?<O< OTK@ JA < -2 H<F@N OC<O -2 <I $-4;F C&*:
<N DI 32-=DO -2, 64-=DO -2, @O>.
1C@ ?<O< OTK@N OC<O OC@ -2 ?@ADI@N <M@ NODGG IJO NPAAD>D@IO: OC@T ><I'O M@KM@N@IO CDBC@M G@Q@G
>JI>@KON GDF@ @3?7 A8 3 EFG67@F JM 3 B>3K;@9 53D6. ! KMJQD?@N H<IT PN@APG ?<O< OTK@N, =PO
@Q@I OC@N@ OTK@N <M@ IJO NPAAD>D@IO OJ M@KM@N@IO H<IT CDBC@M G@Q@G >JI>@KON. 0P>C >JI>@KON
HPNO =@ ?@ADI@? =T OC@ KMJBM<HH@M <N EFDG5FE <I? 5>3EE7E, RCD>C R@ RDGG N@@ DI G<O@M
>C<KO@MN.
!'N 8G@63?7@F3> FKB7E <M@ Q@MT NDHDG<M OJ OC@ API?<H@IO<G OTK@N JA H<IT JOC@M G<IBP<B@N, <N
N@@I DI OC@ AJGGJRDIB O<=G@. 1C@ O@MHN OC<O <KK@<M DI OC@ O<=G@ <M@ @SKG<DI@? =@GJR:
%'T 'VOEBNFOUBM %BUB 5ZQFT
5ZQF %FGJOJUJPO *OJUJBM 7BMVF
CPPM #PPMFBO UZQF GBMTF
CZUF TJHOFE 8 CJUT 0
VCZUF VOTJHOFE 8 CJUT 0
TIPSU TJHOFE 16 CJUT 0
VTIPSU VOTJHOFE 16 CJUT 0
JOU TJHOFE 32 CJUT 0
VJOU VOTJHOFE 32 CJUT 0
MPOH TJHOFE 64 CJUT 0-
VMPOH VOTJHOFE 64 CJUT 0-
GMPBU 32-CJU GMPBUJOH QPJOU GMPBU.OBO
EPVCMF 64-CJU GMPBUJOH QPJOU EPVCMF.OBO
SFBM FJUIFS UIF MBSHFTU GMPBUJOH QPJOU UZQF UIBU UIF
IBSEXBSF TVQQPSUT, PS EPVCMF; XIJDIFWFS JT MBSHFS
SFBM.OBO
JGMPBU JNBHJOBSZ WBMVF UZQF PG GMPBU GMPBU.OBO * 1.0J
JEPVCMFJNBHJOBSZ WBMVF UZQF PG EPVCMF EPVCMF.OBO *
1.0J
JSFBM JNBHJOBSZ WBMVF UZQF PG SFBM SFBM.OBO * 1.0J
DGMPBU DPNQMFY OVNCFS UZQF NBEF PG UXP GMPBUT GMPBU.OBO +
GMPBU.OBO * 1.0J
DEPVCMFDPNQMFY OVNCFS UZQF NBEF PG UXP EPVCMFT EPVCMF.OBO +
EPVCMF.OBO *
1.0J
DSFBM DPNQMFY OVNCFS UZQF NBEF PG UXP SFBMT SFBM.OBO +
SFBM.OBO * 1.0J
DIBS 65'-8 DPEF VOJU 0Y''
XDIBS 65'-16 DPEF VOJU 0Y''''
EDIBS 65'-32 DPEF VOJU BOE 6OJDPEF DPEF QPJOU 0Y0000''''
FG@63?7@F3> )KB7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
14
&I <??DODJI OJ OC@ <=JQ@, OC@ F@TRJM? WPJE M@KM@N@ION :3H;@9 @A FKB7. 1C@ F@TRJM?N DFOU
<I? VDFOU <M@ M@N@MQ@? AJM APOPM@ PN@ OJ M@KM@N@IO NDBI@? <I? PINDBI@? 128 =DO Q<GP@N.
2IG@NN OC@M@ DN < NK@>DAD> M@<NJI IJO OJ, TJP ><I PN@ JOU OJ M@KM@N@IO RCJG@ Q<GP@N. 1J
M@KM@N@IO >JI>@KON OC<O ><I C<Q@ AM<>ODJI<G Q<GP@N, >JIND?@M EPVCMF.
1C@ AJGGJRDIB <M@ OC@ O@MHN OC<O <KK@<M@? DI OC@ O<=G@:
Boolean: 1C@ OTK@ JA GJBD><G @SKM@NNDJIN, C<QDIB OC@ Q<GP@ USVF AJM OMPOC <I? GBMTF AJM
A<GNDOT.
Signed type: A OTK@ OC<O ><I C<Q@ I@B<ODQ@ <I? KJNDODQ@ Q<GP@N. #JM @S<HKG@ CZUF ><I C<Q@
Q<GP@N AMJH -128 OJ 127. 1C@ I<H@N JA OC@N@ OTK@N >JH@ AMJH OC@ I@B<ODQ@ E;9@.
Unsigned type: A OTK@ OC<O ><I C<Q@ JIGT KJNDODQ@ Q<GP@N. #JM @S<HKG@ VCZUF ><I C<Q@
Q<GP@N AMJH 0 OJ 255. 1C@ V <O OC@ =@BDIIDIB JA OC@ I<H@ JA OC@N@ OTK@N >JH@N AMJH
G@E;9@76.
Floating point: 1C@ OTK@ OC<O ><I M@KM@N@IO Q<GP@N RDOC ?@>DH<G AM<>ODJIN <N DI 1.25. 1C@
KM@>DNDJI JA AGJ<ODIB KJDIO ><G>PG<ODJIN <M@ ?DM@>OGT M@G<O@? OJ OC@ =DO >JPIO JA OC@ OTK@: CDBC@M
OC@ =DO >JPIO, HJM@ KM@>DN@ OC@ M@NPGON.
,IGT AGJ<ODIB KJDIO OTK@N ><I M@KM@N@IO ?@>DH<G AM<>ODJIN; DIO@B@M OTK@N GDF@ JOU ><I JIGT
M@KM@N@IO RCJG@ Q<GP@N GDF@ 1 <I? 2.
Complex number type: 1C@ OTK@ OC<O ><I M@KM@N@IO OC@ >JHKG@S IPH=@MN JA H<OC@H<OD>N.
Imaginary number type: 1C@ OTK@ OC<O M@KM@N@ION JIGT OC@ DH<BDI<MT K<MO JA >JHKG@S
IPH=@MN. 1C@ J OC<O <KK@<MN DI OC@ &IDOD<G 3<GP@ >JGPHI DN OC@ NLP<M@ MJJO JA -1 DI
H<OC@H<OD>N.
nan: 0CJMO AJM "IJO < IPH=@M", M@KM@N@IODIB ;@H3>;6 8>A3F;@9 BA;@F H3>G7.
Properties of types
7.1
! OTK@N C<Q@ BDAB7DF;7E. -MJK@MOD@N <M@ <>>@NN@? RDOC < ?JO <AO@M OC@ I<H@ JA OC@ OTK@. #JM
@S<HKG@ OC@ TJ[FPG KMJK@MOT JA JOU DN <>>@NN@? <N JOU.TJ[FPG. 4@ RDGG N@@ JIGT AJPM JA
OC@N@ <OOMD=PO@N DI OCDN >C<KO@M:
t TUSJOHPG DN OC@ I<H@ JA OC@ OTK@
t TJ[FPG DN OC@ G@IBOC JA OC@ OTK@ DI O@MHN JA =TO@N. (&I JM?@M OJ ?@O@MHDI@ OC@ =DO >JPIO,
OCDN Q<GP@ HPNO =@ HPGODKGD@? =T 8, OC@ IPH=@M JA =DON DI < =TO@.)
t NJO DN NCJMO AJM "HDIDHPH"; OCDN DN OC@ NH<GG@NO Q<GP@ OC<O OC@ OTK@ ><I C<Q@
t NBY DN NCJMO AJM "H<SDHPH"; OCDN DN OC@ G<MB@NO Q<GP@ OC<O OC@ OTK@ ><I C<Q@
%@M@ DN < KMJBM<H OC<O KMDION OC@N@ KMJK@MOD@N AJM JOU:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
XSJUFMO("5ZQF : ", JOU.TUSJOHPG);
XSJUFMO("-FOHUI JO CZUFT: ", JOU.TJ[FPG);
XSJUFMO(".JOJNVN WBMVF : ", JOU.NJO);
XSJUFMO(".BYJNVN WBMVF : ", JOU.NBY);
^
FG@63?7@F3> )KB7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
15
TJ[F@U
7.2
6JP RDGG >JH@ <>MJNN OC@ TJ[F@U OTK@ <N R@GG. TJ[F@U DN IJO < N@K<M<O@ OTK@ =PO <I <GD<N JA <I
@SDNODIB PINDBI@? OTK@. &ON I<H@ >JH@N AMJH "NDU@ OTK@". &O DN OC@ HJNO NPDO<=G@ OTK@ OJ
M@KM@N@IO >JI>@KON GDF@ E;L7 JM 5AG@F. TJ[F@U HPNO =@ G<MB@ @IJPBC OJ M@KM@N@IO OC@ IPH=@M
JA =TO@N JA OC@ H@HJMT OC<O < KMJBM<H ><I KJO@IOD<GGT =@ PNDIB. 0J, DON <>OP<G NDU@ ?@K@I?N JI
OC@ NTNO@H: VJOU JI < 32-=DO NTNO@H, VMPOH JI < 64-=DO NTNO@H, @O>.
6JP ><I PN@ OC@ .TUSJOHPG KMJK@MOT OJ N@@ RC<O TJ[F@U DN <I <GD<N JA JI TJPM NTNO@H:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
XSJUFMO(TJ[F@U.TUSJOHPG);
^
1C@ JPOKPO JA OC@ KMJBM<H DN OC@ AJGGJRDIB JI HT NTNO@H:
VMPOH
Exercise
7.3
t -MDIO OC@ KMJK@MOD@N JA JOC@M OTK@N.
Note: .AG 53@'F GE7 F:7 D7E7DH76 FKB7E cent 3@6 ucent ;@ 3@K BDA9D3?; 3@6 3E 3@
7J57BF;A@, void 6A7E @AF :3H7 F:7 BDAB7DF;7E .min 3@6 .max.
... F:7 EA>GF;A@
FG@63?7@F3> )KB7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
16
Assignment and Order of Evaluation 8
1C@ ADMNO ORJ ?DAAD>PGOD@N OC<O HJNO NOP?@ION A<>@ RC@I G@<MIDIB OJ KMJBM<H DIQJGQ@ OC@
<NNDBIH@IO JK@M<ODJI <I? OC@ JM?@M JA @Q<GP<ODJI.
The assignment operation
8.1
6JP RDGG N@@ GDI@N NDHDG<M OJ OC@ AJGGJRDIB DI <GHJNO @Q@MT KMJBM<H DI <GHJNO @Q@MT
KMJBM<HHDIB G<IBP<B@:
B = 10;
1C@ H@<IDIB JA OC<O GDI@ DN "H<F@ B'N Q<GP@ =@>JH@ 10". 0DHDG<MGT, OC@ AJGGJRDIB GDI@ H@<IN
"H<F@ C'N Q<GP@ =@>JH@ 20":
C = 20;
B<N@? JI OC<O DIAJMH<ODJI, RC<O ><I =@ N<D? <=JPO OC@ AJGGJRDIB GDI@?
B = C;
2IAJMOPI<O@GT, OC<O GDI@ DN IJO <=JPO OC@ @LP<GDOT >JI>@KO JA H<OC@H<OD>N OC<O & <NNPH@ R@ <GG
FIJR. 1C@ @SKM@NNDJI <=JQ@ does not H@<I "< DN @LP<G OJ ="! 4C@I R@ <KKGT OC@ N<H@ GJBD>
AMJH OC@ @<MGD@M ORJ GDI@N, OC@ @SKM@NNDJI <=JQ@ HPNO H@<I "H<F@ B'N Q<GP@ =@>JH@ C".
*<FDIB B'N Q<GP@ =@>JH@ C APMOC@M H@<IN "H<F@ B'N Q<GP@ =@>JH@ OC@ N<H@ <N C'N Q<GP@".
1C@ R@GG-FIJRI = NTH=JG JA H<OC@H<OD>N C<N < >JHKG@O@GT ?DAA@M@IO H@<IDIB DI
KMJBM<HHDIB: H<F@ OC@ G@AO ND?@'N Q<GP@ OC@ N<H@ <N OC@ MDBCO ND?@'N Q<GP@.
Order of evaluation
8.2
1C@ JK@M<ODJIN JA < KMJBM<H <M@ <KKGD@? NO@K =T NO@K DI < NK@>DAD> JM?@M. 4@ H<T N@@ OC@
KM@QDJPN OCM@@ @SKM@NNDJIN DI < KMJBM<H DI OC<O JM?@M:
B = 10;
C = 20;
B = C;
1C@ H@<IDIB JA OCJN@ OCM@@ GDI@N <GOJB@OC@M DN OCDN: "H<F@ B'N Q<GP@ =@>JH@ 10, F:7@ H<F@
C'N Q<GP@ =@>JH@ 20, F:7@ H<F@ B'N Q<GP@ =@>JH@ OC@ N<H@ <N C'N Q<GP@". A>>JM?DIBGT, <AO@M
OCJN@ OCM@@ JK@M<ODJIN <M@ K@MAJMH@?, =JOC B'N <I? C'N Q<GP@N RJPG? =@ 20.
Exercise
8.3
,=N@MQ@ OC<O OC@ AJGGJRDIB OCM@@ JK@M<ODJIN NR<K OC@ Q<GP@N JA B <I? C. &A <O OC@
=@BDIIDIB OC@DM Q<GP@N <M@ 1 <I? 2 M@NK@>ODQ@GT, <AO@M OC@ JK@M<ODJIN OC@ Q<GP@N =@>JH@ 2
<I? 1:
D = B;
B = C;
C = D;
... F:7 EA>GF;A@
AEE;9@?7@F 3@6 %D67D A8 EH3>G3F;A@
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
17
Variables 9
JI>M@O@ >JI>@KON OC<O <M@ M@KM@N@IO@? DI < KMJBM<H <M@ ><GG@? H3D;34>7E. A Q<GP@ GDF@ 3;D
F7?B7D3FGD7 JM < HJM@ >JHKGD><O@? J=E@>O GDF@ 3 53D 7@9;@7 ><I =@ Q<MD<=G@N JA < KMJBM<H.
"Q@MT Q<MD<=G@ DN JA < >@MO<DI OTK@ <I? C<N < >@MO<DI Q<GP@. *JNO Q<MD<=G@N C<Q@ I<H@N <N
R@GG, =PO NJH@ Q<MD<=G@N <M@ <IJITHJPN.
AN <I @S<HKG@ JA < Q<MD<=G@, R@ ><I OCDIF JA OC@ >JI>@KO JA F:7 @G?47D A8 EFG67@FE <O <
N>CJJG. 0DI>@ OC@ IPH=@M JA NOP?@ION DN < RCJG@ IPH=@M, JOU DN < NPDO<=G@ OTK@, <I?
TUVEFOU$PVOU RJPG? =@ < NPAAD>D@IOGT ?@N>MDKODQ@ I<H@.
A>>JM?DIB OJ !'N NTIO<S MPG@N, < Q<MD<=G@ DN DIOMJ?P>@? =T DON OTK@ AJGGJR@? =T DON I<H@.
&IOMJ?P>DIB < Q<MD<=G@ OJ OC@ KMJBM<H DN ><GG@? DON 678;@;F;A@. ,I>@ < Q<MD<=G@ DN ?@ADI@?, DON
I<H@ NO<MON M@KM@N@IODIB DON Q<GP@.
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
// 5IF EFGJOJUJPO PG UIF WBSJBCMF; UIJT EFGJOJUJPO
// TQFDJGJFT UIBU UIF UZQF PG TUVEFOU$PVOU JT JOU:
JOU TUVEFOU$PVOU;
// 5IF OBNF PG UIF WBSJBCMF CFDPNFT JUT WBMVF:
XSJUFMO("5IFSF BSF ", TUVEFOU$PVOU, " TUVEFOUT.");
^
1C@ JPOKPO JA OCDN KMJBM<H DN OC@ AJGGJRDIB:
5IFSF BSF 0 TUVEFOUT.
AN N@@I AMJH OC<O JPOKPO, OC@ Q<GP@ JA TUVEFOU$PVOU DN 0. 1CDN DN <>>JM?DIB OJ OC@
API?<H@IO<G OTK@N O<=G@ AMJH OC@ KM@QDJPN >C<KO@M: OC@ DIDOD<G Q<GP@ JA JOU DN 0.
+JO@ OC<O TUVEFOU$PVOU ?J@N IJO <KK@<M DI OC@ JPOKPO <N DON I<H@. &I JOC@M RJM?N, OC@
JPOKPO JA OC@ KMJBM<H DN IJO "1C@M@ <M@ NOP?@IOJPIO NOP?@ION".
1C@ Q<GP@N JA Q<MD<=G@N <M@ >C<IB@? =T OC@ = JK@M<OJM. 1C@ = JK@M<OJM <NNDBIN I@R Q<GP@N OJ
Q<MD<=G@N, <I? AJM OC<O M@<NJI DN ><GG@? OC@ 3EE;9@?7@F AB7D3FAD:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
JOU TUVEFOU$PVOU;
XSJUFMO("5IFSF BSF ", TUVEFOU$PVOU, " TUVEFOUT.");
// "TTJHOJOH UIF WBMVF 200 UP UIF TUVEFOU$PVOU WBSJBCMF:
TUVEFOU$PVOU = 200;
XSJUFMO("5IFSF BSF OPX ", TUVEFOU$PVOU, " TUVEFOUT.");
^
5IFSF BSF 0 TUVEFOUT.
5IFSF BSF OPX 200 TUVEFOUT.
4C@I OC@ Q<GP@ JA < Q<MD<=G@ DN FIJRI <O OC@ ODH@ JA OC@ Q<MD<=G@'N ?@ADIDODJI, OC@ Q<MD<=G@ ><I
=@ ?@ADI@? <I? <NNDBI@? <O OC@ N<H@ ODH@. 1CDN DN <I DHKJMO<IO BPD?@GDI@; DO H<F@N DO
DHKJNND=G@ OJ PN@ < Q<MD<=G@ =@AJM@ <NNDBIDIB DON DIO@I?@? Q<GP@:
+3D;34>7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
18
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
// %FGJOJUJPO BOE BTTJHONFOU BU UIF TBNF UJNF:
JOU TUVEFOU$PVOU = 100;
XSJUFMO("5IFSF BSF ", TUVEFOU$PVOU, " TUVEFOUT.");
^
5IFSF BSF 100 TUVEFOUT.
Exercise
9.1
t !@ADI@ ORJ Q<MD<=G@N OJ KMDIO "& C<Q@ @S>C<IB@? 20 "PMJN <O OC@ M<O@ JA 2.11". 6JP ><I PN@
EPVCMF AJM OC@ AGJ<ODIB KJDIO Q<GP@.
... F:7 EA>GF;A@
+3D;34>7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
19
Standard Input and Output Streams 10
0J A<M, OC@ KMDIO@? JPOKPO JA JPM KMJBM<HN C<N =@@I <KK@<MDIB JI OC@ 5A@EA>7 I;@6AI (JM
E5D77@). AGOCJPBC OCDN DN <>OP<GGT OC@ ><N@ RDOC H<IT PN@N JA H<IT KMJBM<HN, DI M@<GDOT OC@
>C<M<>O@MN <M@ KMDIO@? OJ EF3@63D6 AGFBGF EFD73?E JA KMJBM<HN.
1C@ NO<I?<M? JPOKPO DN >C<M<>O@M =<N@?; @Q@MTOCDIB OJ =@ KMDIO@? <M@ ADMNO >JIQ@MO@? OJ OC@DM
>C<M<>O@M M@KM@N@IO<ODJIN <I? OC@I N@IO OJ OC@ JPOKPO JI@ =T JI@ <N >C<M<>O@MN. #JM @S<HKG@,
OC@ DIO@B@M Q<GP@ 100 OC<O R@'Q@ KMDIO@? DI OC@ G<NO >C<KO@M DN IJO N@IO OJ OC@ JPOKPO <N OC@
Q<GP@ 100, =PO <N OC@ OCM@@ >C<M<>O@MN 1, 0, <I? 0.
0DHDG<MGT, RC<O R@ IJMH<GGT K@M>@DQ@ <N OC@ =7K4A3D6 DN <>OP<GGT OC@ EF3@63D6 ;@BGF EFD73? JA
< KMJBM<H <I? DN <GNJ >C<M<>O@M =<N@?. 1C@ DIAJMH<ODJI <GR<TN >JH@N <N >C<M<>O@MN OJ =@
>JIQ@MO@? OJ ?<O<. #JM @S<HKG@ OC@ DIO@B@M Q<GP@ 42 <>OP<GGT >JH@N OCMJPBC OC@ NO<I?<M?
DIKPO <N OC@ >C<M<>O@MN 4 <I? 2.
1C@N@ >JIQ@MNDJIN C<KK@I <POJH<OD><GGT.
1CDN >JI>@KO JA >JIN@>PODQ@ >C<M<>O@MN DN ><GG@? < 5:3D35F7D EFD73?. AN !'N NO<I?<M? DIKPO
<I? NO<I?<M? JPOKPO ADO OCDN ?@N>MDKODJI, OC@T <M@ >C<M<>O@M NOM@<HN.
1C@ I<H@N JA OC@ NO<I?<M? DIKPO <I? JPOKPO NOM@<HN DI ! <M@ TUEJO <I? TUEPVU, M@NK@>ODQ@GT.
,K@M<ODJIN JI OC@N@ NOM@<HN IJMH<GGT M@LPDM@ OC@ I<H@ JA OC@ NOM@<H, < ?JO, <I? OC@
JK@M<ODJI; <N DI TUSFBN.PQFSBUJPO(). B@><PN@ TUEJO <I? TUEPVU <M@ PN@? Q@MT >JHHJIGT,
<N < >JIQ@ID@I>@, NO<I?<M? JK@M<ODJIN JI OC@H ><I =@ ><GG@? RDOCJPO OC@ I@@? JA OC@ I<H@
<I? OC@ ?JO, <N DI PQFSBUJPO().
XSJUFMO OC<O R@'Q@ =@@I PNDIB DI OC@ KM@QDJPN >C<KO@MN DN <>OP<GGT OC@ NCJMO AJM
TUEPVU.XSJUFMO. 0DHDG<MGT, XSJUF DN OC@ NCJMO AJM TUEPVU.XSJUF. A>>JM?DIBGT, OC@ :7>>A IAD>6
KMJBM<H ><I <GNJ =@ RMDOO@I <N OC@ AJGGJRDIB:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
TUEPVU.XSJUFMO(")FMMP XPSME!");
^
Exercise
10.1
t ,=N@MQ@ OC<O TUEPVU.XSJUF RJMFN OC@ N<H@ <N XSJUF.
... F:7 EA>GF;A@
(F3@63D6 !@BGF 3@6 %GFBGF (FD73?E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
20
Reading from the Standard Input 11
AIT ?<O< OC<O DN M@<? =T OC@ KMJBM<H HPNO ADMNO =@ NOJM@? DI < Q<MD<=G@. #JM @S<HKG@, <
KMJBM<H OC<O M@<?N OC@ IPH=@M JA NOP?@ION AMJH OC@ DIKPO HPNO NOJM@ OCDN DIAJMH<ODJI DI <
Q<MD<=G@. 1C@ OTK@ JA OCDN NK@>DAD> Q<MD<=G@ ><I =@ JOU.
AN R@'Q@ N@@I DI OC@ KM@QDJPN >C<KO@M, R@ ?JI'O I@@? OJ OTK@ TUEPVU RC@I KMDIODIB OJ OC@
JPOKPO, =@><PN@ DO DN DHKGD@?. #PMOC@M, RC<O DN OJ =@ KMDIO@? DN NK@>DAD@? <N OC@ <MBPH@IO. 0J,
XSJUF(TUVEFOU$PVOU) DN NPAAD>D@IO OJ KMDIO OC@ Q<GP@ JA TUVEFOU$PVOU. 1J NPHH<MDU@:
TUSFBN: TUEPVU
PQFSBUJPO: XSJUF
EBUB: UIF WBMVF PG UIF TUVEFOU$PVOU WBSJBCMF
UBSHFU: DPNNPOMZ UIF DPOTPMF XJOEPX
1C@ M@Q@MN@ JA XSJUF DN SFBEG; DO M@<?N AMJH OC@ NO<I?<M? DIKPO. 1C@ "A" DI DON I<H@ >JH@N
AMJH "AJMH<OO@?" <N RC<O DO M@<?N HPNO <GR<TN =@ KM@N@IO@? DI < >@MO<DI AJMH<O.
4@'Q@ <GNJ N@@I DI OC@ KM@QDJPN >C<KO@M OC<O OC@ NO<I?<M? DIKPO NOM@<H DN TUEJO.
&I OC@ ><N@ JA M@<?DIB, JI@ KD@>@ JA OC@ KPUUG@ DN NODGG HDNNDIB: RC@M@ OJ NOJM@ OC@ ?<O<. 1J
NPHH<MDU@:
TUSFBN: TUEJO
PQFSBUJPO: SFBEG
EBUB: TPNF JOGPSNBUJPO
UBSHFU:
1C@ GJ><ODJI JA RC@M@ OJ NOJM@ OC@ ?<O< DN NK@>DAD@? =T OC@ <??M@NN JA < Q<MD<=G@. 1C@ <??M@NN
JA < Q<MD<=G@ DN OC@ @S<>O GJ><ODJI DI OC@ >JHKPO@M'N H@HJMT RC@M@ DON Q<GP@ DN NOJM@?.
&I !, OC@ & >C<M<>O@M OC<O DN OTK@? =@AJM@ < I<H@ DN OC@ <??M@NN JA RC<O OC<O I<H@
M@KM@N@ION. #JM @S<HKG@, OC@ <??M@NN JA TUVEFOU$PVOU DN &TUVEFOU$PVOU. %@M@,
&TUVEFOU$PVOU ><I =@ M@<? <N "OC@ <??M@NN JA TUVEFOU$PVOU" <I? DN OC@ HDNNDIB KD@>@ OJ
M@KG<>@ OC@ LP@NODJI H<MF <=JQ@:
TUSFBN: TUEJO
PQFSBUJPO: SFBEG
EBUB: TPNF JOGPSNBUJPO
UBSHFU: UIF MPDBUJPO PG UIF TUVEFOU$PVOU WBSJBCMF
1TKDIB < & DI AMJIO JA < I<H@ H@<IN BA;@F;@9 <O RC<O OC<O I<H@ M@KM@N@ION. 1CDN >JI>@KO DN
OC@ AJPI?<ODJI JA M@A@M@I>@N <I? KJDIO@MN OC<O R@ RDGG N@@ DI G<O@M >C<KO@MN.
& RDGG G@<Q@ JI@ K@>PGD<MDOT <=JPO OC@ PN@ JA SFBEG AJM G<O@M; AJM IJR, G@O'N <>>@KO <N < MPG@ OC<O
OC@ ADMNO <MBPH@IO OJ SFBEG HPNO =@ "%T":
SFBEG("%T", &TUVEFOU$PVOU);
Note: AE ! 7JB>3;@ 47>AI, ;@ ?AEF 53E7E F:7D7 ?GEF 3>EA 47 3 EB357: " %s".
"%T" DI?D><O@N OC<O OC@ ?<O< NCJPG? <POJH<OD><GGT =@ >JIQ@MO@? DI < R<T OC<O DN NPDO<=G@ OJ OC@
OTK@ JA OC@ Q<MD<=G@. #JM @S<HKG@, RC@I OC@ '4' <I? '2' >C<M<>O@MN <M@ M@<? OJ < Q<MD<=G@ JA
OTK@ JOU, OC@T RJPG? =@ >JIQ@MO@? <N OC@ DIO@B@M Q<GP@ 42.
1C@ KMJBM<H =@GJR <NFN OC@ PN@M OJ @IO@M OC@ IPH=@M JA NOP?@ION. 6JP HPNO KM@NN OC@ "IO@M
F@T <AO@M OTKDIB OC@ DIKPO:
'736;@9 8DA? F:7 (F3@63D6 !@BGF
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
21
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
XSJUF(")PX NBOZ TUVEFOUT BSF UIFSF ");
/*
* 5IF EFGJOJUJPO PG UIF WBSJBCMF UIBU XJMM CF VTFE UP
* TUPSF UIF JOGPSNBUJPO UIBU JT SFBE GSPN UIF JOQVU.
*/
JOU TUVEFOU$PVOU;
// 4UPSJOH UIF JOQVU EBUB UP UIBU WBSJBCMF
SFBEG("%T", &TUVEFOU$PVOU);
XSJUFMO("(PU JU: 5IFSF BSF ", TUVEFOU$PVOU, " TUVEFOUT.");
^
Skipping the whitespace characters
11.1
"Q@I OC@ "IO@M F@T OC<O R@ KM@NN <AO@M OTKDIB OC@ ?<O< DN NOJM@? <N < NK@>D<G >J?@ <I? DN
KG<>@? DIOJ OC@ TUEJO NOM@<H. 1CDN DN PN@APG OJ OC@ KMJBM<HN OJ ?@O@>O RC@OC@M OC@
DIAJMH<ODJI C<N =@@I DIKPO JI < NDIBG@ GDI@ JM HPGODKG@ GDI@N.
AGOCJPBC NJH@ODH@N PN@APG, NP>C NK@>D<G >J?@N <M@ HJNOGT IJO DHKJMO<IO AJM OC@ KMJBM<H <I?
HPNO =@ ADGO@M@? JPO AMJH OC@ DIKPO. ,OC@MRDN@ OC@T 4>A5= OC@ DIKPO <I? KM@Q@IO M@<?DIB JOC@M
?<O<.
1J N@@ OCDN BDA4>7? DI < KMJBM<H, G@O'N M@<? <GNJ OC@ IPH=@M JA O@<>C@MN AMJH OC@ DIKPO:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
XSJUF(")PX NBOZ TUVEFOUT BSF UIFSF ");
JOU TUVEFOU$PVOU;
SFBEG("%T", &TUVEFOU$PVOU);
XSJUF(")PX NBOZ UFBDIFST BSF UIFSF ");
JOU UFBDIFS$PVOU;
SFBEG("%T", &UFBDIFS$PVOU);
XSJUFMO("(PU JU: 5IFSF BSF ", TUVEFOU$PVOU, " TUVEFOUT",
" BOE ", UFBDIFS$PVOU, " UFBDIFST.");
^
2IAJMOPI<O@GT, IJR OC@ KMJBM<H B@ON EFG5= RC@I M@<?DIB OC@ N@>JI? JOU:
)PX NBOZ TUVEFOUT BSF UIFSF 100
)PX NBOZ UFBDIFST BSF UIFSF 20
l 5IF QSPHSBN HFUT TUVDL IFSF
AGOCJPBC OC@ PN@M @IO@MN OC@ IPH=@M JA O@<>C@MN <N 20, OC@ NK@>D<G >J?@(N) OC<O M@KM@N@ION
OC@ "IO@M F@T OC<O C<N =@@I KM@NN@? RC@I @IO@MDIB OC@ KM@QDJPN 100 DN NODGG DI OC@ DIKPO
NOM@<H <I? DN =GJ>FDIB DO. 1C@ >C<M<>O@MN OC<O <KK@<M@? DI OC@ DIKPO NOM@<H <M@ NDHDG<M OJ OC@
AJGGJRDIB:
100<&OUFS$PEF>20<&OUFS$PEF>
& C<Q@ NCJRI OC@ "IO@M >J?@ OC<O DN =GJ>FDIB OC@ DIKPO DI M@?.
'736;@9 8DA? F:7 (F3@63D6 !@BGF
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
22
1C@ NJGPODJI DN OJ PN@ < NK<>@ >C<M<>O@M =@AJM@ %T OJ DI?D><O@ OC<O OC@ "IO@M >J?@ OC<O
<KK@<MN =@AJM@ M@<?DIB OC@ IPH=@M JA O@<>C@MN DN IJO DHKJMO<IO: " %T". 0K<>@N OC<O <M@ DI
OC@ AJMH<O NOMDIBN <M@ PN@? OJ M@<? <I? DBIJM@ U@MJ JM HJM@ DIQDND=G@ >C<M<>O@MN OC<O RJPG?
JOC@MRDN@ <KK@<M DI OC@ DIKPO. 0P>C >C<M<>O@MN DI>GP?@ OC@ <>OP<G NK<>@ >C<M<>O@M, OC@
>J?@(N) OC<O M@KM@N@IO OC@ "IO@M F@T, OC@ 1<= >C<M<>O@M, @O>. <I? <M@ ><GG@? OC@ I:;F7EB357
5:3D35F7DE.
AN < B@I@M<G MPG@, TJP ><I PN@ " %T" AJM @Q@MT ?<O< OC<O DN M@<? AMJH OC@ DIKPO. 1C@ KMJBM<H
<=JQ@ RJMFN <N @SK@>O@? RDOC OC@ AJGGJRDIB >C<IB@N:
// ...
SFBEG(" %T", &TUVEFOU$PVOU);
// ...
SFBEG(" %T", &UFBDIFS$PVOU);
// ...
1C@ JPOKPO:
)PX NBOZ TUVEFOUT BSF UIFSF 100
)PX NBOZ UFBDIFST BSF UIFSF 20
(PU JU: 5IFSF BSF 100 TUVEFOUT BOE 20 UFBDIFST.
Additional information
11.2
t )DI@N OC<O NO<MO RDOC // <M@ PN@APG AJM NDIBG@ GDI@N JA >JHH@ION. 1J RMDO@ HPGODKG@ GDI@N <N
< NDIBG@ >JHH@IO, @I>GJN@ OC@ GDI@N RDOCDI /* <I? */ H<MF@MN.
&I JM?@M OJ =@ <=G@ OJ >JHH@IO @Q@I JOC@M >JHH@ION, PN@ /+ <I? +/:
/+
// " TJOHMF MJOF PG DPNNFOU
/*
" DPNNFOU UIBU TQBOT
NVMUJQMF MJOFT
*/
" DPNNFOU CMPDL UIBU JODMVEFT PUIFS DPNNFOUT
+/
t *JNO JA OC@ RCDO@NK<>@ DI OC@ NJPM>@ >J?@ <M@ DINDBIDAD><IO. &O DN BJJ? KM<>OD>@ OJ RMDO@
GJIB@M @SKM@NNDJIN <N HPGODKG@ GDI@N JM <?? @SOM< RCDO@NK<>@ OJ H<F@ OC@ >J?@ HJM@
M@<?<=G@. 0ODGG, <N GJIB <N OC@ NTIO<S MPG@N JA OC@ G<IBP<B@ <M@ J=N@MQ@?, OC@ KMJBM<HN ><I
=@ RMDOO@I RDOCJPO <IT @SOM< RCDO@NK<>@:
JNQPSU TUE.TUEJP;WPJE NBJO()\XSJUFMO(")BSE UP SFBE!");^
&O DN C<M? OJ M@<? NJPM>@ >J?@ OC<O C<N NJ A@R RCDO@NK<>@.
Exercise
11.3
t "IO@M IJI-IPH@M<G >C<M<>O@MN RC@I OC@ KMJBM<H DN @SK@>ODIB DIO@B@M Q<GP@N <I? J=N@MQ@
OC<O OC@ KMJBM<H ?J@N IJO RJMF >JMM@>OGT.
... F:7 EA>GF;A@
'736;@9 8DA? F:7 (F3@63D6 !@BGF
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
23
Logical Expressions 12
A>OP<G RJMF OC<O < KMJBM<H K@MAJMHN <M@ <>>JHKGDNC@? =T 7JBD7EE;A@E. AIT K<MO JA <
KMJBM<H OC<O KMJ?P>@N < Q<GP@ JM < ND?@ @AA@>O DN ><GG@? <I @SKM@NNDJI. &O C<N < Q@MT RD?@
?@ADIDODJI, =@><PN@ @Q@I < >JINO<IO Q<GP@ GDF@ 42 <I? < NOMDIB GDF@ "IFMMP" <M@ @SKM@NNDJIN
=@><PN@ OC@T KMJ?P>@ OC@ M@NK@>ODQ@ >JINO<IO Q<GP@N 42 <I? "C@GGJ".
Note: DA@'F 5A@8GE7 BDA6G5;@9 3 H3>G7 I;F: 678;@;@9 3 H3D;34>7. +3>G7E @776 @AF 47
3EEA5;3F76 I;F: H3D;34>7E.
#PI>ODJI ><GGN GDF@ XSJUFMO <M@ @SKM@NNDJIN <N R@GG, =@><PN@ OC@T C<Q@ ND?@ @AA@>ON. &I OC@
><N@ JA XSJUFMO, OC@ @AA@>O DN JI OC@ JPOKPO NOM@<H =T OC@ KG<>@H@IO JA >C<M<>O@MN JI DO.
AIJOC@M @S<HKG@ AMJH OC@ KMJBM<HN OC<O R@ C<Q@ RMDOO@I NJ A<M RJPG? =@ OC@ <NNDBIH@IO
JK@M<ODJI, RCD>C <AA@>ON OC@ Q<MD<=G@ JI DON G@AO-C<I? ND?@.
B@><PN@ JA KMJ?P>DIB Q<GP@N, @SKM@NNDJIN ><I O<F@ K<MO DI JOC@M @SKM@NNDJIN. 1CDN <GGJRN PN
OJ AJMH HJM@ >JHKG@S @SKM@NNDJIN AMJH NDHKG@M JI@N. #JM @S<HKG@, <NNPHDIB OC<O OC@M@ DN <
API>ODJI I<H@? DVSSFOU5FNQFSBUVSF() OC<O KMJ?P>@N OC@ Q<GP@ JA OC@ >PMM@IO <DM
O@HK@M<OPM@, OC@ Q<GP@ OC<O DO KMJ?P>@N H<T ?DM@>OGT =@ PN@? DI < XSJUFMO @SKM@NNDJI:
XSJUFMO("*U'T ", DVSSFOU5FNQFSBUVSF(),
" EFHSFFT BU UIF NPNFOU.");
1C<O GDI@ >JINDNON JA AJPM @SKM@NNDJIN:
1. "*U'T "
2. DVSSFOU5FNQFSBUVSF()
3. " EFHSFFT BU UIF NPNFOU."
4. OC@ XSJUFMO @SKM@NNDJI OC<O H<F@N PN@ JA OC@ JOC@M OCM@@
&I OCDN >C<KO@M R@ RDGG >JQ@M OC@ K<MOD>PG<M OTK@ JA @SKM@NNDJI OC<O DN PN@? DI >JI?DODJI<G
NO<O@H@ION.
B@AJM@ BJDIB APMOC@M OCJPBC, & RJPG? GDF@ OJ M@K@<O OC@ <NNDBIH@IO JK@M<OJM JI>@ HJM@, OCDN
ODH@ @HKC<NDUDIB OC@ ORJ @SKM@NNDJIN OC<O <KK@<M JI DON G@AO <I? MDBCO ND?@N: OC@ <NNDBIH@IO
JK@M<OJM (=) <NNDBIN OC@ Q<GP@ JA OC@ @SKM@NNDJI JI DON MDBCO-C<I? ND?@ OJ OC@ @SKM@NNDJI JI DON
G@AO-C<I? ND?@ (@.B. OJ < Q<MD<=G@).
UFNQFSBUVSF = 23 // UFNQFSBUVSF'T WBMVF CFDPNFT 23
Logical Expressions
12.1
)JBD><G @SKM@NNDJIN <M@ OC@ @SKM@NNDJIN OC<O <M@ PN@? DI BJJG@<I <MDOCH@OD>. )JBD><G
@SKM@NNDJIN <M@ RC<O H<F@N >JHKPO@M KMJBM<HN H<F@ ?@>DNDJIN GDF@ "DA OC@ <INR@M DN T@N, &
RDGG N<Q@ OC@ ADG@".
)JBD><G @SKM@NNDJIN ><I C<Q@ JI@ JA JIGT ORJ Q<GP@N: GBMTF OC<O DI?D><O@N A<GNDOT, <I? USVF
OC<O DI?D><O@N OMPOC.
& RDGG PN@ XSJUFMO @SKM@NNDJIN DI OC@ AJGGJRDIB @S<HKG@N. &A < GDI@ C<N USVF KMDIO@? <O OC@
@I?, DO RDGG H@<I OC<O RC<O DN KMDIO@? JI OC@ GDI@ DN OMP@. 0DHDG<MGT, GBMTF RDGG H@<I OC<O RC<O
DN JI OC@ GDI@ DN A<GN@. #JM @S<HKG@, DA OC@ JPOKPO JA < KMJBM<H DN OC@ AJGGJRDIB,
5IFSF JT DPGGFF: USVF
OC@I DO RDGG H@<I OC<O "OC@M@ DN >JAA@@". 0DHDG<MGT,
"A9;53> EJBD7EE;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
24
5IFSF JT DPGGFF: GBMTF
RDGG H@<I OC<O "OC@M@ DNI'O >JAA@@". +JO@ OC<O OC@ A<>O OC<O "DN" <KK@<MN JI OC@ G@AO-C<I? ND?@
?J@N IJO H@<I OC<O >JAA@@ @SDNON. & PN@ OC@ "... DN ...: A<GN@" >JINOMP>O OJ H@<I "DN IJO" JM "DN
A<GN@".
)JBD><G @SKM@NNDJIN <M@ PN@? @SO@INDQ@GT DI 5A@6;F;A@3> EF3F7?7@FE, >AABE, 8G@5F;A@
B3D3?7F7DE, @O>. &O DN @NN@IOD<G OJ PI?@MNO<I? CJR OC@T RJMF. )P>FDGT, GJBD><G @SKM@NNDJIN <M@
Q@MT @<NT OJ @SKG<DI <I? PN@.
1C@ GJBD><G JK@M<OJMN OC<O <M@ PN@? DI GJBD><G @SKM@NNDJIN <M@ OC@ AJGGJRDIB:
t 1C@ == JK@M<OJM <INR@MN OC@ LP@NODJI "DN @LP<G OJ?". JHK<M@N OC@ ORJ @SKM@NNDJIN JI DON
G@AO <I? MDBCO ND?@N <I? KMJ?P>@N USVF DA OC@T <M@ @LP<G <I? GBMTF DA OC@T <M@ IJO. BT
?@ADIDODJI, OC@ Q<GP@ OC<O == KMJ?P>@N DN < GJBD><G @SKM@NNDJI.
AN <I @S<HKG@, G@O'N <NNPH@ OC<O R@ C<Q@ OC@ AJGGJRDIB ORJ Q<MD<=G@N:
JOU EBZT*O8FFL = 7;
JOU NPOUIT*O:FBS = 12;
1C@ AJGGJRDIB <M@ ORJ GJBD><G @SKM@NNDJIN OC<O PN@ OCJN@ Q<GP@N:
EBZT*O8FFL == 7 // USVF
NPOUIT*O:FBS == 11 // GBMTF
t 1C@ != JK@M<OJM <INR@MN OC@ LP@NODJI "DN IJO @LP<G OJ?" JHK<M@N OC@ ORJ @SKM@NNDJIN JI
DON ND?@N <I? KMJ?P>@N OC@ JKKJNDO@ JA ==.
EBZT*O8FFL != 7 // GBMTF
NPOUIT*O:FBS != 11 // USVF
t 1C@ ]] JK@M<OJM H@<IN "JM", <I? KMJ?P>@N USVF DA <IT JI@ JA OC@ GJBD><G @SKM@NNDJIN DN
OMP@.
&A OC@ Q<GP@ JA OC@ G@AO-C<I? @SKM@NNDJI DN USVF, DO KMJ?P>@N USVF RDOCJPO @Q@I GJJFDIB
<O OC@ @SKM@NNDJI OC<O DN JI OC@ MDBCO-C<I? ND?@. &A OC@ G@AO-C<I? ND?@ DN GBMTF, OC@I DO
KMJ?P>@N OC@ Q<GP@ JA OC@ MDBCO-C<I? ND?@. 1CDN JK@M<OJM DN NDHDG<M OJ OC@ "JM" DI
"IBGDNC: DA OC@ G@AO JI@, OC@ MDBCO JI@, JM =JOC <M@ USVF, OC@I DO KMJ?P>@N USVF.
AGG JA OC@ KJNND=G@ Q<GP@N AJM =JOC ND?@N JA OCDN JK@M<OJM <I? DON M@NPGO <M@ <N DI OC@
AJGGJRDIB O<=G@:
-FGU FYQSFTTJPO 3JHIU FYQSFTTJPO 3FTVMU
GBMTF GBMTF GBMTF
GBMTF USVF USVF
USVF GBMTF (OPU FWBMVBUFE) USVF
USVF USVF (OPU FWBMVBUFE) USVF
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
// GBMTF NFBOT "OP", USVF NFBOT "ZFT"
CPPM FYJTUT$PGGFF = GBMTF;
CPPM FYJTUT5FB = USVF;
XSJUFMO("5IFSF JT XBSN ESJOL: ",
"A9;53> EJBD7EE;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
25
FYJTUT$PGGFF ]] FYJTUT5FB);
^
B@><PN@ <O G@<NO JI@ JA OC@ ORJ @SKM@NNDJIN DN USVF, OC@ GJBD><G @SKM@NNDJI <=JQ@
KMJ?P>@N USVF.
t 1C@ && JK@M<OJM H@<IN "<I?", <I? KMJ?P>@N USVF DA =JOC JA OC@ @SKM@NNDJIN <M@ OMP@.
&A OC@ Q<GP@ JA OC@ G@AO-C<I? @SKM@NNDJI DN GBMTF, DO KMJ?P>@N GBMTF RDOCJPO @Q@I
GJJFDIB <O OC@ @SKM@NNDJI OC<O DN JI OC@ MDBCO-C<I? ND?@. &A OC@ G@AO-C<I? ND?@ DN USVF,
OC@I DO KMJ?P>@N OC@ Q<GP@ JA OC@ MDBCO-C<I? ND?@. 1CDN JK@M<OJM DN NDHDG<M OJ OC@ "<I?"
DI "IBGDNC: DA OC@ G@AO Q<GP@ <I? OC@ MDBCO Q<GP@ <M@ USVF, OC@I DO KMJ?P>@N USVF.
-FGU FYQSFTTJPO 3JHIU FYQSFTTJPO 3FTVMU
GBMTF GBMTF (OPU FWBMVBUFE) GBMTF
GBMTF USVF (OPU FWBMVBUFE) GBMTF
USVF GBMTF GBMTF
USVF USVF USVF
XSJUFMO("* XJMM ESJOL DPGGFF: ",
XBOU5P%SJOL$PGGFF && FYJTUT$PGGFF);
Note: ):7 835F F:3F F:7 || 3@6 && AB7D3FADE ?3K @AF 7H3>G3F7 F:7 D;9:F-:3@6
7JBD7EE;A@ ;E 53>>76 F:7;D NCJMO>PO =@C<QDJM . ):7 A@>K AF:7D AB7D3FAD F:3F :3E F:;E
47:3H;AD ;E F:7 F7D@3DK AB7D3FAD ?:, I:;5: I7 I;>> E77 ;@ 3 >3F7D 5:3BF7D. A>> A8 F:7
AF:7D AB7D3FADE 3>I3KE 7H3>G3F7 3@6 GE7 3>> A8 F:7;D 7JBD7EE;A@E.
t 1C@ ? JK@M<OJM <INR@MN OC@ LP@NODJI "DN JI@ JM OC@ JOC@M?" 1CDN JK@M<OJM KMJ?P>@N USVF DA
JIGT JI@ @SKM@NNDJI DN USVF, =PO IJO =JOC.
-FGU FYQSFTTJPO 3JHIU FYQSFTTJPO 3FTVMU
GBMTF GBMTF GBMTF
GBMTF USVF USVF
USVF GBMTF USVF
USVF USVF GBMTF
#JM @S<HKG@, OC@ GJBD> OC<O M@KM@N@ION HT KG<TDIB >C@NN DA A@>K A@7 JA HT ORJ AMD@I?N
NCJRN PK ><I =@ >J?@? GDF@ OCDN:
XSJUFMO("* XJMM QMBZ DIFTT: ", KJN4IPXFE6Q ? CPC4IPXFE6Q);
t 1C@ < JK@M<OJM <INR@MN OC@ LP@NODJI "DN G@NN OC<I?" (JM "?J@N >JH@ =@AJM@ DI NJMO
JM?@M?").
XSJUFMO("8F CFBU: ", UIFJS4DPSF < PVS4DPSF);
t 1C@ > JK@M<OJM <INR@MN OC@ LP@NODJI "DN BM@<O@M OC<I?" (JM "?J@N >JH@ <AO@M DI NJMO
JM?@M?").
XSJUFMO("5IFZ CFBU: ", UIFJS4DPSF > PVS4DPSF);
t 1C@ <= JK@M<OJM <INR@MN OC@ LP@NODJI "DN G@NN OC<I JM @LP<G OJ?" (JM "?J@N >JH@ =@AJM@ JM
OC@ N<H@ DI NJMO JM?@M?"). 1CDN JK@M<OJM DN OC@ JKKJNDO@ JA OC@ > JK@M<OJM.
XSJUFMO("8F XFSF OPU CFBUFO: ", UIFJS4DPSF <= PVS4DPSF);
"A9;53> EJBD7EE;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
26
t 1C@ >= JK@M<OJM <INR@MN OC@ LP@NODJI "DN BM@<O@M OC<I JM @LP<G OJ?" (JM "?J@N >JH@ <AO@M
JM OC@ N<H@ DI NJMO JM?@M?"). 1CDN JK@M<OJM DN OC@ JKKJNDO@ JA OC@ < JK@M<OJM.
XSJUFMO("8F EJE OPU CFBU: ", UIFJS4DPSF >= PVS4DPSF);
t 1C@ ! JK@M<OJM H@<IN "OC@ JKKJNDO@ JA". !DAA@M@IO AMJH OC@ JOC@M GJBD><G JK@M<OJMN, DO
O<F@N EPNO JI@ @SKM@NNDJI <I? KMJ?P>@N USVF DA OC<O @SKM@NNDJI DN GBMTF, <I? GBMTF DA OC<O
@SKM@NNDJI DN USVF.
XSJUFMO("* XJMM XBML: ", !FYJTUT#JDZDMF);
Grouping expressions
12.2
1C@ JM?@M DI RCD>C OC@ @SKM@NNDJIN <M@ @Q<GP<O@? ><I =@ NK@>DAD@? =T PNDIB K<M@IOC@N@N OJ
BMJPK OC@H. 4C@I K<M@IOC@NDU@? @SKM@NNDJIN <KK@<M DI HJM@ >JHKG@S @SKM@NNDJIN, OC@
K<M@IOC@NDU@? @SKM@NNDJIN <M@ @Q<GP<O@? =@AJM@ OC@T ><I =@ PN@? DI OC@ @SKM@NNDJIN OC<O OC@T
<KK@<M DI. #JM @S<HKG@, OC@ @SKM@NNDJI "DA OC@M@ DN >JAA@@ JM O@<, <I? <GNJ >JJFD@ JM N>JI@;
OC@I & <H C<KKT" ><I =@ >J?@? GDF@ OC@ AJGGJRDIB:
XSJUFMO("* BN IBQQZ: ",
(FYJTUT$PGGFF ]] FYJTUT5FB) && (FYJTUT$PPLJF ]] FYJTUT4DPOF));
&A OC@ NP= @SKM@NNDJIN R@M@ IJO K<M@IOC@NDU@?, OC@ @SKM@NNDJIN RJPG? =@ @Q<GP<O@? <>>JM?DIB
OJ AB7D3FAD BD75767@57 MPG@N JA ! (RCD>C C<Q@ =@@I DIC@MDO@? AMJH OC@ G<IBP<B@). 0DI>@ DI
OC@N@ MPG@N && C<N < CDBC@M KM@>@?@I>@ OC<I ]], RMDODIB OC@ @SKM@NNDJI RDOCJPO K<M@IOC@N@N
RJPG? IJO =@ @Q<GP<O@? <N DIO@I?@?:
XSJUFMO("* BN IBQQZ: ",
FYJTUT$PGGFF ]] FYJTUT5FB && FYJTUT$PPLJF ]] FYJTUT4DPOF);
1C@ && JK@M<OJM RJPG? =@ @Q<GP<O@? ADMNO <I? OC@ RCJG@ @SKM@NNDJI RJPG? =@ OC@ N@H<IOD>
@LPDQ<G@IO JA OC@ AJGGJRDIB @SKM@NNDJI:
XSJUFMO("* BN IBQQZ: ",
FYJTUT$PGGFF ]] (FYJTUT5FB && FYJTUT$PPLJF) ]] FYJTUT4DPOF);
1C<O C<N < OJO<GGT ?DAA@M@IO H@<IDIB: "DA OC@M@ DN >JAA@@, JM O@< <I? >JJFD@, JM N>JI@; OC@I & <H
C<KKT".
Reading CPPM input
12.3
AGG JA OC@ CPPM Q<GP@N <=JQ@ <M@ <POJH<OD><GGT KMDIO@? <N "A<GN@" JM "OMP@". &O DN IJO OC@ ><N@ DI
OC@ JKKJNDO@ ?DM@>ODJI: OC@ NOMDIBN "A<GN@" <I? "OMP@" <M@ IJO <POJH<OD><GGT M@<? <N OC@ Q<GP@N
GBMTF <I? USVF. #JM OC<O M@<NJI, OC@ DIKPO HPNO =@ ADMNO M@<? <N < NOMDIB <I? OC@I =@
>JIQ@MO@? OJ < CPPM Q<GP@.
0DI>@ JI@ JA OC@ @S@M>DN@N =@GJR M@LPDM@N TJP OJ @IO@M "A<GN@" <I? "OMP@" AMJH OC@ NO<I?<M?
DIKPO, & C<Q@ =@@I AJM>@? OJ PN@ ! A@<OPM@N OC<O & C<Q@I'O @SKG<DI@? OJ TJP T@O. & RDGG C<Q@ OJ
?@ADI@ < API>ODJI =@GJR OC<O RDGG >JIQ@MO OC@ DIKPO NOMDIB OJ < CPPM Q<GP@. 1CDN API>ODJI RDGG
<>CD@Q@ DON O<NF =T ><GGDIB UP, RCD>C DN ?@ADI@? DI OC@ HJ?PG@ TUE.DPOW. (6JP H<T N@@
$POW&YDFQUJPO @MMJMN DA TJP @IO@M <ITOCDIB JOC@M OC<I "A<GN@" JM "OMP@".)
& <H CJKDIB OC<O <GG JA OC@ >J?@ OC<O <M@ DI OC@ NBJO() API>ODJIN JA OC@ AJGGJRDIB KMJBM<HN
<M@ >G@<M <O OCDN KJDIO. SFBE@CPPM() DN OC@ API>ODJI OC<O >JIO<DIN I@R A@<OPM@N. AGOCJPBC &
"A9;53> EJBD7EE;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
27
C<Q@ DIN@MO@? >JHH@ION OJ @SKG<DI RC<O DO ?J@N, TJP ><I DBIJM@ OC<O API>ODJI AJM IJR. 0ODGG, DO
HPNO =@ < K<MO JA OC@ NJPM>@ >J?@ AJM OC@ KMJBM<H OJ >JHKDG@ <I? RJMF >JMM@>OGT.
Exercises
12.4
1. 4@'Q@ N@@I <=JQ@ OC<O OC@ < <I? OC@ > JK@M<OJMN <M@ PN@? OJ ?@O@MHDI@ RC@OC@M < Q<GP@ DN
G@NN OC<I JM BM@<O@M OC<I <IJOC@M Q<GP@; =PO OC@M@ DN IJ JK@M<OJM OC<O <INR@MN OC@
LP@NODJI "DN =@OR@@I?" OJ ?@O@MHDI@ RC@OC@M < Q<GP@ DN =@OR@@I ORJ JOC@M Q<GP@N.
)@O'N <NNPH@ OC<O < KMJBM<HH@M C<N RMDOO@I OC@ AJGGJRDIB >J?@ OJ ?@O@MHDI@ RC@OC@M
WBMVF DN =@OR@@I 10 <I? 20. ,=N@MQ@ OC<O OC@ KMJBM<H ><IIJO =@ >JHKDG@? <N
RMDOO@I:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
JOU WBMVF = 15;
XSJUFMO("*T CFUXFFO: ",
10 < WBMVF < 20); // j DPNQJMBUJPO &3303
^
1MT PNDIB K<M@IOC@N@N <MJPI? OC@ RCJG@ @SKM@NNDJI:
XSJUFMO("*T CFUXFFO: ",
(10 < WBMVF < 20)); // j DPNQJMBUJPO &3303
,=N@MQ@ OC<O DO NODGG ><IIJO =@ >JHKDG@?.
2. 4CDG@ N@<M>CDIB AJM < NJGPODJI OJ OCDN KMJ=G@H, OC@ N<H@ KMJBM<HH@M ?DN>JQ@MN OC<O OC@
AJGGJRDIB PN@ JA K<M@IOC@N@N IJR @I<=G@N OC@ >J?@ OJ =@ >JHKDG@?:
XSJUFMO("*T CFUXFFO: ",
(10 < WBMVF) < 20); // j DPNQJMFT CVU 830/(
,=N@MQ@ OC<O OC@ KMJBM<H IJR RJMFN <N @SK@>O@? <I? KMDION "OMP@". 2IAJMOPI<O@GT
OC<O JPOKPO DN HDNG@<?DIB =@><PN@ OC@ KMJBM<H C<N < =PB. 1J N@@ OC@ @AA@>O JA OC<O
=PB, M@KG<>@ 15 RDOC < Q<GP@ BM@<O@M OC<I 20:
JOU WBMVF = 21;
,=N@MQ@ OC<O OC@ KMJBM<H NODGG KMDION "OMP@" @Q@I OCJPBC 21 DN IJO G@NN OC<I 20.
Hint: /@H@H=@M OC<O OC@ OTK@ JA < GJBD><G @SKM@NNDJI DN CPPM. &O NCJPG?I'O H<F@
N@IN@ RC@OC@M < CPPM Q<GP@ DN G@NN OC<I 20.
3. 1C@ GJBD><G @SKM@NNDJI OC<O <INR@MN OC@ LP@NODJI "DN =@OR@@I?" HPNO DINO@<? =@ >J?@? GDF@
OCDN: "DN BM@<O@M OC<I OC@ GJR@M Q<GP@ <I? G@NN OC<I OC@ PKK@M Q<GP@?"
C<IB@ OC@ @SKM@NNDJI DI OC@ KMJBM<H <>>JM?DIB OJ OC<O GJBD> <I? J=N@MQ@ OC<O DO IJR
KMDION "OMP@" <N @SK@>O@?. A??DODJI<GGT, O@NO OC<O OC@ GJBD><G @SKM@NNDJI RJMFN
>JMM@>OGT AJM JOC@M Q<GP@N <N R@GG: AJM @S<HKG@, RC@I WBMVF DN 50 JM 1, OC@ KMJBM<H
NCJPG? KMDIO "A<GN@"; <I? RC@I DO'N 12, OC@ KMJBM<H NCJPG? KMDIO "OMP@".
4. )@O'N <NNPH@ OC<O R@ ><I BJ OJ OC@ =@<>C RC@I JI@ JA OC@ AJGGJRDIB >JI?DODJIN DN OMP@:
w &A OC@ ?DNO<I>@ OJ OC@ =@<>C DN G@NN OC<I 10 <I? OC@M@ DN < =D>T>G@ AJM @Q@MTJI@
w &A OC@M@ DN G@NN OC<I 6 JA PN, <I? R@ C<Q@ < ><M, <I? JI@ JA PN C<N < ?MDQ@M GD>@IN@
"A9;53> EJBD7EE;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
28
AN RMDOO@I, OC@ AJGGJRDIB KMJBM<H <GR<TN KMDION "OMP@". JINOMP>O < GJBD><G @SKM@NNDJI
OC<O RDGG KMDIO "OMP@" RC@I JI@ JA OC@ >JI?DODJIN <=JQ@ DN OMP@. (4C@I OMTDIB OC@
KMJBM<H, @IO@M "A<GN@" JM "OMP@" AJM LP@NODJIN OC<O NO<MO RDOC "&N OC@M@ <".). !JI'O
AJMB@O OJ DI>GP?@ OC@ SFBE@CPPM() API>ODJI RC@I O@NODIB OC@ AJGGJRDIB KMJBM<H:
JNQPSU TUE.TUEJP;
JNQPSU TUE.DPOW;
JNQPSU TUE.TUSJOH;
WPJE NBJO()
\
XSJUF(")PX NBOZ BSF XF ");
JOU QFSTPO$PVOU;
SFBEG(" %T", &QFSTPO$PVOU);
XSJUF(")PX NBOZ CJDZDMFT BSF UIFSF ");
JOU CJDZDMF$PVOU;
SFBEG(" %T", &CJDZDMF$PVOU);
XSJUF("8IBU JT UIF EJTUBODF UP UIF CFBDI ");
JOU EJTUBODF;
SFBEG(" %T", &EJTUBODF);
CPPM FYJTUT$BS = SFBE@CPPM("*T UIFSF B DBS ");
CPPM FYJTUT-JDFOTF =
SFBE@CPPM("*T UIFSF B ESJWFS MJDFOTF ");
/*
3FQMBDF UIF 'USVF' CFMPX XJUI B MPHJDBM FYQSFTTJPO UIBU
QSPEVDFT UIF WBMVF 'USVF' XIFO POF PG UIF DPOEJUJPOT
MJTUFE JO UIF RVFTUJPO JT TBUJTGJFE:
*/
XSJUFMO("8F BSF HPJOH UP UIF CFBDI: ", USVF);
^
/*
1MFBTF OPUF UIBU UIJT GVODUJPO JODMVEFT GFBUVSFT UIBU XJMM
CF FYQMBJOFE JO MBUFS DIBQUFST.
*/
CPPM SFBE@CPPM(TUSJOH NFTTBHF)
\
// 1SJOU UIF NFTTBHF
XSJUF(NFTTBHF, "(GBMTF PS USVF) ");
// 3FBE UIF MJOF BT B TUSJOH
TUSJOH JOQVU;
XIJMF (JOQVU.MFOHUI == 0) \
JOQVU = DIPNQ(SFBEMO());
^
// 1SPEVDF B 'CPPM' WBMVF GSPN UIBU TUSJOH
CPPM SFTVMU = UP!CPPM(JOQVU);
// 3FUVSO UIF SFTVMU UP UIF DBMMFS
SFUVSO SFTVMU;
^
"IO@M Q<MDJPN Q<GP@N <I? O@NO OC<O OC@ GJBD><G @SKM@NNDJI OC<O TJP RMJO@ RJMFN
>JMM@>OGT.
... F:7 EA>GF;A@E
"A9;53> EJBD7EE;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
29
JG Statement 13
4@'Q@ G@<MI@? OC<O <>OP<G RJMF DI < KMJBM<H <M@ K@MAJMH@? =T @SKM@NNDJIN. AGG JA OC@
@SKM@NNDJIN JA <GG JA OC@ KMJBM<HN OC<O R@'Q@ N@@I NJ A<M C<Q@ NO<MO@? RDOC OC@ NBJO()
API>ODJI <I? R@M@ @S@>PO@? PIODG OC@ @I? JA NBJO.
(F3F7?7@FE JI OC@ JOC@M C<I?, <M@ A@<OPM@N OC<O <AA@>O OC@ @S@>PODJI JA @SKM@NNDJIN.
0O<O@H@ION ?JI'O KMJ?P>@ Q<GP@N <I? ?JI'O C<Q@ ND?@ @AA@>ON OC@HN@GQ@N. 1C@T ?@O@MHDI@
RC@OC@M <I? DI RC<O JM?@M OC@ @SKM@NNDJIN <M@ @S@>PO@?. 0O<O@H@ION NJH@ODH@N PN@ GJBD><G
@SKM@NNDJIN RC@I H<FDIB NP>C ?@>DNDJIN.
Note: %F:7D BDA9D3??;@9 >3@9G397E ?3K :3H7 6;887D7@F 678;@;F;A@E 8AD 7JBD7EE;A@ 3@6
EF3F7?7@F, I:;>7 EA?7 AF:7DE ?3K @AF :3H7 3 6;EF;@5F;A@ 3F 3>>.
The JG block and its scope
13.1
1C@ JG NO<O@H@IO ?@O@MHDI@N RC@OC@M JI@ JM HJM@ @SKM@NNDJIN RJPG? =@ @S@>PO@?. &O H<F@N
OCDN ?@>DNDJI =T @Q<GP<ODIB < GJBD><G @SKM@NNDJI. &O C<N OC@ N<H@ H@<IDIB <N OC@ "IBGDNC RJM?
"DA" <N DI OC@ KCM<N@ "DA OC@M@ DN >JAA@@ OC@I & RDGG ?MDIF >JAA@@".
JG O<F@N < GJBD><G @SKM@NNDJI DI K<M@OC@NDN. &A OC@ Q<GP@ JA OC<O GJBD><G @SKM@NNDJI DN USVF,
OC@I DO @S@>PO@N OC@ @SKM@NNDJIN OC<O <M@ RDOCDI OC@ AJGGJRDIB >PMGT =M<>F@ON. JIQ@MN@GT, DA
OC@ GJBD><G @SKM@NNDJI DN GBMTF, DO ?J@N IJO @S@>PO@ OC@ @SKM@NNDJIN RDOCDI OC@ >PMGT =M<>F@ON.
1C@ <M@< RDOCDI OC@ >PMGT =M<>F@ON DN ><GG@? < E5AB7 <I? <GG JA OC@ >J?@ OC<O DN DI OC<O N>JK@
<M@ ><GG@? < 4>A5= A8 5A67.
%@M@ DN OC@ NTIO<S JA OC@ JG NO<O@H@IO:
JG (B@MPHJDBM@FYQSFTTJPO)
\
// ... FYQSFTTJPO(T) UP FYFDVUF JG USVF
^
#JM @S<HKG@, OC@ KMJBM<H >JINOMP>O OC<O M@KM@N@ION "DA OC@M@ DN >JAA@@ OC@I ?MDIF >JAA@@ <I?
R<NC OC@ >PK" ><I =@ RMDOO@I <N DI OC@ AJGGJRDIB KMJBM<H:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
CPPM FYJTUT$PGGFF = USVF;
JG (FYJTUT$PGGFF) \
XSJUFMO("%SJOL DPGGFF");
XSJUFMO("8BTI UIF DVQ");
^
^
&A OC@ Q<GP@ JA FYJTUT$PGGFF DN GBMTF, OC@I OC@ @SKM@NNDJIN OC<O <M@ RDOCDI OC@ =GJ>F RJPG?
=@ NFDKK@? <I? OC@ KMJBM<H RJPG? IJO KMDIO <ITOCDIB.
AGNJ IJO@ OC<O DO DN < >JHHJI ! >J?DIB NOTG@ OJ OTK@ OC@ JK@IDIB >PMGT =M<>F@ON JI OC@ N<H@
GDI@ <N OC@ JG F@TRJM?.
;8 (F3F7?7@F
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
30
The FMTF block and its scope
13.2
0JH@ODH@N OC@M@ <M@ JK@M<ODJIN OJ @S@>PO@ AJM RC@I OC@ GJBD><G @SKM@NNDJI JA OC@ JG
NO<O@H@IO DN GBMTF. #JM @S<HKG@, OC@M@ DN <GR<TN <I JK@M<ODJI OJ @S@>PO@ DI < ?@>DNDJI GDF@ "DA
OC@M@ DN >JAA@@ & RDGG ?MDIF >JAA@@, @GN@ & RDGG ?MDIF O@<".
1C@ JK@M<ODJIN OJ @S@>PO@ DI OC@ GBMTF ><N@ <M@ KG<>@? DI < N>JK@ <AO@M OC@ FMTF F@TRJM?:
JG (B@MPHJDBM@FYQSFTTJPO)
\
// ... FYQSFTTJPO(T) UP FYFDVUF JG USVF
^
FMTF
\
// ... FYQSFTTJPO(T) UP FYFDVUF JG GBMTF
^
#JM @S<HKG@, PI?@M OC@ <NNPHKODJI OC<O OC@M@ DN <GR<TN O@<:
JG (FYJTUT$PGGFF) \
XSJUFMO("%SJOL DPGGFF");
^ FMTF \
XSJUFMO("%SJOL UFB");
^
&I OC<O @S<HKG@, @DOC@M OC@ ADMNO JM OC@ N@>JI? NOMDIB RJPG? =@ KMDIO@? ?@K@I?DIB JI OC@ Q<GP@
JA FYJTUT$PGGFF.
AGNJ IJO@ OC@ KG<>@H@IO JA OC@ >PMGT =M<>F@ON <MJPI? FMTF; OC<O DN < >JHHJI ! >J?DIB NOTG@
<N R@GG.
FMTF DON@GA DN IJO < NO<O@H@IO =PO <I JKODJI<G 5>3GE7 JA OC@ JG NO<O@H@IO; DO ><IIJO =@ PN@?
<GJI@.
Always use the scope curly brackets
13.3
&O DN IJO M@>JHH@I?@? =PO DN <>OP<GGT KJNND=G@ OJ JHDO OC@ >PMGT =M<>F@ON DA OC@M@ DN JIGT JI@
NO<O@H@IO RDOCDI < N>JK@. AN =JOC OC@ JG <I? OC@ FMTF N>JK@N C<Q@ EPNO JI@ NO<O@H@IO <=JQ@,
OC<O >J?@ ><I <GNJ =@ RMDOO@I <N OC@ AJGGJRDIB:
JG (FYJTUT$PGGFF)
XSJUFMO("%SJOL DPGGFF");
FMTF
XSJUFMO("%SJOL UFB");
*JNO @SK@MD@I>@? KMJBM<HH@MN PN@ >PMGT =M<>F@ON @Q@I AJM NDIBG@ NO<O@H@ION. (,I@ JA OC@
@S@M>DN@N JA OCDN >C<KO@M DN <=JPO JHDOODIB OC@H.) %<QDIB N<D? OC<O, & RDGG IJR NCJR OC@ JIGT
><N@ RC@M@ JHDOODIB OC@ >PMGT =M<>F@ON DN <>OP<GGT =@OO@M.
The "if, else if, else" chain
13.4
,I@ JA OC@ KJR@MN JA NO<O@H@ION <I? @SKM@NNDJIN DN OC@ <=DGDOT OJ PN@ OC@H DI HJM@ >JHKG@S
R<TN. &I <??DODJI OJ @SKM@NNDJIN, N>JK@N ><I >JIO<DI JOC@M NO<O@H@ION. #JM @S<HKG@, <I FMTF
N>JK@ ><I >JIO<DI <I JG NO<O@H@IO. JII@>ODIB NO<O@H@ION <I? @SKM@NNDJIN DI ?DAA@M@IO R<TN
<GGJRN PN OJ H<F@ KMJBM<HN =@C<Q@ DIO@GGDB@IOGT <>>JM?DIB OJ OC@DM KPMKJN@N.
;8 (F3F7?7@F
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
31
1C@ AJGGJRDIB DN < HJM@ >JHKG@S >J?@ RMDOO@I PI?@M OC@ <BM@@H@IO OC<O MD?DIB OJ < BJJ?
>JAA@@ NCJK DN KM@A@MM@? JQ@M R<GFDIB OJ < =<? JI@:
JG (FYJTUT$PGGFF) \
XSJUFMO("%SJOL DPGGFF BU IPNF");
^ FMTF \
JG (FYJTUT#JDZDMF) \
XSJUFMO("3JEF UP UIF HPPE QMBDF");
^ FMTF \
XSJUFMO("8BML UP UIF CBE QMBDF");
^
^
1C@ >J?@ <=JQ@ M@KM@N@ION OC@ KCM<N@ "DA OC@M@ DN >JAA@@, ?MDIF <O CJH@; @GN@ DA OC@M@ DN <
=D>T>G@, MD?@ OJ OC@ BJJ? KG<>@; JOC@MRDN@ R<GF OJ OC@ =<? KG<>@".
)@O'N >JHKGD><O@ OCDN ?@>DNDJI KMJ>@NN APMOC@M: DINO@<? JA C<QDIB OJ R<GF OJ OC@ =<? KG<>@, G@O'N
ADMNO OMT OC@ I@DBC=JM:
JG (FYJTUT$PGGFF) \
XSJUFMO("%SJOL DPGGFF BU IPNF");
^ FMTF \
JG (FYJTUT#JDZDMF) \
XSJUFMO("3JEF UP UIF HPPE QMBDF");
^ FMTF \
JG (OFJHICPS*T)PNF) \
XSJUFMO(")BWF DPGGFF BU UIF OFJHICPS");
^ FMTF \
XSJUFMO("8BML UP UIF CBE QMBDF");
^
^
^
0P>C ?@>DNDJIN GDF@ "DA OCDN ><N@, @GN@ DA OC<O JOC@M ><N@, @GN@ DA OC<O @Q@I JOC@M ><N@, @O>." <M@
>JHHJI DI KMJBM<HN. 2IAJMOPI<O@GT, RC@I OC@ BPD?@GDI@ JA <GR<TN PNDIB >PMGT =M<>F@ON DN
AJGGJR@? J=NODI<O@GT, OC@ >J?@ @I?N PK C<QDIB OJJ HP>C CJMDUJIO<G <I? Q@MOD><G NK<>@:
DBIJMDIB OC@ @HKOT GDI@N, OC@ 3 JG NO<O@H@ION <I? OC@ 4 XSJUFMO @SKM@NNDJIN <=JQ@ J>>PKT <
OJO<G JA 13 GDI@N.
&I JM?@M OJ RMDO@ NP>C >JINOMP>ON DI < HJM@ >JHK<>O R<T, RC@I <I FMTF N>JK@ >JIO<DIN JIGT
JI@ JG NO<O@H@IO, OC@I OC@ >PMGT =M<>F@ON JA OC<O FMTF N>JK@ <M@ JHDOO@? <N <I @S>@KODJI JA
OCDN BPD?@GDI@.
& <H G@<QDIB OC@ AJGGJRDIB >J?@ PIOD?T <N <I DIO@MH@?D<O@ NO@K =@AJM@ NCJRDIB OC@ =@OO@M
AJMH JA DO. +J >J?@ NCJPG? =@ RMDOO@I DI NP>C <I PIOD?T R<T. (& <H <GNJ G@<QDIB DO =G<>F <I?
RCDO@ OJ DI?D><O@ OC<O DO DN PI<>>@KO<=G@ <N RMDOO@I.)
1C@ AJGGJRDIB DN RC<O OC@ >J?@ GJJFN GDF@ <AO@M M@HJQDIB OC@ >PMGT =M<>F@ON JA OC@ ORJ FMTF
N>JK@N OC<O >JIO<DI EPNO < NDIBG@ JG NO<O@H@IO:
;8 (F3F7?7@F
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
32
JG (FYJTUT$PGGFF) \
XSJUFMO("%SJOL DPGGFF BU IPNF");
^ FMTF
JG (FYJTUT#JDZDMF) \
XSJUFMO("3JEF UP UIF HPPE QMBDF");
^ FMTF
JG (OFJHICPS*T)PNF) \
XSJUFMO(")BWF DPGGFF BU UIF OFJHICPS");
^ FMTF \
XSJUFMO("8BML UP UIF CBE QMBDF");
^
&A R@ IJR HJQ@ OCJN@ JG NO<O@H@ION PK OJ OC@ N<H@ GDI@N <N OC@DM @I>GJNDIB FMTF >G<PN@N <I?
OD?T PK OC@ >J?@, R@ @I? PK RDOC OC@ AJGGJRDIB HJM@ M@<?<=G@ AJMH<O:
JG (FYJTUT$PGGFF) \
XSJUFMO("%SJOL DPGGFF BU IPNF");
^ FMTF JG (FYJTUT#JDZDMF) \
XSJUFMO("3JEF UP UIF HPPE QMBDF");
^ FMTF JG (OFJHICPS*T)PNF) \
XSJUFMO(")BWF DPGGFF BU UIF OFJHICPS");
^ FMTF \
XSJUFMO("8BML UP UIF CBE QMBDF");
^
/@HJQDIB OC@ >PMGT =M<>F@ON <GGJRN OC@ >J?@ OJ =@ HJM@ >JHK<>O, <I? GDI@N PK <GG JA OC@
@SKM@NNDJIN AJM @<ND@M M@<?<=DGDOT. 1C@ GJBD><G @SKM@NNDJIN, OC@ JM?@M OC<O OC@T <M@ @Q<GP<O@?,
<I? OC@ JK@M<ODJIN OC<O <M@ @S@>PO@? RC@I OC@T <M@ OMP@ <M@ IJR @<ND@M OJ N@@ <O < BG<I>@.
1CDN >JHHJI KMJBM<HHDIB >JINOMP>O DN ><GG@? OC@ "DA, @GN@ DA, @GN@" >C<DI.
Exercises
13.5
1. 0DI>@ OC@ GJBD><G @SKM@NNDJI =@GJR DN USVF, R@ RJPG? @SK@>O OCDN KMJBM<H OJ 6D;@=
>7?A@367 3@6 I3E: F:7 5GB:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
CPPM FYJTUT-FNPOBEF = USVF;
JG (FYJTUT-FNPOBEF) \
XSJUFMO("%SJOLJOH MFNPOBEF");
XSJUFMO("8BTIJOH UIF DVQ");
^ FMTF
XSJUFMO("&BUJOH QJF");
XSJUFMO("8BTIJOH UIF QMBUF");
^
BPO RC@I TJP MPI OC<O KMJBM<H TJP RDGG N@@ OC<O DO I3E:7E F:7 B>3F7 <N R@GG:
;8 (F3F7?7@F
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
33
%SJOLJOH MFNPOBEF
8BTIJOH UIF DVQ
8BTIJOH UIF QMBUF
4CT? JMM@>O OC@ KMJBM<H OJ R<NC OC@ KG<O@ JIGT RC@I OC@ GJBD><G @SKM@NNDJI DN GBMTF.
2. 4MDO@ < KMJBM<H OC<O KG<TN < B<H@ RDOC OC@ PN@M (J=QDJPNGT RDOC OMPNO). 1C@ PN@M OCMJRN <
?D@ <I? @IO@MN DON Q<GP@. "DOC@M OC@ PN@M JM OC@ KMJBM<H RDIN <>>JM?DIB OJ OC@ Q<GP@ JA OC@
?D@:
7BMVF PG UIF EJF 0VUQVU PG UIF QSPHSBN
1 :PV XPO
2 :PV XPO
3 :PV XPO
4 * XPO
5 * XPO
6 * XPO
"OZ PUIFS WBMVF &3303: *OWBMJE WBMVF
BJIPN: %<Q@ OC@ KMJBM<H <GNJ H@IODJI OC@ Q<GP@ RC@I OC@ Q<GP@ DN DIQ<GD?. #JM @S<HKG@:
&3303: 7 JT JOWBMJE
3. )@O'N >C<IB@ OC@ B<H@ =T C<QDIB OC@ PN@M @IO@M < Q<GP@ AMJH 1 OJ 1000. +JR OC@ PN@M
RDIN RC@I OC@ Q<GP@ DN DI OC@ M<IB@ 1-500 <I? OC@ >JHKPO@M RDIN RC@I OC@ Q<GP@ DN DI OC@
M<IB@ 501-1000. <I OC@ KM@QDJPN KMJBM<H =@ @<NDGT HJ?DAD@? OJ RJMF DI OCDN R<T?
... F:7 EA>GF;A@E
;8 (F3F7?7@F
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
34
XIJMF Loop 14
1C@ XIJMF GJJK DN NDHDG<M OJ OC@ JG NO<O@H@IO <I? @NN@IOD<GGT RJMFN <N < M@K@<O@? JG
NO<O@H@IO. 'PNO GDF@ JG, XIJMF <GNJ O<F@N < GJBD><G @SKM@NNDJI <I? @Q<GP<O@N OC@ =GJ>F RC@I
OC@ GJBD><G @SKM@NNDJI DN USVF. 1C@ ?DAA@M@I>@ DN OC<O OC@ XIJMF NO<O@H@IO @Q<GP<O@N OC@
GJBD><G @SKM@NNDJI <I? @S@>PO@N OC@ @SKM@NNDJIN DI OC@ =GJ>F <B<DI, <N GJIB <N OC@ GJBD><G
@SKM@NNDJI DN USVF, IJO EPNO JI>@. /@K@<ODIB < =GJ>F JA >J?@ OCDN R<T DN ><GG@? >AAB;@9.
%@M@ DN OC@ NTIO<S JA OC@ XIJMF NO<O@H@IO:
XIJMF (B@MPHJDBM@FYQSFTTJPO)
\
// ... FYQSFTTJPO(T) UP FYFDVUF XIJMF USVF
^
#JM @S<HKG@, OC@ >J?@ OC<O M@KM@N@ION 73F 5AA=;7E 3E >A@9 3E F:7D7 ;E 5AA=;7 ><I =@ >J?@? GDF@
OCDN:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
CPPM FYJTUT$PPLJF = USVF;
XIJMF (FYJTUT$PPLJF) \
XSJUFMO("5BLF DPPLJF");
XSJUFMO("&BU DPPLJF");
^
^
1C<O KMJBM<H RJPG? >JIODIP@ M@K@<ODIB OC@ GJJK =@><PN@ OC@ Q<GP@ JA FYJTUT$PPLJF I@Q@M
>C<IB@N AMJH USVF.
XIJMF DN PN@APG RC@I OC@ Q<GP@ JA OC@ GJBD><G @SKM@NNDJI >C<IB@N ?PMDIB OC@ @S@>PODJI JA OC@
KMJBM<H. 1J N@@ OCDN, G@O'N RMDO@ < KMJBM<H OC<O O<F@N < IPH=@M AMJH OC@ PN@M <N GJIB <N OC<O
IPH=@M DN U@MJ JM BM@<O@M. /@H@H=@M OC<O OC@ DIDOD<G Q<GP@ JA JOU Q<MD<=G@N DN 0:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
JOU OVNCFS;
XIJMF (OVNCFS >= 0) \
XSJUF("1MFBTF FOUFS B OVNCFS: ");
SFBEG(" %T", &OVNCFS);
XSJUFMO("5IBOL ZPV GPS ", OVNCFS);
^
XSJUFMO("&YJUFE UIF MPPQ");
^
1C@ KMJBM<H OC<IFN AJM OC@ KMJQD?@? IPH=@M <I? @SDON OC@ GJJK JIGT RC@I OC@ IPH=@M DN G@NN
OC<I U@MJ.
The DPOUJOVF statement
14.1
1CDN NO<O@H@IO NO<MON OC@ I@SO DO@M<ODJI JA OC@ GJJK MDBCO <R<T, DINO@<? JA @S@>PODIB OC@ M@NO JA
OC@ @SKM@NNDJIN JA OC@ =GJ>F.
I:;>7 "AAB
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
35
)@O'N HJ?DAT OC@ KMJBM<H <=JQ@ OJ =@ < GDOOG@ KD>FT: DINO@<? JA OC<IFDIB AJM <IT IPH=@M, G@O'N
IJO <>>@KO 13. 1C@ AJGGJRDIB KMJBM<H ?J@N IJO OC<IF AJM 13 =@><PN@ DI OC<O ><N@ OC@
DPOUJOVF NO<O@H@IO H<F@N OC@ KMJBM<H BJ OJ OC@ =@BDIIDIB JA OC@ GJJK OJ @Q<GP<O@ OC@
GJBD><G @SKM@NNDJI <B<DI:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
JOU OVNCFS;
XIJMF (OVNCFS >= 0) \
XSJUF("1MFBTF FOUFS B OVNCFS: ");
SFBEG(" %T", &OVNCFS);
JG (OVNCFS == 13) \
XSJUFMO("4PSSZ, OPU BDDFQUJOH UIBU POF...");
DPOUJOVF;
^
XSJUFMO("5IBOL ZPV GPS ", OVNCFS);
^
XSJUFMO("&YJUFE UIF MPPQ");
^
4@ ><I ?@ADI@ OC@ =@C<QDJM JA OC<O KMJBM<H <N F3=7 @G?47DE 3E >A@9 3E F:7K 3D7 9D73F7D F:3@
AD 7CG3> FA 0 4GF E=;B 13.
The CSFBL statement
14.2
0JH@ODH@N DO =@>JH@N J=QDJPN OC<O OC@M@ DN IJ I@@? OJ NO<T DI OC@ XIJMF GJJK <IT GJIB@M.
CSFBL <GGJRN OC@ KMJBM<H OJ @SDO OC@ GJJK MDBCO <R<T. 1C@ AJGGJRDIB KMJBM<H @SDON OC@ GJJK <N
NJJI <N DO ADI?N < NK@>D<G IPH=@M:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
JOU OVNCFS;
XIJMF (OVNCFS >= 0) \
XSJUF("1MFBTF FOUFS B OVNCFS: ");
SFBEG(" %T", &OVNCFS);
JG (OVNCFS == 42) \
XSJUFMO("'06/% *5!");
CSFBL;
^
XSJUFMO("5IBOL ZPV GPS ", OVNCFS);
^
XSJUFMO("&YJUFE UIF MPPQ");
^
4@ ><I NPHH<MDU@ OCDN =@C<QDJM <N F3=7 @G?47DE 3E >A@9 3E F:7K 3D7 9D73F7D F:3@ AD 7CG3> FA
0 G@F;> 3 @G?47D ;E 42.
I:;>7 "AAB
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
36
Infinite loop
14.3
0JH@ODH@N OC@ GJBD><G @SKM@NNDJI DN DIO@IOD<GGT H<?@ < >JINO<IO USVF. 1C@ CSFBL NO<O@H@IO DN
< >JHHJI R<T JA @SDODIB NP>C ;@8;@;F7 >AABE.
1C@ AJGGJRDIB KMJBM<H KMDION < H@IP DI <I DIADIDO@ GJJK; OC@ JIGT R<T JA @SDODIB OC@ GJJK DN <
CSFBL NO<O@H@IO:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
/* *OGJOJUF MPPQ, CFDBVTF UIF MPHJDBM FYQSFTTJPO JT BMXBZT
* USVF */
XIJMF (USVF) \
XSJUF("0:&YJU, 1:5VSLJTI, 2:&OHMJTI - :PVS DIPJDF ");
JOU DIPJDF;
SFBEG(" %T", &DIPJDF);
JG (DIPJDF == 0) \
XSJUFMO("4FF ZPV MBUFS...");
CSFBL; // 5IF POMZ FYJU PG UIJT MPPQ
^ FMTF JG (DIPJDF == 1) \
XSJUFMO(".FSIBCB!");
^ FMTF JG (DIPJDF == 2) \
XSJUFMO(")FMMP!");
^ FMTF \
XSJUFMO("* EPO'U LOPX UIBU... :/");
^
^
^
Note: "S>@KODJIN 53@ F7D?;@3F7 3@ ;@8;@;F7 >AAB 3E I7>>. ,7 I;>> E77 7J57BF;A@E ;@ 3 >3F7D
5:3BF7D.
Exercises
14.4
1. 1C@ AJGGJRDIB KMJBM<H DN ?@NDBI@? OJ NO<T DI OC@ GJJK <N GJIB <N OC@ DIKPO DN 3, =PO OC@M@ DN
< =PB: DO ?J@NI'O <NF AJM <IT DIKPO:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
JOU OVNCFS;
XIJMF (OVNCFS == 3) \
XSJUF("/VNCFS ");
SFBEG(" %T", &OVNCFS);
^
^
#DS OC@ =PB. 1C@ KMJBM<H NCJPG? NO<T DI OC@ GJJK <N GJIB <N OC@ DIKPO DN 3.
2. *<F@ OC@ >JHKPO@M C@GK AII< <I? BDGG KG<T < B<H@. #DMNO, OC@ >JHKPO@M NCJPG? O<F@ <
IPH=@M AMJH AII< DI OC@ M<IB@ AMJH 1 OJ 10. 1C@ KMJBM<H NCJPG? IJO <>>@KO <IT JOC@M
IPH=@M; DO NCJPG? <NF <B<DI.
,I>@ OC@ KMJBM<H O<F@N < Q<GD? IPH=@M AMJH AII<, DO NCJPG? NO<MO O<FDIB IPH=@MN
AMJH BDGG PIODG C@ BP@NN@N AII<'N IPH=@M >JMM@>OGT.
I:;>7 "AAB
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
37
Note: ):7 @G?47DE F:3F A@@3 7@F7DE A4H;AGE>K EF3KE A@ F:7 5A@EA>7 3@6 53@ 47 E77@
4K B;>>. :A) "7F'E ;9@AD7 F:;E 835F 3@6 ID;F7 F:7 BDA9D3? 3E 3@ 7J7D5;E7 A8 F:7 while
EF3F7?7@F.
... F:7 EA>GF;A@E
I:;>7 "AAB
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
38
Integers and Arithmetic Operations 15
4@ C<Q@ N@@I OC<O OC@ JG <I? XIJMF NO<O@H@ION <GGJR KMJBM<HN OJ H<F@ ?@>DNDJIN =T PNDIB
OC@ CPPM OTK@ DI OC@ AJMH JA GJBD><G @SKM@NNDJIN. &I OCDN >C<KO@M, R@ RDGG N@@ <MDOCH@OD>
JK@M<ODJIN JI OC@ ;@F797D OTK@N JA !. 1C@N@ A@<OPM@N RDGG <GGJR PN OJ RMDO@ HP>C HJM@ PN@APG
KMJBM<HN.
AGOCJPBC <MDOCH@OD> JK@M<ODJIN <M@ < K<MO JA JPM ?<DGT GDQ@N <I? <M@ <>OP<GGT NDHKG@, OC@M@ <M@
Q@MT DHKJMO<IO >JI>@KON OC<O < KMJBM<HH@M HPNO =@ <R<M@ JA DI JM?@M OJ KMJ?P>@ >JMM@>O
KMJBM<HN: 4;F >7@9F: A8 3 FKB7, AH7D8>AI, G@67D8>AI, <I? FDG@53F;A@.
B@AJM@ BJDIB APMOC@M, & RJPG? GDF@ OJ NPHH<MDU@ OC@ <MDOCH@OD> JK@M<ODJIN DI OC@ AJGGJRDIB
O<=G@ <N < M@A@M@I>@:
0QFSBUPS &GGFDU 4BNQMF
++ JODSFNFOUT CZ POF ++WBSJBCMF
-- EFDSFNFOUT CZ POF --WBSJBCMF
+ UIF SFTVMU PG BEEJOH UXP WBMVFT GJSTU + TFDPOE
- UIF SFTVMU PG TVCUSBDUJOH 'TFDPOE' GSPN 'GJSTU' GJSTU - TFDPOE
* UIF SFTVMU PG NVMUJQMZJOH UXP WBMVFT GJSTU * TFDPOE
/ UIF SFTVMU PG EJWJEJOH 'GJSTU' CZ 'TFDPOE' GJSTU / TFDPOE
% UIF SFNBJOEFS PG EJWJEJOH 'GJSTU' CZ 'TFDPOE' GJSTU % TFDPOE
?? UIF SFTVMU PG SBJTJOH 'GJSTU' UP UIF QPXFS PG
'TFDPOE'
(NVMUJQMZJOH 'GJSTU' CZ JUTFMG 'TFDPOE' UJNFT)
GJSTU ?? TFDPOE
*JNO JA OCJN@ JK@M<OJMN C<Q@ >JPIO@MK<MON OC<O C<Q@ <I = NDBI <OO<>C@?: +=, -=, *=, /=, %=,
<I? ??=. 1C@ ?DAA@M@I>@ RDOC OC@N@ JK@M<OJMN DN OC<O OC@T <NNDBI OC@ M@NPGO OJ OC@ G@AO-C<I?
ND?@:
WBSJBCMF += 10;
1C<O @SKM@NNDJI <??N OC@ Q<GP@ JA WBSJBCMF <I? 10 <I? <NNDBIN OC@ M@NPGO OJ WBSJBCMF. &I OC@
@I?, OC@ Q<GP@ JA WBSJBCMF RJPG? =@ DI>M@<N@? =T 10. &O DN OC@ @LPDQ<G@IO JA OC@ AJGGJRDIB
@SKM@NNDJI:
WBSJBCMF = WBSJBCMF + 10;
& RJPG? GDF@ <GNJ OJ NPHH<MDU@ ORJ DHKJMO<IO >JI>@KON C@M@ =@AJM@ @G<=JM<ODIB JI OC@H
=@GJR.
Overflow: +JO <GG Q<GP@N ><I ADO DI < OTK@, DI RCD>C ><N@ F:7 H3>G7 AH7D8>AIE. #JM @S<HKG@, <
Q<MD<=G@ JA OTK@ VCZUF ><I C<Q@ Q<GP@N JIGT DI OC@ M<IB@ JA 0 OJ 255; NJ RC@I <NNDBI@? 260,
OC@ Q<GP@ JQ@MAGJRN <I? =@>JH@N 4.
Underflow: 0DHDG<MGT, Q<GP@N H<T IJO =@ G@NN OC<I OC@ HDIDHPH Q<GP@ OC<O < OTK@ ><I C<Q@.
Truncation: &IO@B@M OTK@N ><IIJO C<Q@ Q<GP@N RDOC AM<>ODJI<G K<MON. #JM @S<HKG@, OC@ Q<GP@
JA OC@ JOU @SKM@NNDJI 3/2 DN 1, IJO 1.5.
More Information
15.1
4@ @I>JPIO@M <MDOCH@OD> JK@M<ODJIN ?<DGT RDOCJPO HP>C NPMKMDN@N: DA < =<B@G DN $1, ORJ =<B@GN
<M@ $2; DA AJPM N<I?RD>C@N <M@ $15, JI@ N<I?RD>C DN $3.75, @O>.
!@F797DE 3@6 AD;F:?7F;5 %B7D3F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
39
2IAJMOPI<O@GT OCDIBN <M@ IJO <N NDHKG@ RDOC <MDOCH@OD> JK@M<ODJIN DI >JHKPO@MN. &A R@ ?JI'O
PI?@MNO<I? CJR Q<GP@N <M@ NOJM@? DI < >JHKPO@M, R@ H<T =@ NPMKMDN@? OJ N@@ OC<O <
>JHK<IT'N ?@=O DN D76G576 OJ $1.7 =DGGDJIN RC@I DO =JMMJRN $3 =DGGDJIN HJM@ JI OJK JA DON
@SDNODIB ?@=O JA $3 =DGGDJIN! ,M RC@I < =JS JA D>@ >M@<H N@MQ@N 4 FD?N, <I <MDOCH@OD> JK@M<ODJI
H<T >G<DH OC<O 2 =JS@N RJPG? =@ NPAAD>D@IO AJM 11 FD?N!
-MJBM<HH@MN HPNO PI?@MNO<I? CJR DIO@B@MN <M@ NOJM@? DI >JHKPO@MN.
Integer types 15.1.1
&IO@B@M OTK@N <M@ OC@ OTK@N OC<O ><I C<Q@ JIGT RCJG@ Q<GP@N GDF@ -2, 0, 10, @O>. 1C@N@ OTK@N
><IIJO C<Q@ AM<>ODJI<G K<MON <N DI 2.5. AGG JA OC@ DIO@B@M OTK@N OC<O R@ C<Q@ N@@I DI OC@
#PI?<H@IO<G 1TK@N >C<KO@M <M@ OC@ AJGGJRDIB:
5ZQF
/VNCFS PG
#JUT
*OJUJBM
7BMVF
CZUF 8 0
VCZUF 8 0
TIPSU 16 0
VTIPSU 16 0
JOU 32 0
VJOU 32 0
MPOH 64 0-
VMPOH 64 0-
1C@ V <O OC@ =@BDIIDIB JA OC@ OTK@ I<H@N NO<I?N AJM "PINDBI@?" <I? DI?D><O@N OC<O NP>C OTK@N
><IIJO C<Q@ Q<GP@N G@NN OC<I U@MJ.
Number of bits of a type 15.1.2
&I OJ?<T'N >JHKPO@M NTNO@HN, OC@ NH<GG@NO PIDO JA DIAJMH<ODJI DN ><GG@? < 4;F. AO OC@ KCTND><G
G@Q@G, < =DO DN M@KM@N@IO@? =T @G@>OMD><G NDBI<GN <O >@MO<DI KJDION DI OC@ >DM>PDOMT JA < >JHKPO@M.
A =DO ><I =@ DI JI@ JA ORJ NO<O@N OC<O >JMM@NKJI? OJ OC@ KM@N@I>@ <I? <=N@I>@ JA @G@>OMD><G
NDBI<GN <O OC@ KJDIO OC<O ?@ADI@N OC<O K<MOD>PG<M =DO. 1C@N@ ORJ NO<O@N <M@ <M=DOM<MDGT ?@ADI@? OJ
C<Q@ OC@ Q<GP@N 0 <I? 1. AN < M@NPGO, < =DO ><I C<Q@ JI@ JA OC@N@ ORJ Q<GP@N.
AN OC@M@ <M@I'O H<IT >JI>@KON OC<O ><I =@ M@KM@N@IO@? =T EPNO ORJ NO<O@N, =DO DN IJO < Q@MT
PN@APG OTK@. &O ><I JIGT =@ PN@APG AJM >JI>@KON RDOC ORJ NO<O@N GDF@ C@<?N JM O<DGN JM RC@OC@M <
GDBCO NRDO>C DN JI JM JAA.
&A R@ >JIND?@M ORJ =DON <O < ODH@, OC@ OJO<G IPH=@M JA DIAJMH<ODJI OC<O ><I =@ M@KM@N@IO@?
HPGODKGD@N. B<N@? JI @<>C =DO C<QDIB < Q<GP@ JA 0 JM 1 DI?DQD?P<GGT, OC@M@ <M@ < OJO<G JA 4
KJNND=G@ NO<O@N. ANNPHDIB OC<O OC@ G@AO <I? MDBCO ?DBDON M@KM@N@IO OC@ ADMNO <I? N@>JI? =DO
M@NK@>ODQ@GT, OC@N@ NO<O@N <M@ 00, 01, 10, <I? 11. )@O'N <?? JI@ HJM@ =DO OJ N@@ OCDN @AA@>O
=@OO@M; OCM@@ =DON ><I =@ DI 8 ?DAA@M@IO NO<O@N: 000, 001, 010, 011, 100, 101, 110, 111. AN ><I
=@ N@@I, @<>C <??@? =DO ?JP=G@N OC@ OJO<G IPH=@M JA NO<O@N OC<O ><I =@ M@KM@N@IO@?.
1C@ Q<GP@N OJ RCD>C OC@N@ @DBCO NO<O@N >JMM@NKJI? OJ <M@ ?@ADI@? =T >JIQ@IODJIN. 1C@
AJGGJRDIB O<=G@ NCJRN OC@N@ Q<GP@N AJM OC@ NDBI@? <I? PINDBI@? M@KM@N@IO<ODJIN JA 3 =DON:
!@F797DE 3@6 AD;F:?7F;5 %B7D3F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
40
#JU
4UBUF
6OTJHOFE
7BMVF
4JHOFE
7BMVF
000 0 0
001 1 1
010 2 2
011 3 3
100 4 -4
101 5 -3
110 6 -2
111 7 -1
4@ ><I KMJ?P>@ OC@ AJGGJRDIB O<=G@ =T <??DIB HJM@ =DON:
#JUT /VNCFS PG %JTUJODU 7BMVFT % 5ZQF .JOJNVN 7BMVF .BYJNVN 7BMVF
1 2
2 4
3 8
4 16
5 32
6 64
7 128
8 256 CZUF
VCZUF
-128
0
127
255
... ...
16 65,536 TIPSU
VTIPSU
-32768
0
32767
65535
... ...
32 4,294,967,296 JOU
VJOU
-2147483648
0
2147483647
4294967295
... ...
64 18,446,744,073,709,551,616 MPOH
VMPOH
-9223372036854775808
0
9223372036854775807
18446744073709551615
... ...
& C<Q@ NFDKK@? H<IT MJRN DI OC@ O<=G@, <I? DI?D><O@? OC@ NDBI@? <I? PINDBI@? Q@MNDJIN JA OC@
! OTK@N OC<O C<Q@ OC@ N<H@ IPH=@M JA =DON JI OC@ N<H@ MJR (@.B. JOU <I? VJOU <M@ =JOC JI
OC@ 32-=DO MJR).
Choosing a type 15.1.3
0DI>@ < 3-=DO OTK@ ><I JIGT C<Q@ 8 ?DNODI>O Q<GP@N, DO ><I JIGT M@KM@N@IO >JI>@KON GDF@ OC@
Q<GP@ JA < ?D@ JM OC@ IPH=@M JA OC@ ?<T JA OC@ R@@F. (1CDN DN EPNO <I @S<HKG@; OC@M@ DNI'O <
3-=DO OTK@ DI !.)
,I OC@ JOC@M C<I?, <GOCJPBC VJOU DN < Q@MT G<MB@ OTK@, DO ><IIJO M@KM@N@IO OC@ >JI>@KO JA <I
&! IPH=@M AJM @<>C GDQDIB K@MNJI; <N DON H<SDHPH Q<GP@ DN G@NN OC<I OC@ RJMG? KJKPG<ODJI JA 7
=DGGDJI. MPOH <I? VMPOH RJPG? =@ HJM@ OC<I @IJPBC OJ M@KM@N@IO H<IT >JI>@KON.
AN < B@I@M<G MPG@, <N GJIB <N OC@M@ DN IJ NK@>DAD> M@<NJI IJO OJ, TJP ><I PN@ JOU AJM DIO@B@M
Q<GP@N.
!@F797DE 3@6 AD;F:?7F;5 %B7D3F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
41
Overflow 15.1.4
1C@ A<>O OC<O OTK@N ><I C<Q@ < GDHDO@? M<IB@ JA Q<GP@N H<T ><PN@ PI@SK@>O@? M@NPGON. #JM
@S<HKG@, <GOCJPBC <??DIB ORJ VJOU Q<MD<=G@N RDOC Q<GP@N JA 3 =DGGDJI @<>C NCJPG? KMJ?P>@ 6
=DGGDJI, =@><PN@ OC<O NPH DN BM@<O@M OC<I OC@ H<SDHPH Q<GP@ OC<O < VJOU Q<MD<=G@ ><I CJG?
(<=JPO 4 =DGGDJI), OCDN NPH AH7D8>AIE. 4DOCJPO <IT R<MIDIB, JIGT OC@ ?DAA@M@I>@ JA 6 <I? 4
=DGGDJI B@ON NOJM@?. (A GDOOG@ HJM@ <>>PM<O@GT, 6 HDIPN 4.3 =DGGDJI.)
Truncation 15.1.5
0DI>@ DIO@B@MN ><IIJO C<Q@ Q<GP@N RDOC AM<>ODJI<G K<MON, OC@T GJN@ OC@ K<MO <AO@M OC@ ?@>DH<G
KJDIO. #JM @S<HKG@, <NNPHDIB OC<O < =JS JA D>@ >M@<H N@MQ@N 4 FD?N, <GOCJPBC 11 FD?N RJPG?
<>OP<GGT I@@? 2.75 =JS@N, 2.75 ><I JIGT =@ NOJM@? <N 2 DI <I DIO@B@M OTK@.
& RDGG NCJR GDHDO@? O@>CIDLP@N OJ C@GK M@?P>@ OC@ @AA@>ON JA JQ@MAGJR, PI?@MAGJR, <I?
OMPI><ODJI G<O@M DI OC@ >C<KO@M.
.NJO and .NBY 15.1.6
& RDGG O<F@ <?Q<IO<B@ JA OC@ .NJO <I? .NBY KMJK@MOD@N =@GJR, RCD>C R@ C<Q@ N@@I DI OC@
API?<H@IO<G OTK@N >C<KO@M. 1C@N@ KMJK@MOD@N KMJQD?@ OC@ HDIDHPH <I? H<SDHPH Q<GP@N OC<O
<I DIO@B@M OTK@ ><I C<Q@.
Increment: ++ 15.1.7
1CDN JK@M<OJM DN PN@? RDOC < NDIBG@ Q<MD<=G@ (HJM@ B@I@M<GGT, RDOC < NDIBG@ @SKM@NNDJI) <I? DN
RMDOO@I =@AJM@ OC@ I<H@ JA OC<O Q<MD<=G@. &O DI>M@H@ION OC@ Q<GP@ JA OC<O Q<MD<=G@ =T 1:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
JOU OVNCFS = 10;
++OVNCFS;
XSJUFMO("/FX WBMVF: ", OVNCFS);
^
/FX WBMVF: 11
1C@ DI>M@H@IO JK@M<OJM DN OC@ @LPDQ<G@IO JA PNDIB OC@ 366-3@6-3EE;9@ JK@M<OJM RDOC OC@ Q<GP@
JA 1:
OVNCFS += 1; // TBNF BT ++OVNCFS
&A OC@ M@NPGO JA OC@ DI>M@H@IO JK@M<ODJI DN BM@<O@M OC<I OC@ H<SDHPH Q<GP@ JA OC<O OTK@, OC@
M@NPGO AH7D8>AIE <I? =@>JH@N OC@ HDIDHPH Q<GP@. 4@ ><I N@@ OCDN @AA@>O =T DI>M@H@IODIB <
Q<MD<=G@ OC<O DIDOD<GGT C<N OC@ Q<GP@ JOU.NBY:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
XSJUFMO("NJOJNVN JOU WBMVF : ", JOU.NJO);
XSJUFMO("NBYJNVN JOU WBMVF : ", JOU.NBY);
JOU OVNCFS = JOU.NBY;
XSJUFMO("CFGPSF UIF JODSFNFOU: ", OVNCFS);
++OVNCFS;
!@F797DE 3@6 AD;F:?7F;5 %B7D3F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
42
XSJUFMO("BGUFS UIF JODSFNFOU : ", OVNCFS);
^
1C@ Q<GP@ =@>JH@N JOU.NJO <AO@M OC@ DI>M@H@IO:
NJOJNVN JOU WBMVF : -2147483648
NBYJNVN JOU WBMVF : 2147483647
CFGPSF UIF JODSFNFOU: 2147483647
BGUFS UIF JODSFNFOU : -2147483648
1CDN DN < Q@MT DHKJMO<IO J=N@MQ<ODJI, =@><PN@ OC@ Q<GP@ >C<IB@N AMJH OC@ H<SDHPH OJ OC@
HDIDHPH <N < M@NPGO JA ;@5D7?7@F;@9 <I? RDOCJPO <IT R<MIDIB! 1CDN @AA@>O DN ><GG@? AH7D8>AI.
4@ RDGG N@@ NDHDG<M @AA@>ON RDOC JOC@M JK@M<ODJIN.
Decrement: -- 15.1.8
1CDN JK@M<OJM DN NDHDG<M OJ OC@ DI>M@H@IO JK@M<OJM; OC@ ?DAA@M@I>@ DN OC<O OC@ Q<GP@ DN
?@>M@<N@? =T 1:
--OVNCFS; // UIF WBMVF EFDSFBTFT CZ 1
1C@ ?@>M@H@IO JK@M<ODJI DN OC@ @LPDQ<G@IO JA PNDIB OC@ EG4FD35F-3@6-3EE;9@ JK@M<OJM RDOC OC@
Q<GP@ JA 1:
OVNCFS -= 1; // TBNF BT --OVNCFS
0DHDG<M OJ OC@ ++ JK@M<OJM, DA OC@ Q<GP@ DN OC@ HDIDHPH Q<GP@ OJ =@BDI RDOC, DO =@>JH@N OC@
H<SDHPH Q<GP@. 1CDN @AA@>O DN ><GG@? G@67D8>AI.
Addition: + 15.1.9
1CDN JK@M<OJM DN PN@? RDOC ORJ @SKM@NNDJIN <I? <??N OC@DM Q<GP@N:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
JOU GJSTU = 12;
JOU TFDPOE = 100;
XSJUFMO("3FTVMU: ", GJSTU + TFDPOE);
XSJUFMO("8JUI B DPOTUBOU FYQSFTTJPO: ", 1000 + TFDPOE);
^
3FTVMU: 112
8JUI B DPOTUBOU FYQSFTTJPO: 1100
&A OC@ M@NPGO DN BM@<O@M OC<I OC@ NPH JA OC@ ORJ @SKM@NNDJIN, DO <B<DI JQ@MAGJRN <I? =@>JH@N <
Q<GP@ OC<O DN G@NN OC<I =JOC JA OC@ @SKM@NNDJIN:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
// 3 CJMMJPOT FBDI
VJOU GJSTU = 3000000000;
VJOU TFDPOE = 3000000000;
!@F797DE 3@6 AD;F:?7F;5 %B7D3F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
43
XSJUFMO("NBYJNVN WBMVF PG VJOU: ", VJOU.NBY);
XSJUFMO(" GJSTU: ", GJSTU);
XSJUFMO(" TFDPOE: ", TFDPOE);
XSJUFMO(" TVN: ", GJSTU + TFDPOE);
XSJUFMO("07&3'-08! 5IF SFTVMU JT OPU 6 CJMMJPOT!");
^
NBYJNVN WBMVF PG VJOU: 4294967295
GJSTU: 3000000000
TFDPOE: 3000000000
TVN: 1705032704
07&3'-08! 5IF SFTVMU JT OPU 6 CJMMJPOT!
Subtraction: - 15.1.10
1CDN JK@M<OJM DN PN@? RDOC ORJ @SKM@NNDJIN <I? BDQ@N OC@ ?DAA@M@I>@ =@OR@@I OC@ ADMNO <I? OC@
N@>JI?:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
JOU OVNCFS@1 = 10;
JOU OVNCFS@2 = 20;
XSJUFMO(OVNCFS@1 - OVNCFS@2);
XSJUFMO(OVNCFS@2 - OVNCFS@1);
^
-10
10
&O DN <B<DI NPMKMDNDIB DA OC@ <>OP<G M@NPGO DN G@NN OC<I U@MJ <I? DN NOJM@? DI <I PINDBI@? OTK@.
)@O'N M@RMDO@ OC@ KMJBM<H PNDIB OC@ VJOU OTK@:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
VJOU OVNCFS@1 = 10;
VJOU OVNCFS@2 = 20;
XSJUFMO("130#-&.! VJOU DBOOPU IBWF OFHBUJWF WBMVFT:");
XSJUFMO(OVNCFS@1 - OVNCFS@2);
XSJUFMO(OVNCFS@2 - OVNCFS@1);
^
130#-&.! VJOU DBOOPU IBWF OFHBUJWF WBMVFT:
4294967286
10
&O DN < BJJ? BPD?@GDI@ OJ PN@ NDBI@? OTK@N OJ M@KM@N@IO >JI>@KON OC<O H<T @Q@M =@ NP=OM<>O@?.
AN GJIB <N OC@M@ DN IJ NK@>DAD> M@<NJI IJO OJ, TJP ><I >CJJN@ JOU.
Multiplication: * 15.1.11
1CDN JK@M<OJM HPGODKGD@N OC@ Q<GP@N JA ORJ @SKM@NNDJIN; OC@ M@NPGO DN <B<DI NP=E@>O OJ JQ@MAGJR:
!@F797DE 3@6 AD;F:?7F;5 %B7D3F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
44
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
VJOU OVNCFS@1 = 6;
VJOU OVNCFS@2 = 7;
XSJUFMO(OVNCFS@1 * OVNCFS@2);
^
42
Division: / 15.1.12
1CDN JK@M<OJM ?DQD?@N OC@ ADMNO @SKM@NNDJI =T OC@ N@>JI? @SKM@NNDJI. 0DI>@ DIO@B@M OTK@N
><IIJO C<Q@ AM<>ODJI<G Q<GP@N, OC@ AM<>ODJI<G K<MO JA OC@ Q<GP@ DN ?DN><M?@?. 1CDN @AA@>O DN
><GG@? FDG@53F;A@. AN < M@NPGO, OC@ AJGGJRDIB KMJBM<H KMDION 3, IJO 3.5:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
XSJUFMO(7 / 2);
^
3
#JM ><G>PG<ODJIN RC@M@ AM<>ODJI<G K<MON H<OO@M, 8>A3F;@9 BA;@F FKB7E HPNO =@ PN@? DINO@<? JA
DIO@B@MN. 4@ RDGG N@@ AGJ<ODIB KJDIO OTK@N DI OC@ I@SO >C<KO@M.
Remainder: % 15.1.13
1CDN JK@M<OJM ?DQD?@N OC@ ADMNO @SKM@NNDJI =T OC@ N@>JI? @SKM@NNDJI <I? KMJ?P>@N OC@
M@H<DI?@M JA OC@ ?DQDNDJI:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
XSJUFMO(10 % 6);
^
4
A >JHHJI <KKGD><ODJI JA OCDN JK@M<OJM DN OJ ?@O@MHDI@ RC@OC@M < Q<GP@ DN J?? JM @Q@I. 0DI>@
OC@ M@H<DI?@M JA ?DQD?DIB <I @Q@I IPH=@M =T 2 DN <GR<TN 0, >JHK<MDIB OC@ M@NPGO <B<DINO 0 DN
NPAAD>D@IO OJ H<F@ OC<O ?DNODI>ODJI:
JG ((OVNCFS % 2) == 0) \
XSJUFMO("FWFO OVNCFS");
^ FMTF \
XSJUFMO("PEE OVNCFS");
^
!@F797DE 3@6 AD;F:?7F;5 %B7D3F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
45
Power: ^^ 15.1.14
1CDN JK@M<OJM M<DN@N OC@ ADMNO @SKM@NNDJI OJ OC@ KJR@M JA OC@ N@>JI? @SKM@NNDJI. #JM @S<HKG@,
M<DNDIB 3 OJ OC@ KJR@M JA 4 DN HPGODKGTDIB 3 =T DON@GA 4 ODH@N:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
XSJUFMO(3 ?? 4);
^
81
Arithmetic operations with assignment 15.1.15
AGG JA OC@ JK@M<OJMN OC<O O<F@ ORJ @SKM@NNDJIN C<Q@ 3EE;9@?7@F >JPIO@MK<MON. 1C@N@ JK@M<OJMN
<NNDBI OC@ M@NPGO =<>F OJ OC@ @SKM@NNDJI OC<O DN JI OC@ G@AO-C<I? ND?@:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
JOU OVNCFS = 10;
OVNCFS += 20; // TBNF BT OVNCFS = OVNCFS + 20; OPX 30
OVNCFS -= 5; // TBNF BT OVNCFS = OVNCFS - 5; OPX 25
OVNCFS *= 2; // TBNF BT OVNCFS = OVNCFS * 2; OPX 50
OVNCFS /= 3; // TBNF BT OVNCFS = OVNCFS / 3; OPX 16
OVNCFS %= 7; // TBNF BT OVNCFS = OVNCFS % 7; OPX 2
OVNCFS ??= 6; // TBNF BT OVNCFS = OVNCFS ?? 6; OPX 64
XSJUFMO(OVNCFS);
^
64
Negation: - 15.1.16
1CDN JK@M<OJM >JIQ@MON OC@ Q<GP@ JA OC@ @SKM@NNDJI AMJH I@B<ODQ@ OJ KJNDODQ@ JM KJNDODQ@ OJ
I@B<ODQ@:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
JOU OVNCFS@1 = 1;
JOU OVNCFS@2 = -2;
XSJUFMO(-OVNCFS@1);
XSJUFMO(-OVNCFS@2);
^
-1
2
1C@ OTK@ JA OC@ M@NPGO JA OCDN JK@M<ODJI DN OC@ N<H@ <N OC@ OTK@ JA OC@ @SKM@NNDJI. 0DI>@
PINDBI@? OTK@N ><IIJO C<Q@ I@B<ODQ@ Q<GP@N, OC@ M@NPGO JA PNDIB OCDN JK@M<OJM RDOC PINDBI@?
OTK@N ><I =@ NPMKMDNDIB:
!@F797DE 3@6 AD;F:?7F;5 %B7D3F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
46
VJOU OVNCFS = 1;
XSJUFMO("OFHBUJPO: ", -OVNCFS);
1C@ OTK@ JA -OVNCFS DN VJOU <N R@GG, RCD>C ><IIJO C<Q@ I@B<ODQ@ Q<GP@N:
OFHBUJPO: 4294967295
Plus sign: + 15.1.17
1CDN JK@M<OJM C<N IJ @AA@>O <I? @SDNON JIGT AJM NTHH@OMT RDOC OC@ I@B<ODJI JK@M<OJM. -JNDODQ@
Q<GP@N NO<T KJNDODQ@ <I? I@B<ODQ@ Q<GP@N NO<T I@B<ODQ@:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
JOU OVNCFS@1 = 1;
JOU OVNCFS@2 = -2;
XSJUFMO(+OVNCFS@1);
XSJUFMO(+OVNCFS@2);
^
1
-2
Post-increment: ++ 15.1.18
Note: *@>7EE F:7D7 ;E 3 EFDA@9 D73EA@, 3>I3KE GE7 F:7 D79G>3D ;@5D7?7@F AB7D3FAD (I:;5: ;E
EA?7F;?7E 53>>76 F:7 BD7-;@5D7?7@F AB7D3FAD).
JIOM<MT OJ OC@ M@BPG<M DI>M@H@IO JK@M<OJM, DO DN RMDOO@I <AO@M OC@ @SKM@NNDJI <I? NODGG
DI>M@H@ION OC@ Q<GP@ JA OC@ @SKM@NNDJI =T 1. 1C@ ?DAA@M@I>@ DN, OC@ KJNO-DI>M@H@IO JK@M<ODJI
DON@GA KMJ?P>@N OC@ JG? Q<GP@ JA OC@ @SKM@NNDJI. 1J N@@ OCDN ?DAA@M@I>@, G@O'N >JHK<M@ DO RDOC
OC@ M@BPG<M DI>M@H@IO JK@M<OJM:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
JOU JODSFNFOUFE@SFHVMBSMZ = 1;
XSJUFMO(++JODSFNFOUFE@SFHVMBSMZ); // QSJOUT 2
XSJUFMO(JODSFNFOUFE@SFHVMBSMZ); // QSJOUT 2
JOU QPTU@JODSFNFOUFE = 1;
// (FUT JODSFNFOUFE, CVU JUT PME WBMVF JT VTFE:
XSJUFMO(QPTU@JODSFNFOUFE++); // QSJOUT 1
XSJUFMO(QPTU@JODSFNFOUFE); // QSJOUT 2
^
2
2
1
2
1C@ XSJUFMO(QPTU@JODSFNFOUFE++); NO<O@H@IO <=JQ@ DN OC@ @LPDQ<G@IO JA OC@ AJGGJRDIB
>J?@:
!@F797DE 3@6 AD;F:?7F;5 %B7D3F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
47
JOU PME@WBMVF = QPTU@JODSFNFOUFE;
++QPTU@JODSFNFOUFE;
XSJUFMO(PME@WBMVF); // QSJOUT 1
Post-decrement: -- 15.1.19
Note: *@>7EE F:7D7 ;E 3 EFDA@9 D73EA@, 3>I3KE GE7 F:7 D79G>3D 675D7?7@F AB7D3FAD (I:;5: ;E
EA?7F;?7E 53>>76 F:7 BD7-675D7?7@F AB7D3FAD).
B@C<Q@N OC@ N<H@ <N OC@ KJNO-DI>M@H@IO JK@M<OJM =PO ?@>M@H@ION.
Operator precedence 15.1.20
1C@ JK@M<OJMN R@'Q@ ?DN>PNN@? <=JQ@ C<Q@ <GG =@@I PN@? DI JK@M<ODJIN JI OC@DM JRI RDOC JIGT
JI@ JM ORJ @SKM@NNDJIN. %JR@Q@M, NDHDG<M OJ GJBD><G @SKM@NNDJIN, DO DN >JHHJI OJ >JH=DI@
OC@N@ JK@M<OJMN OJ AJMH HJM@ >JHKG@S <MDOCH@OD> @SKM@NNDJIN:
JOU WBMVF = 77;
JOU SFTVMU = (((WBMVF + 8) * 3) / (WBMVF - 1)) % 5;
AN RDOC GJBD><G JK@M<OJMN, <MDOCH@OD> JK@M<OJMN <GNJ J=@T JK@M<OJM KM@>@?@I>@ MPG@N. #JM
@S<HKG@, OC@ * JK@M<OJM C<N KM@>@?@I>@ JQ@M OC@ + JK@M<OJM. #JM OC<O M@<NJI, RC@I
K<M@IOC@N@N <M@ IJO PN@? (@.B. DI OC@ WBMVF + 8 * 3 @SKM@NNDJI), OC@ * JK@M<OJM DN @Q<GP<O@?
=@AJM@ OC@ + JK@M<OJM. AN < M@NPGO, OC<O @SKM@NNDJI =@>JH@N OC@ @LPDQ<G@IO JA WBMVF + 24,
RCD>C DN LPDO@ ?DAA@M@IO AMJH (WBMVF + 8) * 3.
2NDIB K<M@IOC@N@N DN PN@APG =JOC AJM @INPMDIB >JMM@>O M@NPGON <I? AJM >JHHPID><ODIB OC@
DIO@IO JA OC@ >J?@ OJ KMJBM<HH@MN RCJ H<T RJMF JI OC@ >J?@ DI OC@ APOPM@.
Potential remedy against overflow 15.1.21
&A OC@ M@NPGO JA <I JK@M<ODJI ><IIJO ADO DI OC@ OTK@ JA OC@ M@NPGO, OC@I OC@M@ DN IJOCDIB OC<O ><I
=@ ?JI@. 0JH@ODH@N, <GOCJPBC OC@ PGODH<O@ M@NPGO RJPG? ADO DI < >@MO<DI OTK@, OC@ DIO@MH@?D<O@
><G>PG<ODJIN H<T JQ@MAGJR <I? ><PN@ DI>JMM@>O M@NPGON.
AN <I @S<HKG@, G@O'N <NNPH@ OC<O R@ I@@? OJ KG<IO <I <KKG@ OM@@ K@M 1000 NLP<M@ H@O@MN JA <I
<M@< OC<O DN 40 =T 60 FDGJH@O@MN. %JR H<IT OM@@N <M@ I@@?@??
4C@I R@ NJGQ@ OCDN KMJ=G@H JI K<K@M, R@ N@@ OC<O OC@ M@NPGO DN 40000 ODH@N 60000 ?DQD?@? =T
1000, =@DIB @LP<G OJ 2.4 HDGGDJI OM@@N. )@O'N RMDO@ < KMJBM<H OC<O @S@>PO@N OCDN ><G>PG<ODJI:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
JOU XJEUI = 40000;
JOU MFOHUI = 60000;
JOU BSFB1FS5SFF = 1000;
JOU USFFT/FFEFE = XJEUI * MFOHUI / BSFB1FS5SFF;
XSJUFMO("/VNCFS PG USFFT OFFEFE: ", USFFT/FFEFE);
^
/VNCFS PG USFFT OFFEFE: -1894967
!@F797DE 3@6 AD;F:?7F;5 %B7D3F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
48
+JO OJ H@IODJI DO'N IJO @Q@I >GJN@, OC@ M@NPGO DN <GNJ G@NN OC<I U@MJ! &I OCDN ><N@, OC@
DIO@MH@?D<O@ ><G>PG<ODJI XJEUI * MFOHUI JQ@MAGJRN <I? OC@ NP=N@LP@IO ><G>PG<ODJI JA
/ BSFB1FS5SFF KMJ?P>@N <I DI>JMM@>O M@NPGO.
,I@ R<T JA <QJD?DIB OC@ JQ@MAGJR DI OCDN @S<HKG@ DN OJ >C<IB@ OC@ JM?@M JA JK@M<ODJIN:
JOU USFFT/FFEFE = XJEUI / BSFB1FS5SFF * MFOHUI ;
1C@ M@NPGO RJPG? IJR =@ >JMM@>O:
/VNCFS PG USFFT OFFEFE: 2400000
1C@ M@<NJI OCDN H@OCJ? RJMFN DN OC@ A<>O OC<O <GG JA OC@ NO@KN JA OC@ ><G>PG<ODJI IJR ADO OC@
JOU OTK@.
-G@<N@ IJO@ OC<O OCDN DN IJO < >JHKG@O@ NJGPODJI =@><PN@ OCDN ODH@ OC@ DIO@MH@?D<O@ Q<GP@ DN
KMJI@ OJ OMPI><ODJI, RCD>C H<T <AA@>O OC@ M@NPGO NDBIDAD><IOGT DI >@MO<DI JOC@M ><G>PG<ODJIN.
AIJOC@M NJGPODJI HDBCO =@ OJ PN@ < AGJ<ODIB KJDIO OTK@ DINO@<? JA <I DIO@B@M OTK@: GMPBU,
EPVCMF, JM SFBM.
Potential remedy against truncation 15.1.22
C<IBDIB OC@ JM?@M JA JK@M<ODJIN H<T =@ < NJGPODJI OJ OMPI><ODJI <N R@GG. AI DIO@M@NODIB
@S<HKG@ JA OMPI><ODJI ><I =@ N@@I =T ?DQD?DIB <I? HPGODKGTDIB < Q<GP@ RDOC OC@ N<H@ IPH=@M.
4@ RJPG? @SK@>O OC@ M@NPGO JA 10/9*9 OJ =@ 10, =PO DO >JH@N JPO <N 9:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
XSJUFMO(10 / 9 * 9);
^
9
1C@ M@NPGO DN >JMM@>O RC@I OMPI><ODJI DN <QJD?@? =T >C<IBDIB OC@ JM?@M JA JK@M<ODJIN:
XSJUFMO(10 * 9 / 9);
10
1CDN OJJ DN IJO < >JHKG@O@ NJGPODJI: 1CDN ODH@ OC@ DIO@MH@?D<O@ ><G>PG<ODJI >JPG? =@ KMJI@ OJ
JQ@MAGJR. 2NDIB < AGJ<ODIB KJDIO OTK@ H<T =@ <IJOC@M NJGPODJI OJ OMPI><ODJI DI >@MO<DI
><G>PG<ODJIN.
Exercises
15.2
1. 4MDO@ < KMJBM<H OC<O O<F@N ORJ DIO@B@MN AMJH OC@ PN@M, KMDION OC@ DIO@B@M LPJOD@IO
M@NPGODIB AMJH OC@ ?DQDNDJI JA OC@ ADMNO =T OC@ N@>JI?, <I? <GNJ KMDION OC@ M@H<DI?@M. #JM
@S<HKG@, RC@I 7 <I? 3 <M@ @IO@M@?, C<Q@ OC@ KMJBM<H KMDIO OC@ AJGGJRDIB @LP<ODJI:
7 = 3 * 2 + 1
!@F797DE 3@6 AD;F:?7F;5 %B7D3F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
49
2. *J?DAT OC@ KMJBM<H OJ KMDIO NCJMO@M JPOKPO RC@I OC@ M@H<DI?@M DN 0. #JM @S<HKG@, RC@I
10 <I? 5 <M@ @IO@M@?, DO NCJPG? IJO KMDIO "10 = 5 * 2 + 0" =PO EPNO OC@ AJGGJRDIB:
10 = 5 * 2
3. 4MDO@ < NDHKG@ ><G>PG<OJM OC<O NPKKJMON OC@ AJPM =<ND> <MDOCH@OD> JK@M<ODJIN. %<Q@ OC@
KMJBM<H G@O OC@ JK@M<ODJI OJ =@ N@G@>O@? AMJH < H@IP <I? <KKGT OC<O JK@M<ODJI OJ OC@ ORJ
Q<GP@N OC<O <M@ @IO@M@?. 6JP ><I DBIJM@ JQ@MAGJR <I? OMPI><ODJI DI OCDN KMJBM<H.
4. 4MDO@ < KMJBM<H OC<O KMDION OC@ Q<GP@N AMJH 1 OJ 10, @<>C JI < N@K<M<O@ GDI@, RDOC OC@
@S>@KODJI JA Q<GP@ 7. !J IJO PN@ M@K@<O@? GDI@N GDF@ OC@ AJGGJRDIB:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
// %P OPU EP UIJT!
XSJUFMO(1);
XSJUFMO(2);
XSJUFMO(3);
XSJUFMO(4);
XSJUFMO(5);
XSJUFMO(6);
XSJUFMO(8);
XSJUFMO(9);
XSJUFMO(10);
^
&INO@<?, DH<BDI@ < Q<MD<=G@ RCJN@ Q<GP@ DN DI>M@H@IO@? DI < GJJK. 6JP H<T I@@? OJ
O<F@ <?Q<IO<B@ JA OC@ ;E @AF 7CG3> FA JK@M<OJM != C@M@.
... F:7 EA>GF;A@E
!@F797DE 3@6 AD;F:?7F;5 %B7D3F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
50
Floating Point Types 16
&I OC@ KM@QDJPN >C<KO@M R@ C<Q@ N@@I OC<O ?@NKDO@ OC@DM @<N@ JA PN@, <MDOCH@OD> JK@M<ODJIN JI
DIO@B@MN <M@ KMJI@ OJ KMJBM<HHDIB @MMJMN ?P@ OJ JQ@MAGJR, PI?@MAGJR, <I? OMPI><ODJI. 4@
C<Q@ <GNJ N@@I OC<O DIO@B@MN ><IIJO C<Q@ Q<GP@N RDOC AM<>ODJI<G K<MON <N DI 1.25.
#GJ<ODIB KJDIO OTK@N <M@ @NK@>D<GGT OJ NPKKJMO AM<>ODJI<G K<MON. 1C@ "KJDIO" DI OC@DM I<H@
>JH@N AMJH OC@ 675;?3> BA;@F <I? "AGJ<ODIB" M@A@MN OJ <I DHKG@H@IO<ODJI ?@O<DG JA CJR OC@N@
OTK@N <M@ DHKG@H@IO@?: OC@ ?@>DH<G KJDIO 8>A3FE G@AO <I? MDBCO <N <KKMJKMD<O@. (1CDN ?@O<DG DN
IJO DHKJMO<IO RC@I PNDIB OC@N@ OTK@N.)
4@ HPNO >JQ@M DHKJMO<IO ?@O<DGN DI OCDN >C<KO@M <N R@GG. B@AJM@ ?JDIB OC<O, & RJPG? GDF@ OJ
BDQ@ < GDNO JA NJH@ JA OC@ DIO@M@NODIB <NK@>ON JA AGJ<ODIB KJDIO OTK@N:
t A??DIB 0.001 < OCJPN<I? ODH@N DN IJO OC@ N<H@ <N <??DIB 1.
t 2NDIB OC@ GJBD><G JK@M<OJMN == <I? != RDOC AGJ<ODIB KJDIO OTK@N DN @MMJI@JPN DI HJNO ><N@N.
t 1C@ DIDOD<G Q<GP@N JA AGJ<ODIB KJDIO OTK@N DN .OBO, IJO 0. .OBO H<T IJO =@ PN@? DI
@SKM@NNDJIN. 4C@I PN@? DI >JHK<MDNJI JK@M<ODJIN, .OBO DN IJO G@NN OC<I IJM BM@<O@M OC<I
<IT Q<GP@.
t 1C@ JQ@MAGJR Q<GP@ DN .JOGJOJUZ <I? OC@ PI?@MAGJR Q<GP@ DN I@B<ODQ@ .JOGJOJUZ.
AGOCJPBC AGJ<ODIB KJDIO OTK@N <M@ HJM@ PN@APG DI NJH@ ><N@N, OC@T C<Q@ K@>PGD<MDOD@N OC<O
@Q@MT KMJBM<HH@M HPNO FIJR. JHK<M@? OJ DIO@B@MN, OC@T <M@ Q@MT BJJ? RDOC <QJD?DIB
OMPI><ODJI =@><PN@ OC@DM H<DI KPMKJN@ DN OJ NPKKJMO AM<>ODJI<G Q<GP@N. )DF@ <IT JOC@M OTK@,
=@DIB =<N@? JI >@MO<DI IPH=@MN JA =DON, OC@T OJJ <M@ KMJI@ OJ JQ@MAGJR <I? PI?@MAGJR, =PO
>JHK<M@? OJ DIO@B@MN, OC@ M<IB@ JA Q<GP@N OC<O OC@T ><I NPKKJMO DN Q<NO. A??DODJI<GGT, DINO@<?
JA =@DIB NDG@IO DI OC@ ><N@ JA JQ@MAGJR <I? PI?@MAGJR, OC@T B@O OC@ NK@>D<G Q<GP@N JA KJNDODQ@
<I? I@B<ODQ@ ;@8;@;FK.
AN < M@HDI?@M, <GG JA OC@ AGJ<ODIB KJDIO OTK@N <M@ OC@ AJGGJRDIB:
5ZQF /VNCFS PG #JUT *OJUJBM
7BMVF
GMPBU 32 GMPBU.OBO
EPVCMF 64 EPVCMF.OBO
SFBM BU MFBTU 64, NBZCF NPSF
(F.H. 80, EFQFOEJOH PO IBSEXBSF
TVQQPSU)
SFBM.OBO
Floating point type properties
16.1
#GJ<ODIB KJDIO OTK@N C<Q@ HJM@ KMJK@MOD@N OC<I JOC@M OTK@N:
t .TUSJOHPG DN OC@ I<H@ JA OC@ OTK@.
t .TJ[FPG DN OC@ G@IBOC JA OC@ OTK@ DI O@MHN JA =TO@N. (&I JM?@M OJ ?@O@MHDI@ OC@ =DO >JPIO,
OCDN Q<GP@ HPNO =@ HPGODKGD@? =T 8, OC@ IPH=@M JA =DON DI < =TO@.)
t .NBY DN OC@ NCJMO AJM "H<SDHPH" <I? DN OC@ H<SDHPH Q<GP@ OC<O OC@ OTK@ ><I C<Q@; OC@
I@B<ODQ@ JA OCDN Q<GP@ DN OC@ HDIDHPH Q<GP@ OC<O OC@ OTK@ ><I C<Q@.
t .NJO@OPSNBM DN OC@ NH<GG@NO IJMH<GDU@? Q<GP@ OC<O OCDN OTK@ ><I C<Q@ (OC@ OTK@ ><I C<Q@
NH<GG@M Q<GP@N OC<I .NJO@OPSNBM =PO OC@ KM@>DNDJI JA OCJN@ Q<GP@N <M@ G@NN OC<I OC@
IJMH<G KM@>DNDJI JA OC@ OTK@).
t .EJH DN OC@ NCJMO AJM "?DBDON" <I? NK@>DAD@N OC@ IPH=@M JA ?DBDON OC<O NDBIDAT OC@ KM@>DNDJI
JA OC@ OTK@.
t .JOGJOJUZ DN OC@ NK@>D<G Q<GP@ PN@? OJ ?@IJO@ JQ@MAGJR <I? PI?@MAGJR.
F>A3F;@9 &A;@F )KB7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
51
+JO@ OC<O OC@ HDIDHPH Q<GP@ JA AGJ<ODIB KJDIO OTK@N DN IJO .NJO =PO OC@ I@B<ODQ@ JA .NBY, @.B.
OC@ HDIDHPH Q<GP@ JA EPVCMF DN -EPVCMF.NBY.
,OC@M KMJK@MOD@N JA AGJ<ODIB KJDIO OTK@N <M@ PN@? G@NN >JHHJIGT. 6JP ><I N@@ <GG JA OC@H <O
-MJK@MOD@N AJM #GJ<ODIB -JDIO 1TK@N.
1C@ KMJK@MOD@N JA AGJ<ODIB KJDIO OTK@N <I? OC@DM M@G<ODJIN ><I =@ NCJRI JI < IPH=@M GDI@ GDF@
OC@ AJGGJRDIB:
+ +-----------+------------+ .... + .... +----------+----------+ +
] -NBY -1 ] 0 ] 1 NBY ]
-JOGJOJUZ -NJO@OPSNBM NJO@OPSNBM JOGJOJUZ
1C@ ?<NC@? KJMODJIN JA OC@ GDI@ <=JQ@ <M@ OJ N><G@: OC@ IPH=@M JA Q<GP@N OC<O ><I =@
M@KM@N@IO@? =@OR@@I NJO@OPSNBM <I? 1 DN @LP<G OJ OC@ IPH=@M JA Q<GP@N OC<O ><I =@
M@KM@N@IO@? =@OR@@I 1 <I? NBY. 1CDN H@<IN OC<O OC@ KM@>DNDJI JA OC@ AM<>ODJI<G K<MON JA OC@
Q<GP@N OC<O <M@ =@OR@@I NJO@OPSNBM <I? 1 <M@ Q@MT CDBC. (1C@ N<H@ DN OMP@ AJM OC@ I@B<ODQ@
ND?@ <N R@GG.)
.nan
16.2
4@ C<Q@ <GM@<?T N@@I OC<O OCDN DN OC@ ?@A<PGO Q<GP@ JA AGJ<ODIB KJDIO Q<MD<=G@N. .OBO H<T
<KK@<M <N < M@NPGO JA H@<IDIBG@NN AGJ<ODIB KJDIO @SKM@NNDJIN <N R@GG. #JM @S<HKG@ OC@ AGJ<ODIB
KJDIO @SKM@NNDJIN DI OC@ AJGGJRDIB KMJBM<H <GG KMJ?P>@ EPVCMF.OBO:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
EPVCMF [FSP = 0;
EPVCMF JOGJOJUZ = EPVCMF.JOGJOJUZ;
XSJUFMO("BOZ FYQSFTTJPO XJUI OBO: ", EPVCMF.OBO + 1);
XSJUFMO("[FSP / [FSP : ", [FSP / [FSP);
XSJUFMO("[FSP * JOGJOJUZ : ", [FSP * JOGJOJUZ);
XSJUFMO("JOGJOJUZ / JOGJOJUZ : ", JOGJOJUZ / JOGJOJUZ);
XSJUFMO("JOGJOJUZ - JOGJOJUZ : ", JOGJOJUZ - JOGJOJUZ);
^
Specifying floating point values
16.3
#GJ<ODIB KJDIO Q<GP@N ><I NDHKGT =@ NK@>DAD@? <N DIO@B@MN RDOCJPO < ?@>DH<G KJDIO GDF@ 123, JM
RDOC < ?@>DH<G KJDIO GDF@ 12.3.
#GJ<ODIB KJDIO Q<GP@N ><I <GNJ =@ NK@>DAD@? RDOC OC@ NK@>D<G AGJ<ODIB KJDIO NTIO<S <N DI
1.23F+4. 1C@ F+ K<MO DI OC<O NTIO<S ><I =@ M@<? <N "ODH@N 10 OJ OC@ KJR@M JA". A>>JM?DIB OJ
OC<O M@<?DIB, OC@ KM@QDJPN Q<GP@ DN "1.23 ODH@N 10 OJ OC@ KJR@M JA 4", RCD>C DN OC@ N<H@ <N
"1.23 ODH@N 10
4
", RCD>C DI OPMI DN OC@ N<H@ <N 1.23S10000, =@DIB @LP<G OJ 12300.
&A OC@ Q<GP@ <AO@M F DN I@B<ODQ@ <N DI 5.67F-3, OC@I DO DN M@<? <N "?DQD?@? =T 10 OJ OC@ KJR@M
JA". A>>JM?DIBGT, OCDN @S<HKG@ DN "5.67 ?DQD?@? =T 10
3
", RCD>C DI OPMI DN OC@ N<H@ <N 5.67/
1000, =@DIB @LP<G OJ 0.00567.
1C@ Q<GP@N OC<O <M@ KMDIO@? =T OC@ AJGGJRDIB KMJBM<H <M@ <GG DI OC@ AGJ<ODIB KJDIO AJMH<O. 1C@
KMJBM<H KMDION OC@ KMJK@MOD@N JA OC@ OCM@@ OTK@N:
JNQPSU TUE.TUEJP;
WPJE NBJO()
F>A3F;@9 &A;@F )KB7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
52
\
XSJUFMO("5ZQF : ", GMPBU.TUSJOHPG);
XSJUFMO("1SFDJTJPO : ", GMPBU.EJH);
XSJUFMO(".JOJNVN OPSNBMJ[FE WBMVF: ", GMPBU.NJO@OPSNBM);
XSJUFMO(".BYJNVN WBMVF : ", GMPBU.NBY);
XSJUFMO(".JOJNVN WBMVF : ", -GMPBU.NBY);
XSJUFMO();
XSJUFMO("5ZQF : ", EPVCMF.TUSJOHPG);
XSJUFMO("1SFDJTJPO : ", EPVCMF.EJH);
XSJUFMO(".JOJNVN OPSNBMJ[FE WBMVF: ", EPVCMF.NJO@OPSNBM);
XSJUFMO(".BYJNVN WBMVF : ", EPVCMF.NBY);
XSJUFMO(".JOJNVN WBMVF : ", -EPVCMF.NBY);
XSJUFMO();
XSJUFMO("5ZQF : ", SFBM.TUSJOHPG);
XSJUFMO("1SFDJTJPO : ", SFBM.EJH);
XSJUFMO(".JOJNVN OPSNBMJ[FE WBMVF: ", SFBM.NJO@OPSNBM);
XSJUFMO(".BYJNVN WBMVF : ", SFBM.NBY);
XSJUFMO(".JOJNVN WBMVF : ", -SFBM.NBY);
^
1C@ JPOKPO JA OC@ KMJBM<H DN OC@ AJGGJRDIB DI HT @IQDMJIH@IO. 0DI>@ SFBM ?@K@I?N JI OC@
C<M?R<M@, TJP H<T B@O < ?DAA@M@IO JPOKPO AJM DO:
5ZQF : GMPBU
1SFDJTJPO : 6
.JOJNVN OPSNBMJ[FE WBMVF: 1.17549F-38
.BYJNVN WBMVF : 3.40282F+38
.JOJNVN WBMVF : -3.40282F+38
5ZQF : EPVCMF
1SFDJTJPO : 15
.JOJNVN OPSNBMJ[FE WBMVF: 2.22507F-308
.BYJNVN WBMVF : 1.79769F+308
.JOJNVN WBMVF : -1.79769F+308
5ZQF : SFBM
1SFDJTJPO : 18
.JOJNVN OPSNBMJ[FE WBMVF: 3.3621F-4932
.BYJNVN WBMVF : 1.18973F+4932
.JOJNVN WBMVF : -1.18973F+4932
Observations 16.3.1
AN TJP RDGG M@H@H=@M AMJH OC@ KM@QDJPN >C<KO@M, OC@ H<SDHPH Q<GP@ JA VMPOH C<N 20 ?DBDON:
18,446,744,073,709,551,616. 1C<O Q<GP@ GJJFN NH<GG RC@I >JHK<M@? OJ @Q@I OC@ NH<GG@NO
AGJ<ODIB KJDIO OTK@: GMPBU ><I C<Q@ Q<GP@N PK OJ OC@ 10
38
M<IB@, @.B.
340,282,000,000,000,000,000,000,000,000,000,000,000.
1C@ H<SDHPH Q<GP@ JA SFBM DN DI OC@ M<IB@ 10
4932
, < Q<GP@ RDOC HJM@ OC<I 4900 ?DBDON!
AN <IJOC@M J=N@MQ<ODJI, G@O'N GJJF <O OC@ HDIDHPH Q<GP@ OC<O EPVCMF ><I M@KM@N@IO RDOC
15-?DBDO KM@>DNDJI: 0.000...F:7D7 3D7 300 ?AD7 L7DA7E :7D7...0000222507. (*JM@ KM@>DN@GT, OC@
G<NO K<MO DN ...222507385850720.)
Overflow and underflow are not ignored
16.4
!@NKDO@ =@DIB <=G@ OJ O<F@ Q@MT G<MB@ Q<GP@N, AGJ<ODIB KJDIO OTK@N OJJ <M@ KMJI@ OJ JQ@MAGJR
<I? PI?@MAGJR. 1C@ AGJ<ODIB KJDIO OTK@N <M@ N<A@M OC<I DIO@B@M OTK@N DI OCDN M@B<M? =@><PN@
F>A3F;@9 &A;@F )KB7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
53
JQ@MAGJR <I? PI?@MAGJR <M@ IJO DBIJM@?. 1C@ Q<GP@N OC<O JQ@MAGJR =@>JH@ .JOGJOJUZ, <I?
OC@ Q<GP@N OC<O PI?@MAGJR =@>JH@ -.JOGJOJUZ. 1J N@@ OCDN, G@O'N DI>M@H@IO OC@ Q<GP@ JA .NBY
=T 10%. 0DI>@ OC@ Q<GP@ DN <GM@<?T <O OC@ H<SDHPH, DI>M@H@IODIB =T 10% RJPG? JQ@MAGJR:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
SFBM WBMVF = SFBM.NBY;
XSJUFMO("#FGPSF : ", WBMVF);
// .VMUJQMZJOH XJUI 1.1 JT UIF TBNF BT NBLJOH 110%
WBMVF *= 1.1;
XSJUFMO(""EEFE 10% : ", WBMVF);
// -FU'T USZ UP NBLF JU MFTT CZ EJWJEJOH JO IBMG
WBMVF /= 2;
XSJUFMO("%JWJEFE JO IBMG: ", WBMVF);
^
,I>@ OC@ Q<GP@ JQ@MAGJRN <I? =@>JH@N SFBM.JOGJOJUZ, DO M@H<DIN OC<O R<T @Q@I <AO@M =@DIB
?DQD?@? DI C<GA:
#FGPSF : 1.18973F+4932
"EEFE 10% : JOG
%JWJEFE JO IBMG: JOG
Precision
16.5
-M@>DNDJI DN < >JI>@KO OC<O R@ >JH@ <>MJNN DI ?<DGT GDA@ =PO IJO O<GF <=JPO HP>C. -M@>DNDJI DN
OC@ IPH=@M JA ?DBDON OC<O DN PN@? RC@I NK@>DATDIB < Q<GP@. #JM @S<HKG@, RC@I R@ N<T OC<O OC@
OCDM? JA 100 DN 33, OC@ KM@>DNDJI DN 2 =@><PN@ 33 C<N 2 ?DBDON. 4C@I OC@ Q<GP@ DN NK@>DAD@?
HJM@ KM@>DN@GT GDF@ 33.33, OC@I OC@ KM@>DNDJI DN 4 ?DBDON.
1C@ IPH=@M JA =DON OC<O @<>C AGJ<ODIB OTK@ C<N IJO JIGT @AA@>ON DON H<SDHPH Q<GP@, =PO <GNJ DON
KM@>DNDJI. 1C@ BM@<O@M OC@ IPH=@M JA =DON, OC@ HJM@ KM@>DN@ OC@ Q<GP@N.
There is no truncation in division
16.6
AN R@ C<Q@ N@@I DI OC@ KM@QDJPN >C<KO@M, DIO@B@M ?DQDNDJI ><IIJO KM@N@MQ@ OC@ AM<>ODJI<G K<MO
JA OC@ M@NPGO:
JOU GJSTU = 3;
JOU TFDPOE = 2;
XSJUFMO(GJSTU / TFDPOE);
,POKPO:
1
#GJ<ODIB KJDIO OTK@N ?JI'O C<Q@ OCDN FDG@53F;A@ KMJ=G@H; OC@T <M@ NK@>DAD><GGT AJM KM@N@MQDIB
OC@ AM<>ODJI<G K<MON:
EPVCMF GJSTU = 3;
EPVCMF TFDPOE = 2;
XSJUFMO(GJSTU / TFDPOE);
F>A3F;@9 &A;@F )KB7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
54
,POKPO:
1.5
1C@ <>>PM<>T JA OC@ AM<>ODJI<G K<MO ?@K@I?N JI OC@ KM@>DNDJI JA OC@ OTK@: SFBM C<N OC@ CDBC@NO
KM@>DNDJI <I? GMPBU C<N OC@ GJR@NO KM@>DNDJI.
Which type to use
16.7
2IG@NN OC@M@ DN < NK@>DAD> M@<NJI JOC@MRDN@, TJP ><I >CJJN@ EPVCMF AJM AGJ<ODIB KJDIO Q<GP@N.
GMPBU C<N Q@MT GJR KM@>DNDJI =PO =@><PN@ JA =@DIB NH<GG@M OC<I OC@ JOC@M OTK@N, DO H<T =@
PN@APG RC@I NOJM<B@ NK<>@ DN GDHDO@?. ,I OC@ JOC@M C<I?, NDI>@ OC@ KM@>DNDJI JA SFBM DN CDBC@M
OC<I EPVCMF JI NJH@ C<M?R<M@, DO RJPG? =@ KM@A@M<=G@ AJM CDBC KM@>DNDJI ><G>PG<ODJIN.
Cannot represent all values
16.8
4@ ><IIJO M@KM@N@IO >@MO<DI Q<GP@N DI JPM ?<DGT GDQ@N. &I OC@ ?@>DH<G NTNO@H OC<O R@ PN@ ?<DGT,
OC@ ?DBDON =@AJM@ OC@ ?@>DH<G KJDIO M@KM@N@IO JI@N, O@IN, CPI?M@?N, @O>. <I? OC@ ?DBDON <AO@M
OC@ ?@>DH<G KJDIO M@KM@N@IO O@IOCN, CPI?M@OCN, OCJPN<I?OCN, @O>.
&A < Q<GP@ DN <I @S<>O >JH=DI<ODJI JA OC@N@ Q<GP@N, DO ><I =@ M@KM@N@IO@? KM@>DN@GT. #JM
@S<HKG@, =@><PN@ OC@ Q<GP@ 0.23 >JINDNON JA 2 O@IOCN <I? 3 CPI?M@OCN DO DN M@KM@N@IO@?
KM@>DN@GT. ,I OC@ JOC@M C<I?, OC@ Q<GP@ JA 1/3 ><IIJO =@ M@KM@N@IO@? DI OC@ ?@>DH<G NTNO@H
=@><PN@ DO DN I@Q@M NPAAD>D@IO IJ H<OO@M CJR H<IT ?DBDON <M@ NK@>DAD@?: 0.33333...
&O DN Q@MT NDHDG<M RDOC OC@ AGJ<ODIB KJDIO OTK@N. B@><PN@ OC@N@ OTK@N <M@ =<N@? JI >@MO<DI
IPH=@MN JA =DON, OC@T ><IIJO M@KM@N@IO @Q@MT Q<GP@.
1C@ ?DAA@M@I>@ RDOC OC@ =DI<MT NTNO@H OC<O OC@ >JHKPO@MN PN@ DN OC<O OC@ ?DBDON =@AJM@ OC@
?@>DH<G KJDIO <M@ JI@N, ORJN, AJPMN, @O>. <I? OC@ ?DBDON <AO@M OC@ ?@>DH<G KJDIO <M@ C<GQ@N,
LP<MO@MN, @DBCOCN, @O>. ,IGT OC@ Q<GP@N OC<O <M@ @S<>O >JH=DI<ODJIN JA OCJN@ ?DBDON ><I =@
M@KM@N@IO@? KM@>DN@GT.
A Q<GP@ OC<O ><IIJO =@ M@KM@N@IO@? DI >JHKPO@MN DN 0.1 <N DI 10 >@ION. AGOCJPBC OCDN Q<GP@
><I =@ M@KM@N@IO@? KM@>DN@GT DI OC@ ?@>DH<G NTNO@H, DON =DI<MT M@KM@N@IO<ODJI I@Q@M @I?N <I?
>JIODIPJPNGT M@K@<ON AJPM ?DBDON <N 0.0001100110011... (+JO@ OC<O DO DN RMDOO@I DI =DI<MT
NTNO@H, IJO ?@>DH<G.) &O DN <GR<TN DI<>>PM<O@ <O NJH@ G@Q@G ?@K@I?DIB JI OC@ KM@>DNDJI JA OC@
AGJ<ODIB KJDIO OTK@ OC<O DN PN@?.
1C@ AJGGJRDIB KMJBM<H ?@HJINOM<O@N OCDN KMJ=G@H. 1C@ Q<GP@ JA < Q<MD<=G@ DN =@DIB
DI>M@H@IO@? =T 0.001 < OCJPN<I? ODH@N DI < GJJK. 0PMKMDNDIBGT, OC@ M@NPGO DN IJO 1:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
GMPBU SFTVMU = 0;
// 8F XPVME FYQFDU UIF SFTVMU UP CF 1 BGUFS MPPQJOH 1000
// UJNFT:
XIJMF (SFTVMU < 1) \
SFTVMU += 0.001;
^
// -FU'T WBMJEBUF
JG (SFTVMU == 1) \
XSJUFMO(""T FYQFDUFE: 1");
^ FMTF \
F>A3F;@9 &A;@F )KB7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
55
XSJUFMO("%*''&3&/5: ", SFTVMU);
^
^
%*''&3&/5: 1.00099
B@><PN@ 0.001 ><IIJO =@ M@KM@N@IO@? KM@>DN@GT, OC<O DI<>>PM<>T <AA@>ON OC@ M@NPGO HPGODKG@
ODH@N. 1C@ JPOKPO NPBB@NON OC<O OC@ GJJK C<N =@@I M@K@<O@? 1001 ODH@N.
Comparing floating point values
16.9
4@ C<Q@ N@@I OC@ AJGGJRDIB >JHK<MDNJI JK@M<ODJIN AJM DIO@B@MN: @LP<G OJ (==), IJO @LP<G OJ
(!=), G@NN OC<I (<), BM@<O@M OC<I (>), G@NN OC<I JM @LP<G OJ (<=), <I? BM@<O@M OC<I JM @LP<G OJ
(>=). #GJ<ODIB KJDIO OTK@N C<Q@ H<IT HJM@ >JHK<MDNJI JK@M<OJMN.
0DI>@ OC@ NK@>D<G Q<GP@ .OBO M@KM@N@ION DIQ<GD? AGJ<ODIB KJDIO Q<GP@N, DO H<T IJO =@ >JHK<M@?
RDOC <IT JOC@M Q<GP@. #JM @S<HKG@, DO DN H@<IDIBG@NN OJ <NF RC@OC@M .OBO JM 1 DN BM@<O@M.
#JM OC<O M@<NJI, AGJ<ODIB KJDIO Q<GP@N DIOMJ?P>@ <IJOC@M >JHK<MDNJI >JI>@KO: PIJM?@M@?.
B@DIB PIJM?@M@? H@<IN OC<O <O G@<NO JI@ JA OC@ Q<GP@N DN .OBO.
1C@ AJGGJRDIB O<=G@ DI>GP?@N <GG JA OC@ AGJ<ODIB KJDIO >JHK<MDNJI JK@M<OJMN. AGG JA OC@
JK@M<OJMN <M@ =DI<MT JK@M<OJMN (H@<IDIB OC<O OC@T O<F@ ORJ JK@M<I?N) <I? PN@? <N DI
MFGU == SJHIU. 1C@ >JGPHIN OC<O >JIO<DI GBMTF <I? USVF <M@ OC@ M@NPGON JA OC@ >JHK<MDNJI
JK@M<ODJIN.
1C@ G<NO >JGPHI DI?D><O@N RC@OC@M OC@ JK@M<ODJI DN H@<IDIBAPG DA JI@ JA OC@ JK@M<I?N DN .OBO.
#JM @S<HKG@, @Q@I OCJPBC OC@ M@NPGO JA OC@ @SKM@NNDJI 1.2 < SFBM.OBO DN GBMTF, OC<O M@NPGO
DN H@<IDIBG@NN =@><PN@ JI@ JA OC@ JK@M<I?N DN SFBM.OBO. 1C@ M@NPGO JA OC@ M@Q@MN@
>JHK<MDNJI SFBM.OBO < 1.2 RJPG? KMJ?P>@ GBMTF <N R@GG. 1C@ <=M@QD<ODJI GCN NO<I?N AJM
>78F-:3@6 E;67, DI?D><ODIB OC@ @SKM@NNDJI JI OC@ G@AO-C<I? ND?@ JA @<>C JK@M<OJM.
0QFSBUPS .FBOJOH
*G MIT
JT
HSFBUFS
*G
MIT
JT
MFTT
*G
CPUI
BSF
FRVBM
*G BU
MFBTU
POF JT
.OBO
.FBOJOHGVM
XJUI .OBO
== JT FRVBM UP GBMTF GBMTF USVF GBMTF ZFT
!= JT OPU FRVBM UP USVF USVF GBMTF USVF ZFT
> JT HSFBUFS UIBO USVF GBMTF GBMTF GBMTF OP
>= JT HSFBUFS UIBO PS FRVBM UP USVF GBMTF USVF GBMTF OP
< JT MFTT UIBO GBMTF USVF GBMTF GBMTF OP
<= JT MFTT UIBO PS FRVBM UP GBMTF USVF USVF GBMTF OP
!<>= JT OPU MFTT UIBO, OPU HSFBUFS
UIBO, OPS FRVBM UP
GBMTF GBMTF GBMTF USVF ZFT
<> JT MFTT UIBO PS HSFBUFS UIBO USVF USVF GBMTF GBMTF OP
<>= JT MFTT UIBO, HSFBUFS UIBO, PS
FRVBM UP
USVF USVF USVF GBMTF OP
!<= JT OPU MFTT UIBO OPS FRVBM UP USVF GBMTF GBMTF USVF ZFT
!< JT OPU MFTT UIBO USVF GBMTF USVF USVF ZFT
!>= JT OPU HSFBUFS UIBO OPS FRVBM UP GBMTF USVF GBMTF USVF ZFT
!> JT OPU HSFBUFS UIBO GBMTF USVF USVF USVF ZFT
!<> JT OPU MFTT UIBO OPS HSFBUFS
UIBO
GBMTF GBMTF USVF USVF ZFT
F>A3F;@9 &A;@F )KB7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
56
+JO@ OC<O DO H<F@N N@IN@ OJ PN@ .OBO RDOC <IT JK@M<OJM OC<O >JIO<DIN ;E @AF DI DON H@<IDIB,
<I? OC@ M@NPGO DN <GR<TN USVF. .OBO IJO =@DIB < Q<GD? Q<GP@ H<F@N OC@ M@NPGON JA HJNO
>JHK<MDNJIN OJ C<Q@ @AF DI OC@DM H@<IDIBN.
JT/B/() for .OBO equality comparison 16.9.1
B@><PN@ OC@ M@NPGO RJPG? <GR<TN =@ GBMTF <>>JM?DIB OJ OC@ KM@QDJPN O<=G@, DO DN IJO KJNND=G@
OJ PN@ OC@ == JK@M<OJM OJ ?@O@MHDI@ RC@OC@M OC@ Q<GP@ JA < AGJ<ODIB KJDIO Q<MD<=G@ DN .OBO:
JG (WBSJBCMF == EPVCMF.OBO) \ // j 830/(
// ...
^
#JM OC<O M@<NJI, OC@ JT/B/() API>ODJI AMJH OC@ TUE.NBUI HJ?PG@ HPNO =@ PN@?:
JNQPSU TUE.NBUI;
// ...
JG (JT/B/(WBSJBCMF)) \ // j DPSSFDU
// ...
^
0DHDG<MGT, OJ ?@O@MHDI@ RC@OC@M < Q<GP@ DN @AF .OBO, JI@ HPNO PN@ !JT/B/(), =@><PN@
JOC@MRDN@ OC@ != JK@M<OJM RJPG? <GR<TN KMJ?P>@ USVF.
Exercises
16.10
1. *J?DAT OC@ ><G>PG<OJM AMJH OC@ KM@QDJPN >C<KO@M OJ NPKKJMO AGJ<ODIB KJDIO OTK@N. 1C@ I@R
><G>PG<OJM RJPG? RJMF HJM@ <>>PM<O@GT RDOC OC<O >C<IB@. 4C@I OMTDIB OC@ ><G>PG<OJM, TJP
><I @IO@M AGJ<ODIB KJDIO Q<GP@N DI Q<MDJPN AJMH<ON <N DI 1000, 1.23, <I? 1.23@4.
2. 4MDO@ < KMJBM<H OC<O M@<?N 5 AGJ<ODIB KJDIO Q<GP@N AMJH OC@ DIKPO. *<F@ OC@ KMJBM<H KMDIO
ADMNO ORD>@ JA OCJN@ Q<GP@N <I? OC@I JI@ ADAOC JA OCJN@ Q<GP@N.
1CDN @S@M>DN@ DN < KM@K<M<ODJI AJM OC@ <MM<T >JI>@KO JA OC@ I@SO >C<KO@M. &A TJP RMDO@
OCDN KMJBM<H RDOC RC<O TJP C<Q@ N@@I NJ A<M, TJP RDGG PI?@MNO<I? <MM<TN @<ND@M <I?
<KKM@>D<O@ OC@H HJM@.
... F:7 EA>GF;A@E
F>A3F;@9 &A;@F )KB7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
57
Arrays 17
4@ C<Q@ ?@ADI@? ADQ@ Q<MD<=G@N DI JI@ JA OC@ @S@M>DN@N JA OC@ G<NO >C<KO@M, <I? PN@? OC@H DI
>@MO<DI ><G>PG<ODJIN. 1C@ ?@ADIDODJIN JA OCJN@ Q<MD<=G@N R@M@ OC@ AJGGJRDIB:
EPVCMF WBMVF@1;
EPVCMF WBMVF@2;
EPVCMF WBMVF@3;
EPVCMF WBMVF@4;
EPVCMF WBMVF@5;
1CDN H@OCJ? JA ?@ADIDIB Q<MD<=G@N DI?DQD?P<GGT ?J@N IJO N><G@ OJ ><N@N RC@M@ @Q@I HJM@
Q<MD<=G@N <M@ I@@?@?. &H<BDI@ I@@?DIB < OCJPN<I? Q<GP@N; DO DN <GHJNO DHKJNND=G@ OJ ?@ADI@ <
OCJPN<I? Q<MD<=G@N AMJH WBMVF@1 OJ WBMVF@1000.
AMM<TN <M@ PN@APG DI NP>C ><N@N: 1C@ <MM<T A@<OPM@ <GGJRN OC@ ?@ADIDODJI JA H<IT Q<GP@N
OJB@OC@M. AMM<TN <M@ <GNJ OC@ HJNO >JHHJI ?<O< NOMP>OPM@ RC@I HPGODKG@ Q<GP@N <M@ PN@?
OJB@OC@M <N < >JGG@>ODJI.
1CDN >C<KO@M >JQ@MN JIGT NJH@ JA OC@ A@<OPM@N JA <MM<TN. *JM@ A@<OPM@N RDGG =@ DIOMJ?P>@? DI <
G<O@M >C<KO@M.
Definition
17.1
1C@ ?@ADIDODJI JA <MM<TN DN Q@MT NDHDG<M OJ OC@ ?@ADIDODJI JA Q<MD<=G@N. 1C@ JIGT ?DAA@M@I>@ DN
OC<O OC@ IPH=@M JA Q<MD<=G@N OC<O <M@ =@DIB ?@ADI@? <O OC@ N<H@ ODH@ DN NK@>DAD@? DI NLP<M@
=M<>F@ON. 4@ ><I >JIOM<NO OC@ ORJ ?@ADIDODJIN <N AJGGJRN:
JOU TJOHMF7BSJBCMF;
JOU<10> BSSBZ0G5FO7BSJBCMFT;
1C@ ADMNO GDI@ <=JQ@ DN OC@ ?@ADIDODJI JA < NDIBG@ Q<MD<=G@, EPNO GDF@ OC@ Q<MD<=G@N OC<O R@ C<Q@
?@ADI@? NJ A<M. 1C@ N@>JI? GDI@ DN OC@ ?@ADIDODJI JA <I <MM<T >JINDNODIB JA 10 Q<MD<=G@N.
A>>JM?DIBGT, OC@ @LPDQ<G@IO JA OC@ ADQ@ N@K<M<O@ Q<MD<=G@N <=JQ@ ><I =@ ?@ADI@? <N <I <MM<T JA
ADQ@ Q<MD<=G@N PNDIB OC@ AJGGJRDIB NTIO<S:
EPVCMF<5> WBMVFT;
1C<O ?@ADIDODJI ><I =@ M@<? <N 5 6AG4>7 H3>G7E. +JO@ OC<O & C<Q@ >CJN@I OC@ I<H@ JA OC@ <MM<T
<N KGPM<G OJ <QJD? >JIAPNDIB DO RDOC < NDIBG@ Q<MD<=G@.
&I NPHH<MT, OC@ ?@ADIDODJI JA <I <MM<T >JINDNON JA OC@ OTK@ JA OC@ Q<MD<=G@N, OC@ IPH=@M JA
Q<MD<=G@N, <I? OC@ I<H@ JA OC@ <MM<T:
type_name<variable_count> array_name;
1C@ OTK@ JA OC@ Q<MD<=G@N ><I <GNJ =@ < PN@M-?@ADI@? OTK@. (4@ RDGG N@@ PN@M-?@ADI@? OTK@N
G<O@M.) #JM @S<HKG@:
// "O BSSBZ UIBU IPMET UIF XFBUIFS JOGPSNBUJPO PG BMM
// DJUJFT. )FSF, UIF CPPM WBMVFT NBZ NFBO
// GBMTF: PWFSDBTU
// USVF : TVOOZ
CPPM<DJUZ$PVOU> XFBUIFS$POEJUJPOT;
// "O BSSBZ UIBU IPMET UIF XFJHIUT PG B IVOESFE CPYFT
EPVCMF<100> CPY8FJHIUT;
ADD3KE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
58
// *OGPSNBUJPO BCPVU UIF TUVEFOUT PG B TDIPPM
4UVEFOU*OGPSNBUJPO<TUVEFOU$PVOU> TUVEFOU*OGPSNBUJPOT;
Containers and elements
17.2
!<O< NOMP>OPM@N OC<O =MDIB @G@H@ION JA < >@MO<DI OTK@ OJB@OC@M <M@ ><GG@? 5A@F3;@7DE.
A>>JM?DIB OJ OCDN ?@ADIDODJI, <MM<TN <M@ >JIO<DI@MN. #JM @S<HKG@, <I <MM<T OC<O CJG?N OC@ <DM
O@HK@M<OPM@N JA OC@ ?<TN DI 'PGT ><I =MDIB 31 EPVCMF Q<MD<=G@N OJB@OC@M <I? AJMH 3 5A@F3;@7D
A8 7>7?7@FE A8 FKB7 double.
1C@ Q<MD<=G@N JA < >JIO<DI@M <M@ ><GG@? 7>7?7@FE. 1C@ IPH=@M JA @G@H@ION JA <I <MM<T DN
><GG@? OC@ >7@9F: JA OC@ <MM<T.
Accessing the elements
17.3
&I JM?@M OJ ?DAA@M@IOD<O@ OC@ Q<MD<=G@N DI OC@ @S@M>DN@ JA OC@ KM@QDJPN >C<KO@M, R@ C<? OJ
<KK@I? <I PI?@MN>JM@ <I? < IPH=@M OJ OC@DM I<H@N <N DI WBMVF@1. 1CDN DN IJO KJNND=G@ IJM
I@>@NN<MT RC@I OC@ Q<MD<=G@N <M@ ?@ADI@? OJB@OC@M <N < NDIBG@ <MM<T PI?@M < NDIBG@ I<H@.
&INO@<?, OC@ @G@H@ION <M@ <>>@NN@? =T NK@>DATDIB OC@ 7>7?7@F @G?47D RDOCDI NLP<M@ =M<>F@ON:
WBMVFT<0>
1C<O @SKM@NNDJI ><I =@ M@<? <N F:7 7>7?7@F I;F: F:7 @G?47D 0 A8 F:7 3DD3K @3?76 H3>G7E. &I
JOC@M RJM?N, DINO@<? JA OTKDIB WBMVF@1 JI@ HPNO OTK@ WBMVFT<0> RDOC <MM<TN.
1C@M@ <M@ ORJ DHKJMO<IO KJDION RJMOC NOM@NNDIB C@M@:
t The numbers start with zero: AGOCJPBC CPH<IN <NNDBI IPH=@MN OJ DO@HN NO<MODIB RDOC
1, OC@ IPH=@MN DI <MM<TN NO<MO RDOC 0. 1C@ Q<GP@N OC<O R@ C<Q@ IPH=@M@? <N 1, 2, 3, 4, <I?
5 =@AJM@ <M@ IPH=@M@? <N 0, 1, 2, 3, <I? 4 DI OC@ <MM<T. 1CDN Q<MD<ODJI DN < >JHHJI ><PN@
JA KMJBM<HHDIB @MMJMN.
t Two different uses of the <> characters: !JI'O >JIAPN@ OC@ ORJ N@K<M<O@ PN@N JA OC@ <>
>C<M<>O@MN. 4C@I ?@ADIDIB <MM<TN, OC@ <> >C<M<>O@MN <M@ RMDOO@I <AO@M OC@ OTK@ JA OC@
@G@H@ION <I? NK@>DAT OC@ IPH=@M JA @G@H@ION. 4C@I <>>@NNDIB @G@H@ION, OC@ <>
>C<M<>O@MN <M@ RMDOO@I <AO@M OC@ I<H@ JA OC@ <MM<T <I? NK@>DAT OC@ IPH=@M JA OC@ @G@H@IO
OC<O DN =@DIB <>>@NN@?:
// 5IJT JT B EFGJOJUJPO. *U EFGJOFT BO BSSBZ UIBU DPOTJTUT
// PG 12 FMFNFOUT. 5IJT BSSBZ JT VTFE UP IPME UIF OVNCFS
// PG EBZT JO FBDI NPOUI.
JOU<12> NPOUI%BZT;
// 5IJT JT BO BDDFTT. *U BDDFTTFT UIF FMFNFOU UIBU
// DPSSFTQPOET UP %FDFNCFS BOE TFUT JUT WBMVF UP 31.
NPOUI%BZT<11> = 31;
// 5IJT JT BOPUIFS BDDFTT. *U BDDFTTFT UIF FMFNFOU UIBU
// DPSSFTQPOET UP +BOVBSZ, UIF WBMVF PG XIJDI JT QBTTFE UP
// XSJUFMO.
XSJUFMO("+BOVBSZ IBT ", NPOUI%BZT<0>, " EBZT.");
Reminder: 1C@ @G@H@IO IPH=@MN JA '<IP<MT <I? !@>@H=@M <M@ 0 <I? 11
M@NK@>ODQ@GT; IJO 1 <I? 12.
ADD3KE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
59
Index
17.4
1C@ IPH=@M JA <I @G@H@IO DN ><GG@? DON ;@67J <I? OC@ <>O JA <>>@NNDIB <I @G@H@IO DN ><GG@?
;@67J;@9.
AI DI?@S I@@? IJO =@ < >JINO<IO Q<GP@; OC@ Q<GP@ JA < Q<MD<=G@ ><I <GNJ =@ PN@? <N <I DI?@S,
H<FDIB <MM<TN @Q@I HJM@ PN@APG. #JM @S<HKG@, OC@ HJIOC DN ?@O@MHDI@? =T OC@ Q<GP@ JA OC@
NPOUI*OEFY Q<MD<=G@ =@GJR:
XSJUFMO("5IJT NPOUI IBT ", NPOUI%BZT<NPOUI*OEFY>, " EBZT.");
4C@I OC@ Q<GP@ JA NPOUI*OEFY DN 2, OC@ @SKM@NNDJI <=JQ@ RJPG? KMDIO OC@ Q<GP@ JA
NPOUI%BZT<2>, OC@ IPH=@M JA ?<TN DI *<M>C.
,IGT OC@ DI?@S Q<GP@N =@OR@@I U@MJ <I? JI@ G@NN OC<I OC@ G@IBOC JA OC@ <MM<T <M@ Q<GD?. #JM
@S<HKG@, OC@ Q<GD? DI?@S@N JA < OCM@@-@G@H@IO <MM<T <M@ 0, 1, <I? 2. A>>@NNDIB <I <MM<T RDOC
<I DIQ<GD? DI?@S ><PN@N OC@ KMJBM<H OJ =@ O@MHDI<O@? RDOC <I @MMJM.
AMM<TN <M@ >JIO<DI@MN RC@M@ OC@ @G@H@ION <M@ KG<>@? ND?@ =T ND?@ DI OC@ >JHKPO@M'N H@HJMT.
#JM @S<HKG@, OC@ @G@H@ION JA OC@ <MM<T CJG?DIB OC@ IPH=@M JA ?<TN DI @<>C HJIOC ><I =@
NCJRI GDF@ OC@ AJGGJRDIB (<NNPHDIB < T@<M RC@I #@=MP<MT C<N 28 ?<TN):
JOEFYFT l 0 1 2 3 4 5 6 7 8 9 10 11
FMFNFOUT l ] 31 ] 28 ] 31 ] 30 ] 31 ] 30 ] 31 ] 31 ] 30 ] 31 ] 30 ] 31 ]
1C@ @G@H@IO <O DI?@S 0 C<N OC@ Q<GP@ 31 (IPH=@M JA ?<TN DI '<IP<MT); OC@ @G@H@IO <O DI?@S 1
C<N OC@ Q<GP@ JA 28 (IPH=@M JA ?<TN DI #@=MP<MT), @O>.
Fixed-length arrays vs. dynamic arrays
17.5
4C@I OC@ G@IBOC JA <I <MM<T DN NK@>DAD@? RC@I OC@ KMJBM<H DN RMDOO@I, OC<O <MM<T DN < 8;J76-
>7@9F: 3DD3K. 4C@I OC@ G@IBOC ><I >C<IB@ ?PMDIB OC@ @S@>PODJI JA OC@ KMJBM<H, OC<O <MM<T DN
< 6K@3?;5 3DD3K.
BJOC JA OC@ <MM<TN OC<O R@ C<Q@ ?@ADI@? <=JQ@ <M@ ADS@?-G@IBOC <MM<TN =@><PN@ OC@DM @G@H@IO
>JPION <M@ NK@>DAD@? <N 5 <I? 12 <O OC@ ODH@ RC@I OC@ KMJBM<H DN RMDOO@I. 1C@ G@IBOCN JA
OCJN@ <MM<TN ><IIJO =@ >C<IB@? ?PMDIB OC@ @S@>PODJI JA OC@ KMJBM<H. 1J >C<IB@ OC@DM
G@IBOCN, OC@ NJPM>@ >J?@ HPNO =@ HJ?DAD@? <I? OC@ KMJBM<H HPNO =@ M@>JHKDG@?.
!@ADIDIB ?TI<HD> <MM<TN DN NDHKG@M OC<I ?@ADIDIB ADS@?-G@IBOC <MM<TN =@><PN@ JHDOODIB OC@
G@IBOC H<F@N < ?TI<HD> <MM<T:
JOU<> EZOBNJD"SSBZ;
1C@ G@IBOC JA NP>C <I <MM<T ><I DI>M@<N@ JM ?@>M@<N@ ?PMDIB OC@ @S@>PODJI JA OC@ KMJBM<H.
Array properties
17.6
AN R@GG <N < OTK@, <I <MM<T C<N NJH@ KMJK@MOD@N <N R@GG. 4@ RDGG N@@ JIGT OCM@@ JA OC@H C@M@.
+JO@ OC<O OC@ .MFOHUI KMJK@MOT JA ?TI<HD> <MM<TN DN HJM@ ><K<=G@ OC<I OC<O JA ADS@?-G@IBOC
<MM<TN:
t .MFOHUI: /@OPMIN OC@ IPH=@M JA @G@H@ION JA OC@ <MM<T:
XSJUFMO("5IF BSSBZ IBT ", BSSBZ.MFOHUI, " FMFNFOUT.");
ADD3KE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
60
A??DODJI<GGT, OC@ G@IBOC JA ?TI<HD> <MM<TN ><I =@ >C<IB@? =T <NNDBIDIB < Q<GP@ OJ OCDN
KMJK@MOT:
JOU<> BSSBZ; // JOJUJBMMZ FNQUZ
BSSBZ.MFOHUI = 5; // OPX IBT 5 FMFNFOUT
t .TPSU: 0JMON OC@ @G@H@ION (DI OC@ ><N@ JA DIO@B@MN, AMJH OC@ NH<GG@NO Q<GP@ OJ OC@ BM@<O@NO
Q<GP@):
BSSBZ.TPSU;
t .SFWFSTF: 0JMON OC@ @G@H@ION DI M@Q@MN@ JM?@M:
BSSBZ.SFWFSTF;
+JR G@O'N M@QDNDO OC@ @S@M>DN@ RDOC OC@ ADQ@ Q<GP@N <I? RMDO@ DO <B<DI =T PNDIB <I <MM<T:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
// 5IJT WBSJBCMF JT VTFE BT B MPPQ DPVOUFS
JOU DPVOUFS;
// 5IF EFGJOJUJPO PG B GJYFE-MFOHUI BSSBZ PG GJWF
// FMFNFOUT PG UZQF EPVCMF
EPVCMF<5> WBMVFT;
// 3FBEJOH UIF WBMVFT JO B MPPQ
XIJMF (DPVOUFS < WBMVFT.MFOHUI) \
XSJUF("7BMVF ", DPVOUFS + 1, ": ");
SFBEG(" %T", &WBMVFT<DPVOUFS>);
++DPVOUFS;
^
XSJUFMO("5XJDF UIF WBMVFT:");
DPVOUFS = 0;
XIJMF (DPVOUFS < WBMVFT.MFOHUI) \
XSJUFMO(WBMVFT<DPVOUFS> * 2);
++DPVOUFS;
^
// 5IF MPPQ UIBU DBMDVMBUFT UIF GJGUIT PG UIF WBMVFT XPVME
// CF XSJUUFO TJNJMBSMZ
^
Observations: 1C@ Q<GP@ JA DPVOUFS ?@O@MHDI@N CJR H<IT ODH@N OC@ GJJKN <M@ M@K@<O@?
(DO@M<O@?). &O@M<ODIB OC@ GJJK RCDG@ DON Q<GP@ DN G@NN OC<I BSSBZ.MFOHUI @INPM@N OC<O OC@ GJJKN
<M@ @S@>PO@? JI>@ K@M @G@H@IO. AN OC@ Q<GP@ JA OC<O Q<MD<=G@ DN DI>M@H@IO@? <O OC@ @I? JA
@<>C DO@M<ODJI, OC@ WBMVFT<DPVOUFS> @SKM@NNDJI M@A@MN OJ OC@ @G@H@ION JA OC@ <MM<T JI@ =T
JI@: WBMVFT<0>, WBMVFT<1>, @O>.
1J N@@ CJR OCDN KMJBM<H DN =@OO@M OC<I OC@ KM@QDJPN JI@, DH<BDI@ I@@?DIB OJ M@<? 20 Q<GP@N.
1C@ KMJBM<H <=JQ@ RJPG? M@LPDM@ < NDIBG@ >C<IB@: M@KG<>DIB 5 RDOC 20. ,I OC@ JOC@M C<I?,
OC@ KMJBM<H OC<O ?D? IJO PN@ <I <MM<T RJPG? C<Q@ OJ C<Q@ 15 HJM@ Q<MD<=G@ ?@ADIDODJIN <I?
OC@ GDI@N OC<O OC@T C<Q@ =@@I PN@? DI RJPG? C<Q@ OJ =@ M@K@<O@? 15 HJM@ ODH@N.
Initializing the elements
17.7
)DF@ @Q@MT Q<MD<=G@ DI !, OC@ @G@H@ION JA <MM<TN <M@ <POJH<OD><GGT DIDOD<GDU@?. 1C@ DIDOD<G Q<GP@
JA OC@ @G@H@ION ?@K@I?N JI OC@ OTK@ JA OC@ @G@H@ION: 0 AJM JOU, EPVCMF.OBO AJM EPVCMF, @O>.
ADD3KE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
61
AGG JA OC@ @G@H@ION JA OC@ WBMVFT <MM<T <=JQ@ <M@ DIDOD<GDU@? OJ EPVCMF.OBO:
EPVCMF<5> WBMVFT; // FMFNFOUT BSF BMM EPVCMF.OBO
,=QDJPNGT, OC@ Q<GP@N JA OC@ @G@H@ION ><I =@ >C<IB@? G<O@M DI OC@ KMJBM<H. 4@ C<Q@ <GM@<?T
N@@I OCDN <=JQ@ RC@I <NNDBIDIB OJ <I @G@H@IO JA <I <MM<T:
NPOUI%BZT<11> = 31;
AI? <GNJ RC@I M@<?DIB < Q<GP@ AMJH OC@ DIKPO:
SFBEG(" %T", &WBMVFT<DPVOUFS>);
0JH@ODH@N OC@ ?@NDM@? Q<GP@N JA OC@ @G@H@ION <M@ FIJRI <O OC@ ODH@ RC@I OC@ <MM<T DN
?@ADI@?. &I NP>C ><N@N, OC@ DIDOD<G Q<GP@N JA OC@ @G@H@ION ><I =@ NK@>DAD@? JI OC@ MDBCO-C<I?
ND?@ JA OC@ <NNDBIH@IO JK@M<OJM RDOCDI NLP<M@ =M<>F@ON. )@O'N N@@ OCDN DI < KMJBM<H OC<O
M@<?N OC@ IPH=@M JA OC@ HJIOC AMJH OC@ PN@M, <I? KMDION OC@ IPH=@M JA ?<TN DI OC<O HJIOC:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
// "TTVNJOH UIBU 'FCSVBSZ IBT 28 EBZT
JOU<12> NPOUI%BZT =
< 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 >;
XSJUF("1MFBTF FOUFS UIF OVNCFS PG UIF NPOUI: ");
JOU NPOUI/VNCFS;
SFBEG(" %T", &NPOUI/VNCFS);
JOU JOEFY = NPOUI/VNCFS - 1;
XSJUFMO(".POUI ", NPOUI/VNCFS, " IBT ",
NPOUI%BZT<JOEFY>, " EBZT.");
^
AN TJP N@@, OC@ NPOUI%BZT <MM<T DN ?@ADI@? <I? DIDOD<GDU@? <O OC@ N<H@ ODH@. AGNJ IJO@ OC<O OC@
IPH=@M JA OC@ HJIOC, RCD>C DN DI OC@ M<IB@ 1-12 DN >JIQ@MO@? OJ < Q<GD? <MM<T DI?@S DI OC@
M<IB@ 0-11. AIT Q<GP@ OC<O DN @IO@M@? JPOND?@ JA OC@ 1-12 M<IB@ RJPG? ><PN@ OC@ KMJBM<H OJ
=@ O@MHDI<O@? RDOC <I @MMJM.
4C@I DIDOD<GDUDIB <MM<TN, DO DN KJNND=G@ OJ PN@ < NDIBG@ Q<GP@ JI OC@ MDBCO-C<I? ND?@. &I OC<O
><N@ <GG JA OC@ @G@H@ION JA OC@ <MM<T <M@ DIDOD<GDU@? OJ OC<O Q<GP@:
JOU<10> BMM0OFT = 1; // "MM PG UIF FMFNFOUT BSF TFU UP 1
Basic array operations
17.8
AMM<TN KMJQD?@ >JIQ@ID@IO JK@M<ODJIN OC<O <KKGT OJ <GG JA OC@DM @G@H@ION.
Copying fixed-length arrays: 1C@ <NNDBIH@IO JK@M<OJM >JKD@N <GG JA OC@ @G@H@ION AMJH OC@
MDBCO-C<I? ND?@ OJ OC@ G@AO-C<I? ND?@:
JOU<5> TPVSDF = < 10, 20, 30, 40, 50 >;
JOU<5> EFTUJOBUJPO;
EFTUJOBUJPO = TPVSDF;
Note: ):7 ?73@;@9 A8 F:7 3EE;9@?7@F AB7D3F;A@ ;E 5A?B>7F7>K 6;887D7@F 8AD 6K@3?;5 3DD3KE.
,7 I;>> E77 F:;E ;@ 3 >3F7D 5:3BF7D.
ADD3KE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
62
Adding elements to dynamic arrays: 1C@ _= JK@M<OJM <??N < I@R @G@H@IO JM < I@R <MM<T
OJ OC@ @I? JA < ?TI<HD> <MM<T:
JOU<> BSSBZ; // FNQUZ
BSSBZ _= 7; // IBT B TJOHMF FMFNFOU
BSSBZ _= 360; // IBT UXP FMFNFOUT
BSSBZ _= < 30, 40 >; // IBT GPVS FMFNFOUT
&O DN IJO KJNND=G@ OJ <?? @G@H@ION OJ ADS@?-G@IBOC <MM<TN:
JOU<10> BSSBZ;
BSSBZ _= 7; // j DPNQJMBUJPO &3303
Combining arrays: 1C@ _ JK@M<OJM >M@<O@N < I@R <MM<T =T >JH=DIDIB ORJ <MM<TN. &ON _=
>JPIO@MK<MO >JH=DI@N OC@ ORJ <MM<TN <I? <NNDBIN OC@ M@NPGO =<>F OJ OC@ G@AO-C<I? ND?@ <MM<T:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
JOU<10> GJSTU = 1;
JOU<10> TFDPOE = 2;
JOU<> SFTVMU;
SFTVMU = GJSTU _ TFDPOE;
XSJUFMO(SFTVMU.MFOHUI); // QSJOUT 20
SFTVMU _= GJSTU;
XSJUFMO(SFTVMU.MFOHUI); // QSJOUT 30
^
1C@ _= JK@M<OJM ><IIJO =@ PN@? RC@I OC@ G@AO-C<I? ND?@ <MM<T DN < ADS@?-G@IBOC <MM<T:
JOU<20> SFTVMU;
// ...
SFTVMU _= GJSTU; // j DPNQJMBUJPO &3303
&A OC@ G@AO-C<I? ND?@ <MM<T ?J@NI'O C<Q@ MJJH AJM OC@ M@NPGO, OC@ KMJBM<H DN O@MHDI<O@? RDOC <I
@MMJM ?PMDIB <NNDBIH@IO:
JOU<10> GJSTU = 1;
JOU<10> TFDPOE = 2;
JOU<21> SFTVMU;
SFTVMU = GJSTU _ TFDPOE;
PCKFDU.&YDFQUJPO: MFOHUIT EPO'U NBUDI GPS BSSBZ DPQZ
Exercises
17.9
1. 4MDO@ < KMJBM<H OC<O <NFN OC@ PN@M CJR H<IT Q<GP@N RDGG =@ @IO@M@? <I? OC@I M@<?N <GG JA
OC@H. %<Q@ OC@ KMJBM<H NJMO OC@ @G@H@ION PNDIB .TPSU <I? .SFWFSTF.
2. 4MDO@ < KMJBM<H OC<O M@<?N IPH=@MN AMJH OC@ DIKPO, <I? KMDION OC@ J?? <I? @Q@I JI@N
N@K<M<O@GT =PO DI JM?@M. 1M@<O OC@ Q<GP@ -1 NK@>D<GGT OJ ?@O@MHDI@ OC@ @I? JA OC@ IPH=@MN;
?J IJO KMJ>@NN OC<O Q<GP@.
#JM @S<HKG@, RC@I OC@ AJGGJRDIB IPH=@MN <M@ @IO@M@?,
1 4 7 2 3 8 11 -1
ADD3KE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
63
C<Q@ OC@ KMJBM<H KMDIO OC@ AJGGJRDIB:
1 3 7 11 2 4 8
Hint: 6JP H<T R<IO OJ KPO OC@ @G@H@ION DI N@K<M<O@ <MM<TN. 6JP ><I ?@O@MHDI@
RC@OC@M < IPH=@M DN J?? JM @Q@I PNDIB OC@ % (M@H<DI?@M) JK@M<OJM.
3. 1C@ AJGGJRDIB DN < KMJBM<H OC<O ?J@N IJO RJMF <N @SK@>O@?. 1C@ KMJBM<H DN RMDOO@I OJ
M@<? ADQ@ IPH=@MN AMJH OC@ DIKPO <I? OJ KG<>@ OC@ NLP<M@N JA OCJN@ IPH=@MN DIOJ <I <MM<T.
1C@ KMJBM<H OC@I <OO@HKON OJ KMDIO OC@ NLP<M@N OJ OC@ JPOKPO. &INO@<?, OC@ KMJBM<H
O@MHDI<O@N RDOC <I @MMJM.
#DS OC@ =PBN JA OCDN KMJBM<H <I? H<F@ DO RJMF <N @SK@>O@?:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
JOU<5> TRVBSFT;
XSJUFMO("1MFBTF FOUFS 5 OVNCFST");
JOU J = 0;
XIJMF (J <= 5) \
JOU OVNCFS;
XSJUF("/VNCFS ", J + 1, ": ");
SFBEG(" %T", &OVNCFS);
TRVBSFT<J> = OVNCFS * OVNCFS;
++J;
^
XSJUFMO("=== 5IF TRVBSFT PG UIF OVNCFST ===");
XIJMF (J <= TRVBSFT.MFOHUI)
\
XSJUF(TRVBSFT<J>, " ");
++J;
^
XSJUFMO();
^
... F:7 EA>GF;A@E
ADD3KE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
64
Characters 18
C<M<>O@MN <M@ OC@ =PDG?DIB =GJ>FN JA NOMDIBN. AIT NTH=JG JA < RMDODIB NTNO@H DN ><GG@? <
>C<M<>O@M: G@OO@MN JA <GKC<=@ON, IPH@M<GN, KPI>OP<ODJI H<MFN, OC@ NK<>@ >C<M<>O@M, @O>.
JIAPNDIBGT, OC@ =PDG?DIB =GJ>FN JA >C<M<>O@MN OC@HN@GQ@N <M@ ><GG@? >C<M<>O@MN <N R@GG.
AMM<TN JA >C<M<>O@MN H<F@ PK EFD;@9E. 4@ C<Q@ N@@I <MM<TN DI OC@ KM@QDJPN >C<KO@M; NOMDIBN
RDGG =@ >JQ@M@? ORJ >C<KO@MN G<O@M.
)DF@ <IT JOC@M ?<O<, >C<M<>O@MN <M@ <GNJ M@KM@N@IO@? <N DIO@B@M Q<GP@N OC<O <M@ H<?@ PK JA
=DON. #JM @S<HKG@, OC@ DIO@B@M Q<GP@ JA OC@ GJR@M><N@ B DN 97 <I? OC@ DIO@B@M Q<GP@ JA OC@
IPH@M<G 1 DN 49. 1C@N@ Q<GP@N C<Q@ =@@I <NNDBI@? H@M@GT =T >JIQ@IODJIN RC@I OC@ A0&&
O<=G@ C<N =@@I ?@NDBI@?.
&I HJNO G<IBP<B@N, >C<M<>O@MN <M@ M@KM@N@IO@? =T OC@ DIBS OTK@, RCD>C ><I CJG? JIGT 256
?DNODI>O Q<GP@N. &A TJP <M@ A<HDGD<M RDOC OC@ DIBS OTK@ AMJH JOC@M G<IBP<B@N, TJP H<T <GM@<?T
FIJR OC<O DO DN IJO G<MB@ @IJPBC OJ NPKKJMO OC@ NTH=JGN JA H<IT RMDODIB NTNO@HN. B@AJM@
B@OODIB OJ OC@ OCM@@ ?DNODI>O >C<M<>O@M OTK@N JA !, G@O'N ADMNO O<F@ < GJJF <O OC@ CDNOJMT JA
>C<M<>O@MN DI >JHKPO@M NTNO@HN.
History
18.1
ASCII Table 18.1.1
1C@ A0&& O<=G@ R<N ?@NDBI@? <O < ODH@ RC@I >JHKPO@M C<M?R<M@ R<N Q@MT GDHDO@? >JHK<M@?
OJ HJ?@MI NTNO@HN. %<QDIB =@@I =<N@? JI 7 =DON, OC@ A0&& O<=G@ ><I C<Q@ 128 ?DNODI>O >J?@
Q<GP@N. 1C<O DN NPAAD>D@IO OJ M@KM@N@IO >C<M<>O@MN GDF@ OC@ GJR@M><N@ <I? PKK@M><N@ Q@MNDJIN
JA OC@ 26 G@OO@MN JA OC@ =<ND> )<ODI <GKC<=@O, IPH@M<GN, >JHHJIGT PN@? KPI>OP<ODJI H<MFN,
<I? NJH@ O@MHDI<G (>JINJG@) >JIOMJG >C<M<>O@MN.
AN <I @S<HKG@, OC@ A0&& >J?@N JA OC@ >C<M<>O@MN JA OC@ NOMDIB "C@GGJ" <M@ OC@ AJGGJRDIB (OC@
>JHH<N <M@ DIN@MO@? EPNO OJ H<F@ DO @<ND@M OJ M@<?):
104, 101, 108, 108, 111
"Q@MT >J?@ <=JQ@ M@KM@N@ION < NDIBG@ G@OO@M JA "C@GGJ". #JM @S<HKG@, OC@M@ <M@ ORJ 108 Q<GP@N
AJM OC@ ORJ 'G' G@OO@MN. (Note: ):7 35FG3> AD67D A8 F:7E7 5:3D35F7DE 67B7@6 A@ F:7 B>3F8AD? 3@6
7H7@ F:7 6A5G?7@F F:3F F:7E7 H3>G7E 3D7 3 B3DF A8. ):7 5A67E 34AH7 3D7 ;@ F:7 AD67D F:3F F:7K
3BB73D ;@ F:7 EFD;@9.)
1C@ >J?@N JA OC@ A0&& O<=G@ C<Q@ G<O@M =@@I DI>M@<N@? OJ 8 =DON OJ =@>JH@ OC@ "SO@I?@?
A0&& O<=G@. "SO@I?@? A0&& O<=G@ C<N 256 ?DNODI>O >J?@N.
IBM Code Pages 18.1.2
&B* JMKJM<ODJI C<N ?@ADI@? < N@O JA O<=G@N, @<>C JI@ JA RCD>C <NNDBI OC@ >J?@N JA OC@
"SO@I?@? A0&& O<=G@ AMJH 128 OJ 255 OJ JI@ JM HJM@ RMDODIB NTNO@HN. 1C@N@ >J?@ O<=G@N
<GGJR@? NPKKJMODIB OC@ G@OO@MN JA H<IT HJM@ <GKC<=@ON. #JM @S<HKG@, OC@ NK@>D<G G@OO@MN JA
OC@ 1PMFDNC <GKC<=@O <M@ < K<MO JA &B*'N >J?@ K<B@ 857.
!@NKDO@ =@DIB HP>C PN@APG OC<I A0&&, >J?@ K<B@N C<Q@ NJH@ KMJ=G@HN <I? GDHDO<ODJIN: &I
JM?@M OJ ?DNKG<T O@SO >JMM@>OGT, DO HPNO =@ FIJRI RC<O >J?@ K<B@ < BDQ@I O@SO C<N JMDBDI<GGT
=@@I RMDOO@I DI. 1CDN DN =@><PN@ OC@ N<H@ >J?@ >JMM@NKJI?N OJ < ?DAA@M@IO >C<M<>O@M DI HJNO
JOC@M O<=G@N. #JM @S<HKG@, OC@ >J?@ OC<O M@KM@N@ION a DI O<=G@ 857 >JMM@NKJI?N OJ X DI O<=G@
437.
C:3D35F7DE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
65
AIJOC@M KMJ=G@H DN OC@ GDHDO<ODJI JA OC@ IPH=@M JA <GKC<=@ON OC<O ><I =@ NPKKJMO@? DI <
NDIBG@ ?J>PH@IO. A??DODJI<GGT, <GKC<=@ON OC<O C<Q@ HJM@ OC<I 128 IJI-A0&& >C<M<>O@MN
><IIJO =@ NPKKJMO@? =T <I &B* O<=G@.
ISO/IEC 8859 Code Pages 18.1.3
1C@N@ >J?@ K<B@N <M@ < M@NPGO JA DIO@MI<ODJI<G NO<I?<M?DU<ODJI @AAJMON. 1C@T <M@ NDHDG<M OJ
&B*'N >J?@ K<B@N DI CJR OC@T <NNDBI >J?@N OJ >C<M<>O@MN. AN <I @S<HKG@, OC@ NK@>D<G G@OO@MN
JA OC@ 1PMFDNC <GKC<=@O <KK@<M DI >J?@ K<B@ 8859-9. 1C@N@ O<=G@N C<Q@ OC@ N<H@ KMJ=G@HN
<I? GDHDO<ODJIN JA &B*'N O<=G@N. #JM @S<HKG@, OC@ !PO>C ?DBM<KC e ?J@N IJO <KK@<M DI <IT JA
OC@N@ O<=G@N.
Unicode 18.1.4
2ID>J?@ NJGQ@N <GG JA OC@ KMJ=G@HN <I? GDHDO<ODJIN JA KM@QDJPN NJGPODJIN. 2ID>J?@ DI>GP?@N
HJM@ OC<I 100 OCJPN<I? >C<M<>O@MN <I? NTH=JGN JA OC@ RMDODIB NTNO@HN JA H<IT CPH<I
G<IBP<B@N, >PMM@IO <I? JG?. (+@R JI@N <M@ >JINO<IGT PI?@M M@QD@R AJM <??DODJI OJ OC@ O<=G@.)
"<>C JA OC@N@ >C<M<>O@MN C<N < PIDLP@ >J?@. !J>PH@ION OC<O <M@ @I>J?@? DI 2ID>J?@ ><I
DI>GP?@ <GG JA OC@ >C<M<>O@MN JA N@K<M<O@ RMDODIB NTNO@HN <O OC@ N<H@ ODH@ RDOCJPO <IT
>JIAPNDJI JM GDHDO<ODJI.
Unicode encodings
18.2
2ID>J?@ <NNDBIN < PIDLP@ >J?@ AJM @<>C >C<M<>O@M. 0DI>@ OC@M@ <M@ HJM@ 2ID>J?@ >C<M<>O@MN
OC<I <I 8-=DO Q<GP@ ><I CJG?, NJH@ >C<M<>O@MN HPNO =@ M@KM@N@IO@? =T <O G@<NO ORJ 8-=DO
Q<GP@N. #JM @S<HKG@, OC@ 2ID>J?@ >C<M<>O@M >J?@ JA a (286) DN BM@<O@M OC<I OC@ H<SDHPH
Q<GP@ OC<O <I 8-=DO OTK@ ><I CJG? (255).
Note: ! I;>> 3D4;FD3D;>K GE7 1 3@6 30 3E F:7 H3>G7E A8 F:7 2 4KF7E F:3F D7BD7E7@F N 47>AI. ):7K
3D7 @AF H3>;6 ;@ 3@K *@;5A67 7@5A6;@9; 4GF 3D7 GE78G> I:7@ ;@FDA6G5;@9 *@;5A67 7@5A6;@9E.
):7 355GD3F7 7@5A6;@9 H3>G7E 3D7 AGF A8 F:7 E5AB7 A8 F:;E 5:3BF7D.
1C@ R<T >C<M<>O@MN <M@ M@KM@N@IO@? DI @G@>OMJID> H@?DPHN DN ><GG@? 7@5A6;@9. 4@ C<Q@ N@@I
<=JQ@ CJR OC@ NOMDIB "C@GGJ" DN @I>J?@? DI A0&&. 4@ RDGG IJR N@@ OCM@@ 2ID>J?@ @I>J?DIBN
OC<O >JMM@NKJI? OJ !'N >C<M<>O@M OTK@N.
UTF-32: 1CDN @I>J?DIB PN@N 32 =DON (4 =TO@N) AJM @Q@MT 2ID>J?@ >C<M<>O@M. 1C@ 21#-32
@I>J?DIB JA "C@GGJ" DN NDHDG<M OJ DON A0&& @I>J?DIB, =PO @Q@MT >C<M<>O@M DN M@KM@N@IO@? =T 4
=TO@N:
0, 0, 0, 104, 0, 0, 0, 101, 0, 0, 0, 108, 0, 0, 0, 108, 0, 0, 0, 111
AN <IJOC@M @S<HKG@, OC@ 21#-32 @I>J?DIB JA "<a" DN:
0, 0, 0, 97, 0, 0, 1, 30
Note: ):7 35FG3> H3>G7E A8 EA?7 A8 F:7E7 4KF7E 3D7 6;887D7@F, 3@6 F:7 35FG3> AD67D A8 F:7
4KF7E ?3K 47 6;887D7@F.
< <I? a <M@ M@KM@N@IO@? =T 1 <I? 2 NDBIDAD><IO =TO@N M@NK@>ODQ@GT, <I? OC@ Q<GP@N JA OC@ JOC@M
5 =TO@N <M@ <GG U@MJN. 1C@N@ U@MJN ><I =@ OCJPBCO JA <N ADGG@M =TO@N OJ H<F@ @Q@MT 2ID>J?@
>C<M<>O@M J>>PKT 4 =TO@N @<>C.
#JM ?J>PH@ION =<N@? JI OC@ =<ND> )<ODI <GKC<=@O, OCDN @I>J?DIB <GR<TN PN@N 4 ODH@N <N H<IT
=TO@N <N OC@ A0&& @I>J?DIB. 4C@I HJNO JA OC@ >C<M<>O@MN JA < BDQ@I ?J>PH@IO C<Q@ A0&&
C:3D35F7DE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
66
@LPDQ<G@ION, OC@ 3 ADGG@M =TO@N AJM @<>C JA OCJN@ >C<M<>O@MN RJPG? H<F@ OCDN @I>J?DIB HJM@
R<NO@APG >JHK<M@? OJ JOC@M @I>J?DIBN.
,I OC@ JOC@M C<I?, OC@M@ <M@ =@I@ADON JA @Q@MT >C<M<>O@M =@DIB M@KM@N@IO@? =T <I @LP<G
IPH=@M JA =TO@N.
UTF-16: 1CDN @I>J?DIB PN@N 16 =DON (2 =TO@N) OJ M@KM@N@IO HJNO JA OC@ 2ID>J?@ >C<M<>O@MN.
0DI>@ 16 =DON ><I C<Q@ <=JPO 65 OCJPN<I? PIDLP@ Q<GP@N, OC@ JOC@M 35 OCJPN<I? 2ID>J?@
>C<M<>O@MN HPNO =@ M@KM@N@IO@? =T HJM@ =TO@N.
AN <I @S<HKG@, "<a" DN @I>J?@? =T 4 =TO@N DI 21#-16:
0, 97, 1, 30
Note: ):7 35FG3> H3>G7E A8 EA?7 A8 F:7E7 4KF7E 3D7 6;887D7@F, 3@6 F:7 35FG3> AD67D A8 F:7
4KF7E ?3K 47 6;887D7@F.
JHK<M@? OJ 21#-32, OCDN @I>J?DIB O<F@N G@NN NK<>@ AJM HJNO ?J>PH@ION, =PO =@><PN@ OC@M@
<M@ >C<M<>O@MN OC<O <M@ M@KM@N@IO@? =T HJM@ OC<I 2 =TO@N, 21#-16 DN HJM@ >JHKGD><O@? OJ
KMJ>@NN.
UTF-8: 1CDN @I>J?DIB PN@N 1 JM HJM@ =TO@N AJM @Q@MT >C<M<>O@M. &A < >C<M<>O@M C<N <I
@LPDQ<G@IO DI OC@ A0&& O<=G@, DO DN M@KM@N@IO@? =T 1 =TO@ <I? =T OC@ N<H@ >J?@ <N DI OC@
A0&& O<=G@. 1C@ M@NO JA OC@ 2ID>J?@ >C<M<>O@MN <M@ M@KM@N@IO@? =T 2, 3, JM 4 =TO@N. *JNO JA
OC@ NK@>D<G >C<M<>O@MN JA OC@ "PMJK@<I RMDODIB NTNO@HN <M@ <HJIB OC@ BMJPK JA >C<M<>O@MN
OC<O <M@ M@KM@N@IO@? =T 2 =TO@N.
#JM HJNO ?J>PH@ION, 21#-8 DN OC@ @I>J?DIB OC<O O<F@N OC@ G@<NO <HJPIO JA NK<>@. AIJOC@M
=@I@ADO JA 21#-8 DN OC<O OC@ ?J>PH@ION OC<O C<Q@ <GM@<?T =@@I @I>J?@? DI A0&& ?DM@>OGT
H<O>C OC@DM 21#-8 @I>J?DIBN. 21#-8 ?J@N IJO R<NO@ <IT NK<>@: @Q@MT >C<M<>O@M DN
M@KM@N@IO@? =T NDBIDAD><IO =TO@N. AN <I @S<HKG@, OC@ 21#-8 @I>J?DIB JA "<a" DN:
97, 1, 30
Note: ):7 35FG3> H3>G7E A8 EA?7 A8 F:7E7 4KF7E 3D7 6;887D7@F, 3@6 F:7 35FG3> AD67D A8 F:7
4KF7E ?3K 47 6;887D7@F.
The character types of D
18.3
1C@M@ <M@ OCM@@ ! OTK@N OJ M@KM@N@IO >C<M<>O@MN. 1C@N@ >C<M<>O@MN >JMM@NKJI? OJ OC@ OCM@@
2ID>J?@ @I>J?DIBN H@IODJI@? <=JQ@. AN TJP M@H@H=@M AMJH OC@ #PI?<H@IO<G 1TK@N
>C<KO@M:
5ZQF %FGJOJUJPO *OJUJBM 7BMVF
DIBS 65'-8 DPEF VOJU 0Y''
XDIBS 65'-16 DPEF VOJU 0Y''''
EDIBS 65'-32 DPEF VOJU BOE 6OJDPEF DPEF QPJOU 0Y0000''''
JHK<M@? OJ NJH@ JOC@M KMJBM<HHDIB G<IBP<B@N, >C<M<>O@MN DI ! H<T IJO >JINDNO JA @LP<G
IPH=@M JA =TO@N. #JM @S<HKG@, =@><PN@ a ><I =@ M@KM@N@IO@? =T <O G@<NO 2 =TO@N DI 2ID>J?@,
DO ?J@NI'O ADO DI < Q<MD<=G@ JA OTK@ DIBS. ,I OC@ JOC@M C<I?, =@><PN@ EDIBS >JINDNON JA 4 =TO@N,
DO ><I CJG? <IT 2ID>J?@ >C<M<>O@M.
!@NKDO@ KMJQD?DIB OC@N@ PN@APG OTK@N, ! ?J@N IJO NPKKJMO NJH@ @NJO@MD> A@<OPM@N JA 2ID>J?@. &
RDGG @SKG<DI OCDN =@GJR.
C:3D35F7DE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
67
Character literals
18.4
)DO@M<GN <M@ >JINO<IO Q<GP@N OC<O <M@ OTK@? DI OC@ KMJBM<H <N < K<MO JA OC@ NJPM>@ >J?@. &I !,
>C<M<>O@M GDO@M<GN <M@ NK@>DAD@? RDOCDI NDIBG@ LPJO@N:
DIBS MFUUFS@B = 'B';
XDIBS MFUUFS@F@BDVUF = 'a';
!JP=G@ LPJO@N <M@ IJO Q<GD? AJM >C<M<>O@MN =@><PN@ ?JP=G@ LPJO@N <M@ PN@? RC@I NK@>DATDIB
EFD;@9E, RCD>C R@ RDGG N@@ ORJ >C<KO@MN G<O@M. 'B' DN < >C<M<>O@M GDO@M<G <I? "B" DN < NOMDIB
GDO@M<G OC<O >JINDNON JA JI@ >C<M<>O@M.
3<MD<=G@N JA OTK@ DIBS ><I JIGT CJG? G@OO@MN OC<O <M@ DI OC@ A0&& O<=G@.
1C@M@ <M@ H<IT R<TN JA DIN@MODIB >C<M<>O@MN DI >J?@:
t *JNO I<OPM<GGT, OTKDIB OC@H JI OC@ F@T=J<M?.
t JKTDIB AMJH <IJOC@M KMJBM<H JM <IJOC@M O@SO. #JM @S<HKG@, TJP ><I >JKT <I? K<NO@ AMJH
< R@= NDO@, JM AMJH < KMJBM<H OC<O DN NK@>DAD><GGT AJM ?DNKG<TDIB 2ID>J?@ >C<M<>O@MN. (,I@
NP>C KMJBM<H DI HJNO )DIPS @IQDMJIH@ION DN C:3D35F7D #3B, 5:3D?3B JI OC@ >JINJG@.)
t 2NDIB NCJMO I<H@N JA OC@ >C<M<>O@MN. 1C@ NTIO<S AJM OCDN DN =&character_name;. #JM
@S<HKG@, OC@ I<H@ JA OC@ "PMJ >C<M<>O@M DN FVSP <I? DO ><I =@ NK@>DAD@? DI OC@ KMJBM<H
GDF@ OC@ AJGGJRDIB:
XDIBS DVSSFODZ4ZNCPM = '=&FVSP;';
0@@ OC@ GDNO JA I<H@? >C<M<>O@MN AJM <GG JA OC@ >C<M<>O@MN OC<O ><I =@ NK@>DAD@? OCDN
R<T.
t 0K@>DATDIB >C<M<>O@MN =T OC@DM DIO@B@M 2ID>J?@ Q<GP@N:
DIBS B = 97;
XDIBS c = 286;
t 0K@>DATDIB OC@ >J?@N JA OC@ >C<M<>O@MN JA OC@ A0&& O<=G@ @DOC@M =T =value_in_octal JM
=Yvalue_in_hexadecimal NTIO<S:
DIBS RVFTUJPO.BSL0DUBM = '=77';
DIBS RVFTUJPO.BSL)FYBEFDJNBM = '=Y3G';
t 0K@>DATDIB OC@ 2ID>J?@ Q<GP@N JA OC@ >C<M<>O@MN =T PNDIB OC@ =Vfour_digit_value NTIO<S
AJM XDIBS, <I? OC@ =6eight_digit_value NTIO<S AJM EDIBS. (+JO@ V QN. 6.) 1C@ 2ID>J?@
Q<GP@N HPNO =@ NK@>DAD@? DI C@S<?@>DH<G:
XDIBS c@X = '=V011F';
EDIBS c@E = '=60000011F';
1C@N@ H@OCJ?N ><I =@ PN@? OJ NK@>DAT OC@ >C<M<>O@MN RDOCDI NOMDIBN <N R@GG. #JM @S<HKG@, OC@
AJGGJRDIB ORJ GDI@N C<Q@ OC@ N<H@ NOMDIB GDO@M<GN:
XSJUFMO("3aTVNa QSFQBSBUJPO: 10.25i");
XSJUFMO("=Y52=&FBDVUF;TVN=V00F9 QSFQBSBUJPO: 10.25=&FVSP;");
Control characters
18.5
0JH@ >C<M<>O@MN JIGT <AA@>O OC@ AJMH<O JA OC@ O@SO, OC@T ?JI'O C<Q@ < QDNP<G M@KM@N@IO<ODJI
OC@HN@GQ@N. #JM @S<HKG@, OC@ @7I->;@7 >C<M<>O@M, RCD>C NK@>DAD@N OC<O OC@ JPOKPO NCJPG?
C:3D35F7DE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
68
>JIODIP@ JI < I@R GDI@, ?J@N IJO C<Q@ < QDNP<G M@KM@N@IO<ODJI. 0P>C >C<M<>O@MN <M@ ><GG@?
5A@FDA> 5:3D35F7DE. JIOMJG >C<M<>O@MN <M@ NK@>DAD@? RDOC OC@ =control_character NTIO<S.
4ZOUBY /BNF %FGJOJUJPO
=O OFX MJOF .PWFT UIF QSJOUJOH UP B OFX MJOF
=S DBSSJBHF SFUVSO.PWFT UIF QSJOUJOH UP UIF CFHJOOJOH PG UIF DVSSFOU
MJOF
=U UBC .PWFT UIF QSJOUJOH UP UIF OFYU UBC TUPQ
#JM @S<HKG@, OC@ XSJUF() API>ODJI, RCD>C ?J@N IJO NO<MO < I@R GDI@ <POJH<OD><GGT, RJPG? ?J
NJ AJM @Q@MT =O >C<M<>O@M. "Q@MT J>>PMM@I>@ JA OC@ =O >JIOMJG >C<M<>O@M RDOCDI OC@ AJGGJRDIB
GDO@M<G M@KM@N@ION OC@ NO<MO JA < I@R GDI@:
XSJUF("GJSTU MJOF=OTFDPOE MJOF=OUIJSE MJOF=O");
1C@ JPOKPO:
GJSTU MJOF
TFDPOE MJOF
UIJSE MJOF
Single quote and backslash
18.6
1C@ NDIBG@ LPJO@ >C<M<>O@M DON@GA ><IIJO =@ RMDOO@I RDOCDI NDIBG@ LPJO@N =@><PN@ OC@ >JHKDG@M
RJPG? O<F@ OC@ N@>JI? JI@ <N OC@ >GJNDIB >C<M<>O@M JA OC@ ADMNO JI@: '''. 1C@ ADMNO ORJ RJPG?
=@ OC@ JK@IDIB <I? >GJNDIB LPJO@N, <I? OC@ OCDM? JI@ RJPG? =@ G@AO <GJI@, ><PNDIB <
>JHKDG<ODJI @MMJM.
0DHDG<MGT, NDI>@ OC@ =<>FNG<NC >C<M<>O@M C<N < NK@>D<G H@<IDIB DI OC@ >JIOMJG >C<M<>O@M <I?
GDO@M<G NTIO<S@N, OC@ >JHKDG@M RJPG? O<F@ DO <N OC@ NO<MO JA NP>C < NTIO<S: ='. 1C@ >JHKDG@M
OC@I RJPG? =@ GJJFDIB AJM < >GJNDIB NDIBG@ LPJO@ >C<M<>O@M, IJO ADI?DIB JI@, <I? @HDOODIB <
>JHKDG<ODJI @MMJM.
1J <QJD? OC@N@ >JIAPNDJIN, OC@ NDIBG@ LPJO@ <I? OC@ =<>FNG<NC >C<M<>O@MN <M@ 7E53B76 =T <
KM@>@?DIB =<>FNG<NC >C<M<>O@M:
4ZOUBY /BNF %FGJOJUJPO
=' TJOHMF RVPUF "MMPXT TQFDJGZJOH UIF TJOHMF RVPUF DIBSBDUFS:'=''
== CBDLTMBTI "MMPXT TQFDJGZJOH UIF CBDLTMBTI DIBSBDUFS: '==' PS "=="
The std.uni module
18.7
1C@ TUE.VOJ HJ?PG@ DI>GP?@N API>ODJIN OC<O <M@ PN@APG RDOC 2ID>J?@ >C<M<>O@MN. 6JP ><I N@@
OC@N@ API>ODJIN <O DON ?J>PH@IO<ODJI.
1C@ API>ODJIN OC<O NO<MO RDOC JT <INR@M >@MO<DI LP@NODJIN <=JPO >C<M<>O@MN: OC@ M@NPGO DN
GBMTF JM USVF ?@K@I?DIB JI RC@OC@M OC@ <INR@M DN IJ JM T@N, M@NK@>ODQ@GT. 1C@N@ API>ODJIN
<M@ PN@APG DI GJBD><G @SKM@NNDJIN:
t JT-PXFS: DN < GJR@M><N@ >C<M<>O@M?
t JT6QQFS: DN <I PKK@M><N@ >C<M<>O@M?
t JT"MQIB: DN < 2ID>J?@ <GKC<=@OD> >C<M<>O@M?
t JT8IJUF: DN < RCDO@NK<>@ >C<M<>O@M?
C:3D35F7DE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
69
1C@ API>ODJIN OC<O NO<MO RDOC UP KMJ?P>@ I@R >C<M<>O@MN AMJH @SDNODIB >C<M<>O@MN:
t UP-PXFS: KMJ?P>@N OC@ GJR@M><N@ JA OC@ BDQ@I >C<M<>O@M
t UP6QQFS: KMJ?P>@N OC@ PKK@M><N@ JA OC@ BDQ@I >C<M<>O@M
%@M@ DN < KMJBM<H OC<O PN@N <GG JA OC@N@ API>ODJIN:
JNQPSU TUE.TUEJP;
JNQPSU TUE.VOJ;
WPJE NBJO()
\
XSJUFMO("*T d MPXFSDBTF ", JT-PXFS('d'));
XSJUFMO("*T g MPXFSDBTF ", JT-PXFS('g'));
XSJUFMO("*T e VQQFSDBTF ", JT6QQFS('e'));
XSJUFMO("*T ` VQQFSDBTF ", JT6QQFS('`'));
XSJUFMO("*T [ BMQIBOVNFSJD ", JT"MQIB('['));
XSJUFMO("*T =&FVSP; BMQIBOVNFSJD ", JT"MQIB('=&FVSP;'));
XSJUFMO("*T OFX-MJOF XIJUFTQBDF ", JT8IJUF('=O'));
XSJUFMO("*T VOEFSMJOF XIJUFTQBDF ", JT8IJUF('@'));
XSJUFMO("5IF MPXFSDBTF PG c: ", UP-PXFS('c'));
XSJUFMO("5IF MPXFSDBTF PG e: ", UP-PXFS('e'));
XSJUFMO("5IF VQQFSDBTF PG h: ", UP6QQFS('h'));
XSJUFMO("5IF VQQFSDBTF PG f: ", UP6QQFS('f'));
^
1C@ JPOKPO:
*T e MPXFSDBTF USVF
*T h MPXFSDBTF GBMTF
*T f VQQFSDBTF USVF
*T a VQQFSDBTF GBMTF
*T [ BMQIBOVNFSJD USVF
*T k BMQIBOVNFSJD GBMTF
*T OFX-MJOF XIJUFTQBDF USVF
*T VOEFSMJOF XIJUFTQBDF GBMTF
5IF MPXFSDBTF PG d: e
5IF MPXFSDBTF PG f: J
5IF VQQFSDBTF PG i: h
5IF VQQFSDBTF PG g: *
Limited support for and i of the Turkish alphabet
18.8
1C@ GJR@M><N@ <I? PKK@M><N@ Q@MNDJIN JA OC@ G@OO@MN d <I? D <M@ >JINDNO@IOGT ?JOO@? JM
PI?JOO@? DI OC@ 1PMFDNC <GKC<=@O. *JNO JOC@M <KC<=@ON <M@ DI>JINDNO@IO DI OCDN M@B<M?: OC@
PKK@M><N@ JA OC@ ?JOO@? D DN PI?JOO@? &.
B@><PN@ OC@ >JHKPO@M NTNO@HN C<Q@ NO<MO@? RDOC OC@ A0&& O<=G@, OM<?DODJI<GGT OC@ PKK@M><N@
JA D DN &, <I? OC@ GJR@M><N@ JA & DN D. #JM OC<O M@<NJI, OC@N@ ORJ G@OO@MN I@@? NK@>D<G <OO@IODJI.
1C@ AJGGJRDIB KMJBM<H ?@HJINOM<O@N OCDN KMJ=G@H:
JNQPSU TUE.TUEJP;
JNQPSU TUE.VOJ;
WPJE NBJO()
C:3D35F7DE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
70
\
XSJUFMO("5IF VQQFSDBTF PG J: ", UP6QQFS('J'));
XSJUFMO("5IF MPXFSDBTF PG *: ", UP-PXFS('*'));
^
1C@ JPOKPO DN <>>JM?DIB OJ OC@ =<ND> )<ODI <GKC<=@O:
5IF VQQFSDBTF PG J: *
5IF MPXFSDBTF PG *: J
Every alphabet has limited support 18.8.1
C<M<>O@MN <M@ >JIQ@MO@? =@OR@@I OC@DM PKK@M><N@ <I? GJR@M><N@ Q@MNDJIN IJMH<GGT =T OC@DM
2ID>J?@ >C<M<>O@M >J?@N. 1CDN H@OCJ? DN KMJ=G@H<OD> AJM H<IT <GKC<=@ON. #JM @S<HKG@, OC@
AU@MD <I? @GO <GKC<=@ON <M@ NP=E@>O OJ OC@ N<H@ KMJ=G@H JA KMJ?P>DIB OC@ GJR@M><N@ JA & <N D.
1C@M@ <M@ NDHDG<M KMJ=G@HN RDOC NJMODIB. )@OO@MN JA H<IT <GKC<=@ON, GDF@ OC@ 1PMFDNC b, <M@ <GG
NJMO@? <AO@M U. "Q@I <>>@IO@? >C<M<>O@MN GDF@ [ <M@ NJMO@? <AO@M U @Q@I AJM OC@ =<ND> )<ODI
<GKC<=@O.
The trileri library 18.8.2
A ! KMJE@>O =T OC@ H@H=@MN JA OC@ !?DGD #JMPH OC<O <??M@NN@N OC@N@ KMJ=G@HN DN OC@ OMDG@MD
GD=M<MT. AO OC@ ODH@ JA RMDODIB OCDN >C<KO@M, OMDG@MD NPKKJMON OC@ "IBGDNC, 1PMFDNC, AU@MD,
1PMFH@I, (dMdH 1<O<M, $<B<QPU, (PHPF, %<F<N, (PM?DNC, <I? @GO <GKC<=@ON. &O NJMON OC@
G@OO@MN JA OC@N@ <GKC<=@ON <I? >JIQ@MON OC@DM G@OO@MN OJ <I? AMJH PKK@M><N@ <I? GJR@M><N@
>JMM@>OGT.
6JP ><I O@NO OC@ OMDG@MD GD=M<MT <O OC@ AJGGJRDIB 2/):
COOK://RRR.??DGD.JMB/>BD-=DI/OMDG@MD;?@I@H@
Problems with reading characters
18.9
1C@ AG@SD=DGDOT <I? KJR@M JA !'N 2ID>J?@ >C<M<>O@MN H<T ><PN@ PI@SK@>O@? M@NPGON RC@I
M@<?DIB >C<M<>O@MN AMJH <I DIKPO NOM@<H. 1CDN >JIOM<?D>ODJI DN ?P@ OJ OC@ HPGODKG@ H@<IDIBN
JA OC@ O@MH 5:3D35F7D. B@AJM@ @SK<I?DIB JI OCDN APMOC@M, G@O'N GJJF <O < KMJBM<H OC<O C<N OCDN
KMJ=G@H:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
DIBS MFUUFS;
XSJUF("1MFBTF FOUFS B MFUUFS: ");
SFBEG(" %T", &MFUUFS);
XSJUFMO("5IF MFUUFS UIBU IBT CFFO SFBE: ", MFUUFS);
^
&A TJP OMT OC<O KMJBM<H DI <I @IQDMJIH@IO OC<O ?J@N IJO PN@ 2ID>J?@, TJP H<T N@@ OC<O @Q@I
OC@ IJI-A0&& >C<M<>O@MN <M@ M@<? <I? KMDIO@? >JMM@>OGT.
,I OC@ JOC@M C<I?, DA TJP NO<MO OC@ N<H@ KMJBM<H DI < 2ID>J?@ @IQDMJIH@IO, AJM @S<HKG@ DI <
)DIPS >JINJG@, TJP H<T N@@ OC<O OC@ >C<M<>O@M KMDIO@? JI OC@ JPOKPO DN IJO OC@ N<H@
>C<M<>O@M OC<O C<N =@@I @IO@M@?. 1J N@@ OCDN, G@O'N @IO@M < IJI-A0&& >C<M<>O@M DI < >JINJG@
OC<O PN@N OC@ 21#-8 @I>J?DIB (GDF@ HJNO )DIPS >JINJG@N):
C:3D35F7DE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
71
1MFBTF FOUFS B MFUUFS: e
5IF MFUUFS UIBU IBT CFFO SFBE: l OP MFUUFS PO UIF PVUQVU
1C@ M@<NJI AJM OCDN KMJ=G@H DN OC<O OC@ IJI-A0&& >C<M<>O@MN GDF@ b <M@ M@KM@N@IO@? =T ORJ
>J?@N, <I? M@<?DIB < DIBS AMJH OC@ DIKPO M@<?N JIGT OC@ ADMNO JI@ JA OCJN@ >J?@N. 0DI>@ OC<O
NDIBG@ DIBS DN IJO NPAAD>D@IO OJ M@KM@N@IO OC@ RCJG@ 2ID>J?@ >C<M<>O@M, OC@ >JINJG@ ?J@N IJO
?DNKG<T OC@ ;@5A?B>7F7 >C<M<>O@M.
1J NCJR OC<O OC@ 21#-8 >J?@N OC<O H<F@ PK < >C<M<>O@M <M@ M@<? JI@ DIBS <O < ODH@, G@O'N
M@<? ORJ DIBS Q<MD<=G@N <I? KMDIO OC@H JI@ <AO@M OC@ JOC@M:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
DIBS GJSTU$PEF;
DIBS TFDPOE$PEF;
XSJUF("1MFBTF FOUFS B MFUUFS: ");
SFBEG(" %T", &GJSTU$PEF);
SFBEG(" %T", &TFDPOE$PEF);
XSJUFMO("5IF MFUUFS UIBU IBT CFFO SFBE: ",
GJSTU$PEF, TFDPOE$PEF);
^
1C@ KMJBM<H M@<?N ORJ DIBS Q<MD<=G@N AMJH OC@ DIKPO <I? KMDION OC@H DI OC@ N<H@ JM?@M OC<O
OC@T <M@ M@<?. 4C@I OCJN@ >J?@N <M@ N@IO OJ OC@ >JINJG@ DI OC<O N<H@ JM?@M, OC@T >JHKG@O@
OC@ 21#-8 @I>J?DIB JA OC@ 2ID>J?@ >C<M<>O@M JI OC@ >JINJG@ <I? OCDN ODH@ OC@ 2ID>J?@
>C<M<>O@M DN KMDIO@? >JMM@>OGT:
1MFBTF FOUFS B MFUUFS: e
5IF MFUUFS UIBU IBT CFFO SFBE: e l UIF 6OJDPEF DIBSBDUFS UIBU
DPOTJTUT PG UXP DIBS DPEFT
1C@N@ M@NPGON <M@ <GNJ M@G<O@? OJ OC@ A<>O OC<O OC@ NO<I?<M? DIKPON <I? JPOKPON JA KMJBM<HN
<M@ DIBS NOM@<HN.
4@ RDGG N@@ G<O@M DI OC@ 0OMDIBN >C<KO@M OC<O DO DN @<ND@M OJ M@<? >C<M<>O@MN <N NOMDIBN, DINO@<?
JA ?@<GDIB RDOC 21# >J?@N DI?DQD?P<GGT.
D's Unicode support
18.10
2ID>J?@ DN < G<MB@ <I? >JHKGD><O@? NO<I?<M?. ! NPKKJMON < Q@MT PN@APG NP=N@O JA DO.
A 2ID>J?@-@I>J?@? ?J>PH@IO >JINDNON JA OC@ AJGGJRDIB G@Q@GN JA >JI>@KON AMJH OC@ GJR@MHJNO
OJ OC@ PKK@MHJNO:
t Code unit: 1C@ Q<GP@N OC<O H<F@ PK OC@ 21# @I>J?DIBN <M@ ><GG@? >J?@ PIDON. !@K@I?DIB
JI OC@ @I>J?DIB <I? OC@ >C<M<>O@MN OC@HN@GQ@N, 2ID>J?@ >C<M<>O@MN <M@ H<?@ PK JA JI@
JM HJM@ >J?@ PIDON. #JM @S<HKG@, DI OC@ 21#-8 @I>J?DIB OC@ G@OO@M < DN H<?@ PK JA < NDIBG@
>J?@ PIDO <I? OC@ G@OO@M b DN H<?@ PK JA ORJ >J?@ PIDON.
!'N >C<M<>O@M OTK@N DIBS, XDIBS, <I? EDIBS >JMM@NKJI? OJ 21#-8, 21#-16, <I?
21#-32 >J?@ PIDON, M@NK@>ODQ@GT.
t Code point: "Q@MT G@OO@M, IPH@M<G, NTH=JG, @O>. OC<O OC@ 2ID>J?@ NO<I?<M? ?@ADI@N DN
><GG@? < >J?@ KJDIO. #JM @S<HKG@ OC@ 2ID>J?@ >J?@ Q<GP@N JA < <I? b <M@ ORJ ?DNODI>O >J?@
KJDION.
C:3D35F7DE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
72
!@K@I?DIB JI OC@ @I>J?DIB, >J?@ KJDION <M@ M@KM@N@IO@? =T JI@ JM HJM@ >J?@ PIDON.
AN H@IODJI@? <=JQ@, DI OC@ 21#-8 @I>J?DIB < DN M@KM@N@IO@? =T < NDIBG@ >J?@ PIDO,
<I? b DN M@KM@N@IO@? =T ORJ >J?@ PIDON. ,I OC@ JOC@M C<I?, =JOC < <I? b <M@
M@KM@N@IO@? =T < NDIBG@ >J?@ PIDO DI =JOC 21#-16 <I? 21#-32 @I>J?DIBN.
1C@ ! OTK@ OC<O NPKKJMON >J?@ KJDION DN EDIBS. DIBS <I? XDIBS ><I JIGT =@ PN@? <N
>J?@ PIDON.
t Character: AIT NTH=JG OC<O OC@ 2ID>J?@ NO<I?<M? ?@ADI@N <I? RC<O R@ ><GG ">C<M<>O@M" DI
?<DGT O<GF DN < >C<M<>O@M.
1CDN ?@ADIDODJI JA >C<M<>O@M DN AG@SD=G@ DI 2ID>J?@, <I? OCDN =MDIBN < >JHKGD><ODJI.
0JH@ >C<M<>O@MN ><I =@ AJMH@? =T HJM@ OC<I JI@ >J?@ KJDIO. #JM @S<HKG@, OC@ G@OO@M
b ><I =@ NK@>DAD@? DI ORJ R<TN:
w <N OC@ NDIBG@ >J?@ KJDIO b
w <N OC@ ORJ >J?@ KJDION B <I? g (>JH=DIDIB =M@Q@)
! ?J@N IJO I<ODQ@GT NPKKJMO OC@ >C<M<>O@M >JI>@KO JA >JH=DI@? >J?@ KJDION. &I !, OC@
NDIBG@ >J?@ KJDIO b DN ?DAA@M@IO AMJH OC@ ORJ >JIN@>PODQ@ >J?@ KJDION B <I? g.
Summary
18.11
t 2ID>J?@ NPKKJMON <GG JA OC@ >C<M<>O@MN JA <GG JA OC@ RMDODIB NTNO@HN.
t DIBS DN AJM OC@ 21#-8 @I>J?DIB; <GOCJPBC DO DN IJO NPDO<=G@ OJ M@KM@N@IO >C<M<>O@MN DI
B@I@M<G, DO NPKKJMON OC@ A0&& O<=G@.
t XDIBS DN AJM OC@ 21#-16 @I>J?DIB; <GOCJPBC DO DN IJO NPDO<=G@ OJ M@KM@N@IO >C<M<>O@MN DI
B@I@M<G, DO ><I NPKKJMO G@OO@MN JA HPGODKG@ <GKC<=@ON.
t EDIBS DN AJM OC@ 21#-32 @I>J?DIB; =@><PN@ DO DN 32 =DON, DO ><I <GNJ =@ PN@? <N >J?@ KJDION.
C:3D35F7DE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
73
Slices and Other Array Features 19
4@ C<Q@ N@@I DI OC@ AMM<TN >C<KO@M CJR @G@H@ION <M@ BMJPK@? <N < >JGG@>ODJI DI <I <MM<T.
1C<O >C<KO@M C<N DIO@IODJI<GGT =@@I =MD@A, G@<QDIB HJNO JA OC@ A@<OPM@N JA <MM<TN OJ OCDN
>C<KO@M.
B@AJM@ BJDIB <IT APMOC@M, C@M@ <M@ =MD@A ?@ADIDODJIN JA NJH@ JA OC@ O@MHN OC<O C<KK@I OJ =@
>GJN@ DI H@<IDIB:
t Array: 1C@ B@I@M<G >JI>@KO JA < BMJPK JA @G@H@ION OC<O <M@ GJ><O@? ND?@ =T ND?@ <I? <M@
<>>@NN@? =T DI?@S@N.
t Fixed-length array (static array): AMM<T RDOC < ADS@? IPH=@M JA @G@H@ION. 1CDN OTK@ JA
<MM<T JRIN DON @G@H@ION.
t Dynamic array: AMM<T OC<O ><I B<DI JM GJN@ @G@H@ION. 1CDN OTK@ JA <MM<T KMJQD?@N <>>@NN
OJ @G@H@ION OC<O <M@ JRI@? =T OC@ ! MPIODH@ @IQDMJIH@IO.
t Slice: AIJOC@M I<H@ AJM 6K@3?;5 3DD3K.
4C@I & RMDO@ E>;57 & RDGG NK@>DAD><GGT H@<I < NGD>@; <I? RC@I & RMDO@ 3DD3K, & RDGG H@<I @DOC@M <
NGD>@ JM < ADS@?-G@IBOC <MM<T, RDOC IJ ?DNODI>ODJI.
Slices
19.1
0GD>@N <M@ OC@ N<H@ A@<OPM@ <N ?TI<HD> <MM<TN. 1C@T <M@ ><GG@? 6K@3?;5 3DD3KE AJM =@DIB PN@?
GDF@ <MM<TN, <I? <M@ ><GG@? E>;57E AJM KMJQD?DIB <>>@NN OJ KJMODJIN JA JOC@M <MM<TN. 1C@T <GGJR
PNDIB OCJN@ KJMODJIN <N DA OC@T <M@ N@K<M<O@ <MM<TN.
0GD>@N <M@ ?@ADI@? =T OC@ @G?47D D3@97 NTIO<S OC<O >JMM@NKJI? OJ OC@ DI?@S@N OC<O NK@>DAT OC@
=@BDIIDIB <I? OC@ @I? JA OC@ M<IB@:
beginning_index .. one_beyond_the_end_index
&I OC@ IPH=@M M<IB@ NTIO<S, OC@ =@BDIIDIB DI?@S DN < K<MO JA OC@ M<IB@ =PO OC@ @I? DI?@S DN
JPOND?@ JA OC@ M<IB@:
/* ... */ = NPOUI%BZT<0 .. 3>; // 0, 1, BOE 2 BSF JODMVEFE; CVU OPU 3
Note: $G?47D D3@97E 3D7 6;887D7@F 8DA? &:A4AE D3@97E. &:A4AE D3@97E 3D7 34AGF EFDG5F 3@6
5>3EE ;@F7D8357E. ,7 I;>> E77 F:7E7 873FGD7E ;@ >3F7D 5:3BF7DE.
AN <I @S<HKG@, R@ ><I E>;57 OC@ NPOUI%BZT <MM<T OJ =@ <=G@ OJ PN@ DON K<MON <N AJPM NH<GG@M
<MM<TN:
JOU<12> NPOUI%BZT =
< 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 >;
JOU<> GJSTU2VBSUFS = NPOUI%BZT<0 .. 3>;
JOU<> TFDPOE2VBSUFS = NPOUI%BZT<3 .. 6>;
JOU<> UIJSE2VBSUFS = NPOUI%BZT<6 .. 9>;
JOU<> GPVSUI2VBSUFS = NPOUI%BZT<9 .. 12>;
1C@ AJPM Q<MD<=G@N DI OC@ >J?@ <=JQ@ <M@ NGD>@N; OC@T KMJQD?@ <>>@NN OJ AJPM K<MON JA <I
<GM@<?T @SDNODIB <MM<T. AI DHKJMO<IO KJDIO RJMOC NOM@NNDIB C@M@ DN OC<O OCJN@ NGD>@N ?J IJO
C<Q@ OC@DM JRI @G@H@ION. 1C@T H@M@GT KMJQD?@ <>>@NN OJ OC@ @G@H@ION JA OC@ <>OP<G <MM<T.
*J?DATDIB <I @G@H@IO JA < NGD>@ HJ?DAD@N OC@ @G@H@IO JA OC@ <>OP<G <MM<T. 1J N@@ OCDN, G@O'N
HJ?DAT OC@ ADMNO @G@H@ION JA @<>C NGD>@ <I? OC@I KMDIO OC@ <>OP<G <MM<T:
(>;57E 3@6 %F:7D ADD3K F73FGD7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
74
GJSTU2VBSUFS<0> = 1;
TFDPOE2VBSUFS<0> = 2;
UIJSE2VBSUFS<0> = 3;
GPVSUI2VBSUFS<0> = 4;
XSJUFMO(NPOUI%BZT);
1C@ JPOKPO:
<1, 28, 31, 2, 31, 30, 3, 31, 30, 4, 30, 31>
"<>C NGD>@ HJ?DAD@N DON ADMNO @G@H@IO, <I? OC@ >JMM@NKJI?DIB @G@H@IO JA OC@ <>OP<G <MM<T DN
<AA@>O@?.
4@ C<Q@ N@@I @<MGD@M OC<O Q<GD? <MM<T DI?@S@N <M@ AMJH 0 OJ JI@ G@NN OC<I OC@ G@IBOC JA OC@
<MM<T. #JM @S<HKG@, OC@ Q<GD? DI?@S@N JA < 3-@G@H@IO <MM<T <M@ 0, 1, <I? 2. 0DHDG<MGT, OC@ @I?
DI?@S DI OC@ NGD>@ NTIO<S NK@>DAD@N JI@ =@TJI? OC@ G<NO @G@H@IO OC<O OC@ NGD>@ RDGG =@ KMJQD?DIB
<>>@NN OJ. #JM OC<O M@<NJI, RC@I OC@ G<NO @G@H@IO JA <I <MM<T I@@?N OJ =@ DI>GP?@? DI < NGD>@,
OC@ G@IBOC JA OC@ <MM<T HPNO =@ NK@>DAD@? <N OC@ @I? DI?@S. #JM @S<HKG@, < NGD>@ JA <GG JA OC@
@G@H@ION JA < 3-@G@H@IO <MM<T RJPG? =@ BSSBZ<0..3>.
AI J=QDJPN GDHDO<ODJI DN OC<O OC@ =@BDIIDIB DI?@S ><IIJO =@ BM@<O@M OC<I OC@ @I? DI?@S:
JOU<3> BSSBZ = < 0, 1, 2 >;
JOU<> TMJDF = BSSBZ<2 .. 1>; // j SVO-UJNF &3303
&O DN G@B<G OJ C<Q@ OC@ =@BDIIDIB <I? OC@ @I? DI?@S@N OJ =@ @LP<G. &I OC<O ><N@ OC@ NGD>@ DN
@HKOT. ANNPHDIB OC<O JOEFY DN Q<GD?:
JOU<> TMJDF = BO"SSBZ<JOEFY .. JOEFY>;
XSJUFMO("5IF MFOHUI PG UIF TMJDF: ", TMJDF.MFOHUI);
1C@ JPOKPO:
5IF MFOHUI PG UIF TMJDF: 0
$, instead of BSSBZ.MFOHUI
19.2
4C@I DI?@SDIB, $ DN < NCJMOC<I? AJM OC@ G@IBOC JA OC@ <MM<T:
XSJUFMO(BSSBZ<BSSBZ.MFOHUI - 1>); // UIF MBTU FMFNFOU
XSJUFMO(BSSBZ<$ - 1>); // UIF TBNF UIJOH
.EVQ to copy
19.3
0CJMO AJM "?PKGD><O@", OC@ .EVQ KMJK@MOT H<F@N < I@R <MM<T AMJH OC@ >JKD@N JA OC@ @G@H@ION
JA <I @SDNODIB <MM<T:
EPVCMF<> BSSBZ = < 1.25, 3.75 >;
EPVCMF<> UIF$PQZ = BSSBZ.EVQ;
AN <I @S<HKG@, G@O'N ?@ADI@ <I <MM<T OC<O >JIO<DIN OC@ IPH=@M JA ?<TN JA OC@ HJIOCN JA < G@<K
T@<M. A H@OCJ? DN OJ O<F@ < >JKT JA OC@ IJI-G@<K-T@<M <MM<T <I? OC@I OJ DI>M@H@IO OC@ @G@H@IO
OC<O >JMM@NKJI?N OJ #@=MP<MT:
(>;57E 3@6 %F:7D ADD3K F73FGD7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
75
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
JOU<12> NPOUI%BZT =
< 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 >;
JOU<> MFBQ:FBS = NPOUI%BZT.EVQ;
++MFBQ:FBS<1>; // JODSFNFOUT UIF EBZT JO 'FCSVBSZ
XSJUFMO("/PO-MFBQ ZFBS: ", NPOUI%BZT);
XSJUFMO("-FBQ ZFBS : ", MFBQ:FBS);
^
1C@ JPOKPO:
/PO-MFBQ ZFBS: <31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31>
-FBQ ZFBS : <31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31>
Assignment
19.4
4@ C<Q@ N@@I NJ A<M OC<O OC@ <NNDBIH@IO JK@M<OJM ?A6;8;7E Q<GP@N JA Q<MD<=G@N. &O DN OC@ N<H@
RDOC ADS@?-G@IBOC <MM<TN:
JOU<3> B = < 1, 1, 1 >;
JOU<3> C = < 2, 2, 2 >;
B = C; // UIF FMFNFOUT PG 'B' CFDPNF 2
XSJUFMO(B);
1C@ JPOKPO:
<2, 2, 2>
1C@ <NNDBIH@IO JK@M<ODJI C<N < >JHKG@O@GT ?DAA@M@IO H@<IDIB AJM NGD>@N: &O H<F@N OC@ NGD>@
NO<MO KMJQD?DIB <>>@NN OJ I@R @G@H@ION:
JOU<> PEET = < 1, 3, 5, 7, 9, 11 >;
JOU<> FWFOT = < 2, 4, 6, 8, 10 >;
JOU<> TMJDF; // OPU QSPWJEJOH BDDFTT UP BOZ FMFNFOUT ZFU
TMJDF = PEET<2 .. $ - 2>;
XSJUFMO(TMJDF);
TMJDF = FWFOT<1 .. $ - 1>;
XSJUFMO(TMJDF);
A=JQ@, TMJDF ?J@N IJO KMJQD?@ <>>@NN OJ <IT @G@H@ION RC@I DO DN ?@ADI@?. &O DN OC@I PN@? OJ
KMJQD?@ <>>@NN OJ NJH@ JA OC@ @G@H@ION JA PEET, <I? G<O@M OJ NJH@ JA OC@ @G@H@ION JA FWFOT:
<5, 7>
<4, 6, 8>
(>;57E 3@6 %F:7D ADD3K F73FGD7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
76
Making a slice longer may terminate sharing
19.5
0DI>@ OC@ G@IBOC JA < ADS@?-G@IBOC <MM<T ><IIJO =@ >C<IB@?, OC@ >JI>@KO JA F7D?;@3F;A@ A8
E:3D;@9 DN JIGT <=JPO NGD>@N.
&O DN KJNND=G@ OJ <>>@NN OC@ N<H@ @G@H@ION =T HJM@ OC<I JI@ NGD>@. #JM @S<HKG@, OC@ ADMNO ORJ
JA OC@ @DBCO @G@H@ION =@GJR <M@ =@DIB <>>@NN@? OCMJPBC OCM@@ NGD>@N:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
JOU<> TMJDF = < 1, 3, 5, 7, 9, 11, 13, 15 >;
JOU<> IBMG = TMJDF<0 .. $ / 2>;
JOU<> RVBSUFS = TMJDF<0 .. $ / 4>;
RVBSUFS<1> = 0; // NPEJGZ UISPVHI POF TMJDF
XSJUFMO(RVBSUFS);
XSJUFMO(IBMG);
XSJUFMO(TMJDF);
^
1C@ @AA@>O JA OC@ HJ?DAD><ODJI OJ OC@ N@>JI? @G@H@IO JA RVBSUFS DN N@@I OCMJPBC <GG JA OC@
NGD>@N:
<1, 0>
<1, 0, 5, 7>
<1, 0, 5, 7, 9, 11, 13, 15>
4C@I QD@R@? OCDN R<T, NGD>@N KMJQD?@ E:3D76 <>>@NN OJ @G@H@ION. 1CDN NC<MDIB JK@IN OC@
LP@NODJI JA RC<O C<KK@IN RC@I < I@R @G@H@IO DN <??@? OJ JI@ JA OC@ NGD>@N. 0DI>@ OC@ NGD>@N
KMJQD?@ <>>@NN OJ OC@ N<H@ <>OP<G @G@H@ION, OC@M@ H<T IJO =@ MJJH OJ <?? @G@H@ION OJ < NGD>@
RDOCJPO ?DNOPM=DIB OC@ JOC@MN.
! <INR@MN OCDN LP@NODJI =T O@MHDI<ODIB OC@ NC<MDIB M@G<ODJINCDK DA OC@M@ DN IJ MJJH AJM OC@
I@R @G@H@IO: 1C@ NGD>@ OC<O C<N IJ MJJH OJ BMJR G@<Q@N OC@ NC<MDIB. 4C@I OCDN C<KK@IN, <GG
JA OC@ @SDNODIB @G@H@ION JA OC<O NGD>@ <M@ >JKD@? OJ < I@R KG<>@ <POJH<OD><GGT <I? OC@ NGD>@
NO<MON KMJQD?DIB <>>@NN OJ OC@N@ I@R @G@H@ION.
1J N@@ OCDN DI <>ODJI, G@O'N <?? <I @G@H@IO OJ RVBSUFS =@AJM@ HJ?DATDIB DON N@>JI? @G@H@IO:
RVBSUFS _= 42; // UIJT TMJDF MFBWFT UIF TIBSJOH CFDBVTF
// UIFSF JT OP SPPN GPS UIF OFX FMFNFOU
RVBSUFS<1> = 0; // GPS UIBU SFBTPO UIJT NPEJGJDBUJPO
// EPFT OPU BGGFDU UIF PUIFS TMJDFT
1C@ JPOKPO JA OC@ KMJBM<H NCJRN OC<O OC@ HJ?DAD><ODJI OJ OC@ RVBSUFS NGD>@ ?J@N IJO <AA@>O
OC@ JOC@MN:
<1, 0, 42>
<1, 3, 5, 7>
<1, 3, 5, 7, 9, 11, 13, 15>
"SKGD>DOGT DI>M@<NDIB OC@ G@IBOC JA < NGD>@ H<F@N DO G@<Q@ OC@ NC<MDIB <N R@GG:
++RVBSUFS.MFOHUI; // MFBWFT UIF TIBSJOH
(>;57E 3@6 %F:7D ADD3K F73FGD7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
77
JM
RVBSUFS.MFOHUI += 5; // MFBWFT UIF TIBSJOH
,I OC@ JOC@M C<I?, NCJMO@IDIB < NGD>@ ?J@N IJO <AA@>O NC<MDIB. 0CJMO@IDIB OC@ NGD>@ H@M@GT
H@<IN OC<O OC@ NGD>@ IJR KMJQD?@N <>>@NN OJ G@NN @G@H@ION:
JOU<> B = < 1, 11, 111 >;
JOU<> E = B;
E = E<1 .. $>; // TIPSUFOJOH GSPN UIF CFHJOOJOH
E<0> = 42; // NPEJGZJOH UIF FMFNFOU UISPVHI UIF TMJDF
XSJUFMO(B); // QSJOUJOH UIF PUIFS TMJDF
AN ><I =@ N@@I AMJH OC@ JPOKPO, OC@ HJ?DAD><ODJI OCMJPBC E DN N@@I OCMJPBC B; OC@ NC<MDIB DN
NODGG DI @AA@>O:
<1, 42, 111>
/@?P>DIB OC@ G@IBOC DI ?DAA@M@IO R<TN ?J@N IJO O@MHDI<O@ NC<MDIB @DOC@M:
E = E<0 .. $ - 1>; // TIPSUFOJOH GSPN UIF FOE
--E.MFOHUI; // TBNF UIJOH
E.MFOHUI = E.MFOHUI - 1; // TBNF UIJOH
0C<MDIB JA @G@H@ION DN NODGG DI @AA@>O.
DBQBDJUZ to determine whether sharing will be terminated 19.5.1
1C@M@ <M@ ><N@N RC@I NGD>@N >JIODIP@ NC<MDIB @G@H@ION @Q@I <AO@M <I @G@H@IO DN <??@? OJ JI@
JA OC@H. 1CDN C<KK@IN RC@I OC@ @G@H@IO DN <??@? OJ OC@ GJIB@NO NGD>@ <I? OC@M@ DN MJJH <O OC@
@I? JA DO:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
JOU<> TMJDF = < 1, 3, 5, 7, 9, 11, 13, 15 >;
JOU<> IBMG = TMJDF<0 .. $ / 2>;
JOU<> RVBSUFS = TMJDF<0 .. $ / 4>;
TMJDF _= 42; // BEEJOH UP UIF MPOHFTU TMJDF ...
TMJDF<1> = 0; // ... BOE UIFO NPEJGZJOH BO FMFNFOU
XSJUFMO(RVBSUFS);
XSJUFMO(IBMG);
XSJUFMO(TMJDF);
^
AN N@@I DI OC@ JPOKPO, <GOCJPBC OC@ <??@? @G@H@IO DI>M@<N@N OC@ G@IBOC JA < NGD>@, OC@ NC<MDIB
C<N IJO =@@I O@MHDI<O@?, <I? OC@ HJ?DAD><ODJI DN N@@I OCMJPBC <GG JA OC@ NGD>@N:
<1, 0>
<1, 0, 5, 7>
<1, 0, 5, 7, 9, 11, 13, 15, 42>
(>;57E 3@6 %F:7D ADD3K F73FGD7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
78
1C@ DBQBDJUZ KMJK@MOT JA NGD>@N ?@O@MHDI@N RC@OC@M OC@ NC<MDIB RDGG =@ O@MHDI<O@? DA <I
@G@H@IO DN <??@? OJ < K<MOD>PG<M NGD>@. (DBQBDJUZ DN <>OP<GGT < API>ODJI =PO OCDN ?DNODI>ODJI
?J@N IJO C<Q@ <IT NDBIDAD><I>@ DI OCDN ?DN>PNNDJI.)
DBQBDJUZ C<N ORJ H@<IDIBN:
t 4C@I DON Q<GP@ DN 0, DO H@<IN OC<O OCDN DN IJO OC@ G<MB@NO JMDBDI<G NGD>@. &I OCDN ><N@, <??DIB
< I@R @G@H@IO RJPG? ?@ADIDO@GT M@GJ><O@ OC@ @G@H@ION JA OC@ NGD>@ <I? OC@ NC<MDIB RJPG?
O@MHDI<O@.
t 4C@I DON Q<GP@ DN IJI-U@MJ, DO H@<IN OC<O OCDN DN OC@ G<MB@NO JMDBDI<G NGD>@. &I OCDN ><N@,
DBQBDJUZ ?@IJO@N OC@ OJO<G IPH=@M JA @G@H@ION OC<O OCDN NGD>@ ><I CJG? RDOCJPO I@@?DIB OJ
=@ >JKD@?. 1C@ IPH=@M JA @7I 7>7?7@FE OC<O ><I =@ <??@? OJ OCDN NGD>@ =@AJM@ DO I@@?N OJ
=@ >JKD@? ><I =@ ><G>PG<O@? =T NP=OM<>ODIB OC@ <>OP<G G@IBOC JA OC@ NGD>@ AMJH OC@ ><K<>DOT
Q<GP@. 1C@M@ DN IJ MJJH AJM <IJOC@M @G@H@IO RC@I OC@ G@IBOC JA OC@ NGD>@ @LP<GN DON
><K<>DOT.
A>>JM?DIBGT, < KMJBM<H OC<O I@@?N OJ ?@O@MHDI@ RC@OC@M OC@ NC<MDIB RDGG O@MHDI<O@ NCJPG?
PN@ < GJBD> NDHDG<M OJ OC@ AJGGJRDIB:
JG (TMJDF.DBQBDJUZ == 0) \
/* *UT FMFNFOUT XPVME CF SFMPDBUFE JG POF NPSF FMFNFOU
* JT BEEFE UP UIJT TMJDF. */
// ...
^ FMTF \
/* 5IJT TMJDF NBZ IBWF SPPN GPS OFX FMFNFOUT CFGPSF
* OFFEJOH UP CF SFMPDBUFE. -FU'T DBMDVMBUF IPX
* NBOZ: */
BVUP IPX.BOZ/FX&MFNFOUT = TMJDF.DBQBDJUZ - TMJDF.MFOHUI;
// ...
^
Operations on all of the elements
19.6
1CDN A@<OPM@ DN AJM =JOC ADS@?-G@IBOC <MM<TN <I? NGD>@N.
1C@ <> >C<M<>O@MN RMDOO@I <AO@M OC@ I<H@ JA <I <MM<T H@<IN 3>> A8 F:7 7>7?7@FE. 1CDN A@<OPM@
NDHKGDAD@N OC@ KMJBM<H RC@I >@MO<DI JK@M<ODJIN I@@? OJ =@ <KKGD@? OJ <GG JA OC@ @G@H@ION JA <I
<MM<T.
Note: ):7 D 5A?B;>7D F:3F ! :3H7 GE76 I:7@ ID;F;@9 F:;E 5:3BF7D (6?6 2.056) 6A7E @AF
EGBBADF F:;E 873FGD7 8G>>K. FAD F:3F D73EA@ ! :3H7 GE76 A@>K 8;J76->7@9F: 3DD3KE ;@ EA?7 A8 F:7
8A>>AI;@9 7J3?B>7E.
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
EPVCMF<3> B = < 10, 20, 30 >;
EPVCMF<3> C = < 2, 3, 4 >;
EPVCMF<3> SFTVMU = B<> + C<>;
XSJUFMO(SFTVMU);
^
1C@ JPOKPO:
(>;57E 3@6 %F:7D ADD3K F73FGD7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
79
<12, 23, 34>
1C@ <??DODJI JK@M<ODJI DI OC<O KMJBM<H DN <KKGD@? OJ OC@ >JMM@NKJI?DIB @G@H@ION JA =JOC JA
OC@ <MM<TN DI JM?@M: #DMNO OC@ ADMNO @G@H@ION <M@ <??@?, OC@I OC@ N@>JI? @G@H@ION <M@ <??@?,
@O>. A I<OPM<G M@LPDM@H@IO DN OC<O OC@ G@IBOCN JA OC@ ORJ <MM<TN HPNO =@ @LP<G.
1C@ JK@M<OJM ><I =@ JI@ JA OC@ <MDOCH@OD> JK@M<OJMN +, -, *, /, %, <I? ??; JI@ JA OC@ =DI<MT
JK@M<OJMN ?, &, <I? ]; <N R@GG <N OC@ PI<MT JK@M<OJMN - <I? _ OC<O <M@ OTK@? DI AMJIO JA <I
<MM<T. 4@ RDGG N@@ NJH@ JA OC@N@ JK@M<OJMN DI G<O@M >C<KO@MN.
1C@ <NNDBIH@IO Q@MNDJIN JA OC@N@ JK@M<OJMN ><I <GNJ =@ PN@?: =, +=, -=, *=, /=, %=, ??=, ?=,
&=, <I? ]=.
1CDN A@<OPM@ DN IJO JIGT =@OR@@I ORJ <MM<TN; DI <??DODJI OJ <I <MM<T, <I @SKM@NNDJI OC<O DN
>JHK<OD=G@ RDOC OC@ @G@H@ION ><I <GNJ =@ PN@?. #JM @S<HKG@, OC@ AJGGJRDIB JK@M<ODJI ?DQD?@N
<GG JA OC@ @G@H@ION JA <I <MM<T =T AJPM:
EPVCMF<3> B = < 10, 20, 30 >;
B<> /= 4;
XSJUFMO(B);
1C@ JPOKPO:
<2.5, 5, 7.5>
1J <NNDBI <GG JA OC@ @G@H@ION OJ < NK@>DAD> Q<GP@:
B<> = 42;
XSJUFMO(B);
1C@ JPOKPO:
<42, 42, 42>
1CDN A@<OPM@ M@LPDM@N BM@<O <OO@IODJI RC@I PN@? RDOC NGD>@N. AGOCJPBC OC@M@ DN IJ <KK<M@IO
?DAA@M@I>@ DI @G@H@IO Q<GP@N, OC@ AJGGJRDIB ORJ @SKM@NNDJIN C<Q@ Q@MT ?DAA@M@IO H@<IDIBN:
TMJDF2 = TMJDF1; // j TMJDF2 TUBSUT QSPWJEJOH BDDFTT
// UP UIF TBNF FMFNFOUT UIBU
// TMJDF1 QSPWJEFT BDDFTT UP
TMJDF3<> = TMJDF1; // j UIF WBMVFT PG UIF FMFNFOUT PG
// TMJDF3 DIBOHF
1C@ <NNDBIH@IO JA TMJDF2 H<F@N DO NC<M@ OC@ N<H@ @G@H@ION <N TMJDF1. ,I OC@ JOC@M C<I?,
<N TMJDF3<> H@<IN 3>> 7>7?7@FE A8 slice3, OC@ Q<GP@N JA DON @G@H@ION =@>JH@ OC@ N<H@ <N
OC@ Q<GP@N JA OC@ @G@H@ION JA TMJDF1. 1C@ @AA@>O JA KM@N@I>@ JM <=N@I>@ JA OC@ <> >C<M<>O@MN
><IIJO =@ DBIJM@?.
4@ ><I N@@ <I @S<HKG@ JA OCDN ?DAA@M@I>@ DI OC@ AJGGJRDIB KMJBM<H:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
EPVCMF<> TMJDF1 = < 1, 1, 1 >;
EPVCMF<> TMJDF2 = < 2, 2, 2 >;
EPVCMF<> TMJDF3 = < 3, 3, 3 >;
(>;57E 3@6 %F:7D ADD3K F73FGD7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
80
TMJDF2 = TMJDF1; // j TMJDF2 TUBSUT QSPWJEJOH BDDFTT
// UP UIF TBNF FMFNFOUT UIBU
// TMJDF1 QSPWJEFT BDDFTT UP
TMJDF3<> = TMJDF1; // j UIF WBMVFT PG UIF FMFNFOUT PG
// TMJDF3 DIBOHF
XSJUFMO("TMJDF1 CFGPSF: ", TMJDF1);
XSJUFMO("TMJDF2 CFGPSF: ", TMJDF2);
XSJUFMO("TMJDF3 CFGPSF: ", TMJDF3);
TMJDF2<0> = 42; // j UIF WBMVF PG BO FMFNFOU UIBU
// JU TIBSFT XJUI TMJDF1 DIBOHFT
TMJDF3<0> = 43; // j UIF WBMVF PG BO FMFNFOU UIBU
// POMZ JU QSPWJEFT BDDFTT UP
// DIBOHFT
XSJUFMO("TMJDF1 BGUFS : ", TMJDF1);
XSJUFMO("TMJDF2 BGUFS : ", TMJDF2);
XSJUFMO("TMJDF3 BGUFS : ", TMJDF3);
^
1C@ HJ?DAD><ODJI OCMJPBC TMJDF2 <AA@>ON TMJDF1 OJJ:
TMJDF1 CFGPSF: <1, 1, 1>
TMJDF2 CFGPSF: <1, 1, 1>
TMJDF3 CFGPSF: <1, 1, 1>
TMJDF1 BGUFS : <42, 1, 1>
TMJDF2 BGUFS : <42, 1, 1>
TMJDF3 BGUFS : <43, 1, 1>
1C@ ?<IB@M C@M@ DN OC<O OC@ KJO@IOD<G =PB H<T IJO =@ IJOD>@? PIODG <AO@M OC@ Q<GP@ JA < NC<M@?
@G@H@IO DN >C<IB@?.
Multi-dimensional arrays
19.7
0J A<M R@ C<Q@ PN@? <MM<TN RDOC JIGT API?<H@IO<G OTK@N GDF@ JOU <I? EPVCMF. 1C@ @G@H@IO
OTK@ ><I <>OP<GGT =@ <IT JOC@M OTK@, DI>GP?DIB JOC@M <MM<TN. 1CDN @I<=G@N OC@ KMJBM<HH@M OJ
?@ADI@ >JHKG@S >JIO<DI@MN GDF@ 3DD3K A8 3DD3KE. AMM<TN JA <MM<TN <M@ ><GG@? ?G>F;-6;?7@E;A@3>
3DD3KE.
AGG JA OC@ @G@H@ION JA <GG JA OC@ <MM<TN OC<O R@ C<Q@ ?@ADI@? NJ A<M C<Q@ =@@I RMDOO@I DI OC@
NJPM>@ >J?@ AMJH G@AO OJ MDBCO. 1J C@GK PN PI?@MNO<I? OC@ >JI>@KO JA < ORJ-?DH@INDJI<G <MM<T,
G@O'N ?@ADI@ <I <MM<T AMJH OJK OJ =JOOJH OCDN ODH@:
JOU<> BSSBZ = <
10,
20,
30,
40
>;
AN TJP M@H@H=@M, HJNO NK<>@N DI OC@ NJPM>@ >J?@ <M@ OJ C@GK RDOC M@<?<=DGDOT <I? ?J IJO
>C<IB@ OC@ H@<IDIB JA OC@ >J?@. 1C@ <MM<T <=JQ@ >JPG? C<Q@ =@@I ?@ADI@? JI < NDIBG@ GDI@
<I? RJPG? C<Q@ OC@ N<H@ H@<IDIB.
)@O'N IJR M@KG<>@ @Q@MT @G@H@IO JA OC<O <MM<T RDOC <IJOC@M <MM<T:
(>;57E 3@6 %F:7D ADD3K F73FGD7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
81
/* ... */ BSSBZ = <
< 10, 11, 12 >,
< 20, 21, 22 >,
< 30, 31, 32 >,
< 40, 41, 42 >
>;
4@ C<Q@ M@KG<>@? @G@H@ION JA OTK@ JOU RDOC @G@H@ION JA OTK@ JOU<>. 1J H<F@ OC@ >J?@
>JIAJMH OJ <MM<T ?@ADIDODJI NTIO<S, R@ HPNO IJR NK@>DAT OC@ OTK@ JA OC@ @G@H@ION <N JOU<>
DINO@<? JA JOU:
JOU<><> BSSBZ = <
< 10, 11, 12 >,
< 20, 21, 22 >,
< 30, 31, 32 >,
< 40, 41, 42 >
>;
0P>C <MM<TN <M@ ><GG@? FIA-6;?7@E;A@3> 3DD3KE =@><PN@ OC@T ><I =@ N@@I <N C<QDIB MJRN <I?
>JGPHIN.
1RJ-?DH@INDJI<G <MM<TN <M@ PN@? OC@ N<H@ R<T <N <IT JOC@M <MM<T <N GJIB <N R@ M@H@H=@M
OC<O @<>C @G@H@IO DN <I <MM<T DON@GA <I? DN PN@? DI <MM<T JK@M<ODJIN:
BSSBZ _= < 50, 51 >; // BEET B OFX FMFNFOU (J.F. B TMJDF)
BSSBZ<0> _= 13; // BEET UP UIF GJSTU FMFNFOU
1C@ I@R NO<O@ JA OC@ <MM<T:
<<10, 11, 12, 13>, <20, 21, 22>, <30, 31, 32>, <40, 41, 42>, <50, 51>>
AMM<TN <I? @G@H@ION ><I =@ ADS@?-G@IBOC <N R@GG. 1C@ AJGGJRDIB DN < OCM@@-?DH@INDJI<G <MM<T
RC@M@ <GG ?DH@INDJIN <M@ ADS@?-G@IBOC:
JOU<2><3><4> BSSBZ; // 2 DPMVNOT, 3 SPXT, 4 QBHFT
1C@ ?@ADIDODJI <=JQ@ ><I =@ N@@I <N 8AGD B397E A8 F:D77 DAIE A8 FIA 5A>G?@E. AN <I @S<HKG@,
NP>C <I <MM<T ><I =@ PN@? OJ M@KM@N@IO < 4-NOJMT =PDG?DIB DI <I <?Q@IOPM@ B<H@, @<>C NOJMT
>JINDNODIB JA 2S3=6 MJJHN.
#JM @S<HKG@, OC@ IPH=@M JA DO@HN DI OC@ ADMNO MJJH JA OC@ N@>JI? AGJJM ><I =@ DI>M@H@IO@?
GDF@ OC@ AJGGJRDIB:
// 5IF JOEFY PG UIF TFDPOE GMPPS JT 1, BOE UIF GJSTU SPPN
// PG UIBU GMPPS JT BDDFTTFE CZ <0><0>
++JUFN$PVOUT<1><0><0>;
&I <??DODJI OJ OC@ NTIO<S <=JQ@, OC@ OFX @SKM@NNDJI ><I <GNJ =@ PN@? OJ >M@<O@ < E>;57 A8
E>;57E. 1C@ AJGGJRDIB @S<HKG@ PN@N JIGT ORJ ?DH@INDJIN:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
JOU<><> T = OFX JOU<><>(2, 3);
XSJUFMO(T);
^
(>;57E 3@6 %F:7D ADD3K F73FGD7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
82
1C@ OFX @SKM@NNDJI <=JQ@ >M@<O@N 2 NGD>@N >JIO<DIDIB 3 @G@H@ION @<>C <I? M@OPMIN < NGD>@ OC<O
KMJQD?@N <>>@NN OJ OCJN@ NGD>@N <I? @G@H@ION. 1C@ JPOKPO:
<<0, 0, 0>, <0, 0, 0>>
Summary
19.8
t #DS@?-G@IBOC <MM<TN JRI OC@DM @G@H@ION; NGD>@N KMJQD?@ <>>@NN OJ @G@H@ION OC<O ?JI'O
=@GJIB OJ OC@H.
t 4DOCDI OC@ <> JK@M<OJM, $ DN OC@ @LPDQ<G@IO JA array_name.MFOHUI.
t .EVQ H<F@N < I@R <MM<T OC<O >JINDNON JA OC@ >JKD@N JA OC@ @G@H@ION JA <I @SDNODIB <MM<T.
t 4DOC ADS@?-G@IBOC <MM<TN, OC@ <NNDBIH@IO JK@M<ODJI >C<IB@N OC@ Q<GP@N JA @G@H@ION; RDOC
NGD>@N, DO H<F@N OC@ NGD>@N NO<MO KMJQD?DIB <>>@NN OJ JOC@M @G@H@ION.
t 0GD>@N OC<O B@O GJIB@M ?3K NOJK NC<MDIB @G@H@ION <I? NO<MO KMJQD?DIB <>>@NN OJ I@RGT
>JKD@? @G@H@ION. DBQBDJUZ ?@O@MHDI@N RC@OC@M OCDN RDGG =@ OC@ ><N@.
t 1C@ NTIO<S BSSBZ<> H@<IN 3>> A8 F:7 7>7?7@FE; OC@ JK@M<ODJI OC<O DN <KKGD@? OJ DO DN <KKGD@?
OJ @<>C @G@H@IO DI?DQD?P<GGT.
t AMM<TN JA <MM<TN <M@ ><GG@? HPGOD-?DH@INDJI<G <MM<TN.
Exercise
19.9
t &O@M<O@ JQ@M OC@ @G@H@ION JA <I <MM<T JA EPVCMFN <I? C<GQ@ OC@ JI@N OC<O <M@ BM@<O@M OC<I
10. #JM @S<HKG@, BDQ@I OC@ AJGGJRDIB <MM<T:
EPVCMF<> BSSBZ = < 1, 20, 2, 30, 7, 11 >;
*J?DAT DO <N OC@ AJGGJRDIB:
<1, 10, 2, 15, 7, 5.5>
AGOCJPBC OC@M@ <M@ H<IT NJGPODJIN JA OCDN KMJ=G@H, OMT OJ PN@ JIGT OC@ A@<OPM@N JA
NGD>@N. 6JP ><I NO<MO RDOC < NGD>@ OC<O KMJQD?@N <>>@NN OJ <GG JA OC@ @G@H@ION. 1C@I TJP
><I NCJMO@I OC@ NGD>@ AMJH OC@ =@BDIIDIB <I? <GR<TN PN@ OC@ ADMNO @G@H@IO.
1C@ AJGGJRDIB @SKM@NNDJI NCJMO@IN OC@ NGD>@ AMJH OC@ =@BDIIDIB:
TMJDF = TMJDF<1 .. $>;
... F:7 EA>GF;A@
(>;57E 3@6 %F:7D ADD3K F73FGD7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
83
Strings 20
4@ C<Q@ PN@? NOMDIBN DI H<IT KMJBM<HN OC<O R@ C<Q@ N@@I NJ A<M. 0OMDIBN <M@ < >JH=DI<ODJI
JA OC@ ORJ A@<OPM@N OC<O R@ C<Q@ >JQ@M@? DI OC@ G<NO OCM@@ >C<KO@MN: >C<M<>O@MN <I? <MM<TN. &I
OC@ NDHKG@NO ?@ADIDODJI, NOMDIBN <M@ IJOCDIB =PO <MM<TN JA >C<M<>O@MN. #JM @S<HKG@, DIBS<> DN <
OTK@ JA NOMDIB.
1CDN NDHKG@ ?@ADIDODJI H<T =@ HDNG@<?DIB. AN R@ C<Q@ N@@I DI OC@ C<M<>O@MN >C<KO@M, ! C<N
OCM@@ N@K<M<O@ >C<M<>O@M OTK@N. AMM<TN JA OC@N@ >C<M<>O@M OTK@N G@<? OJ OCM@@ N@K<M<O@ NOMDIB
OTK@N, NJH@ JA RCD>C H<T C<Q@ NPMKMDNDIB JPO>JH@N DI NJH@ NOMDIB JK@M<ODJIN.
SFBEMO and DIPNQ, instead of SFBEG
20.1
1C@M@ <M@ NPMKMDN@N @Q@I RC@I M@<?DIB NOMDIBN AMJH OC@ >JINJG@.
B@DIB >C<M<>O@M <MM<TN, NOMDIBN ><I >JIO<DI >JIOMJG >C<M<>O@MN GDF@ '=O' <N R@GG. 4C@I
M@<?DIB NOMDIBN AMJH OC@ DIKPO, OC@ >JIOMJG >C<M<>O@M OC<O >JMM@NKJI?N OJ OC@ "IO@M F@T OC<O DN
KM@NN@? <O OC@ @I? JA >JINJG@ DIKPO =@>JH@N < K<MO JA OC@ NOMDIB <N R@GG. #PMOC@M, =@><PN@
OC@M@ DN IJ R<T OJ O@GG SFBEG() CJR H<IT >C<M<>O@MN OJ M@<?, DO >JIODIP@N OJ M@<? PIODG OC@
@I? JA OC@ @IODM@ DIKPO. #JM OC@N@ M@<NJIN, SFBEG() ?J@N IJO RJMF <N DIO@I?@? RC@I M@<?DIB
NOMDIBN:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
DIBS<> OBNF;
XSJUF("8IBU JT ZPVS OBNF ");
SFBEG(" %T", &OBNF);
XSJUFMO(")FMMP ", OBNF, "!");
^
1C@ "IO@M F@T OC<O OC@ PN@M KM@NN@N <AO@M OC@ I<H@ ?J@N IJO O@MHDI<O@ OC@ DIKPO. SFBEG()
>JIODIP@N OJ R<DO AJM HJM@ >C<M<>O@MN OJ <?? OJ OC@ NOMDIB:
8IBU JT ZPVS OBNF .FSU
l 5IF JOQVU JT OPU UFSNJOBUFE BMUIPVHI &OUFS IBT CFFO QSFTTFE
l (-FU'T BTTVNF UIBU &OUFS JT QSFTTFE B TFDPOE UJNF IFSF)
,I@ R<T JA O@MHDI<ODIB OC@ NO<I?<M? DIKPO NOM@<H DI < >JINJG@ DN KM@NNDIB OMG-! PI?@M 2IDS-
=<N@? NTNO@HN <I? OMG-7 PI?@M 4DI?JRN NTNO@HN. &A OC@ PN@M @Q@IOP<GGT O@MHDI<O@N OC@ DIKPO
OC<O R<T, R@ N@@ OC<O OC@ I@R-GDI@ >C<M<>O@MN C<Q@ =@@I M@<? <N K<MON JA OC@ NOMDIB <N R@GG:
)FMMP .FSU
l OFX-MJOF DIBSBDUFS BGUFS UIF OBNF
! l (POF NPSF CFGPSF UIF FYDMBNBUJPO NBSL)
1C@ @S>G<H<ODJI H<MF <KK@<MN <AO@M OCJN@ >C<M<>O@MN DINO@<? JA =@DIB KMDIO@? MDBCO <AO@M OC@
I<H@.
SFBEMO() DN HJM@ NPDO<=G@ RC@I M@<?DIB NOMDIBN. 0CJMO AJM "M@<? GDI@", SFBEMO() M@<?N PIODG
OC@ @I? JA OC@ GDI@. &O DN PN@? ?DAA@M@IOGT =@><PN@ OC@ " %T" AJMH<O NOMDIB <I? OC@ & JK@M<OJM
<M@ IJO I@@?@?:
(FD;@9E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
84
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
DIBS<> OBNF;
XSJUF("8IBU JT ZPVS OBNF ");
SFBEMO(OBNF);
XSJUFMO(")FMMP ", OBNF, "!");
^
SFBEMO() NOJM@N OC@ I@R-GDI@ >C<M<>O@M <N R@GG. 1CDN DN NJ OC<O OC@ KMJBM<H C<N < R<T JA
?@O@MHDIDIB RC@OC@M OC@ DIKPO >JINDNO@? JA < >JHKG@O@ GDI@ JM RC@OC@M OC@ @I? JA DIKPO C<N
=@@I M@<>C@?:
8IBU JT ZPVS OBNF .FSU
)FMMP .FSU
! l OFX-MJOF DIBSBDUFS CFGPSF UIF FYDMBNBUJPO NBSL
0P>C >JIOMJG >C<M<>O@MN OC<O <M@ <O OC@ @I?N JA NOMDIBN ><I =@ M@HJQ@? =T
TUE.TUSJOH.DIPNQ:
JNQPSU TUE.TUEJP;
JNQPSU TUE.TUSJOH;
WPJE NBJO()
\
DIBS<> OBNF;
XSJUF("8IBU JT ZPVS OBNF ");
SFBEMO(OBNF);
OBNF = DIPNQ(OBNF);
XSJUFMO(")FMMP ", OBNF, "!");
^
1C@ DIPNQ() @SKM@NNDJI <=JQ@ M@OPMIN < I@R NOMDIB OC<O ?J@N IJO >JIO<DI OC@ OM<DGDIB >JIOMJG
>C<M<>O@MN. ANNDBIDIB OC<O M@OPMI Q<GP@ =<>F OJ OBNF KMJ?P>@N OC@ DIO@I?@? JPOKPO:
8IBU JT ZPVS OBNF .FSU
)FMMP .FSU! l OP OFX-MJOF DIBSBDUFS
SFBEMO() ><I =@ PN@? RDOCJPO < K<M<H@O@M. &I OC<O ><N@ DO D7FGD@E OC@ GDI@ OC<O DO C<N EPNO
M@<?. C<DIDIB OC@ M@NPGO JA SFBEMO() OJ DIPNQ() @I<=G@N < NCJMO@M <I? HJM@ M@<?<=G@
NTIO<S:
TUSJOH OBNF = DIPNQ(SFBEMO());
& RDGG NO<MO PNDIB OC<O AJMH <AO@M DIOMJ?P>DIB OC@ TUSJOH OTK@ =@GJR.
Double quotes, not single quotes
20.2
4@ C<Q@ N@@I OC<O NDIBG@ LPJO@N <M@ PN@? OJ ?@ADI@ >C<M<>O@M GDO@M<GN. 0OMDIB GDO@M<GN <M@
?@ADI@? RDOC ?JP=G@ LPJO@N. 'B' DN < >C<M<>O@M; "B" DN < NOMDIB OC<O >JIO<DIN < NDIBG@
>C<M<>O@M.
(FD;@9E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
85
TUSJOH, XTUSJOH, and ETUSJOH are immutable
20.3
1C@M@ <M@ OCM@@ NOMDIB OTK@N OC<O >JMM@NKJI? OJ OC@ OCM@@ >C<M<>O@M OTK@N: DIBS<>, XDIBS<>,
<I? EDIBS<>.
1C@M@ <M@ OCM@@ 3>;3E7E JA OC@ ;??GF34>7 Q@MNDJIN JA OCJN@ OTK@N: TUSJOH, XTUSJOH, <I?
ETUSJOH. 1C@ >C<M<>O@MN JA OC@ Q<MD<=G@N OC<O <M@ ?@ADI@? =T OC@N@ <GD<N@N ><IIJO =@
HJ?DAD@?. #JM @S<HKG@, OC@ >C<M<>O@MN JA < XDIBS<> ><I =@ HJ?DAD@? =PO OC@ >C<M<>O@MN JA <
XTUSJOH ><IIJO =@ HJ?DAD@?. (4@ RDGG N@@ !'N ;??GF34;>;FK >JI>@KO DI G<O@M >C<KO@MN.)
#JM @S<HKG@, OC@ AJGGJRDIB >J?@ OC<O OMD@N OJ ><KDO<GDU@ OC@ ADMNO G@OO@M JA < TUSJOH RJPG?
><PN@ < >JHKDG<ODJI @MMJM:
TUSJOH DBO/PU#F.VUBUFE = "IFMMP";
DBO/PU#F.VUBUFE<0> = ')'; // j DPNQJMBUJPO &3303
4@ H<T OCDIF JA ?@ADIDIB OC@ Q<MD<=G@ <N < DIBS<> DINO@<? JA OC@ TUSJOH <GD<N =PO OC<O ><IIJO
=@ >JHKDG@? @DOC@M:
DIBS<> B@TMJDF = "IFMMP"; // j DPNQJMBUJPO &3303
1CDN ODH@ OC@ >JHKDG<ODJI @MMJM DN ?P@ OJ OC@ >JH=DI<ODJI JA ORJ A<>OJMN:
1. 1C@ OTK@ JA NOMDIB GDO@M<GN GDF@ "IFMMP" DN TUSJOH, IJO DIBS<>, NJ OC@T <M@ DHHPO<=G@.
2. 1C@ DIBS<> JI OC@ G@AO-C<I? ND?@ DN < NGD>@, RCD>C, DA OC@ >J?@ >JHKDG@?, RJPG? KMJQD?@
<>>@NN OJ <GG JA OC@ >C<M<>O@MN JA OC@ MDBCO-C<I? ND?@.
0DI>@ DIBS<> DN HPO<=G@ <I? TUSJOH DN IJO, OC@M@ DN < HDNH<O>C. 1C@ >JHKDG@M ?J@N IJO <GGJR
<>>@NNDIB >C<M<>O@MN JA <I DHHPO<=G@ <MM<T =T < HPO<=G@ NGD>@.
1C@ NJGPODJI C@M@ DN OJ O<F@ < >JKT JA OC@ DHHPO<=G@ NOMDIB =T OC@ .EVQ KMJK@MOT:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
DIBS<> T = "IFMMP".EVQ;
T<0> = ')';
XSJUFMO(T);
^
1C@ KMJBM<H ><I IJR =@ >JHKDG@? <I? KMDIO OC@ HJ?DAD@? NOMDIB:
)FMMP
0DHDG<MGT, DIBS<> ><IIJO =@ PN@? RC@M@ < TUSJOH DN I@@?@?. &I NP>C ><N@N, OC@ .JEVQ
KMJK@MOT ><I =@ PN@? AJM KMJ?P>DIB <I DHHPO<=G@ TUSJOH Q<MD<=G@ AMJH < HPO<=G@ DIBS<>
Q<MD<=G@. #JM @S<HKG@, DA T DN < Q<MD<=G@ JA OTK@ DIBS<>, OC@ AJGGJRDIB GDI@ ><IIJO =@ >JHKDG@?:
TUSJOH SFTVMU = T _ '.'; // j DPNQJMBUJPO &3303
4C@I OC@ OTK@ JA T DN DIBS<>, OC@ OTK@ JA OC@ @SKM@NNDJI JI OC@ MDBCO-C<I? ND?@ JA OC@
<NNDBIH@IO <=JQ@ DN DIBS<> <N R@GG. .JEVQ DN PN@? AJM KMJ?P>DIB DHHPO<=G@ NOMDIBN AMJH
@SDNODIB NOMDIBN:
TUSJOH SFTVMU = (T _ '.').JEVQ; // j OPX DPNQJMFT
(FD;@9E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
86
Potentially confusing length of strings
20.4
4@ C<Q@ N@@I OC<O NJH@ 2ID>J?@ >C<M<>O@MN <M@ M@KM@N@IO@? =T HJM@ OC<I JI@ =TO@. #JM
@S<HKG@, OC@ G@OO@M ] DN M@KM@N@IO@? =T ORJ =TO@N. 1CDN A<>O DN M@AG@>O@? DI OC@ .MFOHUI
KMJK@MOT JA NOMDIBN:
XSJUFMO("SaTVNa".MFOHUI);
AGOCJPBC "M]NPH]" >JIO<DIN NDS >7FF7DE, OC@ G@IBOC JA OC@ NOMDIB DN OC@ IPH=@M JA 5:3D35F7DE
OC<O DO >JIO<DIN:
8
1C@ OTK@ JA OC@ @G@H@ION JA NOMDIB GDO@M<GN GDF@ "IFMMP" DN DIBS <I? DIBS M@KM@N@ION < 21#-8
>J?@ PIDO. A KMJ=G@H OC<O OCDN H<T ><PN@ DN RC@I R@ OMT OJ M@KG<>@ < ORJ->J?@-PIDO G@OO@M RDOC
< NDIBG@->J?@-PIDO G@OO@M:
DIBS<> T = "SaTVNa".EVQ;
XSJUFMO("#FGPSF: ", T);
T<1> = 'F';
T<5> = 'F';
XSJUFMO(""GUFS : ", T);
1C@ ORJ '@' >C<M<>O@MN ?J IJO M@KG<>@ OC@ ORJ G@OO@MN ]; OC@T M@KG<>@ NDIBG@ >J?@ PIDON,
M@NPGODIB DI <I DI>JMM@>O 21#-8 @I>J?DIB:
#FGPSF: SbTVNb
"GUFS : SF{TVFb l */$033&$5
4C@I ?@<GDIB RDOC G@OO@MN, NTH=JGN, <I? JOC@M 2ID>J?@ >C<M<>O@MN ?DM@>OGT <N DI OC@ >J?@
<=JQ@, OC@ >JMM@>O OTK@ OJ PN@ DN EDIBS:
EDIBS<> T = "SaTVNa"E.EVQ;
XSJUFMO("#FGPSF: ", T);
T<1> = 'F';
T<5> = 'F';
XSJUFMO(""GUFS : ", T);
1C@ JPOKPO:
#FGPSF: SbTVNb
"GUFS : SFTVNF
-G@<N@ IJO@ OC@ ORJ ?DAA@M@I>@N DI OC@ I@R >J?@:
1. 1C@ OTK@ JA OC@ NOMDIB DN EDIBS<>.
2. 1C@M@ DN < E <O OC@ @I? JA OC@ GDO@M<G "SaTVNa"E, NK@>DATDIB DON OTK@ <N <I <MM<T JA EDIBSN.
String literals
20.5
1C@ JKODJI<G >C<M<>O@M OC<O DN NK@>DAD@? <AO@M NOMDIB GDO@M<GN ?@O@MHDI@N OC@ OTK@ JA OC@
@G@H@ION JA OC@ NOMDIB:
JNQPSU TUE.TUEJP;
WPJE NBJO()
(FD;@9E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
87
\
TUSJOH T = "SaTVNa"D; // TBNF BT "SaTVNa"
XTUSJOH X = "SaTVNa"X;
ETUSJOH E = "SaTVNa"E;
XSJUFMO(T.MFOHUI);
XSJUFMO(X.MFOHUI);
XSJUFMO(E.MFOHUI);
^
1C@ JPOKPO:
8
6
6
B@><PN@ <GG JA OC@ G@OO@MN JA "M]NPH]" ><I =@ M@KM@N@IO@? =T < NDIBG@ XDIBS JM EDIBS, OC@ G<NO
ORJ G@IBOCN <M@ @LP<G OJ OC@ IPH=@M JA G@OO@MN.
String concatenation
20.6
0DI>@ OC@T <M@ <>OP<GGT <MM<TN, <GG JA OC@ <MM<T JK@M<ODJIN ><I =@ <KKGD@? OJ NOMDIBN <N R@GG. _
>JI><O@I<O@N ORJ NOMDIBN <I? _= <KK@I?N OJ <I @SDNODIB NOMDIB:
JNQPSU TUE.TUEJP;
JNQPSU TUE.TUSJOH;
WPJE NBJO()
\
XSJUF("8IBU JT ZPVS OBNF ");
TUSJOH OBNF = DIPNQ(SFBEMO());
// $PODBUFOBUF:
TUSJOH HSFFUJOH = ")FMMP " _ OBNF;
// "QQFOE:
HSFFUJOH _= "! 8FMDPNF...";
XSJUFMO(HSFFUJOH);
^
1C@ JPOKPO:
8IBU JT ZPVS OBNF $BO
)FMMP $BO! 8FMDPNF...
Comparing strings
20.7
Note: *@;5A67 6A7E @AF 678;@7 :AI F:7 5:3D35F7DE 3D7 AD67D76 AF:7D F:3@ F:7;D *@;5A67
5A67E. FAD F:3F D73EA@, KAG ?3K 97F D7EG>FE F:3F 6A@'F ?3F5: I;F: KAGD 7JB75F3F;A@E 47>AI.
,:7@ 3>B:347F;53> AD67D;@9 ;E ;?BADF3@F, KAG ?3K I3@F FA GE7 3 >;4D3DK >;=7 FD;>7D; F:3F
EGBBADFE F:7 5A@57BF A8 3@ 3>B:347F.
4@ C<Q@ PN@? >JHK<MDNJI JK@M<OJMN <, >=, @O>. RDOC DIO@B@M <I? AGJ<ODIB KJDIO Q<GP@N =@AJM@.
1C@ N<H@ JK@M<OJMN ><I =@ PN@? RDOC NOMDIBN <N R@GG, =PO RDOC < ?DAA@M@IO H@<IDIB: NOMDIBN
<M@ JM?@M@? >7J;5A9D3B:;53>>K. 1CDN JM?@MDIB O<F@N @<>C >C<M<>O@M'N 2ID>J?@ >J?@ OJ =@ DON
KG<>@ DI < CTKJOC@OD><G BM<I? 2ID>J?@ <GKC<=@O. 1C@ >JI>@KON JA >7EE <I? 9D73F7D <M@
M@KG<>@? RDOC 478AD7 <I? 38F7D DI OCDN CTKJOC@OD><G <GKC<=@O:
(FD;@9E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
88
JNQPSU TUE.TUEJP;
JNQPSU TUE.TUSJOH;
WPJE NBJO()
\
XSJUF(" &OUFS B TUSJOH: ");
TUSJOH T1 = DIPNQ(SFBEMO());
XSJUF("&OUFS BOPUIFS TUSJOH: ");
TUSJOH T2 = DIPNQ(SFBEMO());
JG (T1 == T2) \
XSJUFMO("5IFZ BSF UIF TBNF!");
^ FMTF \
TUSJOH GPSNFS;
TUSJOH MBUUFS;
JG (T1 < T2) \
GPSNFS = T1;
MBUUFS = T2;
^ FMTF \
GPSNFS = T2;
MBUUFS = T1;
^
XSJUFMO("'", GPSNFS, "' DPNFT CFGPSF '", MBUUFS, "'.");
^
^
B@><PN@ 2ID>J?@ <?JKON OC@ G@OO@MN JA OC@ =<ND> )<ODI <GKC<=@O AMJH OC@ A0&& O<=G@, OC@
NOMDIBN OC<O >JIO<DI JIGT OC@ G@OO@MN JA OC@ A0&& O<=G@ <KK@<M OJ =@ JM?@M@? >JMM@>OGT.
Lowercase and uppercase are different
20.8
B@><PN@ @<>C G@OO@M C<N < PIDLP@ >J?@, @Q@MT G@OO@M DN ?DAA@M@IO AMJH @Q@MT JOC@M. #JM
@S<HKG@, 'A' <I? '<' <M@ ?DAA@M@IO G@OO@MN.
A??DODJI<GGT, <N < >JIN@LP@I>@ JA OC@DM A0&& >J?@ Q<GP@N, <GG JA OC@ PKK@M><N@ G@OO@MN <M@
NJMO@? =@AJM@ <GG JA OC@ GJR@M><N@ G@OO@MN. #JM @S<HKG@, 'B' DN =@AJM@ '<'. 1C@ JDNQ() API>ODJI
JA OC@ TUE.TUSJOH HJ?PG@ ><I =@ PN@? RC@I NOMDIBN I@@? OJ =@ >JHK<M@? M@B<M?G@NN JA
GJR@M><N@ <I? PKK@M><N@. 6JP ><I N@@ OC@ API>ODJIN JA OCDN HJ?PG@ <O DON JIGDI@
?J>PH@IO<ODJI.
B@><PN@ NOMDIBN <M@ <MM<TN (<I? <N < >JMJGG<MT, D3@97E), OC@ API>ODJIN JA OC@ TUE.BSSBZ,
TUE.BMHPSJUIN, <I? TUE.SBOHF HJ?PG@N <M@ Q@MT PN@APG RDOC NOMDIBN <N R@GG.
Exercises
20.9
1. BMJRN@ OC@ ?J>PH@IO<ODJIN JA OC@ TUE.TUSJOH, TUE.BSSBZ, TUE.BMHPSJUIN, <I?
TUE.SBOHF HJ?PG@N.
2. 4MDO@ < KMJBM<H OC<O H<F@N PN@ JA OC@ _ JK@M<OJM: 1C@ PN@M @IO@MN OC@ ADMNO I<H@ <I? OC@
G<NO I<H@, <GG DI GJR@M><N@ G@OO@MN. -MJ?P>@ OC@ APGG I<H@ OC<O >JIO<DIN OC@ KMJK@M
><KDO<GDU<ODJI JA OC@ ADMNO <I? G<NO I<H@N. #JM @S<HKG@, RC@I OC@ NOMDIBN <M@ "@=MP" <I?
"?JH<O@N" OC@ KMJBM<H NCJPG? KMDIO ""=MP !JH<O@N".
3. /@<? < GDI@ AMJH OC@ DIKPO <I? KMDIO OC@ K<MO =@OR@@I OC@ ADMNO <I? G<NO '@' G@OO@MN JA OC@
GDI@. #JM @S<HKG@, RC@I OC@ GDI@ DN "OCDN GDI@ C<N ADQ@ RJM?N" OC@ KMJBM<H NCJPG? KMDIO "@
C<N ADQ@".
(FD;@9E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
89
6JP H<T ADI? OC@ JOEFY0G() <I? MBTU*OEFY0G() API>ODJIN PN@APG OJ B@O ORJ DI?@S@N
OJ KMJ?P>@ < NGD>@.
AN DO DN DI?D><O@? DI OC@DM ?J>PH@IO<ODJI, OC@ M@OPMI OTK@N JA JOEFY0G() <I?
MBTU*OEFY0G() <M@ IJO JOU IJM TJ[F@U, =PO TJ[FEJGG@U. 6JP H<T C<Q@ OJ ?@ADI@
Q<MD<=G@N JA OC<O @S<>O OTK@:
TJ[FEJGG@U GJSTU@F = JOEFY0G(MJOF, 'F');
&O DN KJNND=G@ OJ ?@ADI@ Q<MD<=G@N NCJMO@M RDOC OC@ BVUP F@TRJM?, RCD>C R@ RDGG N@@ DI
< G<O@M >C<KO@M:
BVUP GJSTU@F = JOEFY0G(MJOF, 'F');
... F:7 EA>GF;A@E
(FD;@9E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
90
Redirecting Standard Input and Output Streams 21
AGG JA OC@ KMJBM<HN OC<O R@ C<Q@ N@@I NJ A<M C<Q@ DIO@M<>O@? OCMJPBC TUEJO <I? TUEPVU, OC@
NO<I?<M? DIKPO <I? JPOKPO NOM@<HN. &IKPO <I? JPOKPO API>ODJIN GDF@ SFBEG <I? XSJUFMO
JK@M<O@ JI OC@N@ NOM@<HN =T ?@A<PGO.
4CDG@ PNDIB OC@N@ NOM@<HN, R@ C<Q@ H<?@ <I <NNPHKODJI OC<O OC@ NO<I?<M? DIKPO DN AMJH OC@
F@T=J<M? <I? OC@ NO<I?<M? JPOKPO DN OJ OC@ N>M@@I.
4@ RDGG NO<MO RMDODIB KMJBM<HN OC<O ?@<G RDOC ADG@N DI G<O@M >C<KO@MN. 4@ RDGG N@@ OC<O EPNO GDF@
NO<I?<M? DIKPO <I? JPOKPO NOM@<HN, ADG@N <M@ >C<M<>O@M NOM@<HN <N R@GG; NJ OC@T <M@ PN@? DI
<GHJNO OC@ N<H@ R<T <N TUEJO <I? TUEPVU.
B@AJM@ N@@DIB CJR ADG@N <M@ <>>@NN@? AMJH RDOCDI KMJBM<HN, & RJPG? GDF@ OJ NCJR CJR
NO<I?<M? DIKPON <I? JPOKPON JA KMJBM<HN ><I =@ M@?DM@>O@? OJ ADG@N, <I? ><I =@ KDK@? OJ JOC@M
KMJBM<HN. -MJBM<HN ><I KMDIO OJ ADG@N DINO@<? JA OC@ N>M@@I, <I? M@<? AMJH ADG@N DINO@<? JA OC@
F@T=J<M?. AGOCJPBC OC@N@ A@<OPM@N <M@ IJO ?DM@>OGT M@G<O@? OJ KMJBM<HHDIB G<IBP<B@N, OC@T
<M@ PN@APG OJJGN OC<O <M@ <Q<DG<=G@ DI <GG HJ?@MI >JINJG@N.
Redirecting standard output to a file with >
21.1
4C@I NO<MODIB OC@ KMJBM<H AMJH OC@ >JINJG@, OTKDIB < > >C<M<>O@M <I? < ADG@ I<H@ <O OC@ @I?
JA OC@ >JHH<I? GDI@ M@?DM@>ON OC@ NO<I?<M? JPOKPO JA OC<O KMJBM<H OJ OC@ NK@>DAD@? ADG@.
"Q@MTOCDIB OC<O OC@ KMJBM<H KMDION OJ DON NO<I?<M? JPOKPO RJPG? =@ RMDOO@I OJ OC<O ADG@
DINO@<?.
)@O'N O@NO OCDN RDOC < KMJBM<H OC<O M@<?N < AGJ<ODIB KJDIO IPH=@M AMJH DON DIKPO, HPGODKGD@N
OC<O IPH=@M =T ORJ, <I? KMDION OC@ M@NPGO OJ DON NO<I?<M? JPOKPO:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
EPVCMF OVNCFS;
SFBEG(" %T", &OVNCFS);
XSJUFMO(OVNCFS * 2);
^
&A OC@ I<H@ JA OC@ KMJBM<H DN CZ@UXP, DON JPOKPO RJPG? =@ RMDOO@I OJ < ADG@ I<H@?
CZ@UXP@SFTVMU.UYU RC@I OC@ KMJBM<H DN NO<MO@? JI OC@ >JHH<I? GDI@ <N DI OC@ AJGGJRDIB
GDI@:
./CZ@UXP > CZ@UXP@SFTVMU.UYU
#JM @S<HKG@, DA R@ @IO@M 1.2 <O OC@ >JINJG@, OC@ M@NPGO 2.4 RJPG? <KK@<M DI
CZ@UXP@SFTVMU.UYU. (Note: A>F:AG9: F:7 BDA9D3? 6A7E @AF 6;EB>3K 3 BDA?BF >;=7 "&>73E7
7@F7D 3 @G?47D", ;F EF;>> 7JB75FE 3 @G?47D FA 47 7@F7D76.)
Redirecting standard input from a file with <
21.2
0DHDG<M OJ M@?DM@>ODIB NO<I?<M? JPOKPO =T >, NO<I?<M? DIKPO ><I =@ M@?DM@>O@? AMJH < ADG@ =T <.
&I OCDN ><N@, OC@ KMJBM<H M@<?N AMJH OC@ NK@>DAD@? ADG@ DINO@<? JA AMJH OC@ F@T=J<M?.
1J O@NO OCDN, G@O'N PN@ < KMJBM<H OC<O ><G>PG<O@N JI@ O@IOC JA < IPH=@M:
'76;D75F;@9 (F3@63D6 !@BGF 3@6 %GFBGF (FD73?E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
91
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
EPVCMF OVNCFS;
SFBEG(" %T", &OVNCFS);
XSJUFMO(OVNCFS / 10);
^
ANNPHDIB OC<O OC@ ADG@ CZ@UXP@SFTVMU.UYU NODGG @SDNON <I? >JIO<DIN 2.4 AMJH OC@ KM@QDJPN
JPOKPO, <I? OC<O OC@ I<H@ JA OC@ I@R KMJBM<H DN POF@UFOUI, R@ ><I M@?DM@>O OC@ I@R
KMJBM<H'N NO<I?<M? DIKPO AMJH OC<O ADG@ <N DI OC@ AJGGJRDIB GDI@:
./POF@UFOUI < CZ@UXP@SFTVMU.UYU
1CDN ODH@ OC@ KMJBM<H RJPG? M@<? AMJH CZ@UXP@SFTVMU.UYU <I? KMDIO OC@ M@NPGO OJ OC@
>JINJG@ <N 0.24.
Redirecting both standard streams
21.3
> <I? < ><I =@ PN@? <O OC@ N<H@ ODH@:
./POF@UFOUI < CZ@UXP@SFTVMU.UYU > POF@UFOUI@SFTVMU.UYU
1CDN ODH@ OC@ NO<I?<M? DIKPO RJPG? =@ M@<? AMJH CZ@UXP@SFTVMU.UYU <I? OC@ NO<I?<M?
JPOKPO RJPG? =@ RMDOO@I OJ POF@UFOUI@SFTVMU.UYU.
Piping programs with ]
21.4
+JO@ OC<O CZ@UXP@SFTVMU.UYU DN <I DIO@MH@?D<MT =@OR@@I OC@ ORJ KMJBM<HN; CZ@UXP RMDO@N
OJ DO <I? POF@UFOUI M@<?N AMJH DO.
1C@ ] >C<M<>O@M KDK@N OC@ NO<I?<M? JPOKPO JA OC@ KMJBM<H OC<O DN JI DON G@AO-C<I? ND?@ OJ OC@
NO<I?<M? DIKPO JA OC@ KMJBM<H OC<O DN JI DON MDBCO-C<I? ND?@ RDOCJPO OC@ I@@? AJM <I
DIO@MH@?D<MT ADG@. #JM @S<HKG@, RC@I OC@ ORJ KMJBM<HN <=JQ@ <M@ KDK@? OJB@OC@M <N DI OC@
AJGGJRDIB GDI@, OC@T >JGG@>ODQ@GT ><G>PG<O@ A@7 8;8F: JA OC@ DIKPO:
./CZ@UXP ] ./POF@UFOUI
#DMNO CZ@UXP MPIN <I? M@<?N < IPH=@M AMJH DON DIKPO. (/@H@H=@M OC<O <GOCJPBC DO ?J@N IJO
KMJHKO AJM JI@, DO NODGG R<DON AJM < IPH=@M.)
1C@ M@NPGO JA CZ@UXP RJPG? <KK@<M <O OC@ NO<I?<M? DIKPO JA POF@UFOUI, RCD>C DI OPMI RJPG?
><G>PG<O@ <I? KMDIO JI@ O@IOC JA OC<O M@NPGO.
Exercise
21.5
t -DK@ HJM@ OC<I JI@ KMJBM<H:
./POF ] ./UXP ] ./UISFF
... F:7 EA>GF;A@
'76;D75F;@9 (F3@63D6 !@BGF 3@6 %GFBGF (FD73?E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
92
Files 22
4@ C<Q@ N@@I DI OC@ KM@QDJPN >C<KO@M OC<O NO<I?<M? DIKPO <I? JPOKPO NOM@<HN ><I =@
M@?DM@>O@? OJ <I? AMJH ADG@N <I? JOC@M KMJBM<HN RDOC OC@ >, <, <I? ] JK@M<OJMN JI OC@
>JINJG@. !@NKDO@ =@DIB Q@MT KJR@MAPG, OC@N@ OJJGN <M@ IJO NPDO<=G@ DI @Q@MT NDOP<ODJI =@><PN@
DI H<IT ><N@N KMJBM<HN ><I IJO >JHKG@O@ OC@DM O<NFN =T M@<?DIB AMJH OC@DM DIKPO <I? RMDODIB
OJ OC@DM JPOKPO GDF@ < NDHKG@ KDK@.
#JM @S<HKG@, < KMJBM<H OC<O ?@<GN RDOC NOP?@IO M@>JM?N H<T PN@ DON NO<I?<M? JPOKPO OJ
?DNKG<T OC@ KMJBM<H H@IP. 0P>C < KMJBM<H RJPG? I@@? OJ RMDO@ OC@ NOP?@IO M@>JM?N OJ <I
<>OP<G ADG@ DINO@<? JA TUEPVU.
&I OCDN >C<KO@M, R@ RDGG >JQ@M M@<?DIB AMJH <I? RMDODIB OJ ADG@N JA ADG@ NTNO@HN.
Fundamental concepts
22.1
#DG@N <M@ M@KM@N@IO@? =T OC@ 'JMF EFDG5F JA OC@ TUE.TUEJP HJ?PG@. 0DI>@ & C<Q@I'O DIOMJ?P>@?
NOMP>ON T@O, R@ RDGG C<Q@ OJ <>>@KO OC@ NTIO<S JA NOMP>O >JINOMP>ODJI <N-DN AJM IJR.
B@AJM@ B@OODIB OJ >J?@ N<HKG@N R@ C<Q@ OJ BJ OCMJPBC API?<H@IO<G >JI>@KON <=JPO ADG@N.
The producer and the consumer 22.1.1
#DG@N OC<O <M@ >M@<O@? JI JI@ KG<OAJMH H<T IJO =@ M@<?DGT PN<=G@ JI JOC@M KG<OAJMHN. *@M@GT
JK@IDIB < ADG@ <I? RMDODIB ?<O< DI DO H<T IJO =@ NPAAD>D@IO AJM OC<O ?<O< OJ =@ <Q<DG<=G@ JI OC@
>JINPH@M'N ND?@. 1C@ KMJ?P>@M <I? OC@ >JINPH@M JA OC@ ?<O< HPNO C<Q@ <GM@<?T <BM@@? JI
OC@ AJMH<O JA OC@ ?<O< OC<O DN DI OC@ ADG@. #JM @S<HKG@, DA OC@ KMJ?P>@M C<N RMDOO@I OC@ D? <I?
OC@ I<H@ JA OC@ NOP?@IO M@>JM?N DI < >@MO<DI JM?@M, OC@ >JINPH@M HPNO M@<? OC@ ?<O< =<>F DI
OC@ N<H@ JM?@M.
A??DODJI<GGT, OC@ N<HKG@ >J?@N =@GJR ?J IJO RMDO@ B,* OJ OC@ =@BDIIDIB JA OC@ ADG@. 1CDN H<T
H<F@ TJPM ADG@N DI>JHK<OD=G@ RDOC NTNO@HN OC<O M@LPDM@ B,*. (B,* DN NCJMO AJM 4KF7 AD67D
?3D=. &O NK@>DAD@N DI RC<O JM?@M OC@ 21# >J?@ PIDON JA >C<M<>O@MN <M@ <MM<IB@? DI < ADG@.)
Access rights 22.1.2
#DG@ NTNO@HN KM@N@IO ADG@N OJ KMJBM<HN PI?@M >@MO<DI <>>@NN MDBCON. A>>@NN MDBCON <M@
DHKJMO<IO AJM =JOC ?<O< DIO@BMDOT <I? K@MAJMH<I>@.
4C@I DO DN <=JPO M@<?DIB, <GGJRDIB HPGODKG@ KMJBM<HN M@<? AMJH OC@ N<H@ ADG@ RJPG? DHKMJQ@
K@MAJMH<I>@ =@><PN@ IJ KMJBM<H RJPG? =@ R<DODIB AJM <IT JOC@M OJ ADIDNC OC@DM M@<?DIB. ,I
OC@ JOC@M C<I?, RC@I DO DN <=JPO RMDODIB, JIGT JI@ KMJBM<H NCJPG? =@ <GGJR@? OJ RMDO@ OJ <
ADG@, JOC@MRDN@ KMJBM<HN H<T JQ@MRMDO@ @<>C JOC@M'N ?<O<.
Opening a file 22.1.3
1C@ NO<I?<M? DIKPO <I? JPOKPO NOM@<HN TUEJO <I? TUEPVU <M@ <GM@<?T AB7@ RC@I KMJBM<HN
NO<MO MPIIDIB. 1C@T <M@ M@<?T OJ =@ PN@?.
,I OC@ JOC@M C<I?, ADG@N HPNO ADMNO =@ JK@I@? =T NK@>DATDIB OC@ I<H@ JA OC@ ADG@ <I? OC@
<>>@NN MDBCON OC<O <M@ I@@?@?.
F;>7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
93
Closing a file 22.1.4
AIT ADG@ OC<O C<N =@@I JK@I@? =T < KMJBM<H HPNO =@ >GJN@? RC@I OC@ KMJBM<H ADIDNC@N PNDIB
OC<O ADG@. &I HJNO ><N@N OC@ ADG@N I@@? IJO =@ >GJN@? @SKGD>DOGT; OC@T <M@ >GJN@? <POJH<OD><GGT
RC@I 'JMF J=E@>ON <M@ O@MHDI<O@? <POJH<OD><GGT:
JG (B$POEJUJPO) \
// "TTVNF B 'JMF PCKFDU IBT CFFO DSFBUFE BOE VTFE IFSF.
// ...
^ // j 5IF BDUVBM GJMF XPVME CF DMPTFE BVUPNBUJDBMMZ IFSF
// XIFO MFBWJOH UIJT TDPQF. /P OFFE UP DMPTF FYQMJDJUMZ.
&I NJH@ ><N@N < ADG@ J=E@>O H<T I@@? OJ =@ M@-JK@I@? OJ <>>@NN < ?DAA@M@IO ADG@ JM OC@ N<H@ ADG@
RDOC ?DAA@M@IO <>>@NN MDBCON. &I NP>C ><N@N OC@ ADG@ HPNO =@ >GJN@? <I? M@-JK@I@?:
GJMF.DMPTF();
GJMF.PQFO("TUVEFOU@SFDPSET", "S");
Writing to and reading from files 22.1.5
0DI>@ ADG@N <M@ >C<M<>O@M NOM@<HN, DIKPO <I? JPOKPO API>ODJIN XSJUFMO, SFBEG, @O>. <M@ PN@?
@S<>OGT OC@ N<H@ R<T RDOC OC@H. 1C@ JIGT ?DAA@M@I>@ DN OC<O OC@ I<H@ JA OC@ 'JMF Q<MD<=G@
<I? < ?JO HPNO =@ OTK@?:
XSJUFMO("IFMMP"); // XSJUFT UP TUBOEBSE PVUQVU
TUEPVU.XSJUFMO("IFMMP"); // TBNF BT BCPWF
GJMF.XSJUFMO("IFMMP"); // XSJUFT UP UIF TQFDJGJFE GJMF
FPG() to determine the end of a file 22.1.6
1C@ FPG() H@H=@M API>ODJI ?@O@MHDI@N RC@OC@M OC@ @I? JA < ADG@ C<N =@@I M@<>C@? RCDG@
M@<?DIB AMJH < ADG@. &O M@OPMIN USVF DA OC@ @I? JA OC@ ADG@ C<N =@@I M@<>C@?.
#JM @S<HKG@, OC@ AJGGJRDIB GJJK RDGG =@ <>ODQ@ PIODG OC@ @I? JA OC@ ADG@:
XIJMF (!GJMF.FPG()) \
/* ... */
^
The TUE.GJMF module 22.1.7
1C@ TUE.GJMF HJ?PG@ >JIO<DIN API>ODJIN <I? OTK@N OC<O <M@ PN@APG RC@I RJMFDIB RDOC
>JIO@ION JA ?DM@>OJMD@N. #JM @S<HKG@, FYJTUT ><I =@ PN@? OJ ?@O@MHDI@ RC@OC@M < ADG@ JM <
?DM@>OJMT @SDNON JI OC@ ADG@ NTNO@HN:
JNQPSU TUE.GJMF;
// ...
JG (FYJTUT(GJMF/BNF)) \
// UIFSF JT B GJMF PS EJSFDUPSZ VOEFS UIBU OBNF
^ FMTF \
// OP GJMF PS EJSFDUPSZ VOEFS UIBU OBNF
^
F;>7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
94
TUE.TUEJP.'JMF struct
22.2
'JMF PN@N OC@ N<H@ HJ?@ >C<M<>O@MN OC<O <M@ PN@? =T GPQFO JA OC@ KMJBM<HHDIB G<IBP<B@:
.PEF %FGJOJUJPO
S SFBE BDDFTT
UIF GJMF JT PQFOFE UP CF SFBE GSPN UIF CFHJOOJOH
S+ SFBE BOE XSJUF BDDFTT
UIF GJMF JT PQFOFE UP CF SFBE GSPN BOE XSJUUFO BU UIF CFHJOOJOH
X XSJUF BDDFTT
JG UIF GJMF EPFT OPU FYJTU, JU JT DSFBUFE BT FNQUZ
JG UIF GJMF BMSFBEZ FYJTUT, JUT DPOUFOUT BSF DMFBSFE
X+ SFBE BOE XSJUF BDDFTT
JG UIF GJMF EPFT OPU FYJTU, JU JT DSFBUFE BT FNQUZ
JG UIF GJMF BMSFBEZ FYJTUT, JUT DPOUFOUT BSF DMFBSFE
B BQQFOE BDDFTT
JG UIF GJMF EPFT OPU FYJTU, JU JT DSFBUFE BT FNQUZ
JG UIF GJMF BMSFBEZ FYJTUT, JUT DPOUFOUT BSF QSFTFSWFE BOE JU JT PQFOFE
UP CF XSJUUFO BU UIF FOE
B+ SFBE BOE BQQFOE BDDFTT
JG UIF GJMF EPFT OPU FYJTU, JU JT DSFBUFE BT FNQUZ
JG UIF GJMF BMSFBEZ FYJTUT, JUT DPOUFOUT BSF QSFTFSWFE BOE UIF GJMF JT
PQFOFE UP CF SFBE GSPN UIF CFHJOOJOH BOE XSJUUFO BU UIF FOE
A '=' >C<M<>O@M H<T =@ <??@? OJ OC@ HJ?@ NOMDIB <N DI "M=". 1CDN H<T C<Q@ <I @AA@>O JI
KG<OAJMHN OC<O NPKKJMO OC@ 4;@3DK ?A67, =PO DO DN DBIJM@? JI <GG -,0&5 NTNO@HN.
1C@ 'JMF NOMP>O DN DI>GP?@? DI OC@ TUE.TUEJP HJ?PG@.
Writing to a file 22.2.1
1C@ ADG@ HPNO C<Q@ =@@I JK@I@? DI JI@ JA OC@ RMDO@ HJ?@N ADMNO:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
'JMF GJMF = 'JMF("TUVEFOU@SFDPSET", "X");
GJMF.XSJUFMO("/BNF : ", ";BGFS");
GJMF.XSJUFMO("/VNCFS: ", 123);
GJMF.XSJUFMO("$MBTT : ", "1"");
^
AN TJP M@H@H=@M AMJH OC@ 0OMDIBN >C<KO@M, OC@ OTK@ JA GDO@M<GN GDF@ "TUVEFOU@SFDPSET" DN
TUSJOH, >JINDNODIB JA DHHPO<=G@ >C<M<>O@MN. #JM OC<O M@<NJI, DO DN IJO KJNND=G@ OJ >JINOMP>O
'JMF J=E@>ON =T < HPO<=G@ ADG@ I<H@ (@.B. DIBS<>). 4C@I I@@?@?, DO RJPG? =@ I@>@NN<MT OJ
><GG OC@ .JEVQ KMJK@MOT JA OC@ HPO<=G@ NOMDIB.
1C@ KMJBM<H <=JQ@ >M@<O@N JM JQ@MRMDO@N OC@ >JIO@ION JA < ADG@ I<H@? TUVEFOU@SFDPSET DI
OC@ ?DM@>OJMT OC<O DO C<N =@@I NO<MO@? PI?@M (DI OC@ KMJBM<H'N IAD=;@9 6;D75FADK).
Note: F;>7 @3?7E 53@ 5A@F3;@ 3@K 5:3D35F7D F:3F ;E >793> 8AD F:3F 8;>7 EKEF7?. )A 47 BADF34>7, !
I;>> GE7 A@>K A(C!! 5:3D35F7DE.
F;>7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
95
Reading from a file 22.2.2
1C@ ADG@ HPNO C<Q@ =@@I JK@I@? DI JI@ JA OC@ M@<? HJ?@N ADMNO:
JNQPSU TUE.TUEJP;
JNQPSU TUE.TUSJOH;
WPJE NBJO()
\
'JMF GJMF = 'JMF("TUVEFOU@SFDPSET", "S");
XIJMF (!GJMF.FPG()) \
TUSJOH MJOF = DIPNQ(GJMF.SFBEMO());
XSJUFMO("SFBE MJOF -> ]", MJOF);
^
^
1C@ KMJBM<H <=JQ@ M@<?N <GG JA OC@ GDI@N JA OC@ ADG@ I<H@? TUVEFOU@SFDPSET <I? KMDION OCJN@
GDI@N OJ DON NO<I?<M? JPOKPO.
Exercise
22.3
t 4MDO@ < KMJBM<H OC<O O<F@N < ADG@ I<H@ AMJH OC@ PN@M, JK@IN OC<O ADG@, <I? RMDO@N <GG JA OC@
IJI-@HKOT GDI@N JA OC<O ADG@ OJ <IJOC@M ADG@. 1C@ I<H@ JA OC@ I@R ADG@ ><I =@ =<N@? JI OC@
I<H@ JA OC@ JMDBDI<G ADG@. #JM @S<HKG@, DA OC@ JMDBDI<G ADG@ DN GPP.UYU, OC@ I@R ADG@ ><I =@
GPP.UYU.PVU.
... F:7 EA>GF;A@
F;>7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
96
BVUP and UZQFPG 23
BVUP
23.1
4C@I ?@ADIDIB 'JMF Q<MD<=G@N DI OC@ KM@QDJPN >C<KO@M, R@ C<Q@ M@K@<O@? OC@ I<H@ JA OC@ OTK@
JI =JOC ND?@N JA OC@ = JK@M<OJM:
'JMF GJMF = 'JMF("TUVEFOU@SFDPSET", "X");
&O A@@GN M@?PI?<IO. &O RJPG? <GNJ =@ >PH=@MNJH@ <I? @MMJM-KMJI@ @NK@>D<GGT RC@I OC@ OTK@
I<H@ R@M@ GJIB@M:
7FSZ-POH5ZQF/BNF WBS = 7FSZ-POH5ZQF/BNF(/* ... */);
#JMOPI<O@GT, OC@ OTK@ I<H@ JI OC@ G@AO-C<I? ND?@ DN IJO I@>@NN<MT =@><PN@ OC@ >JHKDG@M ><I
DIA@M OC@ OTK@ JA OC@ G@AO-C<I? ND?@ AMJH OC@ @SKM@NNDJI JI OC@ MDBCO-C<I? ND?@. #JM OC@
>JHKDG@M OJ DIA@M OC@ OTK@, OC@ BVUP F@TRJM? ><I =@ PN@?:
BVUP WBS = 7FSZ-POH5ZQF/BNF(/* ... */);
BVUP ><I =@ PN@? RDOC <IT OTK@ @Q@I RC@I OC@ OTK@ DN IJO NK@GG@? JPO JI OC@ MDBCO-C<I? ND?@:
BVUP EVSBUJPO = 42;
BVUP EJTUBODF = 1.2;
BVUP HSFFUJOH = ")FMMP";
BVUP WFIJDMF = #FBVUJGVM#JDZDMF("CMVF");
AGOCJPBC "<POJ" DN OC@ <==M@QD<ODJI JA 3GFA?3F;5, DO ?J@N IJO >JH@ AMJH 3GFA?3F;5 FKB7
;@87D7@57. &O >JH@N AMJH 3GFA?3F;5 EFAD397 5>3EE, RCD>C DN < >JI>@KO <=JPO GDA@ ODH@N JA
Q<MD<=G@N. BVUP DN PN@? RC@I IJ JOC@M NK@>DAD@M DN <KKMJKMD<O@. #JM @S<HKG@, OC@ AJGGJRDIB
?@ADIDODJI ?J@N IJO PN@ BVUP:
JNNVUBCMF J = 42;
1C@ >JHKDG@M DIA@MN OC@ OTK@ JA J <N JNNVUBCMF JOU <=JQ@. (4@ RDGG N@@ JNNVUBCMF DI < G<O@M
>C<KO@M.)
UZQFPG
23.2
UZQFPG KMJQD?@N OC@ <>OP<G OTK@ JA @SKM@NNDJIN (DI>GP?DIB NDIBG@ Q<MD<=G@N, J=E@>ON, GDO@M<GN,
@O>.).
1C@ AJGGJRDIB DN <I @S<HKG@ JA CJR UZQFPG ><I =@ PN@? OJ NK@>DAT < OTK@ RDOCJPO @SKGD>DOGT
NK@GGDIB DO JPO:
JOU WBMVF = 100; // BMSFBEZ EFGJOFE BT 'JOU'
UZQFPG(WBMVF) WBMVF2; // NFBOT "UZQF PG WBMVF"
UZQFPG(100) WBMVF3; // NFBOT "UZQF PG MJUFSBM 100"
1C@ G<NO ORJ Q<MD<=G@ ?@ADIDODJIN <=JQ@ <M@ OC@ @LPDQ<G@IO JA OC@ AJGGJRDIB:
JOU WBMVF2;
JOU WBMVF3;
3GFA 3@6 FKB7A8
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
97
&O DN J=QDJPN OC<O UZQFPG DN IJO I@@?@? DI NDOP<ODJIN GDF@ <=JQ@ RC@I <>OP<G OTK@N <M@ FIJRI.
1CDN F@TRJM? DN @NK@>D<GGT PN@APG DI O@HKG<O@ ?@ADIDODJIN, RCD>C R@ RDGG N@@ DI G<O@M >C<KO@MN.
Exercise
23.3
t AN R@ C<Q@ N@@I <=JQ@, OC@ OTK@ JA GDO@M<GN GDF@ 100 DN JOU (<N JKKJN@? OJ TIPSU, MPOH, JM
<IT JOC@M OTK@). 4MDO@ < KMJBM<H OJ ?@O@MHDI@ OC@ OTK@ JA AGJ<ODIB KJDIO GDO@M<GN GDF@ 1.2.
UZQFPG <I? .TUSJOHPG RJPG? =@ PN@APG DI OCDN KMJBM<H.
... F:7 EA>GF;A@
3GFA 3@6 FKB7A8
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
98
Name Space 24
AIT I<H@ DN <>>@NND=G@ AMJH OC@ KJDIO OC<O DO C<N =@@I ?@ADI@? <O OJ OC@ KJDIO OC<O DON N>JK@
C<N =@@I @SDO@?, <N R@GG <N DI <GG JA OC@ N>JK@N OC<O DON N>JK@ DI>GP?@N. &I OCDN M@B<M?, @Q@MT
N>JK@ ?@ADI@N < @3?7 EB357.
+<H@N <M@ IJO <Q<DG<=G@ JI>@ OC@DM N>JK@ C<N =@@I @SDO@?:
WPJE NBJO()
\
JOU PVUFS;
JG (B$POEJUJPO) \ // j DVSMZ CSBDLFU TUBSUT B OFX TDPQF
JOU JOOFS = 1;
PVUFS = 2; // j XPSLT; 'PVUFS' JT BWBJMBCMF IFSF
^ // j 'JOOFS' JT OPU BWBJMBCMF CFZPOE UIJT QPJOU
JOOFS = 3; // j DPNQJMBUJPO &3303
// 'JOOFS' JT OPU BWBJMBCMF JO UIF PVUFS TDPQF
^
B@><PN@ JOOFS DN ?@ADI@? RDOCDI OC@ N>JK@ JA OC@ JG >JI?DODJI DO DN <Q<DG<=G@ JIGT DI OC<O
N>JK@. ,I OC@ JOC@M C<I?, PVUFS DN <Q<DG<=G@ DI =JOC OC@ JPO@M N>JK@ <I? OC@ DII@M N>JK@.
&O DN IJO G@B<G OJ ?@ADI@ OC@ N<H@ I<H@ DI <I DII@M N>JK@:
TJ[F@U MFOHUI = PEE/VNCFST.MFOHUI;
JG (B$POEJUJPO) \
TJ[F@U MFOHUI = QSJNF/VNCFST.MFOHUI; // j DPNQJMBUJPO &3303
^
Defining names closest to their first use
24.1
AN R@ C<Q@ =@@I ?JDIB DI <GG JA OC@ KMJBM<HN NJ A<M, Q<MD<=G@N HPNO =@ ?@ADI@? =@AJM@ OC@DM
ADMNO PN@:
XSJUFMO(OVNCFS); // j DPNQJMBUJPO &3303
// OVNCFS JT OPU LOPXO ZFU
JOU OVNCFS = 42;
#JM OC<O >J?@ OJ =@ <>>@KO<=G@ =T OC@ >JHKDG@M, OVNCFS HPNO =@ ?@ADI@? =@AJM@ DO DN PN@? RDOC
XSJUFMO. AGOCJPBC OC@M@ DN IJ M@NOMD>ODJI JI CJR H<IT GDI@N @<MGD@M DO NCJPG? =@ ?@ADI@?, DO DN
<>>@KO@? <N BJJ? KMJBM<HHDIB KM<>OD>@ OC<O Q<MD<=G@N =@ ?@ADI@? >GJN@NO OJ RC@M@ OC@T <M@
ADMNO PN@?.
)@O'N N@@ OCDN DI < KMJBM<H OC<O KMDION OC@ <Q@M<B@ JA OC@ IPH=@MN OC<O DO O<F@N AMJH OC@ PN@M.
-MJBM<HH@MN RCJ <M@ @SK@MD@I>@? DI NJH@ JOC@M KMJBM<HHDIB G<IBP<B@N H<T =@ PN@? OJ
?@ADIDIB Q<MD<=G@N <O OJKN JA N>JK@N:
JOU DPVOU; // j )&3&
JOU<> OVNCFST; // j )&3&
EPVCMF BWFSBHF7BMVF; // j )&3&
XSJUF(")PX NBOZ OVNCFST BSF UIFSF ");
SFBEG(" %T", &DPVOU);
JG (DPVOU >= 1) \
OVNCFST.MFOHUI = DPVOU;
$3?7 (B357
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
99
// ... BTTVNF UIF DBMDVMBUJPO JT IFSF ...
^ FMTF \
XSJUFMO("&3303: :PV NVTU FOUFS BU MFBTU POF OVNCFS!");
^
JIOM<NO OC@ >J?@ <=JQ@ OJ OC@ JI@ =@GJR OC<O ?@ADI@N OC@ Q<MD<=G@N G<O@M, <N @<>C Q<MD<=G@
<>OP<GGT NO<MON O<FDIB K<MO DI OC@ KMJBM<H:
XSJUF(")PX NBOZ OVNCFST BSF UIFSF ");
JOU DPVOU; // j )&3&
SFBEG(" %T", &DPVOU);
JG (DPVOU >= 1) \
JOU<> OVNCFST; // j )&3&
OVNCFST.MFOHUI = DPVOU;
EPVCMF BWFSBHF7BMVF; // j )&3&
// ... BTTVNF UIBU UIF DBMDVMBUJPO JT IFSF ...
^ FMTF \
XSJUFMO("&3303: :PV NVTU FOUFS BU MFBTU POF OVNCFS!");
^
AGOCJPBC ?@ADIDIB <GG JA OC@ Q<MD<=G@N <O OC@ OJK H<T GJJF =@OO@M NOMP>OPM<GGT, OC@M@ <M@ N@Q@M<G
=@I@ADON JA ?@ADIDIB OC@H <N G<O@ <N KJNND=G@:
t Speed: "Q@MT Q<MD<=G@ ?@ADIDODJI C<N < NK@@? >JNO DI OC@ KMJBM<H. AN @Q@MT Q<MD<=G@ DN
DIDOD<GDU@? DI !, ?@ADIDIB Q<MD<=G@N <O OC@ OJK RJPG? KJO@IOD<GGT R<NO@ OC@DM DIDOD<GDU<ODJI
>JNO DA OCJN@ Q<MD<=G@N RJPG? IJO <>OP<GGT =@ PN@? G<O@M.
t Risk of mistakes: "Q@MT GDI@ OC<O DN =@OR@@I OC@ ?@ADIDODJI <I? PN@ JA < Q<MD<=G@ ><MMD@N <
CDBC@M MDNF JA KMJBM<HHDIB HDNO<F@N. AN <I @S<HKG@ JA OCDN, >JIND?@M < Q<MD<=G@ I<H@? <N
>JHHJI <N MFOHUI. &O DN KJNND=G@ OJ PN@ OC<O Q<MD<=G@ DI<?Q@MO@IOGT AJM <IJOC@M G@IBOC
=@AJM@ DON DIO@I?@? GDI@. AO OC@ ODH@ DON DIO@I?@? GDI@ C<N =@@I M@<>C@?, OC@ Q<MD<=G@ H<T
C<Q@ <I PIDIO@I?@? Q<GP@.
t Readability: AN OC@ IPH=@M JA GDI@N DI < N>JK@ <M@ DI>M@<N@?, DO DN HJM@ GDF@GT OC<O OC@
?@ADIDODJI JA < Q<MD<=G@ H<T =@>JH@ OJJ A<M PK DI OC@ NJPM>@ >J?@, AJM>DIB OC@ KMJBM<HH@M
OJ N>MJGG =<>F DI JM?@M OJ GJJF <O DON ?@ADIDODJI.
t Code maintenance: 0JPM>@ >J?@ DN DI >JINO<IO HJ?DAD><ODJI <I? DHKMJQ@H@IO: I@R
A@<OPM@N <M@ <??@?, JG? A@<OPM@N <M@ M@HJQ@?, =PBN <M@ ADS@?, @O>. 1C@N@ >C<IB@N
NJH@ODH@N H<F@ DO I@>@NN<MT OJ HJQ@ < BMJPK JA GDI@N <GOJB@OC@M <N < I@R API>ODJI.
4C@I OC<O C<KK@IN, C<QDIB <GG JA OC@ Q<MD<=G@N ?@ADI@? >GJN@ OJ OC@ GDI@N OC<O PN@
OC@H H<F@N DO @<ND@M OJ HJQ@ OC@H <N < >JC@M@IO =PI>C.
#JM @S<HKG@, DI OC@ G<OO@M >J?@ <=JQ@ OC<O AJGGJR@? OCDN BPD?@GDI@, <GG JA OC@ GDI@N
RDOCDI OC@ JG NO<O@H@IO ><I =@ HJQ@? OJ < I@R < API>ODJI DI OC@ KMJBM<H.
,I OC@ JOC@M C<I?, RC@I OC@ Q<MD<=G@N <M@ <GR<TN ?@ADI@? <O OC@ OJK, DA OC@ GDI@N @Q@M
I@@? OJ =@ HJQ@?, OC@ Q<MD<=G@N OC<O <M@ PN@? DI OCJN@ GDI@N HPNO =@ D?@IODAD@? JI@ =T
JI@.
$3?7 (B357
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
100
GPS Loop 25
1C@ GPS GJJK DN AJM OC@ N<H@ KPMKJN@ <N OC@ XIJMF GJJK. GPS H<F@N DO KJNND=G@ OJ KPO OC@
?@ADIDODJIN <I? @SKM@NNDJIN <=JPO OC@ GJJK'N DO@M<ODJI JI OC@ N<H@ GDI@.
AGOCJPBC GPS DN PN@? HP>C G@NN OC<I GPSFBDI DI KM<>OD>@, DO DN DHKJMO<IO OJ PI?@MNO<I? OC@
GPS GJJK ADMNO. 4@ RDGG N@@ GPSFBDI DI < G<O@M >C<KO@M.
Sections of the XIJMF loop
25.1
1C@ XIJMF GJJK @Q<GP<O@N OC@ GJJK >JI?DODJI <I? >JIODIP@N @S@>PODIB OC@ GJJK <N GJIB <N OC<O
>JI?DODJI DN USVF. #JM @S<HKG@, < GJJK OJ KMDIO OC@ IPH=@MN =@OR@@I 1 <I? 11 H<T >C@>F OC@
>JI?DODJI >7EE F:3@ 11:
XIJMF (OVNCFS < 11)
!F7D3F;@9 OC@ GJJK ><I =@ <>CD@Q@? =T DI>M@H@IODIB OVNCFS <O OC@ @I? JA OC@ GJJK:
++OVNCFS;
1J =@ >JHKDG<=G@ <N ! >J?@, OVNCFS HPNO C<Q@ =@@I ?@ADI@? =@AJM@ DON ADMNO PN@:
JOU OVNCFS = 1;
#DI<GGT, OC@M@ DN OC@ <>OP<G RJMF RDOCDI OC@ GJJK =J?T:
XSJUFMO(OVNCFS);
1C@N@ AJPM N@>ODJIN ><I =@ ?@ADI@? <N DI OC@ >JHH@ION =@GJR:
JOU OVNCFS = 1; // j QSFQBSBUJPO
XIJMF (OVNCFS < 11) \ // j DPOEJUJPO DIFDL
XSJUFMO(OVNCFS); // j BDUVBM XPSL
++OVNCFS; // j JUFSBUJPO
^
1C@ N@>ODJIN JA OC@ XIJMF GJJK <M@ @S@>PO@? DI OC@ AJGGJRDIB JM?@M ?PMDIB OC@ DO@M<ODJI JA OC@
XIJMF GJJK:
QSFQBSBUJPO
DPOEJUJPO DIFDL
BDUVBM XPSL
JUFSBUJPO
DPOEJUJPO DIFDL
BDUVBM XPSL
JUFSBUJPO
...
A CSFBL NO<O@H@IO JM < OCMJRI @S>@KODJI ><I O@MHDI<O@ OC@ GJJK <N R@GG.
8AD "AAB
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
101
Sections of the GPS loop
25.2
GPS =MDIBN OCM@@ JA OC@N@ N@>ODJIN JI < NDIBG@ GDI@. 1C@T <M@ RMDOO@I RDOCDI OC@ K<M@IOC@N@N JA
OC@ GPS GJJK, N@K<M<O@? RDOC N@HD>JGJIN. 1C@ GJJK =J?T >JIO<DIN JIGT OC@ <>OP<G RJMF:
GPS (/* QSFQBSBUJPO */; /* DPOEJUJPO DIFDL */; /* JUFSBUJPO */) \
/* BDUVBM XPSL */
^
1C@ N<H@ >J?@ DN HJM@ >JC@M@IO RC@I RMDOO@I <N < GPS GJJK:
GPS (JOU OVNCFS = 1; OVNCFS < 11; ++OVNCFS) \
XSJUFMO(OVNCFS);
^
1C@ =@I@ADO JA OC@ GPS GJJK DN HJM@ J=QDJPN RC@I OC@ GJJK =J?T C<N < G<MB@ IPH=@M JA
NO<O@H@ION. 1C@ @SKM@NNDJI OC<O DI>M@H@ION OC@ GJJK Q<MD<=G@ DN QDND=G@ JI OC@ GPS GDI@
DINO@<? JA =@DIB HDS@? RDOC OC@ JOC@M NO<O@H@ION JA OC@ GJJK.
1C@ N@>ODJIN JA OC@ GPS GJJK <M@ @S@>PO@? DI OC@ N<H@ JM?@M <N OC@ XIJMF GJJK.
1C@ CSFBL <I? DPOUJOVF NO<O@H@ION RJMF @S<>OGT OC@ N<H@ DI OC@ GPS GJJK.
1C@ JIGT ?DAA@M@I>@ =@OR@@I OC@ XIJMF <I? GPS GJJKN DN OC@ I<H@ NK<>@ JA OC@ GJJK Q<MD<=G@.
1CDN DN @SKG<DI@? =@GJR.
AGOCJPBC Q@MT >JHHJI, OC@ DO@M<ODJI Q<MD<=G@ I@@? IJO =@ <I DIO@B@M, IJM DO DN HJ?DAD@? JIGT
=T DI>M@H@IODIB. #JM @S<HKG@, OC@ AJGGJRDIB GJJK DN PN@? OJ KMDIO OC@ C<GQ@N JA OC@ KM@QDJPN
AGJ<ODIB KJDIO Q<GP@N:
GPS (EPVCMF WBMVF = 1; WBMVF > 0.001; WBMVF /= 2) \
XSJUFMO(WBMVF);
^
Note: 1C@ DIAJMH<ODJI <=JQ@ PI?@M OCDN ODOG@ DN O@>CID><GGT DI>JMM@>O =PO ?J@N >JQ@M OC@
H<EJMDOT JA OC@ PN@ ><N@N JA OC@ GPS GJJK, @NK@>D<GGT =T KMJBM<HH@MN RCJ C<Q@ < JM ++
=<>FBMJPI?. &I M@<GDOT, !'N GPS GJJK ?J@N IJO C<Q@ F:D77 E75F;A@E F:3F 3D7 E7B3D3F76 4K
E7?;5A>A@E. &O C<N ORJ N@>ODJIN, ADMNO JA RCD>C >JIO<DIN OC@ KM@K<M<ODJI <I? OC@ GJJK >JI?DODJI
OJB@OC@M. 4DOCJPO B@OODIB DIOJ OC@ ?@O<DGN JA OCDN NTIO<S, C@M@ DN CJR OJ ?@ADI@ ORJ Q<MD<=G@N JA
?DAA@M@IO OTK@N DI OC@ KM@K<M<ODJI N@>ODJI:
GPS (\ JOU J = 0; EPVCMF E = 0.5; ^ J < 10; ++J) \
XSJUFMO("J: ", J, ", E: ", E);
E /= 2;
^
+JO@ OC<O OC@ KM@K<M<ODJI N@>ODJI DN OC@ <M@< RDOCDI OC@ T@GGJR >PMGT =M<>F@ON <I? OC<O OC@M@
DN IJO < N@HD>JGJI =@OR@@I OC@ KM@K<M<ODJI N@>ODJI <I? OC@ >JI?DODJI N@>ODJI.
The sections may be empty
25.3
AGG OCM@@ JA OC@ GPS GJJK N@>ODJIN H<T =@ G@AO @HKOT:
t 0JH@ODH@N < NK@>D<G GJJK Q<MD<=G@ DN IJO I@@?@?, KJNND=GT =@><PN@ <I <GM@<?T-?@ADI@?
Q<MD<=G@ RJPG? =@ PN@?.
t 0JH@ODH@N OC@ GJJK RJPG? =@ @SDO@? =T < CSFBL NO<O@H@IO DINO@<? JA =T M@GTDIB JI OC@
GJJK >JI?DODJI.
8AD "AAB
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
102
t 0JH@ODH@N OC@ DO@M<ODJI @SKM@NNDJIN ?@K@I? JI >@MO<DI >JI?DODJIN OC<O RJPG? =@ >C@>F@?
RDOCDI OC@ GJJK =J?T.
4C@I <GG JA OC@ N@>ODJIN <M@ @HOKT, OC@ GPS GJJK HJ?@GN 8AD7H7D:
GPS ( ; ; ) \
// ...
^
0P>C < GJJK H<T =@ ?@NDBI@? OJ I@Q@M @I? JM @I? RDOC < CSFBL NO<O@H@IO.
The name space of the loop variable
25.4
1C@ JIGT ?DAA@M@I>@ =@OR@@I OC@ GPS <I? XIJMF GJJK DN OC@ I<H@ NK<>@ JA OC@ Q<MD<=G@
?@ADI@? ?PMDIB GJJK KM@K<M<ODJI: 1C@ Q<MD<=G@ DN <>>@NND=G@ JIGT RDOCDI OC@ GPS GJJK, IJO
JPOND?@:
GPS (JOU J = 0; J < 5; ++J) \
// ...
^
XSJUFMO(J); // j DPNQJMBUJPO &3303
// J JT OPU BDDFTTJCMF IFSF
,I OC@ JOC@M C<I?, NDI>@ OC@ Q<MD<=G@ DN ?@ADI@? DI OC@ I<H@ NK<>@ OC<O >JIO<DIN OC@ XIJMF
GJJK, OC@ I<H@ DN <>>@NND=G@ @Q@I <AO@M OC@ GJJK:
JOU J = 0;
XIJMF (J < 5) \
// ...
++J;
^
XSJUFMO(J); // j XPSLT; J JT BDDFTTJCMF IFSF
4@ C<Q@ N@@I OC@ BPD?@GDI@ JA 678;@;@9 @3?7E 5>AE7EF FA F:7;D 8;DEF GE7 DI OC@ KM@QDJPN
>C<KO@M. 0DHDG<M OJ OC@ M<ODJI<G@ AJM OC<O BPD?@GDI@, OC@ NH<GG@M OC@ I<H@ NK<>@ JA < Q<MD<=G@
OC@ =@OO@M. &I OCDN M@B<M?, RC@I OC@ GJJK Q<MD<=G@ DN IJO I@@?@? JPOND?@ OC@ GJJK, GPS DN =@OO@M
OC<I XIJMF.
Exercises
25.5
1. -MDIO OC@ AJGGJRDIB 9S9 O<=G@ =T PNDIB ORJ GPS GJJKN, JI@ DIND?@ OC@ JOC@M:
0,0 0,1 0,2 0,3 0,4 0,5 0,6 0,7 0,8
1,0 1,1 1,2 1,3 1,4 1,5 1,6 1,7 1,8
2,0 2,1 2,2 2,3 2,4 2,5 2,6 2,7 2,8
3,0 3,1 3,2 3,3 3,4 3,5 3,6 3,7 3,8
4,0 4,1 4,2 4,3 4,4 4,5 4,6 4,7 4,8
5,0 5,1 5,2 5,3 5,4 5,5 5,6 5,7 5,8
6,0 6,1 6,2 6,3 6,4 6,5 6,6 6,7 6,8
7,0 7,1 7,2 7,3 7,4 7,5 7,6 7,7 7,8
8,0 8,1 8,2 8,3 8,4 8,5 8,6 8,7 8,8
2. 2N@ JI@ JM HJM@ GPS GJJKN OJ KMDIO OC@ * >C<M<>O@M <N I@@?@? OJ KMJ?P>@ B@JH@OMD><G
K<OO@MIN:
8AD "AAB
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
103
*
**
***
****
*****
******
*******
********
*********
********
********
********
********
********
********
********
********
********
@O>.
... F:7 EA>GF;A@E
8AD "AAB
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
104
Ternary Operator : 26
1C@ : JK@M<OJM RJMFN Q@MT NDHDG<MGT OJ <I JG-FMTF NO<O@H@IO:
JG (/* DPOEJUJPO DIFDL */) \
/* ... FYQSFTTJPO(T) UP FYFDVUF JG USVF */
^ FMTF \
/* ... FYQSFTTJPO(T) UP FYFDVUF JG GBMTF */
^
1C@ JG NO<O@H@IO @S@>PO@N @DOC@M OC@ =GJ>F AJM OC@ ><N@ JA USVF JM OC@ =GJ>F AJM OC@ ><N@ JA
GBMTF. AN TJP M@H@H=@M, =@DIB < NO<O@H@IO, DO ?J@N IJO C<Q@ < Q<GP@; JG H@M@GT <AA@>ON OC@
@S@>PODJI JA >J?@ =GJ>FN.
,I OC@ JOC@M C<I?, OC@ : JK@M<OJM DN <I @SKM@NNDJI. &I <??DODJI OJ RJMFDIB NDHDG<MT OJ OC@
JG-FMTF NO<O@H@IO, DO KMJ?P>@N < Q<GP@. 1C@ @LPDQ<G@IO JA OC@ <=JQ@ >J?@ DN OC@ AJGGJRDIB:
/* DPOEJUJPO */ /* USVUI FYQSFTTJPO */ : /* GBMTJUZ FYQSFTTJPO */
B@><PN@ DO PN@N OCM@@ @SKM@NNDJIN, OC@ : JK@M<OJM DN ><GG@? OC@ O@MI<MT JK@M<OJM.
1C@ Q<GP@ OC<O DN KMJ?P>@? =T OCDN JK@M<OJM DN @DOC@M OC@ Q<GP@ JA OC@ OMPOC @SKM@NNDJI JM OC@
Q<GP@ JA OC@ A<GNDOT @SKM@NNDJI. B@><PN@ DO DN <I @SKM@NNDJI, DO ><I =@ PN@? <ITRC@M@ OC<O
@SKM@NNDJIN ><I =@ PN@?.
1C@ AJGGJRDIB @S<HKG@N >JIOM<NO OC@ : JK@M<OJM OJ OC@ JG-FMTF NO<O@H@IO. 1C@ O@MI<MT
JK@M<OJM DN HJM@ >JI>DN@ AJM OC@ ><N@N OC<O <M@ NDHDG<M OJ OC@N@ @S<HKG@N.
t Initialization
1J DIDOD<GDU@ RDOC 366 DA G@<K T@<M, 365 JOC@MRDN@:
JOU EBZT = JT-FBQ:FBS 366 : 365;
4DOC JG, JI@ R<T DN OJ ?@ADI@ OC@ Q<MD<=G@ RDOCJPO <I @SKGD>DO DIDOD<G Q<GP@ <I? OC@I
<NNDBI OC@ DIO@I?@? Q<GP@:
JOU EBZT;
JG (JT-FBQ:FBS) \
EBZT = 366;
^ FMTF \
EBZT = 365;
^
AI <GO@MI<ODQ@ RDOC JG DN OJ DIDOD<GDU@ OC@ Q<MD<=G@ RDOC OC@ IJI-G@<K T@<M Q<GP@ <I?
OC@I DI>M@H@IO DO DA G@<K T@<M:
JOU EBZT = 365;
JG (JT-FBQ:FBS) \
++EBZT;
^
t Printing
-MDIODIB < K<MO JA < H@NN<B@ ?DAA@M@IOGT ?@K@I?DIB JI < >JI?DODJI:
)7D@3DK %B7D3FAD ?:
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
105
XSJUFMO("5IF HMBTT JT IBMG ",
JT0QUJNJTUJD "GVMM." : "FNQUZ.");
4DOC JG, OC@ ADMNO <I? G<NO K<MON JA OC@ H@NN<B@ H<T =@ KMDIO@? N@K<M<O@GT:
XSJUF("5IF HMBTT JT IBMG ");
JG (JT0QUJNJTUJD) \
XSJUFMO("GVMM.");
^ FMTF \
XSJUFMO("FNQUZ.");
^
AGO@MI<ODQ@GT, OC@ @IODM@ H@NN<B@ ><I =@ KMDIO@? N@K<M<O@GT:
JG (JT0QUJNJTUJD) \
XSJUFMO("5IF HMBTT JT IBMG GVMM.");
^ FMTF \
XSJUFMO("5IF HMBTT JT IBMG FNQUZ.");
^
t Calculation
&I>M@<NDIB OC@ N>JM@ JA OC@ RDII@M DI < =<>FB<HHJI B<H@ 2 KJDION JM 1 KJDIO
?@K@I?DIB JI RC@OC@M OC@ B<H@ C<N @I?@? RDOC B<HHJI;
TDPSF += JT(BNNPO 2 : 1;
0OM<DBCOAJMR<M? RDOC JG:
JG (JT(BNNPO) \
TDPSF += 2;
^ FMTF \
TDPSF += 1;
^
AI <GO@MI<ODQ@ RDOC JG DN OJ ADMNO DI>M@H@IO =T JI@ <I? OC@I DI>M@H@IO <B<DI DA
B<HHJI:
++TDPSF;
JG (JT(BNNPO) \
++TDPSF;
^
AN ><I =@ N@@I AMJH OC@ @S<HKG@N <=JQ@, OC@ >J?@ DN HJM@ >JI>DN@ <I? HJM@ >G@<M RDOC OC@
O@MI<MT JK@M<OJM DI >@MO<DI NDOP<ODJIN.
The types of the selection expressions must match
26.1
1C@ Q<GP@ JA OC@ : JK@M<OJM DN @DOC@M OC@ Q<GP@ JA OC@ OMPOC @SKM@NNDJI JM OC@ Q<GP@ JA OC@
A<GNDOT @SKM@NNDJI. 1C@ OTK@N JA OC@N@ ORJ @SKM@NNDJIN I@@? IJO =@ OC@ N<H@ =PO OC@T HPNO
H<O>C. #JM @S<HKG@, OC@T ><I =@ =JOC DIO@B@M OTK@N GDF@ JOU <I? MPOH =PO OC@T ><IIJO =@
HDNH<O>C@? OTK@N GDF@ JOU <I? TUSJOH.
#MJH OC@ @S<HKG@N <=JQ@, OC@ Q<GP@N OC<O RJPG? =@ N@G@>O@? ?@K@I?DIB JI OC@ Q<GP@ JA
JT-FBQ:FBS R@M@ 366 <I? 365. BJOC JA OCJN@ Q<GP@N <M@ JA OTK@ JOU <I? ?J H<O>C.
)7D@3DK %B7D3FAD ?:
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
106
1J N@@ < >JHKDG<ODJI @MMJM ?P@ OJ OC@ Q<GP@N JA OC@ @SKM@NNDJIN IJO H<O>CDIB, G@O'N GJJF <O
>JHKJNDIB < H@NN<B@ OC<O M@KJMON OC@ IPH=@M JA DO@HN OJ =@ NCDKK@?. )@O'N KMDIO "A ?JU@I"
RC@I OC@ Q<GP@ @LP<GN 12: "A ?JU@I DO@HN RDGG =@ NCDKK@?." ,OC@MRDN@, G@O'N C<Q@ OC@ H@NN<B@
DI>GP?@ OC@ @S<>O IPH=@M: "3 DO@HN RDGG =@ NCDKK@?."
,I@ HDBCO OCDIF OC<O OC@ Q<MTDIB K<MO JA OC@ H@NN<B@ ><I =@ N@G@>O@? RDOC OC@ : JK@M<OJM:
XSJUFMO((DPVOU == 12) "" EP[FO" : DPVOU, // j DPNQJMBUJPO &3303
" JUFNT XJMM CF TIJQQFE.");
1C@ @SKM@NNDJIN ?J IJO H<O>C =@><PN@ OC@ OTK@ JA "" EP[FO" DN TUSJOH <I? OC@ OTK@ JA DPVOU
DN JOU.
A NJGPODJI DN OJ >JIQ@MO DPVOU OJ TUSJOH <N R@GG. 1C@ API>ODJI UP!TUSJOH AMJH OC@ TUE.DPOW
HJ?PG@ KMJ?P>@N < TUSJOH Q<GP@ AMJH OC@ NK@>DAD@? K<M<H@O@M:
JNQPSU TUE.DPOW;
// ...
XSJUFMO((DPVOU == 12) "" EP[FO" : UP!TUSJOH(DPVOU),
" JUFNT XJMM CF TIJQQFE.");
+JR <N =JOC JA OC@ N@G@>ODJI @SKM@NNDJIN JA OC@ : JK@M<OJM <M@ JA TUSJOH OTK@, OC@ >J?@
>JHKDG@N <I? KMDION OC@ @SK@>O@? H@NN<B@.
Exercise
26.2
t %<Q@ OC@ KMJBM<H M@<? < NDIBG@ JOU Q<GP@ <N F:7 @7F 3?AG@F RC@M@ < KJNDODQ@ Q<GP@
M@KM@N@ION < B<DI <I? < I@B<ODQ@ Q<GP@ M@KM@N@ION < GJNN.
1C@ KMJBM<H NCJPG? KMDIO < H@NN<B@ OC<O >JIO<DIN "B<DI@?" JM "GJNO" ?@K@I?DIB JI
RC@OC@M OC@ <HJPIO DN KJNDODQ@ JM I@B<ODQ@. #JM @S<HKG@, "$100 GJNO" JM "$70 B<DI@?".
"Q@I OCJPBC DO H<T =@ HJM@ NPDO<=G@, ?J IJO PN@ OC@ JG NO<O@H@IO DI OCDN @S@M>DN@.
... F:7 EA>GF;A@
)7D@3DK %B7D3FAD ?:
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
107
Literals 27
-MJBM<HN <>CD@Q@ OC@DM O<NFN =T H<IDKPG<ODIB Q<GP@N JA Q<MD<=G@N <I? J=E@>ON. 1C@T KMJ?P>@
I@R Q<GP@N <I? I@R J=E@>ON =T PNDIB OC@H RDOC API>ODJIN <I? JK@M<OJMN.
0JH@ Q<GP@N I@@? IJO =@ KMJ?P>@? ?PMDIB OC@ @S@>PODJI JA OC@ KMJBM<H; OC@T <M@ RMDOO@I
?DM@>OGT DIOJ OC@ NJPM>@ >J?@. #JM @S<HKG@, OC@ AGJ<ODIB KJDIO Q<GP@ 0.75 <I? OC@ TUSJOH
Q<GP@ "5PUBM QSJDF: " =@GJR <M@ IJO ><G>PG<O@?:
EJTDPVOUFE1SJDF = BDUVBM1SJDF * 0.75;
UPUBM1SJDF += DPVOU * EJTDPVOUFE1SJDF;
XSJUFMO("5PUBM QSJDF: ", UPUBM1SJDF);
0P>C Q<GP@N OC<O <M@ OTK@? DIOJ OC@ NJPM>@ >J?@ GDO@M<GGT <M@ ><GG@? GDO@M<GN. 4@ C<Q@ PN@?
H<IT GDO@M<GN DI OC@ KMJBM<HN OC<O R@ C<Q@ RMDOO@I NJ A<M. 4@ RDGG >JQ@M <GG JA OC@ OTK@N JA
GDO@M<GN <I? OC@DM NTIO<S MPG@N.
Integer literals
27.1
&IO@B@M GDO@M<GN ><I =@ RMDOO@I DI JI@ JA AJPM R<TN: OC@ ?@>DH<G NTNO@H OC<O R@ PN@ DI JPM
?<DGT GDQ@N; OC@ C@S<?@>DH<G <I? =DI<MT NTNO@HN, RCD>C <M@ HJM@ NPDO<=G@ DI >@MO<DI
>JHKPODIB O<NFN; <I? OC@ J>O<G NTNO@H, RCD>C H<T =@ I@@?@? DI Q@MT M<M@ ><N@N.
&I JM?@M OJ H<F@ OC@ >J?@ HJM@ M@<?<=G@ JM AJM <IT JOC@M M@<NJI, DO DN KJNND=G@ OJ DIN@MO @
>C<M<>O@MN <ITRC@M@ <HJIB OC@ >C<M<>O@MN JA DIO@B@M GDO@M<GN. #JM @S<HKG@, OJ N@K<M<O@ OC@
IPH=@MN <O OCM@@ ?DBDO DIO@MQ<GN <N DI 1@234@567. 1C@N@ >C<M<>O@MN <M@ JKODJI<G; OC@T <M@
DBIJM@? =T OC@ >JHKDG@M.
In the decimal system: 1C@ GDO@M<GN <M@ NK@>DAD@? =T OC@ ?@>DH<G IPH@M<GN @S<>OGT OC@ N<H@
R<T <N R@ <M@ PN@? OJ DI JPM ?<DGT GDQ@N, <N DI 12. &I OCDN NTNO@H, OC@ ADMNO ?DBDO ><IIJO =@ 0 <N
OC<O ?DBDO DN M@N@MQ@? AJM DI?D><ODIB OC@ J>O<G NTNO@H DI ?AEF AF:7D >3@9G397E. &I !, DIO@B@M
GDO@M<GN ><IIJO NO<MO RDOC OC@ ?DBDO 0 OJ KM@Q@IO =PBN OC<O <M@ ><PN@? =T OCDN NP=OG@ ?DAA@M@I>@.
1CDN ?J@N IJO KM@>GP?@ 0 JI DON JRI: 0 DN U@MJ.
In the hexadecimal system: 1C@ GDO@M<GN NO<MO RDOC 0Y JM 09 <I? DI>GP?@ OC@ IPH@M<GN JA OC@
C@S<?@>DH<G NTNO@H: "0123456789<=>?@A" <I? "AB!"#" <N DI 0Y12BC00GF.
In the octal system: 1C@ GDO@M<GN <M@ NK@>DAD@? =T OC@ PDUBM O@HKG<O@ AMJH OC@ TUE.DPOW
HJ?PG@ <I? DI>GP?@ OC@ IPH@M<GN JA OC@ J>O<G NTNO@H: "01234567" <N DI PDUBM!576.
In the binary system: 1C@ GDO@M<GN NO<MO RDOC 0C JM 0# <I? DI>GP?@ OC@ IPH@M<GN JA OC@
=DI<MT NTNO@H: 0 <I? 1 <N DI 0C01100011.
The types of integer literals 27.1.1
'PNO GDF@ <IT JOC@M Q<GP@, @Q@MT GDO@M<G DN JA < >@MO<DI OTK@. 1C@ OTK@N JA GDO@M<GN <M@ IJO
NK@>DAD@? @SKGD>DOGT <N JOU, EPVCMF, @O>. 1C@ >JHKDG@M DIA@MN OC@ OTK@ AMJH OC@ Q<GP@ <I?
NTIO<S JA OC@ GDO@M<G DON@GA.
AGOCJPBC HJNO JA OC@ ODH@ OC@ OTK@N JA GDO@M<GN <M@ IJO DHKJMO<IO, NJH@ODH@N OC@ OTK@N H<T
IJO H<O>C OC@ @SKM@NNDJIN OC<O OC@T <M@ PN@? DI. &I NP>C ><N@N OC@ OTK@ HPNO =@ NK@>DAD@?
@SKGD>DOGT.
BT ?@A<PGO, DIO@B@M GDO@M<GN <M@ DIA@MM@? OJ =@ JA OTK@ JOU. 4C@I OC@ Q<GP@ C<KK@IN OJ =@ OJJ
G<MB@ OJ =@ M@KM@N@IO@? =T <I JOU, OC@ >JHKDG@M PN@N OC@ AJGGJRDIB GJBD> OJ ?@>D?@ JI OC@ OTK@
JA OC@ GDO@M<G:
";F7D3>E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
108
t &A OC@ Q<GP@ JA OC@ GDO@M<G ?J@N IJO ADO <I JOU <I? DO DN NK@>DAD@? DI OC@ ?@>DH<G NTNO@H OC@I
DON OTK@ DN MPOH.
t &O OC@ Q<GP@ JA OC@ GDO@M<G ?J@N IJO ADO <I JOU <I? DO DN NK@>DAD@? DI <IT JOC@M NTNO@H OC@I
OC@ OTK@ DN OMD@? OJ =@ VJOU, MPOH, <I? VMPOH, DI OC<O JM?@M, ?@K@I?DIB JI RCD>C OTK@ ><I
<>>JHJ?<O@ OC@ Q<GP@.
1J N@@ OCDN GJBD> DI <>ODJI, G@O'N OMT OC@ AJGGJRDIB KMJBM<H OC<O O<F@N <?Q<IO<B@ JA UZQFPG <I?
TUSJOHPG:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
XSJUFMO("=O--- UIFTF BSF XSJUUFO JO EFDJNBM ---");
// GJUT BO JOU, TP UIF UZQF JT JOU
XSJUFMO( 2@147@483@647, "=U=U",
UZQFPG(2@147@483@647).TUSJOHPG);
// EPFT OPU GJU BO JOU BOE JT EFDJNBM, TP UIF UZQF JT MPOH
XSJUFMO( 2@147@483@648, "=U=U",
UZQFPG(2@147@483@648).TUSJOHPG);
XSJUFMO("=O--- UIFTF BSF /05 XSJUUFO JO EFDJNBM ---");
// GJUT BO JOU, TP UIF UZQF JT JOU
XSJUFMO( 0Y7'''@'''', "=U=U",
UZQFPG(0Y7'''@'''').TUSJOHPG);
// EPFT OPU GJU BO JOU BOE JT OPU EFDJNBM, TP UIF UZQF JT VJOU
XSJUFMO( 0Y8000@0000, "=U=U",
UZQFPG(0Y8000@0000).TUSJOHPG);
// EPFT OPU GJU B VJOU BOE JT OPU EFDJNBM, TP UIF UZQF JT MPOH
XSJUFMO( 0Y1@0000@0000, "=U=U",
UZQFPG(0Y1@0000@0000).TUSJOHPG);
// EPFT OPU GJU B MPOH BOE JT OPU EFDJNBM, TP UIF UZQF JT VMPOH
XSJUFMO( 0Y8000@0000@0000@0000, "=U=U",
UZQFPG(0Y8000@0000@0000@0000).TUSJOHPG);
^
1C@ JPOKPO:
--- UIFTF BSF XSJUUFO JO EFDJNBM ---
2147483647 JOU
2147483648 MPOH
--- UIFTF BSF /05 XSJUUFO JO EFDJNBM ---
2147483647 JOU
2147483648 VJOU
4294967296 MPOH
9223372036854775808 VMPOH
The - suffix 27.1.2
/@B<M?G@NN JA OC@ H<BIDOP?@ JA OC@ Q<GP@, DA DO @I?N RDOC - <N DI 10-, OC@ OTK@ DN MPOH.
The 6 suffix 27.1.3
/@B<M?G@NN JA OC@ H<BIDOP?@ JA OC@ Q<GP@, DA DO @I?N RDOC 6 <N DI 106, OC@ OTK@ DN VOTJHOFE.
)JR@M><N@ V ><I <GNJ =@ PN@?.
";F7D3>E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
109
1C@ - <I? 6 NK@>DAD@MN ><I =@ PN@? OJB@OC@M DI <IT JM?@M. #JM @S<HKG@, 76- <I? 8-6 <M@ =JOC
VMPOH.
Floating point literals
27.2
1C@ AGJ<ODIB KJDIO GDO@M<GN ><I =@ NK@>DAD@? DI @DOC@M OC@ ?@>DH<G NTNO@H <N DI 1.234 JM DI OC@
C@S<?@>DH<G NTNO@H <N DI 0Y9B.CD.
In the decimal system: AI @SKJI@IO H<T =@ <KK@I?@? <AO@M OC@ >C<M<>O@M F JM & H@<IDIB
"ODH@N 10 OJ OC@ KJR@M JA". #JM @S<HKG@, 3.4F5 H@<IN "3.4 ODH@N 10 OJ OC@ KJR@M JA 5". A +
>C<M<>O@M H<T <GNJ =@ NK@>DAD@? =@AJM@ OC@ Q<GP@ JA OC@ @SKJI@IO, =PO DO C<N IJ @AA@>O. #JM
@S<HKG@ 5.6F2 <I? 5.6F+2 <M@ OC@ N<H@.
1C@ - >C<M<>O@M OTK@? =@AJM@ OC@ Q<GP@ JA OC@ @SKJI@IO >C<IB@N OC@ H@<IDIB OJ =@ "?DQD?@?
=T 10 OJ OC@ KJR@M JA". #JM @S<HKG@, 7.8F-3 H@<IN "7.8 ?DQD?@? =T 10 OJ OC@ KJR@M JA 3".
In the hexadecimal system: 1C@ Q<GP@ NO<MON RDOC @DOC@M 0Y JM 09 <I? OC@ K<MON =@AJM@ <I?
<AO@M OC@ KJDIO <M@ NK@>DAD@? DI OC@ IPH@M<GN JA OC@ C@S<?@>DH<G NTNO@H. 0DI>@ F <I? & <M@
Q<GD? IPH@M<GN DI OCDN NTNO@H, OC@ @SKJI@IO DN NK@>DAD@? =T Q JM 1.
AIJOC@M ?DAA@M@I>@ DN OC<O OC@ @SKJI@IO ?J@N IJO H@<I "10 OJ OC@ KJR@M JA", =PO "2 OJ OC@
KJR@M JA". #JM @S<HKG@, OC@ 14 K<MO DI 0YBCD.EFG14 H@<IN "2 OJ OC@ KJR@M JA 4".
#GJ<ODIB KJDIO GDO@M<GN <GHJNO <GR<TN C<Q@ < KJDIO =PO DO H<T =@ JHDOO@? DA OC@M@ DN <I
@SKJI@IO NK@>DAD@?. #JM @S<HKG@, 2F3 DN < AGJ<ODIB KJDIO GDO@M<G RDOC OC@ Q<GP@ 2000.
1C@ Q<GP@ =@AJM@ OC@ KJDIO H<T =@ JHDOO@? DA U@MJ. #JM @S<HKG@, .25 DN < GDO@M<G C<QDIB OC@
Q<GP@ "LP<MO@M".
1C@ JKODJI<G @ >C<M<>O@MN H<T =@ PN@? RDOC AGJ<ODIB KJDIO GDO@M<GN <N R@GG, <N DI 1@000.5.
The types of floating point literals 27.2.1
2IG@NN @SKGD>DOGT NK@>DAD@?, OC@ OTK@ JA < AGJ<ODIB KJDIO GDO@M<G DN EPVCMF. 1C@ G <I? '
NK@>DAD@MN H@<I GMPBU, <I? OC@ - NK@>DAD@M H@<IN SFBM. #JM @S<HKG@; 1.2 DN EPVCMF, 3.4G DN
GMPBU, <I? 5.6- DN SFBM.
Character literals
27.3
C<M<>O@M GDO@M<GN <M@ NK@>DAD@? RDOCDI NDIBG@ LPJO@N <N DI 'B', '=O', '=Y21', @O>.
As the character itself: 1C@ >C<M<>O@M H<T =@ OTK@? ?DM@>OGT =T OC@ F@T=J<M? JM >JKD@?
AMJH < N@K<M<O@ O@SO: '<', 'f', @O>.
As the character specifier: 1C@ >C<M<>O@M GDO@M<G H<T =@ NK@>DAD@? =T < =<>FNG<NC >C<M<>O@M
AJGGJR@? =T < NK@>D<G G@OO@M. #JM @S<HKG@, OC@ =<>FNG<NC >C<M<>O@M DON@GA ><I =@ NK@>DAD@? =T
'=='. C<M<>O@M NK@>DAD@M G@OO@MN <M@ OC@ AJGGJRDIB:
";F7D3>E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
110
4ZOUBY %FGJOJUJPO
=' TJOHMF RVPUF
=" EPVCMF RVPUF
= RVFTUJPO NBSL
== CBDLTMBTI
=B BMFSU (CFMM TPVOE PO TPNF UFSNJOBMT)
=C EFMFUF DIBSBDUFS
=G OFX QBHF
=O OFX-MJOF
=S DBSSJBHF SFUVSO
=U UBC
=W WFSUJDBM UBC
As the extended ASCII character code: C<M<>O@M GDO@M<GN ><I =@ NK@>DAD@? ?DM@>OGT =T
OC@DM >J?@N. 1C@ >J?@N ><I =@ NK@>DAD@? @DOC@M DI OC@ C@S<?@>DH<G NTNO@H JM DI OC@ J>O<G
NTNO@H. 4C@I PNDIB OC@ C@S<?@>DH<G NTNO@H, OC@ GDO@M<G HPNO NO<MO RDOC =Y <I? HPNO PN@ ORJ
?DBDON AJM OC@ >J?@, <I? RC@I PNDIB OC@ J>O<G NTNO@H OC@ GDO@M<G HPNO NO<MO RDOC = <I? C<Q@ PK
OJ OCM@@ ?DBDON. #JM @S<HKG@, OC@ GDO@M<GN '=Y21' <I? '=41' <M@ =JOC OC@ @S>G<H<ODJI KJDIO.
As the Unicode character code: 4C@I OC@ GDO@M<G DN NK@>DAD@? RDOC V AJGGJR@? =T 4
C@S<?@>DH<G ?DBDON, OC@I DON OTK@ DN XDIBS. 4C@I DO'N NK@>DAD@? RDOC 6 AJGGJR@? =T 8
C@S<?@>DH<G ?DBDON, OC@I DON OTK@ DN EDIBS. #JM @S<HKG@, '=V011F' <I? '=60000011F' <M@
=JOC OC@ a >C<M<>O@M, C<QDIB OC@ OTK@ XDIBS <I? EDIBS, M@NK@>ODQ@GT.
As named character entity: C<M<>O@MN OC<O C<Q@ @IODOT I<H@N ><I =@ NK@>DAD@? =T OC<O
I<H@ =T OC@ NTIO<S '=&name;'. (0@@ OC@ +<H@? C<M<>O@M "IODOD@N O<=G@.) #JM @S<HKG@,
'=&FVSP;' DN u, '=&IFBSUT;' DN |, <I? '=&DPQZ;' DN W.
String literals
27.4
0OMDIB GDO@M<GN <M@ < >JH=DI<ODJI JA >C<M<>O@M GDO@M<GN <I? ><I =@ NK@>DAD@? DI < Q<MD@OT JA
R<TN.
Double-quoted string literals 27.4.1
1C@ HJNO >JHHJI R<T JA NK@>DATDIB NOMDIB GDO@M<GN DN OTKDIB OC@DM >C<M<>O@MN RDOCDI ?JP=G@
LPJO@N <N DI "IFMMP". &I?DQD?P<G >C<M<>O@MN JA NOMDIB GDO@M<GN AJGGJR OC@ MPG@N JA >C<M<>O@M
GDO@M<GN. #JM @S<HKG@, OC@ GDO@M<G ""4 LB=V011GgU: 3=&GSBD12;5-" DN OC@ N<H@ <N
""4 LBegU: 3`5-".
Wysiwyg string literals 27.4.2
4C@I NOMDIB GDO@M<GN <M@ NK@>DAD@? RDOCDI =<>F-LPJO@N, OC@ DI?DQD?P<G >C<M<>O@MN JA OC@ NOMDIB
?J IJO J=@T OC@ NK@>D<G NTIO<S MPG@N JA >C<M<>O@M GDO@M<GN. #JM @S<HKG@, OC@ GDO@M<G
AD:=OVSUFOA ><I =@ < ?DM@>OJMT I<H@ JI OC@ 4DI?JRN JK@M<ODJIB NTNO@H. &A DO R@M@ RMDOO@I
RDOCDI ?JP=G@ LPJO@N, OC@ '=O' K<MO RJPG? H@<I OC@ @7I->;@7 >C<M<>O@M:
XSJUFMO(AD:=OVSUFOA);
XSJUFMO("D:=OVSUFO");
";F7D3>E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
111
D:=OVSUFO l XZTJXZH (XIBU ZPV TFF JT XIBU ZPV HFU)
D: l UIF DIBSBDUFS MJUFSBM JT UBLFO BT OFX-MJOF
VSUFO
4TNDRTB NOMDIB GDO@M<GN ><I <GO@MI<ODQ@GT =@ NK@>DAD@? RDOCDI ?JP=G@ LPJO@N =PO KM@K@I?@?
RDOC OC@ S >C<M<>O@M: S"D:=OVSUFO" DN <GNJ < RTNDRTB NOMDIB GDO@M<G.
Hexadecimal string literals 27.4.3
&I NDOP<ODJIN RC@M@ @Q@MT >C<M<>O@M DI < NOMDIB I@@?N OJ =@ NK@>DAD@? DI C@S<?@>DH<G NTNO@H,
DINO@<? JA OTKDIB =Y =@AJM@ @Q@MT JI@ JA OC@H, < NDIBG@ Y >C<M<>O@M H<T =@ OTK@? =@AJM@ OC@
JK@IDIB ?JP=G@ LPJO@. &I OC<O ><N@, @Q@MT >C<M<>O@M DI OC@ NOMDIB GDO@M<G DN O<F@I OJ =@
C@S<?@>DH<G. A??DODJI<GGT, OC@ NOMDIB GDO@M<G H<T >JIO<DI NK<>@N, RCD>C <M@ DBIJM@? =T OC@
>JHKDG@M. #JM @S<HKG@, "=Y44=Y64=Y69=Y6D=Y69" <I? Y"44 64 69 6D 69" <M@ OC@ N<H@
NOMDIB GDO@M<G.
Delimited string literals 27.4.4
1C@ NOMDIB GDO@M<G H<T >JIO<DI ?@GDHDO@MN OC<O <M@ OTK@? MDBCO DIND?@ OC@ ?JP=G@ LPJO@N. 1C@N@
?@GDHDO@MN <M@ IJO >JIND?@M@? OJ =@ K<MON JA OC@ Q<GP@ JA OC@ GDO@M<G. !@GDHDO@? NOMDIB GDO@M<GN
NO<MO RDOC < R =@AJM@ OC@ JK@IDIB ?JP=G@ LPJO@. #JM @S<HKG@, OC@ Q<GP@ JA R".IFMMP." DN
"C@GGJ"; OC@ ?JON <M@ IJO K<MON JA OC@ Q<GP@. AN GJIB <N DO @I?N RDOC < I@R-GDI@, OC@ ?@GDHDO@M
><I C<Q@ HJM@ OC<I JI@ >C<M<>O@M:
XSJUFMO(R".:@%&-*.*5&3
GJSTU MJOF
TFDPOE MJOF
.:@%&-*.*5&3");
*6;!")&*&1"/ DN IJO < K<MO JA OC@ Q<GP@:
GJSTU MJOF
TFDPOE MJOF
Token string literals 27.4.5
0OMDIB GDO@M<GN OC<O NO<MO RDOC R <I? OC<O PN@ \ <I? ^ <N ?@GDHDO@MN ><I >JIO<DI JIGT G@B<G !
>J?@:
BVUP TUS = R\JOU OVNCFS = 42; ++OVNCFS;^;
XSJUFMO(TUS);
1C@ JPOKPO:
JOU OVNCFS = 42; ++OVNCFS;
1CDN A@<OPM@ DN K<MOD>PG<MGT PN@APG OJ C@GK O@SO @?DOJMN CDBCGDBCO OC@ >J?@ DIND?@ OC@ NOMDIB <N !
>J?@.
Types of string literals 27.4.6
BT ?@A<PGO OC@ OTK@ JA < NOMDIB GDO@M<G DN JNNVUBCMF(DIBS)<>. AI <KK@I?@? D, X, JM E
>C<M<>O@M NK@>DAD@N OC@ OTK@ JA OC@ NOMDIB @SKGD>DOGT <N JNNVUBCMF(DIBS)<>,
";F7D3>E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
112
JNNVUBCMF(XDIBS)<>, JM JNNVUBCMF(EDIBS)<>, M@NK@>ODQ@GT. #JM @S<HKG@, OC@ >C<M<>O@MN JA
"IFMMP"E <M@ JA OTK@ JNNVUBCMF(EDIBS).
4@ C<Q@ N@@I DI OC@ 0OMDIBN >C<KO@M OC<O OC@N@ OCM@@ NOMDIB OTK@N <M@ <GD<N@? <N TUSJOH,
XTUSJOH, <I? ETUSJOH M@NK@>ODQ@GT.
Literals are calculated at compile time
27.5
&O DN KJNND=G@ OJ NK@>DAT GDO@M<GN <N @SKM@NNDJIN. #JM @S<HKG@, DINO@<? JA RMDODIB OC@ OJO<G
IPH=@M JA N@>JI?N DI '<IP<MT <N 2678400 JM 2@678@400, DO DN KJNND=G@ OJ NK@>DAT DO =T OC@
O@MHN OC<O H<F@ PK OC<O Q<GP@ <N 60 * 60 * 24 * 31. 1C@ HPGODKGD><ODJI JK@M<ODJIN DI OC<O
@SKM@NNDJI ?J IJO <AA@>O OC@ MPI-ODH@ NK@@? JA OC@ KMJBM<H, <N OC@ KMJBM<H RJPG? =@
>JHKDG@? <N DA 2678400 R@M@ RMDOO@I DINO@<?.
1C@ N<H@ <KKGD@N OJ NOMDIB GDO@M<GN. #JM @S<HKG@, OC@ >JI><O@I<ODJI JK@M<ODJI DI
"IFMMP " _ "XPSME" RJPG? =@ @S@>PO@? <O >JHKDG@ ODH@, IJO <O MPI ODH@. 1C@ KMJBM<H
RJPG? =@ >JHKDG@? <N DA OC@ >J?@ >JIO<DIN OC@ NDIBG@ NOMDIB GDO@M<G "IFMMP XPSME".
Exercises
27.6
1. 1C@ AJGGJRDIB GDI@ ><PN@N < >JHKDG<ODJI @MMJM:
JOU BNPVOU = 10@000@000@000; // j DPNQJMBUJPO &3303
C<IB@ OC@ KMJBM<H NJ OC<O OC@ GDI@ ><I =@ >JHKDG@? <I? OC<O BNPVOU @LP<GN O@I
=DGGDJIN.
2. 4MDO@ < KMJBM<H OC<O DI>M@<N@N OC@ Q<GP@ JA < Q<MD<=G@ <I? KMDION DO DI <I DIADIDO@ GJJK.
*<F@ OC@ Q<GP@ =@ KMDIO@? JI OC@ N<H@ GDI@:
/VNCFS: 25774 l BMXBZT PO UIF TBNF MJOF
A NK@>D<G >C<M<>O@M GDO@M<G JOC@M OC<I '=O' H<T =@ PN@APG C@M@.
... F:7 EA>GF;A@E
";F7D3>E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
113
Formatted Output 28
1CDN >C<KO@M DN <=JPO A@<OPM@N JA -CJ=JN'N TUE.GPSNBU HJ?PG@, IJO <=JPO OC@ >JM@ A@<OPM@N JA
OC@ ! G<IBP<B@.
!'N DIKPO <I? JPOKPO AJMH<O NK@>DAD@MN <M@ NDHDG<M OJ OC@ JI@N DI OC@ G<IBP<B@.
B@AJM@ BJDIB APMOC@M, & RJPG? GDF@ OJ NPHH<MDU@ OC@ AJMH<O NK@>DAD@MN <I? AG<BN <N <
M@A@M@I>@:
'MBHT (DBO CF VTFE UPHFUIFS)
- GMVTI MFGU
+ QSJOU TJHO
# QSJOU JO UIF BMUFSOBUJWF XBZ
0 QSJOU [FSP-GJMMFE
space QSJOU TQBDF-GJMMFE
'PSNBU 4QFDJGJFST
T EFGBVMU
C CJOBSZ
E EFDJNBM
P PDUBM
Y,9 IFYBEFDJNBM
F,& TDJFOUJGJD GMPBUJOH QPJOU
G,' EPUUFE GMPBUJOH QPJOU
H,( BT F PS G
B," IFYBEFDJNBM GMPBUJOH QPJOU
4@ C<Q@ =@@I PNDIB API>ODJIN GDF@ XSJUFMO RDOC HPGODKG@ K<M<H@O@MN <N I@>@NN<MT. 1C@
K<M<H@O@MN RJPG? =@ >JIQ@MO@? OJ OC@DM NOMDIB M@KM@N@IO<ODJIN <I? OC@I N@IO OJ OC@ JPOKPO.
0JH@ODH@N OCDN DN IJO NPAAD>D@IO. 1C@ JPOKPO H<T C<Q@ OJ =@ DI < >@MO<DI AJMH<O. )@O'N GJJF <O
OC@ AJGGJRDIB >J?@ OC<O DN PN@? OJ KMDIO DO@HN JA <I DIQJD>@:
JUFNT _= 1.23;
JUFNT _= 45.6;
GPS (JOU J = 0; J != JUFNT.MFOHUI; ++J) \
XSJUFMO("*UFN ", J + 1, ": ", JUFNT<J>);
^
1C@ JPOKPO:
*UFN 1: 1.23
*UFN 2: 45.6
!@NKDO@ OC@ DIAJMH<ODJI =@DIB >JMM@>O, DO H<T =@ M@LPDM@? OJ =@ KMDIO@? DI < >@MO<DI AJMH<O.
#JM @S<HKG@ OC@ ?JON H<T C<Q@ OJ =@ GDI@? PK <I? OC<O OC@M@ HPNO <GR<TN =@ ORJ ?DBDON <AO@M
OC@ ?JO <N DI OC@ AJGGJRDIB JPOKPO:
*UFN 1: 1.23
*UFN 2: 45.60
#JMH<OO@? JPOKPO DN PN@APG DI NP>C ><N@N. 1C@ JPOKPO API>ODJIN OC<O R@ C<Q@ =@@I PNDIB NJ A<M
C<N >JPIO@MK<MON OC<O >JIO<DI OC@ G@OO@M G DI OC@DM I<H@N: XSJUFG() <I? XSJUFGMO(). 1C@
G@OO@M G DN NCJMO AJM 8AD?3FF76. 1C@ ADMNO K<M<H@O@M JA OC@N@ API>ODJIN DN < 8AD?3F EFD;@9 OC<O
?@N>MD=@N CJR OC@ JOC@M K<M<H@O@MN NCJPG? =@ KMDIO@?.
#JM @S<HKG@, OC@ AJMH<O NOMDIB OC<O RJPG? C<Q@ XSJUFGMO() KMJ?P>@ OC@ ?@NDM@? JPOKPO
<=JQ@ DN OC@ AJGGJRDIB:
FAD?3FF76 %GFBGF
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
114
XSJUFGMO("*UFN %E:%9.02G", J + 1, JUFNT<J>);
1C@ AJMH<O NOMDIB >JIO<DIN M@BPG<M >C<M<>O@MN OC<O <M@ K<NN@? OJ OC@ JPOKPO <N-DN, <N R@GG <N
NK@>D<G AJMH<O NK@>DAD@MN OC<O >JMM@NKJI? OJ @<>C K<M<H@O@M OC<O DN OJ =@ KMDIO@?. #JMH<O
NK@>DAD@MN NO<MO RDOC OC@ % >C<M<>O@M <I? @I?N RDOC < 8AD?3F 5:3D35F7D. 1C@ AJMH<O NOMDIB
<=JQ@ C<N ORJ AJMH<O NK@>DAD@MN: %E <I? %9.02G.
"Q@MT NK@>DAD@M DN <NNJ>D<O@? OJ OC@ AJGGJRDIB K<M<H@O@MN DI JM?@M. #JM @S<HKG@, %E DN
<NNJ>D<O@? RDOC J + 1 <I? %9.02G DN <NNJ>D<O@? RDOC JUFNT<J>. "Q@MT NK@>DAD@M NK@>DAD@N OC@
AJMH<O JA OC@ K<M<H@O@M OC<O DO >JMM@NKJI?N OJ. (#JMH<O NK@>DAD@MN H<T C<Q@ K<M<H@O@M
IPH=@MN <N R@GG. 1CDN RDGG =@ @SKG<DI@? G<O@M DI OC@ >C<KO@M.)
AGG JA OC@ JOC@M >C<M<>O@MN JA OC@ AJMH<O NOMDIB OC<O <M@ IJO K<MON JA AJMH<O NK@>DAD@MN <M@
KMDIO@? <N-DN. 0P>C D79G>3D >C<M<>O@MN JA OC@ AJMH<O NK@>DAD@M <=JQ@ <M@ CDBCGDBCO@? <N M@? <N
DI "*UFN %E:%9.02G".
#JMH<O NK@>DAD@MN >JINDNO JA NDS K<MON HJNO JA RCD>C <M@ JKODJI<G. 1C@ K<MO I<H@? BAE;F;A@ RDGG
=@ @SKG<DI@? G<O@M =@GJR. 1C@ JOC@M ADQ@ <M@ OC@ AJGGJRDIB (Note: ):7 EB357E 47FI77@ F:7E7
B3DFE 3D7 ;@E7DF76 :7D7 FA :7>B I;F: D73634;>;FK; F:7K 3D7 @AF B3DFE A8 F:7 EB75;8;7DE.):
% flags width precision format_character
1C@ % >C<M<>O@M <O OC@ =@BDIIDIB <I? OC@ AJMH<O >C<M<>O@M <O OC@ @I? <M@ M@LPDM@?; OC@
JOC@MN <M@ JKODJI<G.
B@><PN@ % C<N < NK@>D<G H@<IDIB DI AJMH<O NOMDIBN, RC@I < % I@@?N OJ =@ KMDIO@? <N < M@BPG<M
>C<M<>O@M, DO HPNO =@ OTK@? <N %%.
format_character
28.1
C: &IO@B@M K<M<H@O@M DN KMDIO@? DI OC@ =DI<MT NTNO@H.
P: &IO@B@M K<M<H@O@M DN KMDIO@? DI OC@ J>O<G NTNO@H.
Y <I? 9: &IO@B@M K<M<H@O@M DN KMDIO@? DI OC@ C@S<?@>DH<G NTNO@H; RDOC GJR@M><N@ G@OO@MN AJM Y
<I? PKK@M><N@ G@OO@MN AJM 9.
E: &IO@B@M K<M<H@O@M DN KMDIO@? DI ?@>DH<G NTNO@H; < I@B<ODQ@ NDBI DN <GNJ KMDIO@? DA DO DN <
NDBI@? OTK@ <I? OC@ Q<GP@ DN G@NN OC<I U@MJ.
XSJUFGMO("#JOBSZ : %C", WBMVF);
XSJUFGMO("0DUBM : %P", WBMVF);
XSJUFGMO(")FYBEFDJNBM: %Y", WBMVF);
XSJUFGMO("%FDJNBM : %E", WBMVF);
#JOBSZ : 1100
0DUBM : 14
)FYBEFDJNBM: D
%FDJNBM : 12
F: #GJ<ODIB KJDIO K<M<H@O@M DN KMDIO@? <>>JM?DIB OJ OC@ AJGGJRDIB MPG@N.
t NDIBG@ ?DBDO =@AJM@ OC@ ?JO
t ?JO DA BD75;E;A@ DN IJI-U@MJ
t ?DBDON <AO@M OC@ ?JO, IPH=@M JA RCD>C DN ?@O@MHDI@? =T BD75;E;A@ (?@A<PGO KM@>DNDJI DN 6)
t OC@ F >C<M<>O@M (H@<IDIB "10 OJ OC@ KJR@M JA")
FAD?3FF76 %GFBGF
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
115
t OC@ - JM + >C<M<>O@M ?@K@I?DIB JI RC@OC@M OC@ @SKJI@IO DN G@NN OC<I JM BM@<O@M OC<I U@MJ
t OC@ @SKJI@IO >JINDNODIB JA <O G@<NO ORJ ?DBDON
&: 0<H@ <N DI F RDOC OC@ @S>@KODJI JA OC@ & >C<M<>O@M <O OC@ JPOKPO DINO@<? JA F.
G <I? ': #GJ<ODIB KJDIO K<M<H@O@M DN KMDIO@? DI OC@ ?@>DH<G NTNO@H; OC@M@ DN <O G@<NO JI@ ?DBDO
=@AJM@ OC@ ?JO <I? OC@ ?@A<PGO KM@>DNDJI DN 6.
H: 0<H@ <N DI G DA OC@ @SKJI@IO DN =@OR@@I -5 <I? BD75;E;A@; JOC@MRDN@ <N DI F. BD75;E;A@ ?J@N
IJO NK@>DAT OC@ IPH=@M JA ?DBDON <AO@M OC@ ?JO, =PO OC@ NDBIDAD><IO ?DBDON JA OC@ @IODM@ Q<GP@. &A
OC@M@ <M@ IJ NDBIDAD><IO ?DBDON <AO@M OC@ ?JO, OC@I OC@ ?JO DN IJO KMDIO@?. 1C@ MDBCOHJNO U@MJN
<AO@M OC@ ?JO <M@ IJO KMDIO@?.
(: 0<H@ <N DI H RDOC OC@ @S>@KODJI JA & JM ' <O OC@ JPOKPO.
B: #GJ<ODIB KJDIO K<M<H@O@M DN KMDIO@? DI OC@ C@S<?@>DH<G AGJ<ODIB AJMH<O:
t OC@ >C<M<>O@MN 0Y
t NDIBG@ C@S<?@>DH<G ?DBDO
t ?JO DA BD75;E;A@ DN IJI-U@MJ
t ?DBDON <AO@M OC@ ?JO, IPH=@M JA RCD>C DN ?@O@MHDI@? =T BD75;E;A@; DA IJ BD75;E;A@ DN
NK@>DAD@?, OC@I <N H<IT ?DBDON <N I@>@NN<MT
t OC@ Q >C<M<>O@M (H@<IDIB "2 OJ OC@ KJR@M JA")
t OC@ - JM + >C<M<>O@M ?@K@I?DIB JI RC@OC@M OC@ @SKJI@IO DN G@NN OC<I JM BM@<O@M OC<I U@MJ
t OC@ @SKJI@IO >JINDNODIB JA <O G@<NO JI@ ?DBDO (OC@ @SKJI@IO JA OC@ Q<GP@ 0 DN 0)
": 0<H@ <N DI B RDOC OC@ @S>@KODJI JA OC@ 09 <I? 1 >C<M<>O@MN <O OC@ JPOKPO.
EPVCMF WBMVF = 123.456789;
XSJUFGMO("XJUI F: %F", WBMVF);
XSJUFGMO("XJUI G: %G", WBMVF);
XSJUFGMO("XJUI H: %H", WBMVF);
XSJUFGMO("XJUI B: %B", WBMVF);
XJUI F: 1.234568F+02
XJUI G: 123.456789
XJUI H: 123.457
XJUI B: 0Y1.FEE3D07FF0C0CQ+6
T: 1C@ Q<GP@ DN KMDIO@? DI OC@ N<H@ R<T <N DI IJI-AJMH<OO@? JPOKPO, <>>JM?DIB OJ OC@ OTK@ JA
OC@ K<M<H@O@M:
t CPPM Q<GP@N <N USVF JM GBMTF
t DIO@B@M Q<GP@N N<H@ <N %E
t AGJ<ODIB KJDIO Q<GP@N N<H@ <N %H
t NOMDIBN DI 21#-8 @I>J?DIB; BD75;E;A@ ?@O@MHDI@N OC@ H<SDHPH IPH=@M JA =TO@N OJ PN@
(M@H@H=@M OC<O DI 21#-8 @I>J?DIB, OC@ IPH=@M JA =TO@N DN IJO OC@ N<H@ <N OC@ IPH=@M JA
>C<M<>O@MN; AJM @S<HKG@ OC@ NOMDIB "<b" C<N 2 >C<M<>O@MN, >JINDNODIB < OJO<G JA 3 =TO@N)
t NOMP>O <I? >G<NN J=E@>ON <N OC@ M@OPMI Q<GP@ JA OC@ UP4USJOH() H@H=@M API>ODJIN JA OC@DM
OTK@N; BD75;E;A@ ?@O@MHDI@N OC@ H<SDHPH IPH=@M JA =TO@N OJ PN@
t <MM<TN <N OC@DM @G@H@IO Q<GP@N ND?@ =T ND?@
CPPM C = USVF;
JOU J = 365;
EPVCMF E = 9.87;
TUSJOH T = "GPSNBUUFE";
BVUP P = 'JMF("UFTU@GJMF", "S");
FAD?3FF76 %GFBGF
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
116
JOU<> B = < 2, 4, 6, 8 >;
XSJUFGMO("CPPM : %T", C);
XSJUFGMO("JOU : %T", J);
XSJUFGMO("EPVCMF: %T", E);
XSJUFGMO("TUSJOH: %T", T);
XSJUFGMO("PCKFDU: %T", P);
XSJUFGMO("BSSBZ : %T", B);
CPPM : USVF
JOU : 365
EPVCMF: 9.87
TUSJOH: GPSNBUUFE
PCKFDU: 'JMF(55738'"0)
BSSBZ : <2, 4, 6, 8>
width
28.2
1CDN K<MO ?@O@MHDI@N OC@ RD?OC JA OC@ AD@G? OC<O OC@ K<M<H@O@M DN KMDIO@? DI. &A OC@ RD?OC DN
NK@>DAD@? <N OC@ >C<M<>O@M *, OC@I OC@ <>OP<G RD?OC Q<GP@ DN M@<? AMJH OC@ I@SO K<M<H@O@M. &A
RD?OC DN < I@B<ODQ@ Q<GP@, OC@I OC@ - AG<B DN <NNPH@?.
JOU WBMVF = 100;
XSJUFGMO("*O B GJFME PG 10 DIBSBDUFST:%10T", WBMVF);
XSJUFGMO("*O B GJFME PG 5 DIBSBDUFST :%5T", WBMVF);
*O B GJFME PG 10 DIBSBDUFST: 100
*O B GJFME PG 5 DIBSBDUFST : 100
precision
28.3
-M@>DNDJI DN NK@>DAD@? <AO@M < ?JO DI OC@ AJMH<O NK@>DAD@M. #JM AGJ<ODIB KJDIO OTK@N, DO
?@O@MHDI@N OC@ KM@>DNDJI JA OC@ KMDIO@? M@KM@N@IO<ODJI JA OC@ Q<GP@N. &A OC@ KM@>DNDJI DN
NK@>DAD@? <N OC@ >C<M<>O@M *, OC@I OC@ <>OP<G KM@>DNDJI DN M@<? AMJH OC@ I@SO K<M<H@O@M (OC<O
K<M<H@O@M HPNO =@ <I JOU). +@B<ODQ@ KM@>DNDJI Q<GP@N <M@ DBIJM@?.
EPVCMF WBMVF = 1234.56789;
XSJUFGMO("%.8H", WBMVF);
XSJUFGMO("%.3H", WBMVF);
XSJUFGMO("%.8G", WBMVF);
XSJUFGMO("%.3G", WBMVF);
1234.5679
1.23F+03
1234.56789000
1234.568
BVUP OVNCFS = 0.123456789;
XSJUFGMO("/VNCFS: %.*H", 4, OVNCFS);
/VNCFS: 0.1235
FAD?3FF76 %GFBGF
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
117
flags
28.4
*JM@ OC<I JI@ AG<B ><I =@ NK@>DAD@?.
-: OC@ Q<GP@ DN KMDIO@? G@AO-<GDBI@? DI DON AD@G?; OCDN AG<B ><I>@GN OC@ 0 AG<B
JOU WBMVF = 123;
XSJUFGMO("/PSNBMMZ SJHIU-BMJHOFE:]%10E]", WBMVF);
XSJUFGMO("-FGU-BMJHOFE :]%-10E]", WBMVF);
/PSNBMMZ SJHIU-BMJHOFE:] 123]
-FGU-BMJHOFE :]123 ]
+: DA OC@ Q<GP@ DN KJNDODQ@, DO DN KM@K@I?@? RDOC OC@ + >C<M<>O@M; OCDN AG<B ><I>@GN OC@ EB357 AG<B
XSJUFGMO("/P FGGFDU GPS OFHBUJWF WBMVFT : %+E", -50);
XSJUFGMO("1PTJUJWF WBMVF XJUI UIF + GMBH : %+E", 50);
XSJUFGMO("1PTJUJWF WBMVF XJUIPVU UIF + GMBH: %E", 50);
/P FGGFDU GPS OFHBUJWF WBMVFT : -50
1PTJUJWF WBMVF XJUI UIF + GMBH : +50
1PTJUJWF WBMVF XJUIPVU UIF + GMBH: 50
#: KMDION OC@ Q<GP@ DI <I 3>F7D@3F7 AJMH ?@K@I?DIB JI OC@ 8AD?3F25:3D35F7D
t P: OC@ ADMNO >C<M<>O@M JA OC@ J>O<G Q<GP@ DN <GR<TN KMDIO@? <N 0
t Y <I? 9: DA OC@ Q<GP@ DN IJO U@MJ, DO DN KM@K@I?@? RDOC 0Y JM 09
t AGJ<ODIB KJDION: < ?JO DN KMDIO@? @Q@I DA OC@M@ <M@ IJ NDBIDAD><IO ?DBDON <AO@M OC@ ?JO
t H <I? (: @Q@I OC@ DINDBIDAD><IO U@MJ ?DBDON <AO@M OC@ ?JO <M@ KMDIO@?
XSJUFGMO("0DUBM TUBSUT XJUI 0 : %#P", 1000);
XSJUFGMO(")FYBEFDJNBM TUBSUT XJUI 0Y : %#Y", 1000);
XSJUFGMO("$POUBJOT EPU FWFO XIFO VOOFDFTTBSZ: %#H", 1G);
XSJUFGMO("3JHIUNPTU [FSPT BSF QSJOUFE : %#H", 1.2);
0DUBM TUBSUT XJUI 0 : 01750
)FYBEFDJNBM TUBSUT XJUI 0Y : 0Y3F8
$POUBJOT EPU FWFO XIFO VOOFDFTTBSZ: 1.00000
3JHIUNPTU [FSPT BSF QSJOUFE : 1.20000
0: OC@ AD@G? DN K<??@? RDOC U@MJN (PIG@NN OC@ Q<GP@ DN OBO JM JOGJOJUZ); DA BD75;E;A@ DN <GNJ
NK@>DAD@?, OCDN AG<B DN DBIJM@?
XSJUFGMO("*O B GJFME PG 8 DIBSBDUFST: %08E", 42);
*O B GJFME PG 8 DIBSBDUFST: 00000042
EB357 >C<M<>O@M: DA OC@ Q<GP@ DN KJNDODQ@, < NK<>@ >C<M<>O@M DN KM@K@I?@? OJ <GDBI OC@ I@B<ODQ@
<I? KJNDODQ@ Q<GP@N
XSJUFGMO("/P FGGFDU GPS OFHBUJWF WBMVFT: % E", -34);
XSJUFGMO("1PTJUJWF WBMVF XJUI TQBDF : % E", 56);
XSJUFGMO("1PTJUJWF WBMVF XJUIPVU TQBDF : %E", 56);
FAD?3FF76 %GFBGF
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
118
/P FGGFDU GPS OFHBUJWF WBMVFT: -34
1PTJUJWF WBMVF XJUI TQBDF : 56
1PTJUJWF WBMVF XJUIPVU TQBDF : 56
Positional parameters
28.5
4@ C<Q@ N@@I <=JQ@ OC<O OC@ K<M<H@O@MN <M@ <NNJ>D<O@? JI@ =T JI@ RDOC OC@ NK@>DAD@MN DI OC@
AJMH<O NOMDIB. &O DN KJNND=G@ OJ PN@ KJNDODJI IPH=@MN RDOCDI AJMH<O NK@>DAD@MN. 1CDN @I<=G@N
<NNJ>D<ODIB OC@ NK@>DAD@MN RDOC NK@>DAD> K<M<H@O@MN. -<M<H@O@MN <M@ IPH=@M@? DI DI>M@<NDIB
A<NCDJI, NO<MODIB RDOC 1. 1C@ K<M<H@O@M IPH=@MN <M@ NK@>DAD@? DHH@?D<O@GT <AO@M OC@ %
>C<M<>O@M, AJGGJR@? =T < $:
% position$ flags width precision format_character
AI <?Q<IO<B@ JA KJNDODJI<G K<M<H@O@MN DN =@DIB <=G@ OJ PN@ OC@ N<H@ K<M<H@O@M DI HJM@ OC<I
JI@ KG<>@N DI OC@ N<H@ AJMH<O NOMDIB:
XSJUFGMO("%1$E %1$Y %1$P %1$C", 42);
1C@ AJMH<O NOMDIB <=JQ@ PN@N OC@ K<M<H@O@M IPH=@M@? 1 RDOCDI AJPM NK@>DAD@MN OJ KMDIO DO DI
?@>DH<G, C@S<?@>DH<G, J>O<G, <I? =DI<MT AJMH<ON:
42 2B 52 101010
AIJOC@M <KKGD><ODJI JA KJNDODJI<G K<M<H@O@MN DN NPKKJMODIB HPGODKG@ CPH<I G<IBP<B@N. 4C@I
M@A@MM@? =T KJNDODJI IPH=@MN, K<M<H@O@MN ><I =@ HJQ@? <ITRC@M@ RDOCDI OC@ NK@>DAD> AJMH<O
NOMDIB AJM < BDQ@I CPH<I G<IBP<B@. #JM @S<HKG@, OC@ IPH=@M JA NOP?@ION JA < BDQ@I >G<NNMJJH
><I =@ KMDIO@? <N DI OC@ AJGGJRDIB:
XSJUFGMO("5IFSF BSF %T TUVEFOUT JO SPPN %T.", DPVOU, SPPN);
5IFSF BSF 20 TUVEFOUT JO SPPN 1".
)@O'N <NNPH@ OC<O OC@ KMJBM<H HPNO <GNJ NPKKJMO 1PMFDNC. &I OCDN ><N@ OC@ AJMH<O NOMDIB
I@@?N =@ N@G@>O@? <>>JM?DIB OJ OC@ <>ODQ@ G<IBP<B@. 1C@ AJGGJRDIB H@OCJ? O<F@N <?Q<IO<B@ JA
OC@ O@MI<MT JK@M<OJM:
BVUP GPSNBU = (MBOHVBHF == "FO"
"5IFSF BSF %T TUVEFOUT JO SPPN %T."
: "%T TfOfGfOEB %T bdSFODJ WBS.");
XSJUFGMO(GPSNBU, DPVOU, SPPN);
2IAJMOPI<O@GT, RC@I OC@ K<M<H@O@MN <M@ <NNJ>D<O@? JI@ =T JI@, OC@ >G<NNMJJH <I? NOP?@IO
>JPIO DIAJMH<ODJI <KK@<M DI M@Q@MN@ JM?@M DI OC@ 1PMFDNC H@NN<B@; OC@ MJJH DIAJMH<ODJI DN
RC@M@ OC@ >JPIO NCJPG? =@ <I? OC@ >JPIO DN RC@M@ OC@ MJJH NCJPG? =@:
20 TgOgGgOEB 1" ceSFODJ WBS. l 8SPOH: NFBOT "SPPN 20", BOE "1" TUVEFOUT"!
1J <QJD? OCDN, OC@ K<M<H@O@MN ><I =@ NK@>DAD@? =T IPH=@MN <N 1$ <I? 2$ OJ <NNJ>D<O@ @<>C
NK@>DAD@M RDOC OC@ @S<>O K<M<H@O@M:
FAD?3FF76 %GFBGF
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
119
BVUP GPSNBU = (MBOHVBHF == "FO"
"5IFSF BSF %1$T TUVEFOUT JO SPPN %2$T."
: "%2$T TfOfGfOEB %1$T bdSFODJ WBS.");
XSJUFGMO(GPSNBU, DPVOU, SPPN);
+JR OC@ K<M<H@O@MN <KK@<M DI OC@ KMJK@M JM?@M, M@B<M?G@NN JA OC@ G<IBP<B@ N@G@>O@?:
5IFSF BSF 20 TUVEFOUT JO SPPN 1".
1" TgOgGgOEB 20 ceSFODJ WBS.
GPSNBU
28.6
#JMH<OO@? JPOKPO DN <Q<DG<=G@ =T OC@ GPSNBU() API>ODJI JA OC@ TUE.TUSJOH HJ?PG@ <N R@GG.
GPSNBU() RJMFN OC@ N<H@ <N XSJUFG() =PO DO D7FGD@E OC@ M@NPGO <N < TUSJOH DINO@<? JA
KMDIODIB DO OJ OC@ JPOKPO:
JNQPSU TUE.TUEJP;
JNQPSU TUE.TUSJOH;
WPJE NBJO()
\
XSJUF("8IBU JT ZPVS OBNF ");
BVUP OBNF = DIPNQ(SFBEMO());
BVUP SFTVMU = GPSNBU(")FMMP %T!", OBNF);
^
1C@ KMJBM<H ><I H<F@ PN@ JA OC<O M@NPGO DI G<O@M @SKM@NNDJIN.
Exercises
28.7
1. 4MDO@ < KMJBM<H OC<O M@<?N < Q<GP@ <I? KMDION DO DI OC@ C@S<?@>DH<G NTNO@H.
2. 4MDO@ < KMJBM<H OC<O M@<?N < AGJ<ODIB KJDIO Q<GP@ <I? KMDION DO <N K@M>@IO<B@ Q<GP@ RDOC
ORJ ?DBDON <AO@M OC@ ?JO. #JM @S<HKG@, DA OC@ Q<GP@ DN 1.2345, DO NCJPG? KMDIO %1.23.
... F:7 EA>GF;A@E
FAD?3FF76 %GFBGF
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
120
Formatted Input 29
&O DN KJNND=G@ OJ NK@>DAT OC@ AJMH<O JA OC@ ?<O< OC<O DN @SK@>O@? <O OC@ DIKPO. 1C@ AJMH<O
NK@>DAD@N =JOC OC@ ?<O< OC<O DN OJ =@ M@<? <I? OC@ >C<M<>O@MN OC<O NCJPG? =@ DBIJM@?.
!'N DIKPO AJMH<O NK@>DAD@MN <M@ NDHDG<M OJ OC@ JI@N OC<O <M@ DI OC@ G<IBP<B@.
AN R@ C<Q@ <GM@<?T =@@I PNDIB DI OC@ KM@QDJPN >C<KO@MN, OC@ AJMH<O NK@>DAD@M " %T" M@<?N OC@
?<O< <>>JM?DIB OJ OC@ OTK@ JA OC@ Q<MD<=G@. #JM @S<HKG@, <N OC@ OTK@ JA OC@ AJGGJRDIB Q<MD<=G@
DN EPVCMF, OC@ >C<M<>O@MN <O OC@ DIKPO RJPG? =@ M@<? <N AGJ<ODIB KJDIO:
EPVCMF OVNCFS;
SFBEG(" %T", &OVNCFS);
1C@ AJMH<O NOMDIB ><I >JIO<DI OCM@@ OTK@N JA DIAJMH<ODJI:
t The space character: &I?D><O@N L7DA JM HJM@ RCDO@NK<>@ >C<M<>O@MN <O OC@ DIKPO <I?
NK@>DAD@N OC<O <GG JA OCJN@ >C<M<>O@MN NCJPG? =@ M@<? <I? DBIJM@?.
t Format specifier: 0DHDG<M OJ OC@ JPOKPO AJMH<O NK@>DAD@MN, DIKPO AJMH<O NK@>DAD@MN NO<MO
RDOC OC@ % >C<M<>O@M <I? ?@O@MHDI@ OC@ AJMH<O JA OC@ ?<O< OC<O DN OJ =@ M@<?.
t Any other character: &I?D><O@N OC@ >C<M<>O@MN OC<O <M@ @SK@>O@? <O OC@ DIKPO <N-DN, RCD>C
NCJPG? =@ M@<? <I? DBIJM@?.
1C@ AJMH<O NOMDIB H<F@N DO KJNND=G@ OJ N@G@>O NK@>DAD> DIAJMH<ODJI AMJH OC@ DIKPO <I? DBIJM@
OC@ JOC@MN.
)@O'N C<Q@ < GJJF <O <I @S<HKG@ OC<O PN@N <GG JA OC@ OCM@@ OTK@N JA DIAJMH<ODJI DI OC@ AJMH<O
NOMDIB. )@O'N <NNPH@ OC<O OC@ NOP?@IO IPH=@M <I? OC@ BM<?@ <M@ @SK@>O@? OJ <KK@<M <O OC@
DIKPO DI OC@ AJGGJRDIB AJMH<O:
OVNCFS:123 HSBEF:90
)@O'N APMOC@M <NNPH@ OC<O OC@ O<BN OVNCFS: <I? HSBEF: HPNO =@ DBIJM@?. 1C@ AJGGJRDIB
AJMH<O NOMDIB RJPG? E7>75F OC@ Q<GP@N JA IPH=@M <I? BM<?@ <I? RJPG? DBIJM@ OC@ JOC@M
>C<M<>O@MN:
JOU OVNCFS;
JOU HSBEF;
SFBEG("OVNCFS:%T HSBEF:%T", &OVNCFS, &HSBEF);
1C@ >C<M<>O@MN OC<O <M@ DI?D><O@? DI JM<IB@ DI "OVNCFS:%T HSBEF:%T" HPNO <KK@<M <O OC@
DIKPO @S<>OGT <N NK@>DAD@?; SFBEG() M@<?N <I? DBIJM@N OC@H.
1C@ NDIBG@ NK<>@ >C<M<>O@M OC<O <KK@<MN DI OC@ AJMH<O NOMDIB <=JQ@ RJPG? ><PN@ <GG JA OC@
RCDO@NK<>@ >C<M<>O@MN OC<O <KK@<M @S<>OGT <O OC<O KJNDODJI OJ =@ M@<? <I? DBIJM@?.
AN OC@ % >C<M<>O@M C<N < NK@>D<G H@<IDIB DI AJMH<O NOMDIBN, RC@I OC<O >C<M<>O@M DON@GA I@@?N
OJ =@ M@<? <I? DBIJM@?, DO HPNO =@ RMDOO@I ORD>@ DI OC@ AJMH<O NOMDIB <N %%.
/@<?DIB < NDIBG@ GDI@ JA ?<O< AMJH OC@ DIKPO C<N =@@I M@>JHH@I?@? <N DIPNQ(SFBEMO()) DI
OC@ 0OMDIBN >C<KO@M. &INO@<? JA OC<O H@OCJ?, < =O >C<M<>O@M <O OC@ @I? JA OC@ AJMH<O NOMDIB
><I <>CD@Q@ < NDHDG<M BJ<G:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
FAD?3FF76 !@BGF
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
121
XSJUF("'JSTU OBNF: ");
TUSJOH GJSTU/BNF;
SFBEG(" %T=O", &GJSTU/BNF); // j =O BU UIF FOE
XSJUF("-BTU OBNF : ");
TUSJOH MBTU/BNF;
SFBEG(" %T=O", &MBTU/BNF); // j =O BU UIF FOE
XSJUF(""HF : ");
JOU BHF;
SFBEG(" %T", &BHF);
XSJUFGMO("%T %T (%T)", GJSTU/BNF, MBTU/BNF, BHF);
^
1C@ =O >C<M<>O@MN <O OC@ @I?N JA OC@ AJMH<O NOMDIBN RC@I M@<?DIB GJSTU/BNF <I? MBTU/BNF
RJPG? ><PN@ OC@ I@R-GDI@ >C<M<>O@MN OJ =@ M@<? AMJH OC@ DIKPO <I? OJ =@ DBIJM@?. %JR@Q@M,
KJO@IOD<G RCDO@NK<>@ >C<M<>O@MN <O OC@ @I?N JA OC@ NOMDIBN H<T NODGG I@@? OJ =@ M@HJQ@? =T
DIPNQ().
Format specifier characters
29.1
E: /@<? <I DIO@B@M DI OC@ ?@>DH<G NTNO@H.
P: /@<? <I DIO@B@M DI OC@ J>O<G NTNO@H.
Y: /@<? <I DIO@B@M DI OC@ C@S<?@>DH<G NTNO@H.
G: /@<? < AGJ<ODIB KJDIO IPH=@M.
T: /@<? <>>JM?DIB OJ OC@ OTK@ JA OC@ Q<MD<=G@.
D: /@<? < NDIBG@ >C<M<>O@M. 1CDN NK@>DAD@M <GGJRN M@<?DIB RCDO@NK<>@ >C<M<>O@MN <N R@GG (DO
><I>@GN OC@ DBIJM@ =@C<QDJM).
#JM @S<HKG@, DA OC@ DIKPO >JIO<DIN "23 23 23", OC@ Q<GP@N RJPG? =@ M@<? ?DAA@M@IOGT <>>JM?DIB
OJ OC@ ?DAA@M@IO AJMH<O NK@>DAD@MN:
JOU OVNCFS@E;
JOU OVNCFS@P;
JOU OVNCFS@Y;
SFBEG(" %E %P %Y", &OVNCFS@E, &OVNCFS@P, &OVNCFS@Y);
XSJUFMO("3FBE XJUI %E: ", OVNCFS@E);
XSJUFMO("3FBE XJUI %P: ", OVNCFS@P);
XSJUFMO("3FBE XJUI %Y: ", OVNCFS@Y);
AGOCJPBC OC@ DIKPO >JIO<DIN OCM@@ N@ON JA "23" >C<M<>O@MN, OC@ Q<GP@N JA OC@ Q<MD<=G@N <M@
?DAA@M@IO:
3FBE XJUI %E: 23
3FBE XJUI %P: 19
3FBE XJUI %Y: 35
Note: +7DK 4D;78>K, "23" ;E 7CG3> FA 2J8+3=19 ;@ F:7 A5F3> EKEF7? 3@6 FA 2J16+3=35 ;@ F:7
:7J3675;?3> EKEF7?.
FAD?3FF76 !@BGF
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
122
Exercise
29.2
t ANNPH@ OC<O OC@ DIKPO >JIO<DIN OC@ ?<O@ DI OC@ AJMH<O K73D.?A@F:.63K. 4MDO@ < KMJBM<H
OC<O KMDION OC@ IPH=@M JA OC@ HJIOC. #JM @S<HKG@, DA OC@ DIKPO DN 2009.09.30, OC@ JPOKPO
NCJPG? =@ 9.
... F:7 EA>GF;A@
FAD?3FF76 !@BGF
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
123
EP-XIJMF Loop 30
&I OC@ GPS )JJK >C<KO@M, R@ C<Q@ N@@I OC@ NO@KN DI RCD>C OC@ XIJMF GJJK DN @S@>PO@?:
QSFQBSBUJPO
DPOEJUJPO DIFDL
BDUVBM XPSL
JUFSBUJPO
DPOEJUJPO DIFDL
BDUVBM XPSL
JUFSBUJPO
...
1C@ EP-XIJMF GJJK DN Q@MT NDHDG<M OJ OC@ XIJMF GJJK. 1C@ ?DAA@M@I>@ DN OC<O OC@ 5A@6;F;A@
5:75= DN K@MAJMH@? <O OC@ @I? JA @<>C DO@M<ODJI JA OC@ EP-XIJMF GJJK, NJ OC<O OC@ 35FG3> IAD=
DN K@MAJMH@? <O G@<NO JI>@:
QSFQBSBUJPO
BDUVBM XPSL
JUFSBUJPO
DPOEJUJPO DIFDL j BU UIF FOE PG UIF JUFSBUJPO
BDUVBM XPSL
JUFSBUJPO
DPOEJUJPO DIFDL j BU UIF FOE PG UIF JUFSBUJPO
...
#JM @S<HKG@, EP-XIJMF H<T =@ HJM@ I<OPM<G DI OC@ AJGGJRDIB KMJBM<H RC@M@ OC@ PN@M
BP@NN@N < IPH=@M, <N OC@ PN@M HPNO BP@NN <O G@<NO JI>@ NJ OC<O OC@ IPH=@M ><I =@ >JHK<M@?:
JNQPSU TUE.TUEJP;
JNQPSU TUE.SBOEPN;
WPJE NBJO()
\
JOU OVNCFS = VOJGPSN(1, 101);
XSJUFMO("* BN UIJOLJOH PG B OVNCFS CFUXFFO 1 BOE 100.");
JOU HVFTT;
EP \
XSJUF("8IBU JT ZPVS HVFTT ");
SFBEG(" %T", &HVFTT);
JG (OVNCFS < HVFTT) \
XSJUF(".Z OVNCFS JT MFTT UIBO UIBU. ");
^ FMTF JG (OVNCFS > HVFTT) \
XSJUF(".Z OVNCFS JT HSFBUFS UIBO UIBU. ");
^
^ XIJMF (HVFTT != OVNCFS);
XSJUFMO("$PSSFDU!");
^
1C@ API>ODJI VOJGPSN() OC<O DN PN@? DI OC@ KMJBM<H DN < K<MO JA OC@ TUE.SBOEPN HJ?PG@. &O
M@OPMIN < M<I?JH IPH=@M DI OC@ NK@>DAD@? M<IB@. 1C@ R<T DO DN PN@? <=JQ@, OC@ N@>JI?
6A-I:;>7 "AAB
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
124
IPH=@M DN >JIND?@M@? OJ =@ JPOND?@ JA OC@ M<IB@. &I JOC@M RJM?N, VOJGPSN() RJPG? IJO M@OPMI
101 AJM OC<O ><GG.
Exercise
30.1
t 4MDO@ < KMJBM<H OC<O KG<TN OC@ N<H@ B<H@ =PO C<Q@ OC@ KMJBM<H ?J OC@ BP@NNDIB. &A OC@
KMJBM<H DN RMDOO@I >JMM@>OGT, DO NCJPG? BP@NN OC@ PN@M'N IPH=@M DI <O HJNO 7 OMD@N.
... F:7 EA>GF;A@
6A-I:;>7 "AAB
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
125
Associative Arrays 31
ANNJ>D<ODQ@ <MM<TN <M@ < A@<OPM@ OC<O DN AJPI? DI HJNO JA OC@ HJ?@MI CDBC-G@Q@G G<IBP<B@N.
1C@T <M@ Q@MT A<NO ?<O< NOMP>OPM@N OC<O RJMF GDF@ HDID ?<O<=<N@N <I? <M@ >JHHJIGT PN@? DI
H<IT KMJBM<HN.
4@ C<Q@ N@@I <MM<TN DI OC@ AMM<TN >C<KO@M <N >JIO<DI@MN OC<O NOJM@ OC@DM @G@H@ION ND?@-=T-
ND?@ <I? KMJQD?@ <>>@NN OJ OC@H =T DI?@S@N. AI <MM<T OC<O NOJM@N OC@ I<H@N JA OC@ ?<TN JA OC@
R@@F ><I =@ ?@ADI@? GDF@ OCDN:
TUSJOH<> EBZ/BNFT =
< ".POEBZ", "5VFTEBZ", "8FEOFTEBZ", "5IVSTEBZ",
"'SJEBZ", "4BUVSEBZ", "4VOEBZ" >;
1C@ I<H@ JA < NK@>DAD> ?<T ><I =@ <>>@NN@? =T DON DI?@S DI OC<O <MM<T:
XSJUFMO(EBZ/BNFT<1>); // QSJOUT "5VFTEBZ"
1C@ A<>O OC<O <MM<TN KMJQD?@ <>>@NN OJ @G@H@ION =T DI?@S Q<GP@N ><I =@ ?@N>MD=@? <N <I
3EEA5;3F;A@ JA DI?@S@N RDOC @G@H@ION. &I JOC@M RJM?N, <MM<TN H<K DI?@S@N OJ @G@H@ION. AMM<TN
><I PN@ JIGT DIO@B@MN <N DI?@S@N.
ANNJ>D<ODQ@ <MM<TN <GGJR DI?@SDIB IJO JIGT =T DIO@B@MN =PO <IT OTK@. 1C@T H<K OC@ Q<GP@N JA
JI@ OTK@ OJ OC@ Q<GP@N JA <IJOC@M OTK@. 1C@ Q<GP@N JA OC@ OTK@ OC<O <NNJ>D<ODQ@ <MM<TN ?3B
8DA? <M@ ><GG@? =7KE, M<OC@M OC<I DI?@S@N. 1C@T KMJQD?@ <>>@NN OJ @G@H@ION =T OC@ F@T JA @<>C
@G@H@IO.
Very fast but unordered
31.1
ANNJ>D<ODQ@ <MM<TN <M@ < :3E: F34>7 DHKG@H@IO<ODJI. %<NC O<=G@N <M@ <HJIB OC@ A<NO@NO
>JGG@>ODJIN AJM NOJMDIB <I? <>>@NNDIB @G@H@ION. ,OC@M OC<I M<M@ K<OCJGJBD><G ><N@N, OC@ ODH@ DO
O<F@N OJ NOJM@ <I @G@H@IO JM OJ <>>@NN <I @G@H@IO DN DI?@K@I?@IO JA OC@ IPH=@M JA @G@H@ION
OC<O <M@ DI OC@ <NNJ>D<ODQ@ <MM<T.
1C@ CDBC K@MAJMH<I>@ JA C<NC O<=G@N DN <O OC@ @SK@IN@ JA OC@DM NOJMDIB OC@ @G@H@ION DI <I
PIJM?@M@? R<T. 2IGDF@ <MM<TN, OC@ @G@H@ION JA C<NC O<=G@N <M@ IJO ND?@-=T-ND?@. 1C@T <M@ IJO
NJMO@? DI <IT R<T @DOC@M.
Definition
31.2
1C@ NTIO<S JA <NNJ>D<ODQ@ <MM<TN DN NDHDG<M OJ OC@ <MM<T NTIO<S. 1C@ ?DAA@M@I>@ DN OC<O DO DN OC@
OTK@ JA OC@ F@T OC<O DN NK@>DAD@? RDOCDI OC@ NLP<M@ =M<>F@ON, IJO OC@ G@IBOC JA OC@ <MM<T:
element_type<key_type> associative_array_name;
#JM @S<HKG@, <I <NNJ>D<ODQ@ <MM<T OC<O H<KN ?<T I<H@N JA OTK@ TUSJOH OJ ?<T IPH=@MN JA
OTK@ JOU ><I =@ ?@ADI@? GDF@ OCDN:
JOU<TUSJOH> EBZ/VNCFST;
1C@ EBZ/VNCFST Q<MD<=G@ <=JQ@ DN <I <NNJ>D<ODQ@ <MM<T OC<O ><I =@ PN@? <N < O<=G@ OC<O
KMJQD?@N < H<KKDIB AMJH ?<T I<H@N OJ ?<T IPH=@MN. &I JOC@M RJM?N, DO ><I =@ PN@? <N OC@
M@Q@MN@ JA OC@ EBZ/BNFT <MM<T AMJH OC@ =@BDIIDIB JA OCDN >C<KO@M. 4@ RDGG PN@ OC@ EBZ/VNCFST
<NNJ>D<ODQ@ <MM<T DI OC@ @S<HKG@N =@GJR.
AEEA5;3F;H7 ADD3KE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
126
1C@ F@TN JA <NNJ>D<ODQ@ <MM<TN ><I =@ JA <IT OTK@ DI>GP?DIB PN@M-?@ADI@? TUSVDU <I? DMBTT
OTK@N. 4@ RDGG N@@ PN@M-?@ADI@? OTK@N DI G<O@M >C<KO@MN.
1C@ G@IBOC JA <NNJ>D<ODQ@ <MM<TN ><IIJO =@ NK@>DAD@? RC@I ?@ADI@?. 1C@T BMJR <POJH<OD><GGT
<N @G@H@ION <M@ <??@?.
Adding elements
31.3
ANNDBIH@IO JK@M<OJM DN NPAAD>D@IO OJ =PDG? OC@ <NNJ>D<ODJI =@OR@@I < F@T <I? < Q<GP@:
// BTTPDJBUFT FMFNFOU 0 XJUI LFZ ".POEBZ"
EBZ/VNCFST<".POEBZ"> = 0;
// BTTPDJBUFT FMFNFOU 1 XJUI LFZ "5VFTEBZ"
EBZ/VNCFST<"5VFTEBZ"> = 1;
1C@ O<=G@ BMJRN <POJH<OD><GGT RDOC @<>C <NNJ>D<ODJI. #JM @S<HKG@, EBZ/VNCFST RJPG? C<Q@
ORJ @G@H@ION <AO@M OC@ JK@M<ODJIN <=JQ@. 1CDN ><I =@ ?@HJINOM<O@? =T KMDIODIB OC@ @IODM@
O<=G@:
XSJUFMO(EBZ/VNCFST);
1C@ JPOKPO DI?D><O@N OC<O OC@ @G@H@IO Q<GP@N 0 <I? 1 >JMM@NKJI? OJ F@T Q<GP@N "*JI?<T" <I?
"1P@N?<T", M@NK@>ODQ@GT:
<".POEBZ":0, "5VFTEBZ":1>
1C@M@ ><I =@ JIGT JI@ @G@H@IO K@M F@T. #JM OC<O M@<NJI, RC@I <NNDBI@? OJ <I @SDNODIB
@G@H@IO, OC@ O<=G@ ?J@N IJO BMJR; DINO@<?, OC@ Q<GP@ JA OC@ @SDNODIB @G@H@IO >C<IB@N:
EBZ/VNCFST<"5VFTEBZ"> = 222; // DIBOHJOH UIF FYJTUJOH FMFNFOU
XSJUFMO(EBZ/VNCFST);
1C@ JPOKPO:
<".POEBZ":0, "5VFTEBZ":222>
Initialization
31.4
0JH@ODH@N NJH@ JA OC@ H<KKDIBN =@OR@@I OC@ F@TN <I? OC@ Q<GP@N <M@ <GM@<?T FIJRI <O OC@
ODH@ JA OC@ ?@ADIDODJI JA OC@ <NNJ>D<ODQ@ <MM<T. ANNJ>D<ODQ@ <MM<TN <M@ DIDOD<GDU@? NDHDG<MGT OJ
<MM<TN, RDOC OC@ ?DAA@M@I>@ JA < >JGJI N@K<M<ODIB @<>C F@T AMJH DON @G@H@IO:
// LFZ : FMFNFOU
JOU<TUSJOH> EBZ/VNCFST =
< ".POEBZ" : 0, "5VFTEBZ" : 1, "8FEOFTEBZ" : 2,
"5IVSTEBZ" : 3, "'SJEBZ" : 4, "4BUVSEBZ" : 5,
"4VOEBZ" : 6 >;
XSJUFMO(EBZ/VNCFST<"5VFTEBZ">); // QSJOUT 1
Removing elements
31.5
1C@ @G@H@IO OC<O >JMM@NKJI?N OJ < F@T DN M@HJQ@? =T .SFNPWF():
AEEA5;3F;H7 ADD3KE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
127
EBZ/VNCFST.SFNPWF("5VFTEBZ");
XSJUFMO(EBZ/VNCFST<"5VFTEBZ">); // j SVO-UJNF &3303
1C@ ADMNO GDI@ <=JQ@ M@HJQ@N OC@ @G@H@IO AJM OC@ F@T "1P@N?<T". 0DI>@ OC<O @G@H@IO DN IJO DI
OC@ >JIO<DI@M <ITHJM@, OC@ N@>JI? GDI@ RJPG? ><PN@ <I @S>@KODJI OJ =@ OCMJRI <I? OC@
KMJBM<H OJ =@ O@MHDI<O@? DA OC<O @S>@KODJI DN IJO ><PBCO. 4@ RDGG N@@ @S>@KODJIN DI < G<O@M
>C<KO@M.
&O DN KJNND=G@ OJ M@HJQ@ <GG JA OC@ @G@H@ION <O JI>@ <N RDGG =@ N@@I DI OC@ ADMNO @S@M>DN@ =@GJR.
Determining the presence of an element
31.6
1C@ JO JK@M<OJM ?@O@MHDI@N RC@OC@M OC@ @G@H@IO AJM < BDQ@I F@T @SDNON DI OC@ <NNJ>D<ODQ@
<MM<T:
JOU<TUSJOH> DPMPS$PEFT = < /* ... */ >;
JG ("QVSQMF" JO DPMPS$PEFT) \
// UIFSF JT BO FMFNFOU GPS LFZ "QVSQMF"
^ FMTF \
// OP FMFNFOU GPS LFZ "QVSQMF"
^
0JH@ODH@N DO H<F@N N@IN@ OJ PN@ < ?@A<PGO @G@H@IO Q<GP@ AJM F@TN OC<O ?J IJO @SDNO DI OC@
<NNJ>D<ODQ@ <MM<T. #JM @S<HKG@, OC@ NK@>D<G Q<GP@ JA -1 ><I =@ PN@? <N OC@ >J?@ AJM >JGJMN OC<O
<M@ IJO DI DPMPS$PEFT. .HFU() DN PN@APG DI NP>C ><N@N: &O M@OPMIN OC@ Q<GP@ JA OC@ @G@H@IO DA
OC@ @G@H@IO AJM OC@ NK@>DAD@? F@T @SDNON, OC@ ?@A<PGO Q<GP@ JOC@MRDN@. 1C@ ?@A<PGO Q<GP@ DN
NK@>DAD@? <N OC@ N@>JI? K<M<H@O@M JA .HFU():
JOU<TUSJOH> DPMPS$PEFT = < "CMVF" : 10, "HSFFO" : 20 >;
XSJUFMO(DPMPS$PEFT.HFU("QVSQMF", -1));
0DI>@ OC@ <MM<T ?J@N IJO >JIO<DI <I @G@H@IO AJM OC@ F@T "QVSQMF", .HFU() M@OPMIN -1:
-1
Properties
31.7
t .MFOHUI M@OPMIN OC@ IPH=@M JA @G@H@ION DI OC@ <MM<T.
t .LFZT M@OPMIN >JKD@N JA <GG JA OC@ F@TN DI OC@ <NNJ>D<ODQ@ <MM<T <N < ?TI<HD> <MM<T.
t .CZ,FZ KMJQD?@N <>>@NN OJ OC@ F@TN DI OC@ <NNJ>D<ODQ@ <MM<T RDOCJPO >JKTDIB OC@H; R@ RDGG
N@@ CJR .CZ,FZ DN PN@? DI GPSFBDI GJJKN DI OC@ I@SO >C<KO@M.
t .WBMVFT M@OPMIN >JKD@N JA <GG JA OC@ Q<GP@N DI OC@ <NNJ>D<ODQ@ <MM<T <N < ?TI<HD> <MM<T.
t .CZ7BMVF KMJQD?@N <>>@NN OJ OC@ @G@H@ION JA OC@ <NNJ>D<ODQ@ <MM<T RDOCJPO >JKTDIB OC@H.
t .SFIBTI H<T H<F@ OC@ <MM<T HJM@ @AAD>D@IO DI NJH@ ><N@N GDF@ <AO@M DIN@MODIB < G<MB@
IPH=@M JA @G@H@ION <I? =@AJM@ <>OP<GGT NO<MODIB OJ PN@ OC@ <NNJ>D<ODQ@ <MM<T.
t .TJ[FPG DN OC@ NDU@ JA OC@ <MM<T D787D7@57 (DO C<N IJOCDIB OJ ?J RDOC OC@ IPH=@M JA
@G@H@ION DI OC@ O<=G@ <I? DN OC@ N<H@ Q<GP@ AJM <GG <NNJ>D<ODQ@ <MM<TN).
t .HFU M@OPMIN OC@ @G@H@IO DA DO @SDNON, OC@ ?@A<PGO Q<GP@ JOC@MRDN@.
t .SFNPWF M@HJQ@N OC@ NK@>DAD@? @G@H@IO AMJH OC@ <MM<T.
AEEA5;3F;H7 ADD3KE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
128
Example
31.8
%@M@ DN < KMJBM<H OC<O KMDION OC@ 1PMFDNC I<H@N JA >JGJMN OC<O <M@ NK@>DAD@? DI "IBGDNC:
JNQPSU TUE.TUEJP;
JNQPSU TUE.TUSJOH;
WPJE NBJO()
\
TUSJOH<TUSJOH> DPMPST = < "CMBDL" : "TJZBI",
"XIJUF" : "CFZB[",
"SFE" : "LfSNf[f",
"HSFFO" : "ZFhJM",
"CMVF" : "NBWJ"
>;
XSJUFGMO("* LOPX UIF 5VSLJTI OBNFT PG UIFTF %T DPMPST: %T",
DPMPST.MFOHUI, DPMPST.LFZT);
XSJUF("1MFBTF BTL NF POF: ");
TUSJOH JO&OHMJTI = DIPNQ(SFBEMO());
JG (JO&OHMJTI JO DPMPST) \
XSJUFGMO("="%T=" JT ="%T=" JO 5VSLJTI.",
JO&OHMJTI, DPMPST<JO&OHMJTI>);
^ FMTF \
XSJUFMO("* EPO'U LOPX UIBU POF.");
^
^
Exercises
31.9
1. %JR ><I <GG JA OC@ @G@H@ION JA <I <NNJ>D<ODQ@ <MM<T =@ M@HJQ@?? 1C@M@ <M@ <O G@<NO OCM@@
H@OCJ?N:
w /@HJQDIB OC@ @G@H@ION JI@-=T-JI@ AMJH OC@ <NNJ>D<ODQ@ <MM<T.
w ANNDBIDIB <I @HKOT <NNJ>D<ODQ@ <MM<T.
w 0DHDG<M OJ OC@ KM@QDJPN H@OCJ?, <NNDBIDIB OC@ <MM<T'N .JOJU KMJK@MOT.
Note: ):7 .init BDAB7DFK A8 3@K H3D;34>7 AD FKB7 ;E F:7 ;@;F;3> H3>G7 A8 F:3F
FKB7:
OVNCFS = JOU.JOJU; // 0 GPS JOU
2. 'PNO GDF@ RDOC <MM<TN, OC@M@ ><I =@ JIGT JI@ Q<GP@ AJM @<>C F@T. 1CDN H<T =@ N@@I <N <
GDHDO<ODJI AJM NJH@ <KKGD><ODJIN.
ANNPH@ OC<O <I <NNJ>D<ODQ@ <MM<T DN PN@? AJM NOJMDIB NOP?@IO BM<?@N. #JM @S<HKG@,
G@O'N <NNPH@ OC<O OC@ BM<?@N 90, 85, 95, @O>. <M@ OJ =@ NOJM@? AJM OC@ NOP?@IO I<H@?
"@HM@".
ANNJ>D<ODQ@ <MM<TN H<F@ DO @<NT OJ <>>@NN OC@ BM<?@N =T OC@ I<H@ JA OC@ NOP?@IO <N DI
HSBEFT<"FNSF">. %JR@Q@M, OC@ BM<?@N ><IIJO =@ DIN@MO@? <N DI OC@ AJGGJRDIB >J?@
=@><PN@ @<>C BM<?@ RJPG? JQ@MRMDO@ OC@ KM@QDJPN JI@:
JOU<TUSJOH> HSBEFT;
HSBEFT<"FNSF"> = 90;
HSBEFT<"FNSF"> = 85; // j 0WFSXSJUFT UIF QSFWJPVT HSBEF!
%JR ><I TJP NJGQ@ OCDN KMJ=G@H? !@ADI@ <I <NNJ>D<ODQ@ <MM<T OC<O ><I NOJM@ HPGODKG@
BM<?@N K@M NOP?@IO.
AEEA5;3F;H7 ADD3KE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
129
... F:7 EA>GF;A@E
AEEA5;3F;H7 ADD3KE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
130
GPSFBDI Loop 32
,I@ JA OC@ HJNO >JHHJI NO<O@H@ION DI ! DN OC@ GPSFBDI GJJK. &O DN PN@? AJM <KKGTDIB OC@
N<H@ JK@M<ODJIN OJ @Q@MT @G@H@IO JA < >JIO<DI@M (JM < D3@97).
,K@M<ODJIN OC<O <M@ <KKGD@? OJ @G@H@ION JA >JIO<DI@MN <M@ Q@MT >JHHJI DI KMJBM<HHDIB. 4@
C<Q@ N@@I DI OC@ GPS )JJK >C<KO@M OC<O @G@H@ION JA <I <MM<T <M@ <>>@NN@? DI < GPS GJJK =T <I
DI?@S Q<GP@ OC<O DN DI>M@H@IO@? <O @<>C DO@M<ODJI:
GPS (JOU J = 0; J != BSSBZ.MFOHUI; ++J) \
XSJUFMO(BSSBZ<J>);
^
1C@ AJGGJRDIB <M@ OC@ NO@KN OC<O <M@ DIQJGQ@? DI DO@M<ODIB JQ@M <GG JA OC@ @G@H@ION:
t !@ADIDIB < Q<MD<=G@ <N < >JPIO@M, RCD>C DN >JIQ@IODJI<GGT I<H@? <N J
t &O@M<ODIB OC@ GJJK PK OJ OC@ Q<GP@ JA OC@ .MFOHUI KMJK@MOT JA OC@ <MM<T
t &I>M@H@IODIB J
t A>>@NNDIB OC@ @G@H@IO
GPSFBDI C<N @NN@IOD<GGT OC@ N<H@ =@C<QDJM =PO DO NDHKGDAD@N OC@ >J?@ =T C<I?GDIB OCJN@ NO@KN
<POJH<OD><GGT:
GPSFBDI (FMFNFOU; BSSBZ) \
XSJUFMO(FMFNFOU);
^
-<MO JA OC@ KJR@M JA GPSFBDI >JH@N AMJH OC@ A<>O OC<O DO ><I =@ PN@? OC@ N<H@ R<T
M@B<M?G@NN JA OC@ OTK@ JA OC@ >JIO<DI@M. AN R@ C<Q@ N@@I DI OC@ KM@QDJPN >C<KO@M, JI@ R<T JA
DO@M<ODIB JQ@M OC@ Q<GP@N JA <I <NNJ>D<ODQ@ <MM<T DI < GPS GJJK DN =T ADMNO ><GGDIB OC@ <MM<T'N
.WBMVFT KMJK@MOT:
BVUP WBMVFT = BB.WBMVFT;
GPS (JOU J = 0; J != WBMVFT.MFOHUI; ++J) \
XSJUFMO(WBMVFT<J>);
^
GPSFBDI ?J@N IJO M@LPDM@ <ITOCDIB NK@>D<G AJM <NNJ>D<ODQ@ <MM<TN; DO DN PN@? @S<>OGT OC@ N<H@
<N RDOC <MM<TN:
GPSFBDI (WBMVF; BB) \
XSJUFMO(WBMVF);
^
The GPSFBDI syntax
32.1
GPSFBDI >JINDNON JA OCM@@ N@>ODJIN:
GPSFBDI (names; container_or_range) \
operations
^
t container_or_range NK@>DAD@N RC@M@ OC@ @G@H@ION <M@.
t operations NK@>DAD@N OC@ JK@M<ODJIN OJ <KKGT OJ @<>C @G@H@IO.
t names NK@>DAD@N OC@ I<H@ JA OC@ @G@H@IO <I? KJO@IOD<GGT JOC@M Q<MD<=G@N ?@K@I?DIB JI
OC@ OTK@ JA OC@ >JIO<DI@M JM OC@ M<IB@. AGOCJPBC OC@ >CJD>@ JA I<H@N DN PK OJ OC@
8AD735: "AAB
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
131
KMJBM<HH@M, OC@ IPH=@M JA <I? OC@ OTK@N JA OC@N@ I<H@N ?@K@I? JI OC@ OTK@ JA OC@
>JIO<DI@M.
DPOUJOVF and CSFBL
32.2
1C@N@ F@TRJM?N C<Q@ OC@ N<H@ H@<IDIB <N OC@T C<Q@ RDOC OC@ GPS GJJK: DPOUJOVF HJQ@N OJ
OC@ I@SO DO@M<ODJI =@AJM@ >JHKG@ODIB OC@ M@NO JA OC@ JK@M<ODJIN AJM OC@ >PMM@IO @G@H@IO, <I?
CSFBL O@MHDI<O@N OC@ GJJK <GOJB@OC@M.
GPSFBDI with arrays
32.3
4C@I OC@M@ DN < NDIBG@ I<H@ NK@>DAD@? DI OC@ @3?7E N@>ODJI, DO DN OC@ Q<GP@ JA OC@ @G@H@IO <O
@<>C DO@M<ODJI:
GPSFBDI (FMFNFOU; BSSBZ) \
XSJUFMO(FMFNFOU);
^
4C@I ORJ I<H@N <M@ NK@>DAD@? DI OC@ @3?7E N@>ODJI, OC@T <M@ <I <POJH<OD> >JPIO@M <I? OC@
Q<GP@ JA OC@ @G@H@IO, M@NK@>ODQ@GT:
GPSFBDI (J, FMFNFOU; BSSBZ) \
XSJUFMO(J, ": ", FMFNFOU);
^
1C@ >JPIO@M DN DI>M@H@IO@? <POJH<OD><GGT =T GPSFBDI. &ON I<H@ DN PK OJ OC@ KMJBM<HH@M.
GPSFBDI with strings and TUE.SBOHF.TUSJEF
32.4
0DI>@ NOMDIBN <M@ <MM<TN JA >C<M<>O@MN, GPSFBDI RJMFN OC@ N<H@ <N DO RJMFN RDOC <MM<TN:
0DIBG@ I<H@ DN OC@ >C<M<>O@M, ORJ I<H@N <M@ OC@ >JPIO@M <I? OC@ >C<M<>O@M:
GPSFBDI (D; "IFMMP") \
XSJUFMO(D);
^
GPSFBDI (J, D; "IFMMP") \
XSJUFMO(J, ": ", D);
^
%JR@Q@M, =@DIB 21# >J?@ PIDON, DIBS <I? XDIBS DO@M<O@ JQ@M 21# >J?@ PIDON, IJO 2ID>J?@
>J?@ KJDION:
GPSFBDI (J, DPEF; "BCD`E") \
XSJUFMO(J, ": ", DPEF);
^
1C@ ORJ 21#-8 >J?@ PIDON OC<O H<F@ PK \ RJPG? =@ <>>@NN@? <N N@K<M<O@ @G@H@ION:
0: B
1: C
2: D
3:
4: {
5: E
8AD735: "AAB
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
132
,I@ R<T JA DO@M<ODIB JQ@M 2ID>J?@ >C<M<>O@MN JA NOMDIBN DI < GPSFBDI GJJK DN TUSJEF AMJH OC@
TUE.SBOHF HJ?PG@. TUSJEF KM@N@ION OC@ NOMDIB <N < >JIO<DI@M OC<O >JINDNON JA 2ID>J?@
>C<M<>O@MN. &O O<F@N OC@ G@IBOC JA DON EFD;67E JQ@M OC@ >C<M<>O@MN <N DON N@>JI? K<M<H@O@M:
JNQPSU TUE.SBOHF;
// ...
GPSFBDI (D; TUSJEF("BCD`E", 1)) \
XSJUFMO(D);
^
/@B<M?G@NN JA OC@ >C<M<>O@M OTK@ JA OC@ NOMDIB, TUSJEF <GR<TN KM@N@ION DON @G@H@ION <N
2ID>J?@ >C<M<>O@MN:
B
C
D
a
E
& RDGG @SKG<DI =@GJR RCT OCDN GJJK >JPG? IJO DI>GP?@ <I <POJH<OD> >JPIO@M.
GPSFBDI with associative arrays
32.5
A NDIBG@ I<H@ NK@>DAD@N OC@ Q<GP@, ORJ I<H@N NK@>DAT OC@ F@T <I? OC@ Q<GP@:
GPSFBDI (WBMVF; BB) \
XSJUFMO(WBMVF);
^
GPSFBDI (LFZ, WBMVF; BB) \
XSJUFMO(LFZ, ": ", WBMVF);
^
ANNJ>D<ODQ@ <MM<TN ><I KMJQD?@ OC@DM F@TN <I? Q<GP@N <N D3@97E <N R@GG. 4@ RDGG N@@ M<IB@N DI
< G<O@M >C<KO@M. .CZ,FZ() <I? .CZ7BMVF() M@OPMI @AAD>D@IO M<IB@ J=E@>ON OC<O <M@ <GNJ PN@APG
DI JOC@M >JIO@SON. .CZ7BMVF() ?J@N IJO =MDIB <IT =@I@ADO DI GPSFBDI GJJKN JQ@M OC@ M@BPG<M
Q<GP@ DO@M<ODJI <=JQ@. ,I OC@ JOC@M C<I?, .CZ,FZ() DN OC@ JIGT @AA@>ODQ@ R<T JA DO@M<ODIB JQ@M
EPNO OC@ F@TN JA <I <NNJ>D<ODQ@ <MM<T:
GPSFBDI (LFZ; BB.CZ,FZ()) \
XSJUFMO(LFZ);
^
GPSFBDI with number ranges
32.6
4@ C<Q@ N@@I IPH=@M M<IB@N DI OC@ 0GD>@N <I? ,OC@M AMM<T #@<OPM@N >C<KO@M =@AJM@. &O DN
KJNND=G@ OJ NK@>DAT < IPH=@M M<IB@ DI OC@ 5A@F3;@7D2AD2D3@97 N@>ODJI:
GPSFBDI (OVNCFS; 10..15) \
XSJUFMO(OVNCFS);
^
/@H@H=@M OC<O 10 RJPG? =@ DI>GP?@? DI OC@ M<IB@ =PO 15 RJPG? IJO =@.
8AD735: "AAB
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
133
GPSFBDI with structs, classes, and ranges
32.7
GPSFBDI ><I <GNJ =@ PN@? RDOC J=E@>ON JA PN@M OTK@N OC<O ?@ADI@ OC@DM JRI DO@M<ODJI DI
GPSFBDI GJJKN. AN OC@ OTK@ DON@GA ?@ADI@N DON DO@M<ODJI =@C<QDJM, DO DN IJO KJNND=G@ OJ N<T
<ITOCDIB C@M@. -MJBM<HH@MN HPNO M@A@M OJ OC@ ?J>PH@IO<ODJI JA OC@ K<MOD>PG<M OTK@.
0OMP>ON <I? >G<NN@N KMJQD?@ NPKKJMO AJM GPSFBDI DO@M<ODJI @DOC@M =T OC@DM PQ"QQMZ() H@H=@M
API>ODJIN, JM =T < N@O JA D3@97 H@H=@M API>ODJIN. 4@ RDGG N@@ OC@N@ A@<OPM@N DI G<O@M >C<KO@MN.
The counter is automatic only for arrays
32.8
1C@ <POJH<OD> >JPIO@M DN KMJQD?@? JIGT RC@I DO@M<ODIB JQ@M <MM<TN. 4C@I < >JPIO@M DN I@@?@?
RCDG@ DO@M<ODIB JQ@M JOC@M OTK@N JA >JIO<DI@MN, OC@ >JPIO@M HPNO =@ ?@ADI@? <I? DI>M@H@IO@?
@SKGD>DOGT:
JOU J;
GPSFBDI (FMFNFOU; DPOUBJOFS) \
// ...
++J;
^
0P>C < Q<MD<=G@ DN <GNJ I@@?@? RC@I >JPIODIB < NK@>DAD> >JI?DODJI. #JM @S<HKG@, OC@ AJGGJRDIB
>J?@ >JPION JIGT OC@ Q<GP@N OC<O <M@ ?DQDND=G@ =T 10:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
BVUP OVNCFST = < 1, 0, 15, 10, 3, 5, 20, 30 >;
JOU DPVOU;
GPSFBDI (OVNCFS; OVNCFST) \
JG ((OVNCFS % 10) == 0) \
++DPVOU;
XSJUF(DPVOU);
^ FMTF \
XSJUF(' ');
^
XSJUFMO(": ", OVNCFS);
^
^
1C@ JPOKPO:
: 1
1: 0
: 15
2: 10
: 3
: 5
3: 20
4: 30
8AD735: "AAB
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
134
The copy of the element, not the element itself
32.9
1C@ GPSFBDI GJJK IJMH<GGT KMJQD?@N < >JKT JA OC@ @G@H@IO, IJO OC@ <>OP<G @G@H@IO OC<O DN
NOJM@? DI OC@ >JIO<DI@M. 1CDN H<T =@ < ><PN@ JA =PBN.
1J N@@ <I @S<HKG@ JA OCDN, G@O'N C<Q@ < GJJF <O OC@ AJGGJRDIB KMJBM<H OC<O DN OMTDIB OJ ?JP=G@
OC@ Q<GP@N JA OC@ @G@H@ION JA <I <MM<T:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
EPVCMF<> OVNCFST = < 1.2, 3.4, 5.6 >;
XSJUFGMO("#FGPSF: %T", OVNCFST);
GPSFBDI (OVNCFS; OVNCFST) \
OVNCFS *= 2;
^
XSJUFGMO(""GUFS : %T", OVNCFST);
^
1C@ JPOKPO JA OC@ KMJBM<H DI?D><O@N OC<O OC@ <NNDBIH@IO H<?@ OJ @<>C @G@H@IO DIND?@ OC@
GPSFBDI =J?T ?J@N IJO C<Q@ <IT @AA@>O JI OC@ @G@H@ION JA OC@ >JIO<DI@M:
#FGPSF: <1.2, 3.4, 5.6>
"GUFS : <1.2, 3.4, 5.6>
1C<O DN =@><PN@ OVNCFS DN IJO <I <>OP<G @G@H@IO JA OC@ <MM<T, =PO < >JKT JA @<>C @G@H@IO.
4C@I OC@ <>OP<G @G@H@ION I@@? OJ =@ JK@M<O@? JI, OC@ I<H@ HPNO =@ ?@ADI@? <N < D787D7@57
JA OC@ <>OP<G @G@H@IO =T OC@ SFG F@TRJM?:
GPSFBDI (SFG OVNCFS; OVNCFST) \
OVNCFS *= 2;
^
1C@ I@R JPOKPO NCJRN OC<O OC@ <NNDBIH@ION IJR HJ?DAT OC@ <>OP<G @G@H@ION JA OC@ <MM<T:
#FGPSF: <1.2, 3.4, 5.6>
"GUFS : <2.4, 6.8, 11.2>
1C@ SFG F@TRJM? H<F@N OVNCFS <I 3>;3E JA OC@ <>OP<G @G@H@IO <O @<>C DO@M<ODJI. AN < M@NPGO,
OC@ HJ?DAD><ODJIN OCMJPBC OVNCFS HJ?DAD@N OC<O <>OP<G @G@H@IO JA OC@ >JIO<DI@M.
The integrity of the container must be preserved
32.10
AGOCJPBC DO DN ADI@ OJ HJ?DAT OC@ @G@H@ION JA OC@ >JIO<DI@M OCMJPBC SFG Q<MD<=G@N, OC@
NOMP>OPM@ JA OC@ >JIO<DI@M HPNO IJO =@ >C<IB@?. #JM @S<HKG@, @G@H@ION HPNO IJO =@ M@HJQ@?
IJM <??@? OJ OC@ >JIO<DI@M ?PMDIB < GPSFBDI GJJK.
0P>C HJ?DAD><ODJIN H<T >JIAPN@ OC@ DII@M RJMFDIBN JA OC@ GJJK DO@M<ODJI <I? M@NPGO DI
DI>JMM@>O KMJBM<H NO<O@N.
8AD735: "AAB
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
135
Exercise
32.11
t 4@ FIJR OC<O <NNJ>D<ODQ@ <MM<TN KMJQD?@ < H<KKDIB AMJH F@TN OJ Q<GP@N. 1CDN H<KKDIB DN
PID?DM@>ODJI<G: Q<GP@N <M@ <>>@NN@? =T F@TN =PO IJO OC@ JOC@M R<T <MJPI?.
ANNPH@ OC<O OC@M@ DN <GM@<?T OC@ AJGGJRDIB <NNJ>D<ODQ@ <MM<T:
TUSJOH<JOU> OBNFT = < 1:"POF", 7:"TFWFO", 20:"UXFOUZ" >;
2N@ OC<O <NNJ>D<ODQ@ <MM<T <I? < GPSFBDI GJJK OJ ADGG <IJOC@M <NNJ>D<ODQ@ <MM<T I<H@?
WBMVFT. 1C@ I@R <NNJ>D<ODQ@ <MM<T NCJPG? KMJQD?@ Q<GP@N OC<O >JMM@NKJI? OJ I<H@N.
#JM @S<HKG@, OC@ AJGGJRDIB GDI@ NCJPG? KMDIO 20:
XSJUFMO(WBMVFT<"UXFOUZ">);
... F:7 EA>GF;A@
8AD735: "AAB
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
136
TXJUDI and DBTF 33
TXJUDI DN < NO<O@H@IO OC<O <GGJRN >JHK<MDIB OC@ Q<GP@ JA <I @SKM@NNDJI <B<DINO HPGODKG@
NK@>D<G Q<GP@N. &O DN NDHDG<M OJ =PO IJO OC@ N<H@ <N <I "DA, @GN@ DA, @GN@" >C<DI. DBTF DN PN@? AJM
NK@>DATDIB OC@ Q<GP@N OC<O <M@ OJ =@ >JHK<M@? RDOC TXJUDI'N @SKM@NNDJI. DBTF DN < K<MO JA OC@
TXJUDI NO<O@H@IO, IJO < NO<O@H@IO DON@GA.
TXJUDI O<F@N <I @SKM@NNDJI RDOCDI K<M@IOC@N@N, >JHK<M@N OC@ Q<GP@ JA OC<O @SKM@NNDJI OJ OC@
DBTF Q<GP@N, <I? @S@>PO@N OC@ JK@M<ODJIN JA OC@ DBTF OC<O DN @LP<G OJ OC@ Q<GP@ JA OC@
@SKM@NNDJI. &ON NTIO<S >JINDNON JA < TXJUDI =GJ>F OC<O >JIO<DIN JI@ JM HJM@ DBTF N@>ODJIN <I?
< EFGBVMU N@>ODJI:
TXJUDI (expression) \
DBTF value_1:
// PQFSBUJPOT UP FYFDVUF JG UIF FYQSFTTJPO JT FRVBM UP WBMVF@1
// ...
CSFBL;
DBTF value_2:
// PQFSBUJPOT UP FYFDVUF JG UIF FYQSFTTJPO JT FRVBM UP WBMVF@2
// ...
CSFBL;
// ... PUIFS DBTFT ...
EFGBVMU:
// PQFSBUJPOT UP FYFDVUF JG UIF FYQSFTTJPO JT OPU FRVBM UP BOZ DBTF
// ...
CSFBL;
^
AGOCJPBC DO DN PN@? DI >JI?DODJI<G >C@>FN, OC@ @SKM@NNDJI OC<O TXJUDI O<F@N DN IJO PN@? <N <
GJBD><G @SKM@NNDJI. &O DN IJO @Q<GP<O@? <N "DA OCDN >JI?DODJI DN OMP@" <N DI <I JG NO<O@H@IO. 1C@
H3>G7 JA OC@ TXJUDI @SKM@NNDJI DN PN@? DI @LP<GDOT >JHK<MDNJIN RDOC OC@ DBTF Q<GP@N. &O DN
NDHDG<M OJ <I "DA, @GN@ DA, @GN@" >C<DI OC<O C<N JIGT @LP<GDOT >JHK<MDNJIN:
BVUP WBMVF = expression;
JG (WBMVF == value_1) \
// PQFSBUJPOT GPS WBMVF@1
// ...
^ FMTF JG (WBMVF == value_2) \
// PQFSBUJPOT GPS WBMVF@2
// ...
^
// ... PUIFS 'FMTF JG'T ...
^ FMTF \
// PQFSBUJPOT GPS PUIFS WBMVFT
// ...
^
%JR@Q@M, OC@ "DA, @GN@ DA, @GN@" <=JQ@ DN IJO OC@ @LPDQ<G@IO JA OC@ TXJUDI NO<O@H@IO. 1C@
M@<NJIN RDGG =@ @SKG<DI@? DI OC@ AJGGJRDIB N@>ODJIN.
&A < DBTF Q<GP@ H<O>C@N OC@ Q<GP@ JA OC@ TXJUDI @SKM@NNDJI, OC@I OC@ JK@M<ODJIN OC<O <M@
PI?@M OC@ DBTF <M@ @S@>PO@?. &A IJ Q<GP@ H<O>C@N, OC@I OC@ JK@M<ODJIN OC<O <M@ PI?@M OC@
EFGBVMU <M@ @S@>PO@?. 1C@ JK@M<ODJIN <M@ @S@>PO@? PIODG < CSFBL JM < HPUP NO<O@H@IO DN
M@<>C@?.
EI;F5: 3@6 53E7
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
137
The HPUP statement
33.1
0JH@ PN@N JA HPUP DN <?QDN@? <B<DINO DI HJNO KMJBM<HHDIB G<IBP<B@N DI B@I@M<G. %JR@Q@M,
HPUP DN PN@APG DI TXJUDI NO<O@H@ION DI M<M@ NDOP<ODJIN. 1C@ HPUP NO<O@H@IO RDGG =@ >JQ@M@? DI
HJM@ ?@O<DG DI < G<O@M >C<KO@M.
DBTF ?J@N IJO DIOMJ?P>@ < E5AB7 <N OC@ JG NO<O@H@IO ?J@N. ,I>@ OC@ JK@M<ODJIN RDOCDI <I JG
JM FMTF N>JK@ <M@ ADIDNC@?, OC@ @Q<GP<ODJI JA OC@ @IODM@ JG NO<O@H@IO DN <GNJ ADIDNC@?. &O DN IJO
OC@ N<H@ RDOC OC@ DBTF N@>ODJIN; JI>@ < H<O>CDIB DBTF DN AJPI?, OC@ @S@>PODJI JA OC@
KMJBM<H EPHKN OJ OC<O ><N@ <I? @S@>PO@N OC@ JK@M<ODJIN PI?@M OC<O DBTF. 4C@I I@@?@? DI
M<M@ NDOP<ODJIN, HPUP DBTF H<F@N OC@ KMJBM<H @S@>PODJI EPHK PI?@M OC@ I@SO DBTF:
TXJUDI (WBMVF) \
DBTF 5:
XSJUFMO("GJWF");
HPUP DBTF; // DPOUJOVFT XJUI UIF OFYU DBTF
DBTF 4:
XSJUFMO("GPVS");
CSFBL;
EFGBVMU:
XSJUFMO("VOLOPXO");
CSFBL;
^
&A WBMVF DN 5, OC@ @S@>PODJI >JIODIP@N PI?@M OC@ DBTF 5 GDI@ <I? OC@ KMJBM<H KMDION "ADQ@".
1C@I OC@ HPUP DBTF NO<O@H@IO ><PN@N OC@ @S@>PODJI OJ >JIODIP@ OJ OC@ I@SO DBTF, <I? <N <
M@NPGO "AJPM" DN <GNJ KMDIO@?:
GJWF
GPVS
HPUP ><I <KK@<M DI OCM@@ R<TN PI?@M DBTF N@>ODJIN:
t HPUP DBTF ><PN@N OC@ @S@>PODJI OJ >JIODIP@ OJ OC@ I@SO DBTF.
t HPUP EFGBVMU ><PN@N OC@ @S@>PODJI OJ >JIODIP@ OJ OC@ EFGBVMU N@>ODJI.
t HPUP DBTF expression ><PN@N OC@ @S@>PODJI OJ >JIODIP@ OJ OC@ DBTF OC<O H<O>C@N OC<O
@SKM@NNDJI.
1C@ AJGGJRDIB KMJBM<H ?@HJINOM<O@N OC@N@ OCM@@ PN@N =T O<FDIB <?Q<IO<B@ JA < GPSFBDI GJJK:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
GPSFBDI (WBMVF; < 1, 2, 3, 10, 20 >) \
XSJUFGMO("--- WBMVF: %T ---", WBMVF);
TXJUDI (WBMVF) \
DBTF 1:
XSJUFMO("DBTF 1");
HPUP DBTF;
DBTF 2:
XSJUFMO("DBTF 2");
HPUP DBTF 10;
DBTF 3:
XSJUFMO("DBTF 3");
EI;F5: 3@6 53E7
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
138
HPUP EFGBVMU;
DBTF 10:
XSJUFMO("DBTF 10");
CSFBL;
EFGBVMU:
XSJUFMO("EFGBVMU");
CSFBL;
^
^
^
1C@ JPOKPO:
--- WBMVF: 1 ---
DBTF 1
DBTF 2
DBTF 10
--- WBMVF: 2 ---
DBTF 2
DBTF 10
--- WBMVF: 3 ---
DBTF 3
EFGBVMU
--- WBMVF: 10 ---
DBTF 10
--- WBMVF: 20 ---
EFGBVMU
The expression type must be integer, string, or CPPM
33.2
AIT OTK@ ><I =@ PN@? DI @LP<GDOT >JHK<MDNJIN DI JG NO<O@H@ION. ,I OC@ JOC@M C<I?, OC@ OTK@
JA OC@ TXJUDI @SKM@NNDJI DN GDHDO@? OJ DIO@B@M OTK@N, NOMDIB OTK@N, <I? CPPM.
TUSJOH PQ = /* ... */;
// ...
TXJUDI (PQ) \
DBTF "BEE":
SFTVMU = GJSTU + TFDPOE;
CSFBL;
DBTF "TVCUSBDU":
SFTVMU = GJSTU - TFDPOE;
CSFBL;
DBTF "NVMUJQMZ":
SFTVMU = GJSTU * TFDPOE;
CSFBL;
DBTF "EJWJEF":
SFTVMU = GJSTU / TFDPOE;
CSFBL;
EFGBVMU:
UISPX OFX &YDFQUJPO(GPSNBU("6OLOPXO PQFSBUJPO: %T", PQ));
^
Note: ):7 5A67 34AH7 F:DAIE 3@ 7J57BF;A@ I:7@ F:7 AB7D3F;A@ ;E @AF D75A9@;L76 4K F:7
BDA9D3?. ,7 I;>> E77 7J57BF;A@E ;@ 3 >3F7D 5:3BF7D.
EI;F5: 3@6 53E7
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
139
AGOCJPBC DO DN KJNND=G@ OJ PN@ CPPM @SKM@NNDJIN <N R@GG, NDI>@ CPPM C<N JIGT ORJ Q<GP@N, DO H<T
=@ HJM@ NPDO<=G@ OJ PN@ <I JG NO<O@H@IO JM OC@ O@MI<MT JK@M<OJM (:) RDOC OC<O OTK@.
DBTF values must be known at compile time
33.3
4DOC OC@ JG NO<O@H@IO, OC@ Q<GP@N OC<O <M@ JI =JOC ND?@N JA OC@ @LP<GDOT JK@M<OJM ><I =@
><G>PG<O@? <O MPI ODH@. #JM @S<HKG@, OC@ AJGGJRDIB JG NO<O@H@IO H<T =@ PNDIB ORJ Q<GP@N, JI@
JA RCD>C DN ><G>PG<O@? =T OC@ KMJBM<H <I? OC@ JOC@M @IO@M@? =T OC@ PN@M:
JG (HVFTT == OVNCFS) \
XSJUFMO("$PSSFDU!");
^
,I OC@ JOC@M C<I?, <GOCJPBC OC@ Q<GP@ JA OC@ TXJUDI @SKM@NNDJI DN IJMH<GGT ><G>PG<O@? <O MPI
ODH@, OC@ DBTF Q<GP@N HPNO =@ FIJRI <O >JHKDG@ ODH@.
Value ranges
33.4
/<IB@N JA Q<GP@N ><I =@ NK@>DAD@? =T .. =@OR@@I DBTFN:
TXJUDI (EJF7BMVF) \
DBTF 1:
XSJUFMO(":PV XPO");
CSFBL;
DBTF 2: .. DBTF 5:
XSJUFMO("*U'T B ESBX");
CSFBL;
DBTF 6:
XSJUFMO("* XPO");
CSFBL;
EFGBVMU:
/* 5IF QSPHSBN TIPVME OFWFS HFU IFSF CFDBVTF UIF DBTFT
* BCPWF DPWFS UIF FOUJSF SBOHF PG WBMJE EJF WBMVFT.
* (4FF 'GJOBM TXJUDI' CFMPX.) */
CSFBL;
^
1C@ >J?@ <=JQ@ ?@O@MHDI@N OC<O OC@ B<H@ @I?N DI < ?M<R RC@I OC@ ?D@ Q<GP@ DN 2, 3, 4, JM 5.
Distinct values
33.5
)@O'N <NNPH@ OC<O DO DN < ?M<R AJM OC@ Q<GP@N 2 <I? 4, M<OC@M OC<I AJM OC@ Q<GP@N OC<O <M@ DI OC@
M<IB@ 82,5:. !DNODI>O Q<GP@N JA < DBTF <M@ N@K<M<O@? =T >JHH<N:
DBTF 2, 4:
XSJUFMO("*U'T B ESBX");
CSFBL;
The GJOBM TXJUDI statement
33.6
1CDN NO<O@H@IO RJMFN NDHDG<MGT OJ OC@ M@BPG<M TXJUDI NO<O@H@IO RDOC OC@ AJGGJRDIB
?DAA@M@I>@N:
EI;F5: 3@6 53E7
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
140
t &O ><IIJO C<Q@ < EFGBVMU N@>ODJI. +JO@ OC<O OCDN N@>ODJI DN H@<IDIBG@NN RC@I OC@ DBTF
N@>ODJIN >JQ@M OC@ @IODM@ M<IB@ JA Q<GP@N <ITR<T, <N C<N =@@I RDOC OC@ NDS Q<GP@N JA OC@
?D@ <=JQ@.
t 3<GP@ M<IB@N ><IIJO =@ PN@? RDOC DBTFN (?DNODI>O Q<GP@N ><I =@).
t &A OC@ @SKM@NNDJI DN JA <I FOVN OTK@, <GG JA OC@ Q<GP@N JA OC@ OTK@ HPNO =@ >JQ@M@? =T OC@
DBTFN (R@ RDGG N@@ FOVN OTK@N DI OC@ I@SO >C<KO@M).
JOU EJF7BMVF = 1;
GJOBM TXJUDI (EJF7BMVF) \
DBTF 1:
XSJUFMO(":PV XPO");
CSFBL;
DBTF 2, 3, 4, 5:
XSJUFMO("*U'T B ESBX");
CSFBL;
DBTF 6:
XSJUFMO("* XPO");
CSFBL;
^
When to use
33.7
TXJUDI DN NPDO<=G@ AJM >JHK<MDIB OC@ Q<GP@ JA <I @SKM@NNDJI <B<DINO < N@O JA Q<GP@N OC<O <M@
FIJRI <O >JHKDG@ ODH@.
4C@I OC@M@ <M@ JIGT ORJ Q<GP@N OJ >JHK<M@, <I JG NO<O@H@IO H<T H<F@ HJM@ N@IN@. #JM
@S<HKG@, OJ >C@>F RC@OC@M DO DN C@<?N JM O<DGN:
JG (IFBET5BJMT3FTVMU == IFBET) \
// ...
^ FMTF \
// ...
^
AN < B@I@M<G MPG@, TXJUDI DN HJM@ NPDO<=G@ RC@I OC@M@ <M@ OCM@@ JM HJM@ Q<GP@N OJ >JHK<M@.
Exercises
33.8
1. 4MDO@ < ><G>PG<OJM KMJBM<H OC<O NPKKJMON <MDOCH@OD> JK@M<ODJIN. %<Q@ OC@ KMJBM<H ADMNO
M@<? OC@ JK@M<ODJI <N < TUSJOH, OC@I ORJ Q<GP@N JA OTK@ EPVCMF AMJH OC@ DIKPO. 1C@
><G>PG<OJM NCJPG? KMDIO OC@ M@NPGO JA OC@ JK@M<ODJI. #JM @S<HKG@, RC@I OC@ JK@M<ODJI <I?
Q<GP@N <M@ "<??" <I? "5 7", M@NK@>ODQ@GT, OC@ KMJBM<H NCJPG? KMDIO 12.
1C@ DIKPO ><I =@ M@<? <N DI OC@ AJGGJRDIB >J?@:
TUSJOH PQ;
EPVCMF GJSTU;
EPVCMF TFDPOE;
// ...
PQ = DIPNQ(SFBEMO());
SFBEG(" %T %T", &GJSTU, &TFDPOE);
2. &HKMJQ@ OC@ ><G>PG<OJM OJ NPKKJMO JK@M<OJMN GDF@ "+" DI <??DODJI OJ RJM?N GDF@ "<??".
3. %<Q@ OC@ KMJBM<H OCMJR <I @S>@KODJI AJM PIFIJRI JK@M<OJMN.
EI;F5: 3@6 53E7
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
141
... F:7 EA>GF;A@E
EI;F5: 3@6 53E7
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
142
FOVN 34
FOVN DN OC@ A@<OPM@ OC<O @I<=G@N ?@ADIDIB I<H@? >JINO<IO Q<GP@N.
Effects of magic constants on code quality
34.1
1C@ AJGGJRDIB >J?@ <KK@<M@? DI OC@ @S@M>DN@ NJGPODJIN JA OC@ &IO@B@MN <I? AMDOCH@OD>
,K@M<ODJIN >C<KO@M:
JG (PQFSBUJPO == 1) \
SFTVMU = GJSTU + TFDPOE;
^ FMTF JG (PQFSBUJPO == 2) \
SFTVMU = GJSTU - TFDPOE;
^ FMTF JG (PQFSBUJPO == 3) \
SFTVMU = GJSTU * TFDPOE;
^ FMTF JG (PQFSBUJPO == 4) \
SFTVMU = GJSTU / TFDPOE;
^
1C@ DIO@B@M GDO@M<GN 1, 2, 3, <I? 4 DI OC<O KD@>@ JA >J?@ <M@ ><GG@? ?39;5 5A@EF3@FE. &O DN IJO
@<NT OJ ?@O@MHDI@ RC<O @<>C JA OCJN@ GDO@M<GN H@<IN DI OC@ KMJBM<H. ,I@ HPNO @S<HDI@ OC@
>J?@ DI @<>C N>JK@ OJ ?@O@MHDI@ OC<O 1 H@<IN 366;F;A@, 2 H@<IN EG4FD35F;A@, @O>. 1CDN O<NF DN
M@G<ODQ@GT @<NT AJM OC@ >J?@ <=JQ@ =@><PN@ <GG JA OC@ N>JK@N >JIO<DI EPNO < NDIBG@ GDI@. &O RJPG?
=@ >JIND?@M<=GT HJM@ ?DAAD>PGO OJ ?@>DKC@M OC@ H@<IDIBN JA H<BD> >JINO<ION DI HJNO JOC@M
KMJBM<HN.
*<BD> >JINO<ION HPNO =@ <QJD?@? =@><PN@ OC@T M@?P>@ ORJ HJNO DHKJMO<IO LP<GDOD@N JA
KMJBM<HN: M@<?<=DGDOT <I? H<DIO<DI<=DGDOT.
FOVN @I<=G@N BDQDIB I<H@N OJ NP>C >JINO<ION <I? <N < >JIN@LP@I>@ H<FDIB OC@ >J?@ HJM@
M@<?<=G@ <I? H<DIO<DI<=G@. "<>C >JI?DODJI RJPG? =@ M@<?DGT PI?@MNO<I?<=G@ RC@I OC@
AJGGJRDIB FOVN Q<GP@N R@M@ PN@?:
JG (PQFSBUJPO == 0QFSBUJPO.BEE) \
SFTVMU = GJSTU + TFDPOE;
^ FMTF JG (PQFSBUJPO == 0QFSBUJPO.TVCUSBDU) \
SFTVMU = GJSTU - TFDPOE;
^ FMTF JG (PQFSBUJPO == 0QFSBUJPO.NVMUJQMZ) \
SFTVMU = GJSTU * TFDPOE;
^ FMTF JG (PQFSBUJPO == 0QFSBUJPO.EJWJEF) \
SFTVMU = GJSTU / TFDPOE;
^
1C@ FOVN OTK@ 0QFSBUJPO <=JQ@ OC<O J=QD<O@N OC@ I@@? AJM H<BD> >JINO<ION 1, 2, 3, <I? 4 ><I
=@ ?@ADI@? GDF@ OCDN:
FOVN 0QFSBUJPO \ BEE = 1, TVCUSBDU, NVMUJQMZ, EJWJEF ^
The FOVN syntax
34.2
1C@ NDHKG@NO AJMH JA <I FOVN ?@ADIDODJI DN OC@ AJGGJRDIB:
FOVN TypeName \ ValueName_1, ValueName_2, /* FUD. */ ^
7@G?
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
143
0JH@ODH@N DO DN I@>@NN<MT OJ NK@>DAT OC@ <>OP<G OTK@ (OC@ 43E7 FKB7) JA OC@ Q<GP@N <N R@GG:
FOVN TypeName : base_type \ ValueName_1, ValueName_2, /* FUD. */ ^
4@ RDGG N@@ CJR OCDN DN PN@? DI OC@ I@SO N@>ODJI.
)KB7$3?7 ?@ADI@N RC<O OC@ Q<GP@N >JGG@>ODQ@GT H@<I. AGG JA OC@ Q<GP@N JA <I FOVN FKB7 <M@
GDNO@? RDOCDI >PMGT =M<>F@ON. %@M@ <M@ NJH@ @S<HKG@N:
FOVN )FBET0S5BJMT \ IFBET, UBJMT ^
FOVN 4VJU \ TQBEFT, IFBSUT, EJBNPOET, DMVCT ^
FOVN 'BSF \ SFHVMBS, DIJME, TUVEFOU, TFOJPS ^
"<>C N@O JA Q<GP@N =@>JH@N K<MO JA < N@K<M<O@ OTK@. #JM @S<HKG@, IFBET <I? UBJMT =@>JH@
Q<GP@N JA OC@ OTK@ )FBET0S5BJMT. 1C@ I@R OTK@ ><I =@ PN@? GDF@ JOC@M API?<H@IO<G OTK@N
RC@I ?@ADIDIB Q<MD<=G@N:
)FBET0S5BJMT SFTVMU; // EFGBVMU JOJUJBMJ[FE
BVUP IU = )FBET0S5BJMT.IFBET; // JOGFSSFE UZQF
AN C<N =@@I N@@I DI OC@ >J?@N <=JQ@, OC@ Q<GP@N JA FOVN OTK@N <M@ <GR<TN NK@>DAD@? =T OC@
I<H@ JA OC@DM FOVN OTK@:
JG (SFTVMU == )FBET0S5BJMT.IFBET) \
// ...
^
Actual values and base types
34.3
1C@ Q<GP@N JA FOVN OTK@N <M@ IJMH<GGT DHKG@H@IO@? DI OC@ =<>FBMJPI? <N JOU Q<GP@N. &I
JOC@M RJM?N, <GOCJPBC OC@T <KK@<M <N I<H@? Q<GP@N <N IFBET <I? UBJMT DI OC@ >J?@, OC@T <M@
<>OP<GGT JOU Q<GP@N. (Note: !F ;E BAEE;4>7 FA 5:AAE7 3 FKB7 AF:7D F:3@ int I:7@ @77676.).
2IG@NN @SKGD>DOGT NK@>DAD@? =T OC@ KMJBM<HH@M, OC@ JOU Q<GP@N NO<MO =T 0 <I? <M@ DI>M@H@IO@?
=T JI@ AJM @<>C FOVN Q<GP@. #JM @S<HKG@, OC@ ORJ Q<GP@N JA OC@ )FBET0S5BJMT C<Q@ OC@ Q<GP@N
0 <I? 1:
XSJUFMO("IFBET JT 0: ", ()FBET0S5BJMT.IFBET == 0));
XSJUFMO("UBJMT JT 1: ", ()FBET0S5BJMT.UBJMT == 1));
1C@ JPOKPO:
IFBET JT 0: USVF
UBJMT JT 1: USVF
&O DN KJNND=G@ OJ H<IP<GGT M@N@O OC@ Q<GP@N <O <IT KJDIO. 1C<O C<N =@@I OC@ ><N@ RC@I
NK@>DATDIB OC@ Q<GP@ JA 0QFSBUJPO.BEE <N 1 <=JQ@. 1C@ AJGGJRDIB @S<HKG@ M@N@ON OC@ Q<GP@N
ORD>@:
FOVN 5FTU \ B, C, D, ` = 100, E, F, G = 222, H, d ^
XSJUFGMO("%E %E %E", 5FTU.C, 5FTU.`, 5FTU.d);
1C@ JPOKPO:
1 100 224
7@G?
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
144
&A JOU DN IJO NPDO<=G@ <N OC@ =<N@ OTK@ JA OC@ FOVN Q<GP@N, OC@ =<N@ OTK@ ><I =@ NK@>DAD@?
@SKGD>DOGT <AO@M OC@ I<H@ JA OC@ FOVN:
FOVN /BUVSBM$POTUBOU : EPVCMF \ QJ = 3.14, F = 2.72 ^
FOVN 5FNQFSBUVSF6OJU : TUSJOH \ $ = "$FMTJVT", ' = "'BISFOIFJU" ^
FOVN values that are not of an FOVN type
34.4
4@ C<Q@ ?DN>PNN@? OC<O DO DN DHKJMO<IO OJ <QJD? H<BD> >JINO<ION <I? DINO@<? OJ O<F@
<?Q<IO<B@ JA OC@ FOVN A@<OPM@.
%JR@Q@M, NJH@ODH@N DO H<T IJO =@ I<OPM<G OJ >JH@ PK RDOC FOVN OTK@ I<H@N EPNO OJ PN@
I<H@? >JINO<ION. )@O'N <NNPH@ OC<O < I<H@? >JINO<IO DN I@@?@? OJ M@KM@N@IO OC@ IPH=@M JA
N@>JI?N K@M ?<T. &O NCJPG? IJO =@ I@>@NN<MT OJ <GNJ ?@ADI@ <I FOVN FKB7 AJM OCDN >JINO<IO
Q<GP@. AGG OC<O DN I@@?@? DN < >JINO<IO Q<GP@ OC<O ><I =@ M@A@MM@? OJ =T DON I<H@. &I NP>C
><N@N, OC@ OTK@ JA OC@ FOVN <I? OC@ Q<GP@ K<M@IOC@N@N <M@ IJO NK@>DAD@?:
FOVN TFDPOET1FS%BZ = 60 * 60 * 24;
1C@ OTK@ JA OC@ Q<GP@ ><I =@ NK@>DAD@? @SKGD>DOGT, RCD>C RJPG? =@ M@LPDM@? DA OC@ OTK@ ><IIJO
=@ DIA@MM@? AMJH OC@ MDBCO C<I? ND?@:
FOVN JOU TFDPOET1FS%BZ = 60 * 60 * 24;
0DI>@ OC@M@ DN IJ FOVN OTK@ OJ M@A@M OJ, NP>C I<H@? >JINO<ION ><I =@ PN@? DI >J?@ NDHKGT =T
OC@DM I<H@N:
UPUBM4FDPOET = UPUBM%BZT * TFDPOET1FS%BZ;
FOVN ><I =@ PN@? AJM ?@ADIDIB I<H@? >JINO<ION JA JOC@M OTK@N <N R@GG. #JM @S<HKG@, OC@ OTK@
JA OC@ AJGGJRDIB >JINO<IO RJPG? =@ TUSJOH:
FOVN GJMF/BNF = "MJTU.UYU";
Properties
34.5
1C@ .NJO <I? .NBY KMJK@MOD@N <M@ OC@ HDIDHPH <I? H<SDHPH Q<GP@N JA <I FOVN OTK@. 4C@I
OC@ Q<GP@N JA OC@ FOVN OTK@ <M@ >JIN@>PODQ@, OC@T ><I =@ DO@M<O@? JQ@M DI < GPS GJJK RDOCDI
OC@N@ GDHDON:
FOVN 4VJU \ TQBEFT, IFBSUT, EJBNPOET, DMVCT ^
GPS (BVUP TVJU = 4VJU.NJO; TVJU <= 4VJU.NBY; ++TVJU) \
XSJUFGMO("%T: %E", TVJU, TVJU);
^
#JMH<O NK@>DAD@MN "%T" <I? "%E" KMJ?P>@ ?DAA@M@IO JPOKPON:
TQBEFT: 0
IFBSUT: 1
EJBNPOET: 2
DMVCT: 3
+JO@ OC<O < GPSFBDI GJJK JQ@M OC<O M<IB@ RJPG? G@<Q@ OC@ .NBY Q<GP@ JPO JA OC@ DO@M<ODJI:
7@G?
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
145
GPSFBDI (TVJU; 4VJU.NJO .. 4VJU.NBY) \
XSJUFGMO("%T: %E", TVJU, TVJU);
^
1C@ JPOKPO:
TQBEFT: 0
IFBSUT: 1
EJBNPOET: 2
l DMVCT JT NJTTJOH
Converting from the base type
34.6
AN C<N =@@I N@@I DI OC@ AJMH<OO@? JPOKPON <=JQ@, <I FOVN Q<GP@ ><I <POJH<OD><GGT =@
>JIQ@MO@? OJ DON =<N@ OTK@ (@.B. OJ JOU). 1C@ M@Q@MN@ >JIQ@MNDJI DN IJO <POJH<OD>:
4VJU TVJU = 1; // j DPNQJMBUJPO &3303
1C@ M@<NJI AJM OCDN DN OJ <QJD? @I?DIB PK RDOC DIQ<GD? FOVN Q<GP@N:
TVJU = 100; // j XPVME CF BO JOWBMJE FOVN WBMVF
1C@ Q<GP@N OC<O <M@ FIJRI OJ >JMM@NKJI? OJ Q<GD? FOVN Q<GP@N JA < K<MOD>PG<M FOVN OTK@ ><I
NODGG =@ >JIQ@MO@? OJ OC<O OTK@ =T <I @SKGD>DO FKB7 53EF:
TVJU = DBTU(4VJU)1; // OPX IFBSUT
&O RJPG? =@ OC@ KMJBM<HH@M'N M@NKJIND=DGDOT OJ @INPM@ OC@ Q<GD?DOT JA OC@ Q<GP@N RC@I <I
@SKGD>DO ><NO DN PN@?. 4@ RDGG N@@ OTK@ ><NODIB <I? OTK@ >JIQ@MNDJIN DI G<O@M >C<KO@MN.
Exercise
34.7
t *J?DAT OC@ ><G>PG<OJM KMJBM<H AMJH OC@ @S@M>DN@N JA OC@ &IO@B@MN <I? AMDOCH@OD>
,K@M<ODJIN >C<KO@M =T C<QDIB OC@ PN@M N@G@>O OC@ <MDOCH@OD> JK@M<ODJI AMJH < H@IP.
1CDN KMJBM<H NCJPG? =@ ?DAA@M@IO AMJH OC@ KM@QDJPN JI@ <O G@<NO DI OC@ AJGGJRDIB
<M@<N:
w 2N@ FOVN Q<GP@N, IJO H<BD> >JINO<ION.
w 2N@ EPVCMF DINO@<? JA JOU.
w 2N@ < TXJUDI NO<O@H@IO DINO@<? JA <I "DA, @GN@ DA, @GN@" >C<DI.
... F:7 EA>GF;A@
7@G?
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
146
Functions 35
0DHDG<M OJ CJR API?<H@IO<G OTK@N <M@ =PDG?DIB =GJ>FN JA KMJBM<H ?<O<, API>ODJIN <M@ =PDG?DIB
=GJ>FN JA KMJBM<H =@C<QDJM.
#PI>ODJIN <M@ <GNJ >GJN@GT M@G<O@? OJ OC@ >M<AO <NK@>O JA KMJBM<HHDIB. 1C@ API>ODJIN OC<O <M@
RMDOO@I =T @SK@MD@I>@? KMJBM<HH@MN <M@ NP>>DI>O, NDHKG@, <I? >G@<M. 1CDN BJ@N =JOC R<TN:
1C@ H@M@ <>O JA OMTDIB OJ D?@IODAT <I? RMDO@ NH<GG@M =PDG?DIB =GJ>FN JA < KMJBM<H H<F@N <
=@OO@M KMJBM<HH@M.
4@ C<Q@ >JQ@M@? =<ND> NO<O@H@ION <I? @SKM@NNDJIN DI KM@QDJPN >C<KO@MN. AGOCJPBC OC@M@ RDGG
=@ H<IT HJM@ OC<O R@ RDGG N@@ DI G<O@M >C<KO@MN, RC<O R@ C<Q@ N@@I NJ A<M <M@ >JHHJIGT-
PN@? A@<OPM@N JA !. 0ODGG, OC@T <M@ IJO NPAAD>D@IO JI OC@DM JRI OJ RMDO@ G<MB@ KMJBM<HN. 1C@
KMJBM<HN OC<O R@ C<Q@ RMDOO@I NJ A<M C<Q@ <GG =@@I Q@MT NCJMO, @<>C ?@HJINOM<ODIB EPNO <
NDHKG@ A@<OPM@ JA OC@ G<IBP<B@. 1MTDIB OJ RMDO@ < KMJBM<H RDOC <IT G@Q@G JA >JHKG@SDOT
RDOCJPO API>ODJIN RJPG? =@ Q@MT ?DAAD>PGO <I? JK@I OJ =PBN.
#PI>ODJIN <M@ A@<OPM@N OC<O KPO NO<O@H@ION <I? @SKM@NNDJIN OJB@OC@M <N PIDON JA KMJBM<H
@S@>PODJI. 0P>C NO<O@H@ION <I? @SKM@NNDJI <M@ BDQ@I < I<H@ OC<O ?@N>MD=@N RC<O OC@T
>JGG@>ODQ@GT <>CD@Q@. 1C@T ><I OC@I =@ 53>>76 (JM 7J75GF76) =T OC<O I<H@.
1C@ >JI>@KO JA 9;H;@9 @3?7E FA 3 9DAGB A8 EF7BE DN >JHHJI DI ?<DGT GDQ@N. #JM @S<HKG@, OC@
<>O JA >JJFDIB <I JH@G@O ><I =@ ?@N>MD=@? DI NJH@ G@Q@G JA ?@O<DG =T OC@ AJGGJRDIB NO@KN:
t B@O OC@ K<I
t B@O =POO@M
t B@O OC@ @BB
t OPMI JI OC@ NOJQ@
t KPO OC@ K<I JI OC@ ADM@
t KPO =POO@M DIOJ OC@ K<I RC@I DO DN CJO
t KPO OC@ @BB DIOJ =POO@M RC@I DO DN H@GO@?
t M@HJQ@ OC@ K<I AMJH OC@ ADM@ RC@I OC@ @BB DN >JJF@?
t OPMI JAA OC@ NOJQ@
0DI>@ OC<O HP>C ?@O<DG DN J=QDJPNGT @S>@NNDQ@, NO@KN OC<O <M@ M@G<O@? OJB@OC@M RJPG? =@
>JH=DI@? PI?@M < NDIBG@ I<H@:
t H<F@ KM@K<M<ODJIN (B@O OC@ K<I, =POO@M, <I? OC@ @BB)
t OPMI JI OC@ NOJQ@
t >JJF OC@ @BB (KPO OC@ K<I JI OC@ ADM@, @O>.)
t OPMI JAA OC@ NOJQ@
$JDIB APMOC@M, OC@M@ ><I =@ < NDIBG@ I<H@ AJM <GG JA OC@ NO@KN:
t H<F@ < JI@-@BB JH@G@O (<GG JA OC@ NO@KN)
#PI>ODJIN <M@ =<N@? JI OC@ N<H@ >JI>@KO: 0O@KN OC<O ><I >JGG@>ODQ@GT =@ I<H@? <N < RCJG@
<M@ KPO OJB@OC@M OJ AJMH < API>ODJI. AN <I @S<HKG@, G@O'N NO<MO RDOC OC@ AJGGJRDIB GDI@N JA >J?@
OC<O <>CD@Q@ OC@ O<NF JA KMDIODIB < H@IP:
XSJUFMO(" 0 &YJU");
XSJUFMO(" 1 "EE");
XSJUFMO(" 2 4VCUSBDU");
XSJUFMO(" 3 .VMUJQMZ");
XSJUFMO(" 4 %JWJEF");
0DI>@ DO RJPG? H<F@ N@IN@ OJ I<H@ OCJN@ GDI@N <GOJB@OC@M <N QSJOU.FOV, OC@T ><I =@ KPO
OJB@OC@M OJ AJMH < API>ODJI =T OC@ AJGGJRDIB NTIO<S:
FG@5F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
147
WPJE QSJOU.FOV()
\
XSJUFMO(" 0 &YJU");
XSJUFMO(" 1 "EE");
XSJUFMO(" 2 4VCUSBDU");
XSJUFMO(" 3 .VMUJQMZ");
XSJUFMO(" 4 %JWJEF");
^
1C@ >JIO@ION JA OC<O API>ODJI ><I IJR =@ @S@>PO@? AMJH RDOCDI NBJO() NDHKGT =T DON I<H@:
WPJE NBJO()
\
QSJOU.FOV();
/* ... */
^
&O H<T =@ J=QDJPN AMJH OC@ NDHDG<MDOD@N JA OC@ ?@ADIDODJIN JA QSJOU.FOV() <I? NBJO() OC<O
NBJO() DN < API>ODJI <N R@GG. 1C@ @S@>PODJI JA < ! KMJBM<H NO<MON RDOC OC@ API>ODJI I<H@?
NBJO() <I? =M<I>C@N JPO OJ JOC@M API>ODJIN AMJH OC@M@.
Parameters
35.1
0JH@ JA OC@ KJR@MN JA API>ODJIN >JH@ AMJH OC@ A<>O OC<O OC@DM =@C<QDJMN <M@ <?EPNO<=G@
OCMJPBC K<M<H@O@MN.
)@O'N >JIODIP@ RDOC OC@ JH@G@O @S<HKG@ =T HJ?DATDIB DO OJ H<F@ <I JH@G@O JA ADQ@ @BBN
DINO@<? JA <GR<TN JI@. 1C@ NO@KN RJPG? @S<>OGT =@ OC@ N<H@, OC@ JIGT ?DAA@M@I>@ =@DIB OC@
IPH=@M JA @BBN OJ PN@. 4@ ><I >C<IB@ OC@ HJM@ B@I@M<G ?@N>MDKODJI <=JQ@ <>>JM?DIBGT:
t H<F@ KM@K<M<ODJIN (B@O OC@ K<I, =POO@M, <I? ADQ@ @BBN)
t OPMI JI OC@ NOJQ@
t >JJF OC@ @BBN (KPO OC@ K<I JI OC@ ADM@, @O>.)
t OPMI JAA OC@ NOJQ@
)DF@RDN@, OC@ HJNO B@I@M<G NDIBG@ NO@K RJPG? =@>JH@ OC@ AJGGJRDIB:
t H<F@ < ADQ@-@BB JH@G@O (<GG JA OC@ NO@KN)
1CDN ODH@ OC@M@ DN <I <??DODJI<G DIAJMH<ODJI OC<O >JI>@MIN NJH@ JA OC@ NO@KN: "B@O ADQ@ @BBN",
">JJF OC@ @BBN", <I? "H<F@ < ADQ@-@BB JH@G@O".
1C@ =@C<QDJMN JA API>ODJIN ><I =@ <?EPNO@? NDHDG<MGT OJ OC@ JH@G@O @S<HKG@. 1C@ DIAJMH<ODJI
OC<O API>ODJIN PN@ OJ <?EPNO OC@DM =@C<QDJM <M@ ><GG@? B3D3?7F7DE. -<M<H@O@MN <M@ NK@>DAD@? DI
OC@ 8G@5F;A@ B3D3?7F7D >;EF, N@K<M<O@? =T >JHH<N AMJH @<>C JOC@M. 1C@ K<M<H@O@M GDNO DN
DIND?@ JA OC@ K<M@IOC@N@N OC<O >JH@N <AO@M OC@ I<H@ JA OC@ API>ODJI.
1C@ QSJOU.FOV() API>ODJI <=JQ@ C<N =@@I ?@ADI@? RDOC <I @HKOT K<M<H@O@M GDNO =@><PN@ OC<O
API>ODJI <GR<TN KMDIO@? OC@ N<H@ H@IP. )@O'N <NNPH@ OC<O NJH@ODH@N OC@ H@IP RDGG I@@? OJ
=@ KMDIO@? ?DAA@M@IOGT DI ?DAA@M@IO >JIO@SON. #JM @S<HKG@, DO H<T H<F@ HJM@ N@IN@ OJ KMDIO OC@
ADMNO @IOMT <N "/@OPMI" DINO@<? JA ""SDO" ?@K@I?DIB JI OC@ K<MO JA OC@ KMJBM<H OC<O DN =@DIB
@S@>PO@? <O OC<O ODH@.
&I NP>C < ><N@, OC@ ADMNO @IOMT JA OC@ H@IP ><I =@ B3D3?7F7D;L76 =T C<QDIB =@@I ?@ADI@? DI
OC@ K<M<H@O@M GDNO. 1C@ API>ODJI OC@I PN@N OC@ Q<GP@ JA OC<O K<M<H@O@M DINO@<? JA OC@ GDO@M<G
"&YJU":
FG@5F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
148
WPJE QSJOU.FOV(TUSJOH GJSTU&OUSZ)
\
XSJUFMO(" 0 ", GJSTU&OUSZ);
XSJUFMO(" 1 "EE");
XSJUFMO(" 2 4VCUSBDU");
XSJUFMO(" 3 .VMUJQMZ");
XSJUFMO(" 4 %JWJEF");
^
+JOD>@ OC<O NDI>@ OC@ DIAJMH<ODJI OC<O OC@ GJSTU&OUSZ K<M<H@O@M >JIQ@TN DN < KD@>@ JA O@SO,
DON OTK@ C<N =@@I NK@>DAD@? <N TUSJOH DI OC@ K<M<H@O@M GDNO. 1CDN API>ODJI ><I IJR =@ 53>>76
RDOC ?DAA@M@IO K<M<H@O@M Q<GP@N OJ KMDIO H@IPN C<QDIB ?DAA@M@IO ADMNO @IOMD@N. AGG OC<O I@@?N OJ
=@ ?JI@ DN OJ PN@ <KKMJKMD<O@ TUSJOH Q<GP@N ?@K@I?DIB JI RC@M@ OC@ API>ODJI DN =@DIB ><GG@?
AMJH:
// "U TPNF QMBDF JO UIF QSPHSBN:
QSJOU.FOV("&YJU");
// ...
// "U TPNF PUIFS QMBDF JO UIF QSPHSBN:
QSJOU.FOV("3FUVSO");
Note: 4C@I TJP RMDO@ TJPM JRI API>ODJIN, TJP H<T @I>JPIO@M >JHKDG<ODJI @MMJMN RDOC
K<M<H@O@MN JA OTK@ TUSJOH. 1C@ QSJOU.FOV() API>ODJI <=JQ@ C<N NP>C < KMJ=G@H. AN
RMDOO@I, DO ><IIJO =@ ><GG@? =T K<M<H@O@M Q<GP@N JA OTK@ DIBS<>. #JM @S<HKG@, OC@ AJGGJRDIB
>J?@ RJPG? ><PN@ < >JHKDG<ODJI @MMJM:
DIBS<> BO&OUSZ;
BO&OUSZ _= "5BLF TRVBSF SPPU";
QSJOU.FOV(BO&OUSZ); // j DPNQJMBUJPO &3303
,I OC@ JOC@M C<I?, DA QSJOU.FOV() R@M@ ?@ADI@? OJ O<F@ DON K<M<H@O@M <N DIBS<>, OC@I DO
>JPG? IJO =@ ><GG@? RDOC TUSJOHN GDF@ "&YJU". 1CDN DN M@G<O@? OJ OC@ >JI>@KO JA DHHPO<=DGDOT
<I? OC@ JNNVUBCMF F@TRJM?, =JOC JA RCD>C RDGG =@ >JQ@M@? DI OC@ I@SO >C<KO@M.
)@O'N >JIODIP@ RDOC OC@ H@IP API>ODJI <I? <NNPH@ OC<O DO DN IJO <KKMJKMD<O@ OJ <GR<TN NO<MO
OC@ H@IP N@G@>ODJI IPH=@MN RDOC U@MJ. &I OC<O ><N@ OC@ NO<MODIB IPH=@M ><I <GNJ =@ K<NN@? OJ
OC@ API>ODJI <N DON N@>JI? K<M<H@O@M. 1C@ K<M<H@O@MN JA OC@ API>ODJI HPNO =@ N@K<M<O@? =T
>JHH<N:
WPJE QSJOU.FOV(TUSJOH GJSTU&OUSZ, JOU GJSTU/VNCFS)
\
XSJUFMO(' ', GJSTU/VNCFS, ' ', GJSTU&OUSZ);
XSJUFMO(' ', GJSTU/VNCFS + 1, " "EE");
XSJUFMO(' ', GJSTU/VNCFS + 2, " 4VCUSBDU");
XSJUFMO(' ', GJSTU/VNCFS + 3, " .VMUJQMZ");
XSJUFMO(' ', GJSTU/VNCFS + 4, " %JWJEF");
^
&O DN IJR KJNND=G@ OJ O@GG OC@ API>ODJI RC<O IPH=@M OJ NO<MO AMJH:
QSJOU.FOV("3FUVSO", 1);
Calling a function
35.2
0O<MODIB < API>ODJI NJ OC<O DO <>CD@Q@N DON O<NF DN ><GG@? 53>>;@9 3 8G@5F;A@. 1C@ API>ODJI ><GG
NTIO<S DN OC@ AJGGJRDIB:
function_name(parameter_values)
FG@5F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
149
1C@ <>OP<G K<M<H@O@M Q<GP@N OC<O <M@ K<NN@? OJ API>ODJIN <M@ ><GG@? 8G@5F;A@ 3D9G?7@FE.
AGOCJPBC OC@ O@MHN B3D3?7F7D <I? 3D9G?7@F <M@ NJH@ODH@N PN@? DIO@M>C<IB@<=GT DI OC@
GDO@M<OPM@, OC@T NDBIDAT ?DAA@M@IO >JI>@KON.
1C@ <MBPH@ION <M@ H<O>C@? OJ OC@ K<M<H@O@MN JI@ =T JI@ DI OC@ JM?@M OC<O OC@ K<M<H@O@MN
<M@ ?@ADI@?. #JM @S<HKG@, OC@ G<NO ><GG JA QSJOU.FOV() <=JQ@ PN@N OC@ 3D9G?7@FE "3FUVSO"
<I? 1, RCD>C >JMM@NKJI? OJ OC@ B3D3?7F7DE GJSTU&OUSZ <I? GJSTU/VNCFS, M@NK@>ODQ@GT.
1C@ OTK@ JA @<>C <MBPH@IO HPNO H<O>C OC@ OTK@ JA OC@ >JMM@NKJI?DIB K<M<H@O@M.
Doing work
35.3
&I KM@QDJPN >C<KO@MN, R@ C<Q@ ?@ADI@? @SKM@NNDJIN <N @IODOD@N OC<O ?J RJMF. #PI>ODJI ><GGN <M@
@SKM@NNDJIN <N R@GG: OC@T ?J NJH@ RJMF. !JDIB RJMF ><I H@<I < >JH=DI<ODJI JA ORJ OCDIBN:
t Having side effects: 0D?@ @AA@>ON <M@ <IT >C<IB@ DI OC@ NO<O@ JA OC@ KMJBM<H JM DON
@IQDMJIH@IO. 0JH@ JK@M<ODJIN C<Q@ JIGT ND?@ @AA@>ON. AI @S<HKG@ DN CJR OC@ QSJOU.FOV()
API>ODJI <=JQ@ >C<IB@N TUEPVU =T KMDIODIB OJ DO. AN <IJOC@M @S<HKG@, < API>ODJI OC<O <??N
< 4UVEFOU J=E@>O OJ < NOP?@IO >JIO<DI@M RJPG? <GNJ C<Q@ < ND?@ @AA@>O: DO RJPG? =@ ><PNDIB
OC@ >JIO<DI@M OJ BMJR.
&I NPHH<MT, JK@M<ODJIN OC<O ><PN@ < >C<IB@ DI OC@ NO<O@ JA OC@ KMJBM<H C<Q@ ND?@
@AA@>ON.
t Producing a value: 0JH@ JK@M<ODJIN JIGT KMJ?P>@ Q<GP@N. #JM @S<HKG@, < API>ODJI OC<O
<??N IPH=@MN RJPG? =@ KMJ?P>DIB OC@ M@NPGO JA OC<O <??DODJI. AN <IJOC@M @S<HKG@, <
API>ODJI OC<O H<F@N < 4UVEFOU J=E@>O =T PNDIB OC@ NOP?@IO'N I<H@ <I? <??M@NN RJPG? =@
KMJ?P>DIB < 4UVEFOU J=E@>O.
t Having side effects and producing a value: 0JH@ JK@M<ODJIN ?J =JOC. #JM @S<HKG@, <
API>ODJI OC<O M@<?N ORJ Q<GP@N AMJH TUEJO <I? ><G>PG<O@N OC@DM NPH RJPG? =@ C<QDIB ND?@
@AA@>ON ?P@ OJ >C<IBDIB OC@ NO<O@ JA TUEJO <I? <GNJ KMJ?P>DIB OC@ NPH JA OC@ ORJ Q<GP@N.
t No operation: AGOCJPBC @Q@MT API>ODJI DN JA JI@ JA OC@ OCM@@ ><O@BJMD@N <=JQ@, NJH@ODH@N
NJH@ API>ODJIN @I? PK ?JDIB IJ RJMF <O <GG, ?@K@I?DIB JI >@MO<DI >JI?DODJIN <O >JHKDG@
ODH@ JM <O MPI ODH@.
The return value
35.4
1C@ Q<GP@ OC<O < API>ODJI KMJ?P>@N <N < M@NPGO JA DON RJMF DN ><GG@? DON D7FGD@ H3>G7. 1CDN O@MH
>JH@N AMJH OC@ J=N@MQ<ODJI OC<O JI>@ OC@ KMJBM<H @S@>PODJI =M<I>C@N DIOJ < API>ODJI, DO
@Q@IOP<GGT D7FGD@E =<>F OJ RC@M@ OC@ API>ODJI C<N =@@I ><GG@?. #PI>ODJIN B@O 53>>76 <I? OC@T
D7FGD@ Q<GP@N.
'PNO GDF@ <IT JOC@M Q<GP@, M@OPMI Q<GP@N C<Q@ OTK@N. 1C@ OTK@ JA OC@ M@OPMI Q<GP@ DN NK@>DAD@?
MDBCO =@AJM@ OC@ I<H@ JA OC@ API>ODJI <O OC@ KJDIO RC@M@ OC@ API>ODJI DN ?@ADI@?. #JM @S<HKG@,
< API>ODJI OC<O <??N ORJ Q<GP@N JA JOU <I? M@OPMIN OC@DM NPH <GNJ <N JOU RJPG? =@ ?@ADI@?
GDF@ OC@ AJGGJRDIB:
JOU BEE(JOU GJSTU, JOU TFDPOE)
\
// ... UIF BDUVBM XPSL PG UIF GVODUJPO ...
^
1C@ Q<GP@ OC<O < API>ODJI M@OPMIN O<F@N KG<>@ JA OC@ API>ODJI ><GG DON@GA. #JM @S<HKG@,
<NNPHDIB OC<O OC@ API>ODJI ><GG BEE(5, 7) KMJ?P>@N OC@ Q<GP@ 12, OC@I OC@ AJGGJRDIB ORJ
GDI@N RJPG? =@ @LPDQ<G@IO:
FG@5F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
150
XSJUFMO("3FTVMU: ", BEE(5, 7));
XSJUFMO("3FTVMU: ", 12);
AO OC@ ADMNO GDI@ <=JQ@, OC@ BEE() API>ODJI DN ><GG@? RDOC OC@ <MBPH@ION 5 <I? 7 478AD7
XSJUFMO() B@ON ><GG@?. 1C@ Q<GP@ 12 OC<O OC@ API>ODJI M@OPMIN DN DI OPMI K<NN@? OJ XSJUFMO()
<N DON N@>JI? <MBPH@IO.
1CDN <GGJRN K<NNDIB OC@ M@OPMI Q<GP@N JA API>ODJIN OJ JOC@M API>ODJIN OJ AJMH >JHKG@S
@SKM@NNDJIN:
XSJUFMO("3FTVMU: ", BEE(5, EJWJEF(100, TUVEFOU$PVOU())));
&I OC@ GDI@ <=JQ@, OC@ M@OPMI Q<GP@ JA TUVEFOU$PVOU() DN K<NN@? OJ EJWJEF() <N DON N@>JI?
<MBPH@IO, OC@ M@OPMI Q<GP@ JA EJWJEF() DN K<NN@? OJ BEE() <N DON N@>JI? <MBPH@IO, <I?
@Q@IOP<GGT OC@ M@OPMI Q<GP@ JA BEE() DN K<NN@? OJ XSJUFMO() <N DON N@>JI? <MBPH@IO.
The SFUVSO statement
35.5
1C@ M@OPMI Q<GP@ JA < API>ODJI DN NK@>DAD@? =T OC@ SFUVSO F@TRJM?:
JOU BEE(JOU GJSTU, JOU TFDPOE)
\
JOU SFTVMU = GJSTU + TFDPOE;
SFUVSO SFTVMU;
^
A API>ODJI KMJ?P>@N DON M@OPMI Q<GP@ =T O<FDIB <?Q<IO<B@ JA NO<O@H@ION, @SKM@NNDJIN, <I?
KJO@IOD<GGT ><GGDIB JOC@M API>ODJIN. 1C@ API>ODJI RJPG? OC@I M@OPMI OC<O Q<GP@ =T OC@ SFUVSO
F@TRJM?, <O RCD>C KJDIO OC@ @S@>PODJI JA OC@ API>ODJI @I?N.
&O DN KJNND=G@ OJ C<Q@ HJM@ OC<I JI@ SFUVSO NO<O@H@IO DI < API>ODJI. 1C@ Q<GP@ JA OC@ ADMNO
SFUVSO NO<O@H@IO OC<O B@ON @S@>PO@? ?@O@MHDI@N OC@ M@OPMI Q<GP@ JA OC@ API>ODJI AJM <
K<MOD>PG<M ><GG:
JOU DPNQMFY$BMDVMBUJPO(JOU B1BSBNFUFS, JOU BOPUIFS1BSBNFUFS)
\
JG (B1BSBNFUFS == BOPUIFS1BSBNFUFS) \
SFUVSO 0;
^
SFUVSO B1BSBNFUFS * BOPUIFS1BSBNFUFS;
^
1C@ API>ODJI <=JQ@ M@OPMIN 0 RC@I OC@ ORJ K<M<H@O@MN <M@ @LP<G, <I? OC@ KMJ?P>O JA OC@DM
Q<GP@N RC@I OC@T <M@ ?DAA@M@IO.
WPJE functions
35.6
1C@ M@OPMI OTK@N JA API>ODJIN OC<O ?J IJO KMJ?P>@ Q<GP@N <M@ NK@>DAD@? <N WPJE. 4@ C<Q@ N@@I
OCDN H<IT ODH@N RDOC OC@ NBJO() API>ODJI NJ A<M, <N R@GG <N OC@ QSJOU.FOV() API>ODJI <=JQ@.
0DI>@ OC@T ?J IJO M@OPMI <IT Q<GP@ OJ OC@ ><GG@M, OC@DM M@OPMI Q<GP@N C<Q@ =@@I ?@ADI@? <N
WPJE. (Note: main() 53@ 3>EA 47 678;@76 3E D7FGD@;@9 int. ,7 I;>> E77 F:;E ;@ 3 >3F7D 5:3BF7D.)
FG@5F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
151
The name of the function
35.7
1C@ I<H@ JA < API>ODJI HPNO =@ >CJN@I OJ >JHHPID><O@ OC@ KPMKJN@ JA OC@ API>ODJI >G@<MGT.
#JM @S<HKG@, OC@ I<H@N BEE <I? QSJOU.FOV C<N =@@I <KKMJKMD<O@ =@><PN@ OC@DM KPMKJN@N
C<Q@ =@@I OJ <?? ORJ Q<GP@N, <I? OJ KMDIO < H@IP, M@NK@>ODQ@GT.
A >JHHJI BPD?@GDI@ AJM API>ODJI I<H@N DN OC<O OC@T >JIO<DI < Q@M= GDF@ 366 JM BD;@F.
A>>JM?DIB OJ OCDN BPD?@GDI@ I<H@N GDF@ BEEJUJPO() <I? NFOV() RJPG? =@ G@NN OC<I D?@<G.
%JR@Q@M, DO DN <>>@KO<=G@ OJ I<H@ API>ODJIN NDHKGT <N IJPIN, DA OCJN@ API>ODJIN ?J IJO C<Q@
<IT ND?@ @AA@>ON. #JM @S<HKG@, < API>ODJI OC<O M@OPMIN OC@ >PMM@IO O@HK@M<OPM@ ><I =@ I<H@?
<N DVSSFOU5FNQFSBUVSF() DINO@<? JA HFU$VSSFOU5FNQFSBUVSF().
JHDIB PK RDOC I<H@N OC<O <M@ >G@<M, NCJMO, <I? >JINDNO@IO DN HJM@ JI OC@ <MO ND?@ JA
KMJBM<HHDIB.
Code quality through functions
35.8
#PI>ODJIN ><I DHKMJQ@ OC@ LP<GDOT JA >J?@. 0H<GG@M API>ODJIN RDOC A@R@M M@NKJIND=DGDOD@N G@<?
OJ KMJBM<HN OC<O <M@ @<ND@M OJ H<DIO<DI.
Code duplication is harmful 35.8.1
,I@ JA OC@ KM<>OD>@N OC<O DN CDBCGT ?@OMDH@IO<G OJ KMJBM<H LP<GDOT DN >J?@ ?PKGD><ODJI. J?@
?PKGD><ODJI DN RC@I OC@M@ <M@ HJM@ OC<I JI@ KD@>@ JA >J?@ DI OC@ KMJBM<H OC<O <>CD@Q@ OC@
N<H@ O<NF.
AGOCJPBC OCDN NJH@ODH@N C<KK@IN =T >JKTDIB GDI@N JA >J?@ OJ < I@R KG<>@, DO H<T <GNJ C<KK@I
=T @I?DIB PK RDOC NDHDG<M GDI@N JA >J?@ PIDIO@IODJI<GGT.
,I@ JA OC@ KMJ=G@HN RDOC >J?@ ?PKGD><ODJI DN OC<O KJO@IOD<G =PBN RJPG? I<OPM<GGT J>>PM DI <GG
JA OC@ >JKD@N, M@LPDMDIB OJ =@ ADS@? DI HJM@ OC<I JI@ KG<>@. JIQ@MN@GT, RC@I OC@ >J?@
<KK@<MN DI JIGT JI@ KG<>@ DI OC@ KMJBM<H, OC@I ADSDIB DO <O OC<O JI@ KG<>@ RJPG? B@O MD? JA OC@
=PB JI>@ <I? AJM <GG.
AN & C<Q@ H@IODJI@? <=JQ@, API>ODJIN <M@ >GJN@GT M@G<O@? OJ OC@ >M<AO <NK@>O JA KMJBM<HHDIB.
"SK@MD@I>@? KMJBM<HH@MN <M@ <GR<TN JI OC@ GJJFJPO AJM >J?@ ?PKGD><ODJI. 1C@T <GR<TN OMT OJ
D?@IODAT >JHHJI<GDOD@N DI >J?@ <I? HJQ@ >JHHJI KD@>@N JA >J?@ OJ N@K<M<O@ API>ODJIN (JM OJ
>JHHJI NOMP>ON, >G<NN@N, O@HKG<O@N, @O>. <N R@ RDGG N@@ DI G<O@M >C<KO@MN).
)@O'N NO<MO RDOC < KMJBM<H OC<O >JIO<DIN NJH@ >J?@ ?PKGD><ODJI. )@O'N N@@ CJR OC<O
?PKGD><ODJI ><I =@ M@HJQ@? =T HJQDIB >J?@ DIOJ API>ODJIN (D.@. =T D7835FAD;@9 OC@ >J?@). 1C@
AJGGJRDIB KMJBM<H M@<?N IPH=@MN AMJH OC@ DIKPO <I? KMDION OC@H ADMNO DI OC@ JM?@M OC<O OC@T
C<Q@ <MMDQ@? <I? OC@I DI IPH@MD><G JM?@M:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
JOU<> OVNCFST;
JOU DPVOU;
XSJUF(")PX NBOZ OVNCFST BSF ZPV HPJOH UP FOUFS ");
SFBEG(" %T", &DPVOU);
// 3FBE UIF OVNCFST
GPSFBDI (J; 0 .. DPVOU) \
JOU OVNCFS;
XSJUF("/VNCFS ", J, " ");
SFBEG(" %T", &OVNCFS);
FG@5F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
152
OVNCFST _= OVNCFS;
^
// 1SJOU UIF OVNCFST
XSJUFMO("#FGPSF TPSUJOH:");
GPSFBDI (J, OVNCFS; OVNCFST) \
XSJUFGMO("%3E:%5E", J, OVNCFS);
^
OVNCFST.TPSU;
// 1SJOU UIF OVNCFST
XSJUFMO(""GUFS TPSUJOH:");
GPSFBDI (J, OVNCFS; OVNCFST) \
XSJUFGMO("%3E:%5E", J, OVNCFS);
^
^
0JH@ JA OC@ ?PKGD><O@? GDI@N JA >J?@ <M@ J=QDJPN DI OC<O KMJBM<H. 1C@ G<NO ORJ GPSFBDI GJJKN
OC<O <M@ PN@? AJM KMDIODIB OC@ IPH=@MN <M@ @S<>OGT OC@ N<H@. !@ADIDIB < API>ODJI OC<O HDBCO
<KKMJKMD<O@GT =@ I<H@? <N QSJOU() RJPG? M@HJQ@ OC<O ?PKGD><ODJI. 1C@ API>ODJI >JPG? O<F@ <
NGD>@ <N < K<M<H@O@M <I? KMDIO DO:
WPJE QSJOU(JOU<> TMJDF)
\
GPSFBDI (J, FMFNFOU; TMJDF) \
XSJUFGMO("%3T:%5T", J, FMFNFOU);
^
^
+JOD>@ OC<O OC@ I<H@ JA OC@ K<M<H@O@M DN ?@ADI@? OJ =@ HJM@ B@I@M<GGT <N TMJDF DINO@<? JA
OVNCFST. 1C@ M@<NJI AJM OC<O DN OC@ A<>O OC<O OC@ API>ODJI RJPG? IJO FIJR RC<O OC@ @G@H@ION
JA OC@ NGD>@ RJPG? NK@>DAD><GGT M@KM@N@IO. 1C<O ><I JIGT =@ FIJRI <O OC@ KG<>@ RC@M@ OC@
API>ODJI C<N =@@I ><GG@? AMJH. 1C@ @G@H@ION H<T =@ NOP?@IO &!N, K<MON JA < K<NNRJM?, @O>.
0DI>@ OC<O ><IIJO =@ FIJRI DI OC@ QSJOU() API>ODJI, B@I@M<G I<H@N GDF@ TMJDF <I? FMFNFOU
<M@ PN@? DI DON DHKG@H@IO<ODJI.
1C@ I@R API>ODJI ><I =@ ><GG@? AMJH OC@ ORJ KG<>@N RC@M@ OC@ NGD>@ I@@?N OJ =@ KMDIO@?:
JNQPSU TUE.TUEJP;
WPJE QSJOU(JOU<> TMJDF)
\
GPSFBDI (J, FMFNFOU; TMJDF) \
XSJUFGMO("%3T:%5T", J, FMFNFOU);
^
^
WPJE NBJO()
\
JOU<> OVNCFST;
JOU DPVOU;
XSJUF(")PX NBOZ OVNCFST BSF ZPV HPJOH UP FOUFS ");
SFBEG(" %T", &DPVOU);
// 3FBE UIF OVNCFST
GPSFBDI (J; 0 .. DPVOU) \
JOU OVNCFS;
XSJUF("/VNCFS ", J, " ");
SFBEG(" %T", &OVNCFS);
OVNCFST _= OVNCFS;
^
FG@5F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
153
// 1SJOU UIF OVNCFST
XSJUFMO("#FGPSF TPSUJOH:");
QSJOU(OVNCFST);
OVNCFST.TPSU;
// 1SJOU UIF OVNCFST
XSJUFMO(""GUFS TPSUJOH:");
QSJOU(OVNCFST);
^
1C@M@ DN HJM@ OJ ?J. +JOD>@ OC<O OC@M@ DN <GR<TN < ODOG@ GDI@ KMDIO@? MDBCO =@AJM@ KMDIODIB OC@
@G@H@ION JA OC@ NGD>@. AGOCJPBC OC@ ODOG@ DN ?DAA@M@IO, OC@ O<NF DN OC@ N<H@. &A KMDIODIB OC@ ODOG@
><I =@ N@@I <N < K<MO JA KMDIODIB OC@ NGD>@, OC@ ODOG@ OJJ ><I =@ K<NN@? <N < K<M<H@O@M. %@M@
<M@ OC@ I@R >C<IB@N:
WPJE QSJOU(TUSJOH UJUMF, JOU<> TMJDF)
\
XSJUFMO(UJUMF, ":");
GPSFBDI (J, FMFNFOU; TMJDF) \
XSJUFGMO("%3T:%5T", J, FMFNFOU);
^
^
// ...
// 1SJOU UIF OVNCFST
QSJOU("#FGPSF TPSUJOH", OVNCFST);
// ...
// 1SJOU UIF OVNCFST
QSJOU(""GUFS TPSUJOH", OVNCFST);
1CDN NO@K C<N OC@ <??@? =@I@ADO JA J=QD<ODIB OC@ >JHH@ION OC<O <KK@<M MDBCO =@AJM@ OC@ ORJ
QSJOU() ><GGN. 0DI>@ OC@ I<H@ JA OC@ API>ODJI <GM@<?T >G@<MGT >JHHPID><O@N RC<O DO ?J@N,
OCJN@ >JHH@ION <M@ PII@>@NN<MT:
QSJOU("#FGPSF TPSUJOH", OVNCFST);
OVNCFST.TPSU;
QSJOU(""GUFS TPSUJOH", OVNCFST);
AGOCJPBC NP=OG@, OC@M@ DN HJM@ >J?@ ?PKGD><ODJI DI OCDN KMJBM<H: 1C@ Q<GP@N JA DPVOU <I?
OVNCFS <M@ M@<? DI @S<>OGT OC@ N<H@ R<T. 1C@ JIGT ?DAA@M@I>@ DN OC@ H@NN<B@ OC<O DN KMDIO@? OJ
OC@ PN@M <I? OC@ I<H@ JA OC@ Q<MD<=G@:
JOU DPVOU;
XSJUF(")PX NBOZ OVNCFST BSF ZPV HPJOH UP FOUFS ");
SFBEG(" %T", &DPVOU);
// ...
JOU OVNCFS;
XSJUF("/VNCFS ", J, " ");
SFBEG(" %T", &OVNCFS);
1C@ >J?@ RJPG? =@>JH@ @Q@I =@OO@M DA DO OJJF <?Q<IO<B@ JA < I@R API>ODJI OC<O HDBCO =@
I<H@? <KKMJKMD<O@GT <N SFBE@JOU(). 1C@ I@R API>ODJI ><I O<F@ OC@ H@NN<B@ <N < K<M<H@O@M,
KMDIO OC<O H@NN<B@, M@<? <I JOU AMJH OC@ DIKPO, <I? M@OPMI OC<O JOU:
FG@5F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
154
JOU SFBE@JOU(TUSJOH NFTTBHF)
\
JOU SFTVMU;
XSJUF(NFTTBHF, " ");
SFBEG(" %T", &SFTVMU);
SFUVSO SFTVMU;
^
DPVOU ><I IJR =@ DIDOD<GDU@? ?DM@>OGT =T OC@ M@OPMI Q<GP@ JA < ><GG OJ OCDN I@R API>ODJI:
JOU DPVOU = SFBE@JOU(")PX NBOZ OVNCFST BSF ZPV HPJOH UP FOUFS");
OVNCFS ><IIJO =@ DIDOD<GDU@? DI <N NOM<DBCOAJMR<M? < R<T =@><PN@ OC@ GJJK >JPIO@M J C<KK@IN
OJ =@ < K<MO JA OC@ H@NN<B@ OC<O DN ?DNKG<T@? RC@I M@<?DIB OVNCFS. 1CDN ><I =@ JQ@M>JH@ =T
O<FDIB <?Q<IO<B@ JA GPSNBU:
JNQPSU TUE.TUSJOH;
// ...
JOU OVNCFS = SFBE@JOU(GPSNBU("/VNCFS %T", J));
#PMOC@M, NDI>@ OVNCFS DN PN@? DI JIGT JI@ KG<>@ DI OC@ GPSFBDI GJJK, DON ?@ADIDODJI ><I =@
@GDHDI<O@? <GOJB@OC@M <I? OC@ M@OPMI Q<GP@ JA SFBE@JOU() ><I ?DM@>OGT =@ PN@? DI DON KG<>@:
GPSFBDI (J; 0 .. DPVOU) \
OVNCFST _= SFBE@JOU(GPSNBU("/VNCFS %T", J));
^
)@O'N H<F@ < ADI<G HJ?DAD><ODJI OJ OCDN KMJBM<H =T HJQDIB OC@ GDI@N OC<O M@<? OC@ IPH=@MN OJ
< N@K<M<O@ API>ODJI. 1CDN RJPG? <GNJ @GDHDI<O@ OC@ I@@? AJM OC@ "/@<? OC@ IPH=@MN" >JHH@IO
=@><PN@ OC@ I<H@ JA OC@ I@R API>ODJI RJPG? <GM@<?T ><MMT OC<O DIAJMH<ODJI.
1C@ I@R SFBE/VNCFST() API>ODJI ?J@N IJO I@@? <IT K<M<H@O@M OJ >JHKG@O@ DON O<NF. &O M@<?N
NJH@ IPH=@MN <I? M@OPMIN OC@H <N < NGD>@. 1C@ AJGGJRDIB DN OC@ ADI<G Q@MNDJI JA OC@ KMJBM<H:
JNQPSU TUE.TUEJP;
JNQPSU TUE.TUSJOH;
WPJE QSJOU(TUSJOH UJUMF, JOU<> TMJDF)
\
XSJUFMO(UJUMF, ":");
GPSFBDI (J, FMFNFOU; TMJDF) \
XSJUFGMO("%3T:%5T", J, FMFNFOU);
^
^
JOU SFBE@JOU(TUSJOH NFTTBHF)
\
JOU SFTVMU;
XSJUF(NFTTBHF, " ");
SFBEG(" %T", &SFTVMU);
SFUVSO SFTVMU;
^
JOU<> SFBE/VNCFST()
\
JOU<> SFTVMU;
JOU DPVOU = SFBE@JOU(")PX NBOZ OVNCFST BSF ZPV HPJOH UP FOUFS");
GPSFBDI (J; 0 .. DPVOU) \
SFTVMU _= SFBE@JOU(GPSNBU("/VNCFS %T", J));
^
FG@5F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
155
SFUVSO SFTVMU;
^
WPJE NBJO()
\
JOU<> OVNCFST = SFBE/VNCFST();
QSJOU("#FGPSF TPSUJOH", OVNCFST);
OVNCFST.TPSU;
QSJOU(""GUFS TPSUJOH", OVNCFST);
^
JHK<M@ OCDN Q@MNDJI JA OC@ KMJBM<H OJ OC@ ADMNO JI@. 1C@ H<EJM NO@KN JA OC@ KMJBM<H <M@
Q@MT >G@<M DI OC@ NBJO() API>ODJI JA OC@ I@R KMJBM<H. &I >JIOM<NO, OC@ NBJO() API>ODJI JA OC@
ADMNO KMJBM<H C<? OJ =@ @S<HDI@? OJ PI?@MNO<I? OC@ KPMKJN@ JA OC<O KMJBM<H.
AGOCJPBC OC@ OJO<G IPH=@MN JA IJIOMDQD<G GDI@N JA OC@ ORJ Q@MNDJIN JA OC@ KMJBM<H @I?@? PK
=@DIB @LP<G, API>ODJIN H<F@ KMJBM<HN NCJMO@M DI B@I@M<G. 1CDN @AA@>O DN IJO <KK<M@IO DI OCDN
NDHKG@ KMJBM<H. #JM @S<HKG@, =@AJM@ OC@ SFBE@JOU() API>ODJI C<N =@@I ?@ADI@?, M@<?DIB <I
JOU AMJH OC@ DIKPO DIQJGQ@? OCM@@ GDI@N JA >J?@. AAO@M OC@ ?@ADIDODJI JA SFBE@JOU(), OC@ N<H@
BJ<G DN <>CD@Q@? =T < NDIBG@ GDI@ JA >J?@. #PMOC@M, OC@ ?@ADIDODJI JA SFBE@JOU() <GGJR@?
M@HJQDIB OC@ ?@ADIDODJI JA OC@ Q<MD<=G@ OVNCFS <GOJB@OC@M.
Commented lines of code as functions 35.8.2
0JH@ODH@N OC@ I@@? OJ RMDO@ < >JHH@IO OJ ?@N>MD=@ OC@ KPMKJN@ JA < BMJPK JA GDI@N JA >J?@ DN
<I DI?D><ODJI OC<O OCJN@ GDI@N >JPG? =@OO@M =@ HJQ@? OJ < I@RGT ?@ADI@? API>ODJI. &A OC@ I<H@
JA OC@ API>ODJI DN ?@N>MDKODQ@ @IJPBC OC@I OC@M@ RJPG? =@ IJ I@@? AJM OC@ >JHH@IO @DOC@M.
1C@ OCM@@ >JHH@IO@? BMJPKN JA GDI@N JA OC@ ADMNO Q@MNDJI JA OC@ KMJBM<H C<Q@ =@@I PN@? AJM
?@ADIDIB I@R API>ODJIN OC<O <>CD@Q@? OC@ N<H@ O<NFN.
AIJOC@M DHKJMO<IO =@I@ADO JA M@HJQDIB >JHH@IO GDI@N DN OC<O >JHH@ION O@I? OJ =@>JH@
JPO?<O@? <N OC@ >J?@ B@ON HJ?DAD@? JQ@M OC@ ODH@. JHH@ION <M@ NJH@ODH@N AJMBJOO@I OJ =@
PK?<O@? <GJIB RDOC OC@ >J?@ <I? =@>JH@ @DOC@M PN@G@NN JM @Q@I RJMN@, HDNG@<?DIB. #JM OC<O
M@<NJI, DO DN =@I@AD>D<G OJ OMT OJ RMDO@ KMJBM<HN RDOCJPO OC@ I@@? AJM >JHH@ION.
Exercises
35.9
1. *J?DAT OC@ QSJOU.FOV() API>ODJI OJ O<F@ OC@ @IODM@ N@O JA H@IP DO@HN <N < K<M<H@O@M. #JM
@S<HKG@, OC@ H@IP DO@HN ><I =@ K<NN@? OJ OC@ API>ODJI <N DI OC@ AJGGJRDIB >J?@:
TUSJOH<> JUFNT =
< "#MBDL", "3FE", "(SFFO", "#MVF", "8IJUF" >;
QSJOU.FOV(JUFNT, 1);
%<Q@ OC@ KMJBM<H KMJ?P>@ OC@ AJGGJRDIB JPOKPO:
1 #MBDL
2 3FE
3 (SFFO
4 #MVF
5 8IJUF
2. 1C@ AJGGJRDIB KMJBM<H PN@N < ORJ ?DH@INDJI<G <MM<T <N < ><IQ<N. 0O<MO RDOC OC<O KMJBM<H
<I? DHKMJQ@ DO =T <??DIB HJM@ API>ODJI<GDOT OJ DO:
FG@5F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
156
JNQPSU TUE.TUEJP;
FOVN UPUBM-JOFT = 20;
FOVN UPUBM$PMVNOT = 60;
/*
* 5IF 'BMJBT' JO UIF OFYU MJOF NBLFT '-JOF' BO BMJBT PG
* EDIBS<UPUBM$PMVNOT>. &WFSZ '-JOF' UIBU JT VTFE JO UIF SFTU
* PG UIF QSPHSBN XJMM NFBO EDIBS<UPUBM$PMVNOT> GSPN UIJT
* QPJOU PO.
*
* "MTP OPUF UIBU '-JOF' JT B GJYFE-MFOHUI BSSBZ.
*/
BMJBT -JOF = EDIBS<UPUBM$PMVNOT>;
/*
* " EZOBNJD BSSBZ PG -JOFT JT CFJOH BMJBTFE BT '$BOWBT'.
*/
BMJBT $BOWBT = -JOF<>;
/*
* 1SJOUT UIF DBOWBT MJOF CZ MJOF.
*/
WPJE QSJOU($BOWBT DBOWBT)
\
GPSFBDI (MJOF; DBOWBT) \
XSJUFMO(MJOF);
^
^
/*
* 1MBDFT B EPU BU UIF TQFDJGJFE MPDBUJPO PO UIF DBOWBT. *O B
* TFOTF, "QBJOUT" UIF DBOWBT.
*/
WPJE QVU%PU($BOWBT DBOWBT, JOU MJOF, JOU DPMVNO)
\
DBOWBT<MJOF><DPMVNO> = '#';
^
/*
* %SBXT B WFSUJDBM MJOF PG UIF TQFDJGJFE MFOHUI GSPN UIF
* TQFDJGJFE QPTJUJPO.
*/
WPJE ESBX7FSUJDBM-JOF($BOWBT DBOWBT,
JOU MJOF,
JOU DPMVNO,
JOU MFOHUI)
\
GPSFBDI (MJOF5P1BJOU; MJOF .. MJOF + MFOHUI) \
QVU%PU(DBOWBT, MJOF5P1BJOU, DPMVNO);
^
^
WPJE NBJO()
\
-JOF FNQUZ-JOF = '.';
/* "O FNQUZ DBOWBT */
$BOWBT DBOWBT;
/* $POTUSVDUJOH UIF DBOWBT CZ BEEJOH FNQUZ MJOFT */
GPSFBDI (J; 0 .. UPUBM-JOFT) \
DBOWBT _= FNQUZ-JOF;
^
/* 6TJOH UIF DBOWBT */
QVU%PU(DBOWBT, 7, 30);
ESBX7FSUJDBM-JOF(DBOWBT, 5, 10, 4);
QSJOU(DBOWBT);
^
FG@5F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
157
... F:7 EA>GF;A@E
FG@5F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
158
Immutability 36
4@ C<Q@ N@@I OC<O Q<MD<=G@N M@KM@N@IO >JI>@KON DI KMJBM<HN. 1C@ DIO@M<>ODJIN JA OC@N@
>JI>@KON <M@ <>CD@Q@? =T @SKM@NNDJIN OC<O >C<IB@ OC@ Q<GP@N JA OCJN@ Q<MD<=G@N:
// 1BZ UIF CJMM
UPUBM1SJDF = DBMDVMBUF"NPVOU(JUFN1SJDFT);
NPOFZ*O8BMMFU -= UPUBM1SJDF;
NPOFZ"U.FSDIBOU += UPUBM1SJDF;
*J?DATDIB < Q<MD<=G@ DN ><GG@? ?GF3F;@9 OC<O Q<MD<=G@. 1C@ >JI>@KO JA HPO<=DGDOT DN @NN@IOD<G
AJM HJNO O<NFN. %JR@Q@M, OC@M@ <M@ NJH@ ><N@N RC@M@ HPO<=DGDOT DN IJO NPDO<=G@:
t 0JH@ >JI>@KON <M@ DHHPO<=G@ =T ?@ADIDODJI. #JM @S<HKG@, OC@M@ <M@ <GR<TN N@Q@I ?<TN DI <
R@@F, OC@ H<OC >JINO<IO B; (h) DN >JINO<IO, < KMJBM<H H<T =@ NPKKJMODIB JIGT < NCJMO GDNO
JA CPH<I G<IBP<B@N (@.B. JIGT "IBGDNC <I? 1PMFDNC), @O>.
t &A @Q@MT Q<MD<=G@ R@M@ HJ?DAD<=G@ <N R@ C<Q@ N@@I NJ A<M, OC@I @Q@MT KD@>@ JA >J?@ OC<O
PN@? OC<O Q<MD<=G@ >JPG? KJO@IOD<GGT C<Q@ HJ?DAD@? DO. "Q@I DA OC@M@ R<N IJ M@<NJI OJ
HJ?DAT < Q<MD<=G@ DI <I JK@M<ODJI, OC@M@ RJPG? =@ IJ BP<M<IO@@ OC<O OCDN RJPG? IJO C<KK@I
@DOC@M. -MJBM<HN <M@ ?DAAD>PGO OJ M@<? JM H<DIO<DI RC@I OC@M@ DN IJ BP<M<IO@@ JA
DHHPO<=DGDOT.
#JM @S<HKG@, DO H<T =@ >G@<M OC<O OC@ API>ODJI ><GG SFUJSF(PGGJDF, XPSLFS) RJPG?
M@ODM@ < RJMF@M JA <I JAAD>@. &A @Q@MT Q<MD<=G@ R@M@ HPO<=G@, DO RJPG? IJO =@ >G@<M
RCD>C JA OC@ ORJ Q<MD<=G@N RJPG? =@ HJ?DAD@? <AO@M OC<O API>ODJI ><GG. &O H<T =@
@SK@>O@? OC<O OC@ IPH=@M JA <>ODQ@ @HKGJT@@N JA PGGJDF RJPG? =@ ?@>M@<N@?, =PO
RJPG? OC@ API>ODJI ><GG <GNJ HJ?DAT XPSLFS DI NJH@ R<T?
1C@ >JI>@KO JA DHHPO<=DGDOT C@GKN RDOC PI?@MNO<I?DIB K<MON JA KMJBM<HN =T BP<M<IO@@DIB
OC<O >@MO<DI JK@M<ODJIN ?J IJO >C<IB@ >@MO<DI Q<MD<=G@N. &O <GNJ M@?P>@N OC@ MDNF JA >@MO<DI
OTK@N JA KMJBM<H @MMJMN.
1C@ ;??GF34;>;FK >JI>@KO JA ! DN M@KM@N@IO@? =T OC@ DPOTU <I? JNNVUBCMF F@TRJM?N.
AGOCJPBC OC@ ORJ RJM?N OC@HN@GQ@N <M@ >GJN@ DI H@<IDIB, OC@DM M@NKJIND=DGDOD@N DI KMJBM<HN
<M@ ?DAA@M@IO <I? OC@T <M@ NJH@ODH@N DI>JHK<OD=G@.
Immutable variables
36.1
BJOC JA OC@ O@MHN "DHHPO<=G@ Q<MD<=G@" <I? ">JINO<IO Q<MD<=G@" <M@ IJIN@IND><G RC@I OC@
RJM? "Q<MD<=G@" DN O<F@I GDO@M<GGT OJ H@<I EA?7F:;@9 F:3F 5:3@97E. 1C@ RJM? "Q<MD<=G@" H@<IN
<IT >JI>@KO JA < KMJBM<H RCD>C H<T =@ HPO<=G@ JA DHHPO<=G@.
1C@M@ <M@ OCM@@ R<TN JA ?@ADIDIB Q<MD<=G@N OC<O ><I I@Q@M =@ HPO<O@?.
FOVN constants 36.1.1
4@ C<Q@ N@@I @<MGD@M DI OC@ FOVN >C<KO@M OC<O FOVN ?@ADI@N I<H@? >JINO<IO Q<GP@N:
FOVN GJMF/BNF = "MJTU.UYU";
AN GJIB <N OC@DM Q<GP@N ><I =@ ?@O@MHDI@? <O >JHKDG@ ODH@, FOVN Q<MD<=G@N ><I =@ DIDOD<GDU@?
=T M@OPMI Q<GP@N JA API>ODJIN <N R@GG:
JOU UPUBM-JOFT()
\
SFUVSO 42;
^
!??GF34;>;FK
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
159
JOU UPUBM$PMVNOT()
\
SFUVSO 7;
^
TUSJOH OBNF()
\
SFUVSO "MJTU";
^
WPJE NBJO()
\
FOVN GJMF/BNF = OBNF() _ ".UYU";
FOVN UPUBM4RVBSFT = UPUBM-JOFT() * UPUBM$PMVNOT();
^
AN @SK@>O@?, Q<GP@N JA FOVN >JINO<ION ><IIJO =@ HJ?DAD@?:
++UPUBM4RVBSFT; // j DPNQJMBUJPO &3303
AGOCJPBC DO DN < Q@MT @AA@>ODQ@ R<T JA M@KM@N@IODIB DHHPO<=G@ Q<GP@N, FOVN ><I JIGT =@ PN@?
AJM >JHKDG@-ODH@ Q<GP@N.
AI FOVN >JINO<IO DN 3 ?3@;87EF 5A@EF3@F, H@<IDIB OC<O OC@ KMJBM<H DN >JHKDG@? <N DA DO C<N
=@@I M@KG<>@? =T DON Q<GP@. AN <I @S<HKG@, G@O'N >JIND?@M OC@ AJGGJRDIB FOVN ?@ADIDODJI <I?
OC@ ORJ @SKM@NNDJIN OC<O H<F@ PN@ JA DO:
FOVN J = 42;
XSJUFMO(J);
GPP(J);
1C@ >J?@ <=JQ@ RJPG? =@ OC@ N<H@ <N M@KG<>DIB J RDOC DON Q<GP@ 42:
XSJUFMO(42);
GPP(42);
AGOCJPBC OC<O M@KG<>@H@IO H<F@N N@IN@ AJM NDHKG@ OTK@N GDF@ JOU <I? H<F@N IJ ?DAA@M@I>@ DI
OC@ KMJBM<H, FOVN >JINO<ION =MDIB < CD??@I >JNO RC@I OC@T <M@ PN@? AJM <MM<TN JM <NNJ>D<ODQ@
<MM<TN:
FOVN B = < 42, 100 >;
XSJUFMO(B);
GPP(B);
AAO@M M@KG<>DIB B RDOC DON Q<GP@, OC@ @LPDQ<G@IO >J?@ OC<O OC@ >JHKDG@M RJPG? =@ >JHKDGDIB DN
OC@ AJGGJRDIB:
XSJUFMO(< 42, 100 >); // BO BSSBZ JT DSFBUFE BU SVO UJNF
GPP(< 42, 100 >); // BOPUIFS BSSBZ JT DSFBUFE BU SVO UJNF
1C@ CD??@I >JNO C@M@ DN OC<O OC@M@ RJPG? =@ ORJ N@K<M<O@ <MM<TN >M@<O@? AJM OC@ ORJ
@SKM@NNDJIN <=JQ@. #JM OC<O M@<NJI, DO H<T H<F@ HJM@ N@IN@ OJ ?@ADI@ <MM<TN <I? <NNJ>D<ODQ@
<MM<TN <N JNNVUBCMF Q<MD<=G@N DA OC@T <M@ BJDIB OJ =@ PN@? HJM@ OC<I JI>@ DI OC@ KMJBM<H.
!??GF34;>;FK
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
160
JNNVUBCMF variables 36.1.2
)DF@ FOVN, OCDN F@TRJM? NK@>DAD@N OC<O OC@ Q<GP@ JA < Q<MD<=G@ RDGG I@Q@M >C<IB@. &ON ?DAA@M@I>@
AMJH FOVN DN OC<O OC@ Q<GP@N JA JNNVUBCMF Q<MD<=G@N ><I =@ ><G>PG<O@? ?PMDIB OC@ @S@>PODJI JA
OC@ KMJBM<H.
1C@ AJGGJRDIB KMJBM<H >JHK<M@N OC@ PN@N JA FOVN <I? JNNVUBCMF. 1C@ KMJBM<H R<DON AJM OC@
PN@M OJ BP@NN < IPH=@M OC<O C<N =@@I KD>F@? M<I?JHGT. 0DI>@ OC@ M<I?JH IPH=@M ><IIJO =@
?@O@MHDI@? <O >JHKDG@ ODH@, DO ><IIJO =@ ?@ADI@? <N FOVN. 0ODGG, NDI>@ OC@ M<I?JHGT KD>F@?
Q<GP@ HPNO I@Q@M =@ >C<IB@? <AO@M C<QDIB =@DIB ?@>D?@?, DO DN NPDO<=G@ OJ NK@>DAT OC<O Q<MD<=G@
<N JNNVUBCMF.
1C@ KMJBM<H O<F@N <?Q<IO<B@ JA OC@ SFBE@JOU() API>ODJI OC<O C<N =@@I ?@ADI@? DI OC@
KM@QDJPN >C<KO@M:
JNQPSU TUE.TUEJP;
JNQPSU TUE.SBOEPN;
JOU SFBE@JOU(TUSJOH NFTTBHF)
\
JOU SFTVMU;
XSJUF(NFTTBHF, " ");
SFBEG(" %T", &SFTVMU);
SFUVSO SFTVMU;
^
WPJE NBJO()
\
FOVN NJO = 1;
FOVN NBY = 10;
JNNVUBCMF OVNCFS = VOJGPSN(NJO, NBY + 1);
XSJUFGMO("* BN UIJOLJOH PG B OVNCFS CFUXFFO %T BOE %T.",
NJO, NBY);
BVUP JT$PSSFDU = GBMTF;
XIJMF (!JT$PSSFDU) \
JNNVUBCMF HVFTT = SFBE@JOU("8IBU JT ZPVS HVFTT");
JT$PSSFDU = (HVFTT == OVNCFS);
^
XSJUFMO("$PSSFDU!");
^
,=N@MQ<ODJIN:
t NJO <I? NBY <M@ DIO@BM<G K<MON JA OC@ =@C<QDJM JA OCDN KMJBM<H <I? OC@DM Q<GP@N <M@ FIJRI
<O >JHKDG@ ODH@. #JM OC<O M@<NJI OC@T <M@ ?@ADI@? <N FOVN >JINO<ION.
t OVNCFS DN NK@>DAD@? <N JNNVUBCMF =@><PN@ DO RJPG? IJO =@ <KKMJKMD<O@ OJ HJ?DAT DO ?PMDIB
OC@ @S@>PODJI JA OC@ KMJBM<H. &O DN OC@ N<H@ RDOC @<>C PN@M BP@NN: ,I>@ M@<?, OC@ BP@NN
NCJPG? IJO =@ HJ?DAD@?.
t ,=N@MQ@ OC<O OC@ OTK@N JA OCJN@ Q<MD<=G@N <M@ IJO NK@>DAD@? @SKGD>DOGT. AN RDOC BVUP, OC@
OTK@N JA FOVN <I? JNNVUBCMF Q<MD<=G@N ><I =@ DIA@MM@? AMJH OC@ @SKM@NNDJI JI OC@ MDBCO
C<I? ND?@.
AGOCJPBC DO DN IJO I@>@NN<MT OJ RMDO@ OC@ OTK@ APGGT <N @.B. JNNVUBCMF(JOU), JNNVUBCMF
IJMH<GGT O<F@N OC@ <>OP<G OTK@ RDOCDI K<M@IOC@N@N. 1C@ JPOKPO JA OC@ AJGGJRDIB KMJBM<H
?@HJINOM<O@N OC<O OC@ APGG I<H@N JA OC@ OTK@N JA OC@ OCM@@ Q<MD<=G@N <M@ DI A<>O OC@ N<H@:
JNQPSU TUE.TUEJP;
WPJE NBJO()
!??GF34;>;FK
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
161
\
JNNVUBCMF JOGFSSFE5ZQF = 0;
JNNVUBCMF JOU FYQMJDJU5ZQF = 1;
JNNVUBCMF(JOU) XIPMF5ZQF = 2;
XSJUFMO(UZQFPG(JOGFSSFE5ZQF).TUSJOHPG);
XSJUFMO(UZQFPG(FYQMJDJU5ZQF).TUSJOHPG);
XSJUFMO(UZQFPG(XIPMF5ZQF).TUSJOHPG);
^
1C@ <>OP<G I<H@ JA OC@ OTK@ DI>GP?@N JNNVUBCMF:
JNNVUBCMF(JOU)
JNNVUBCMF(JOU)
JNNVUBCMF(JOU)
1C@ OTK@ OC<O DN NK@>DAD@? RDOCDI OC@ K<M@IOC@N@N C<N NDBIDAD><I>@. 4@ RDGG N@@ OCDN =@GJR
RC@I ?DN>PNNDIB OC@ DHHPO<=DGDOT JA OC@ RCJG@ NGD>@ QN. DON @G@H@ION.
DPOTU variables 36.1.3
1CDN F@TRJM? C<N OC@ N<H@ @AA@>O <N JNNVUBCMF JI Q<MD<=G@N. DPOTU Q<MD<=G@N ><IIJO =@
HJ?DAD@?:
DPOTU IBMG = UPUBM / 2;
IBMG = 10; // j DPNQJMBUJPO &3303
& M@>JHH@I? OC<O TJP KM@A@M JNNVUBCMF JQ@M DPOTU RC@I ?@ADIDIB Q<MD<=G@N. 1C@ M@<NJI DN
OC<O JNNVUBCMF Q<MD<=G@N ><I =@ K<NN@? OJ API>ODJIN <N OC@DM JNNVUBCMF K<M<H@O@MN. 4@ RDGG
N@@ OCDN =@GJR.
Immutable parameters
36.2
&O DN KJNND=G@ AJM API>ODJIN OJ KMJHDN@ OC<O OC@T ?J IJO HJ?DAT >@MO<DI K<M<H@O@MN OC<O OC@T
O<F@. 1C@ >JHKDG@M BP<M<IO@@N OC<O OCDN KMJHDN@ DN @IAJM>@?. B@AJM@ N@@DIB CJR OCDN DN
<>CD@Q@?, G@O'N ADMNO N@@ OC<O API>ODJIN ><I DI?@@? HJ?DAT OC@ @G@H@ION JA NGD>@N OC<O <M@
K<NN@? <N <MBPH@ION OJ OCJN@ API>ODJI.
AN TJP RJPG? M@H@H=@M AMJH OC@ 0GD>@N <I? ,OC@M AMM<T #@<OPM@N >C<KO@M, NGD>@N ?J IJO JRI
@G@H@ION =PO KMJQD?@ <>>@NN OJ OC@H. 1C@M@ H<T =@ HJM@ OC<I JI@ NGD>@ <O < BDQ@I ODH@ OC<O
KMJQD?@ <>>@NN OJ OC@ N<H@ @G@H@ION.
AGOCJPBC OC@ @S<HKG@N DI OCDN N@>ODJI AJ>PN JIGT JI NGD>@N, OCDN OJKD> DN <KKGD><=G@ OJ
<NNJ>D<ODQ@ <MM<TN <I? >G<NN@N <N R@GG =@><PN@ OC@T OJJ <M@ D787D7@57 FKB7E.
A NGD>@ OC<O DN K<NN@? <N < API>ODJI <MBPH@IO DN IJO OC@ NGD>@ OC<O OC@ API>ODJI DN ><GG@? RDOC.
1C@ <MBPH@IO DN < >JKT JA OC@ <>OP<G NGD>@:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
JOU<> TMJDF = < 10, 20, 30, 40 >; // 1
IBMWF(TMJDF);
XSJUFMO(TMJDF);
^
WPJE IBMWF(JOU<> OVNCFST) // 2
\
!??GF34;>;FK
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
162
GPSFBDI (SFG OVNCFS; OVNCFST) \
OVNCFS /= 2;
^
^
4C@I KMJBM<H @S@>PODJI @IO@MN OC@ IBMWF() API>ODJI, OC@M@ <M@ ORJ NGD>@N OC<O KMJQD?@
<>>@NN OJ OC@ N<H@ AJPM @G@H@ION:
1. 1C@ NGD>@ I<H@? TMJDF OC<O DN ?@ADI@? DI NBJO(), RCD>C DN K<NN@? OJ IBMWF() <N DON
<MBPH@IO
2. 1C@ NGD>@ I<H@? OVNCFST OC<O IBMWF() M@>@DQ@N <N DON <MBPH@IO, RCD>C KMJQD?@N <>>@NN OJ
OC@ N<H@ @G@H@ION <N TMJDF
AGNJ ?P@ OJ OC@ SFG F@TRJM? DI OC@ GPSFBDI GJJK, OC@ Q<GP@N JA OC@ JMDBDI<G (<I? OC@ JIGT)
@G@H@ION B@O C<GQ@?:
<5, 10, 15, 20>
&O DN PN@APG AJM API>ODJIN OJ =@ <=G@ OJ HJ?DAT OC@ @G@H@ION JA OC@ NGD>@N OC<O <M@ K<NN@? <N
<MBPH@ION. 0JH@ API>ODJIN @SDNO EPNO AJM OC<O KPMKJN@ <N C<N =@@I N@@I DI OCDN @S<HKG@.
1C@ >JHKDG@M ?J@N IJO <GGJR K<NNDIB JNNVUBCMF Q<MD<=G@N <N <MBPH@ION OJ NP>C API>ODJIN,
=@><PN@ DO DN DHKJNND=G@ OJ HJ?DAT <I DHHPO<=G@ Q<MD<=G@:
JNNVUBCMF JOU<> TMJDF = < 10, 20, 30, 40 >;
IBMWF(TMJDF); // j DPNQJMBUJPO &3303
1C@ >JHKDG<ODJI @MMJM DI?D><O@N OC<O < Q<MD<=G@ JA OTK@ JNNVUBCMF(JOU<>) ><IIJO =@ PN@? <N
<I <MBPH@IO JA OTK@ JOU<>:
&SSPS: GVODUJPO EFOFNF.IBMWF (JOU<> OVNCFST) JT OPU DBMMBCMF
VTJOH BSHVNFOU UZQFT (JNNVUBCMF(JOU<>))
DPOTU parameters 36.2.1
&O DN DHKJMO<IO <I? I<OPM<G OC<O JNNVUBCMF Q<MD<=G@N =@ KM@Q@IO@? AMJH =@DIB K<NN@? OJ
API>ODJIN GDF@ IBMWF(), RCD>C HJ?DAT OC@DM <MBPH@ION. %JR@Q@M, DO RJPG? =@ < GDHDO<ODJI DA
OC@T >JPG? IJO =@ K<NN@? OJ API>ODJIN OC<O ?J IJO HJ?DAT OC@DM <MBPH@ION DI <IT R<T:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
JNNVUBCMF JOU<> TMJDF = < 10, 20, 30, 40 >;
QSJOU(TMJDF); // j DPNQJMBUJPO &3303
^
WPJE QSJOU(JOU<> TMJDF)
\
XSJUFGMO("%T FMFNFOUT: ", TMJDF.MFOHUI);
GPSFBDI (J, FMFNFOU; TMJDF) \
XSJUFGMO("%T: %T", J, FMFNFOU);
^
^
&O ?J@N IJO H<F@ N@IN@ <=JQ@ OC<O < NGD>@ DN KM@Q@IO@? AMJH =@DIB KMDIO@? EPNO =@><PN@ DO DN
JNNVUBCMF. 1C@ KMJK@M R<T JA ?@<GDIB RDOC OCDN NDOP<ODJI DN DPOTU K<M<H@O@MN.
!??GF34;>;FK
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
163
1C@ DPOTU F@TRJM? NK@>DAD@N OC<O < Q<MD<=G@ RJPG? IJO =@ HJ?DAD@? OCMJPBC F:3F B3DF;5G>3D
D787D7@57 (@.B. < NGD>@) JA OC<O Q<MD<=G@. 0K@>DATDIB < K<M<H@O@M <N DPOTU BP<M<IO@@N OC<O OC@
@G@H@ION JA OC@ NGD>@ RJPG? IJO =@ HJ?DAD@? DIND?@ OC@ API>ODJI. ,I>@ QSJOU() KMJQD?@N OCDN
BP<M<IO@@, OC@ KMJBM<H ><I IJR =@ >JHKDG@?:
QSJOU(TMJDF); // OPX DPNQJMFT
// ...
WPJE QSJOU(DPOTU JOU<> TMJDF)
1CDN BP<M<IO@@ <GGJRN K<NNDIB =JOC HPO<=G@ <I? JNNVUBCMF Q<MD<=G@N <N <MBPH@ION:
JNNVUBCMF JOU<> TMJDF = < 10, 20, 30, 40 >;
QSJOU(TMJDF); // DPNQJMFT
JOU<> NVUBCMF4MJDF = < 7, 8 >;
QSJOU(NVUBCMF4MJDF); // DPNQJMFT
A K<M<H@O@M OC<O DN IJO HJ?DAD@? DI < API>ODJI =PO DN IJO NK@>DAD@? <N DPOTU M@?P>@N OC@
PN<=DGDOT JA OC<O API>ODJI. A??DODJI<GGT, DPOTU K<M<H@O@MN KMJQD?@ PN@APG DIAJMH<ODJI OJ OC@
KMJBM<HH@M. (IJRDIB OC<O < Q<MD<=G@ RDGG IJO =@ HJ?DAD@? RC@I K<NN@? OJ < API>ODJI H<F@N
OC@ >J?@ @<ND@M OJ PI?@MNO<I?. &O <GNJ KM@Q@ION KJO@IOD<G @MMJMN =@><PN@ OC@ >JHKDG@M
KM@Q@ION HJ?DAD><ODJIN OJ DPOTU K<M<H@O@MN:
WPJE QSJOU(DPOTU JOU<> TMJDF)
\
TMJDF<0> = 42; // j DPNQJMBUJPO &3303
1C@ KMJBM<HH@M RJPG? @DOC@M M@<GDU@ OC@ HDNO<F@ DI OC@ API>ODJI JM RJPG? M@OCDIF OC@ ?@NDBI
<I? K@MC<KN M@HJQ@ OC@ DPOTU NK@>DAD@M.
1C@ A<>O OC<O DPOTU K<M<H@O@MN ><I <>>@KO =JOC HPO<=G@ <I? JNNVUBCMF Q<MD<=G@N C<N <I
DIO@M@NODIB >JIN@LP@I>@. 1CDN DN @SKG<DI@? DI OC@ "0CJPG? < K<M<H@O@M =@ DPOTU JM
JNNVUBCMF?" N@>ODJI =@GJR.
JNNVUBCMF parameters 36.2.2
AN R@ C<Q@ N@@I <=JQ@, =JOC HPO<=G@ <I? JNNVUBCMF Q<MD<=G@N ><I =@ K<NN@? OJ API>ODJIN <N
OC@DM DPOTU K<M<H@O@MN. &I < R<T, DPOTU K<M<H@O@MN <M@ R@G>JHDIB.
&I >JIOM<NO, JNNVUBCMF K<M<H@O@MN =MDIB < NOMJIB M@LPDM@H@IO: ,IGT JNNVUBCMF Q<MD<=G@N
><I =@ K<NN@? OJ API>ODJIN <N OC@DM JNNVUBCMF K<M<H@O@MN:
WPJE GVOD(JNNVUBCMF JOU<> TMJDF)
\
/* ... */
^
WPJE NBJO()
\
JNNVUBCMF JOU<> JNN4MJDF = < 1, 2 >;
JOU<> TMJDF = < 8, 9 >;
GVOD(JNN4MJDF); // DPNQJMFT
GVOD(TMJDF); // j DPNQJMBUJPO &3303
^
#JM OC<O M@<NJI, OC@ JNNVUBCMF NK@>DAD@M NCJPG? =@ PN@? JIGT RC@I OCDN M@LPDM@H@IO DN
I@>@NN<MT. 4@ C<Q@ DI?@@? =@@I PNDIB OC@ JNNVUBCMF NK@>DAD@M DI?DM@>OGT OCMJPBC >@MO<DI
NOMDIB OTK@N. 1CDN RDGG =@ >JQ@M@? =@GJR.
!??GF34;>;FK
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
164
4@ C<Q@ N@@I OC<O OC@ K<M<H@O@MN OC<O <M@ NK@>DAD@? <N DPOTU JM JNNVUBCMF KMJHDN@ IJO OJ
HJ?DAT F:7 35FG3> H3D;34>7 OC<O DN K<NN@? <N <I <MBPH@IO. 1CDN DN M@G@Q<IO JIGT AJM M@A@M@I>@
OTK@N =@><PN@ JIGT OC@I OC@M@ DN F:7 35FG3> H3D;34>7 OJ O<GF <=JPO OC@ DHHPO<=DGDOT JA.
'787D7@57 FKB7E <I? H3>G7 FKB7E RDGG =@ >JQ@M@? DI G<O@M >C<KO@MN. AHJIB OC@ OTK@N OC<O R@
C<Q@ N@@I NJ A<M, JIGT NGD>@N <I? <NNJ>D<ODQ@ <MM<TN <M@ M@A@M@I>@ OTK@N; OC@ JOC@MN <M@ Q<GP@
OTK@N.
Should a parameter be DPOTU or JNNVUBCMF? 36.2.3
1C@ ORJ N@>ODJIN <=JQ@ H<T BDQ@ OC@ DHKM@NNDJI OC<O =@DIB HJM@ AG@SD=G@, DPOTU K<M<H@O@MN
NCJPG? =@ KM@A@MM@? JQ@M JNNVUBCMF K<M<H@O@MN. 1CDN DN IJO <GR<TN OMP@.
DPOTU 7D3E7E OC@ DIAJMH<ODJI <=JPO RC@OC@M OC@ JMDBDI<G Q<MD<=G@ DN HPO<=G@ JM JNNVUBCMF.
1CDN DIAJMH<ODJI DN CD??@I @Q@I AMJH OC@ >JHKDG@M.
A >JIN@LP@I>@ JA OCDN A<>O DN OC<O DPOTU K<M<H@O@MN ><IIJO =@ K<NN@? <N <MBPH@ION OJ
API>ODJIN OC<O O<F@ JNNVUBCMF K<M<H@O@MN. #JM @S<HKG@, GPP() =@GJR ><IIJO K<NN DON DPOTU
K<M<H@O@M OJ CBS():
WPJE NBJO()
\
/* 5IF PSJHJOBM WBSJBCMF JT JNNVUBCMF */
JNNVUBCMF JOU<> TMJDF = < 10, 20, 30, 40 >;
GPP(TMJDF);
^
/* " GVODUJPO UIBU UBLFT JUT QBSBNFUFS BT DPOTU, JO PSEFS UP
* CF NPSF VTFGVM. */
WPJE GPP(DPOTU JOU<> TMJDF)
\
CBS(TMJDF); // j DPNQJMBUJPO &3303
^
/* " GVODUJPO UIBU UBLFT JUT QBSBNFUFS BT JNNVUBCMF GPS B
* QMBVTJCMF SFBTPO. */
WPJE CBS(JNNVUBCMF JOU<> TMJDF)
\
/* ... */
^
CBS() M@LPDM@N OC<O OC@ K<M<H@O@M DN JNNVUBCMF. %JR@Q@M, DO DN IJO FIJRI RC@OC@M OC@
JMDBDI<G Q<MD<=G@ OC<O GPP()'N DPOTU K<M<H@O@M M@A@M@I>@N DN JNNVUBCMF JM IJO.
Note: !F ;E 5>73D ;@ F:7 5A67 34AH7 F:3F F:7 AD;9;@3> H3D;34>7 ;@ main() ;E immutable.
AI7H7D, F:7 5A?B;>7D 5A?B;>7E 8G@5F;A@E ;@6;H;6G3>>K I;F:AGF D793D6 FA 3>> A8 F:7 B>357E F:3F
8G@5F;A@ ;E 53>>76 8DA?. )A F:7 5A?B;>7D, F:7 slice B3D3?7F7D A8 foo() ?3K 47 D787DD;@9 FA 3
?GF34>7 H3D;34>7 AD 3@ immutable A@7.
A NJGPODJI RJPG? =@ OJ ><GG CBS() RDOC <I DHHPO<=G@ >JKT JA OC@ K<M<H@O@M:
WPJE GPP(DPOTU JOU<> TMJDF)
\
CBS(TMJDF.JEVQ);
^
AGOCJPBC OC<O DN < N@IND=G@ NJGPODJI, DO ?J@N C<Q@ OC@ >JNO JA >JKTDIB, RCD>C RJPG? =@ R<NO@APG
DI OC@ ><N@ RC@M@ OC@ JMDBDI<G Q<MD<=G@ C<N =@@I JNNVUBCMF OJ =@BDI RDOC.
AAO@M OCDN <I<GTNDN, DO NCJPG? =@ >G@<M OC<O O<FDIB K<M<H@O@MN <GR<TN <N DPOTU ?J@N IJO N@@H
OJ =@ OC@ =@NO <KKMJ<>C DI @Q@MT NDOP<ODJI. AAO@M <GG, DA GPP()'N K<M<H@O@M C<N =@@I ?@ADI@? <N
JNNVUBCMF, OC@M@ RJPG? IJO =@ <IT I@@? OJ >JKT DO =@AJM@ ><GGDIB CBS():
!??GF34;>;FK
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
165
WPJE GPP(JNNVUBCMF JOU<> TMJDF) // 5IJT UJNF JNNVUBCMF
\
CBS(TMJDF); // $PQZJOH JT OPU OFFEFE BOZNPSF
^
AGOCJPBC OC@ >J?@ >JHKDG@N, ?@ADIDIB OC@ K<M<H@O@M <N JNNVUBCMF C<N < NDHDG<M >JNO: 1CDN
ODH@ <I DHHPO<=G@ >JKT JA OC@ JMDBDI<G Q<MD<=G@ DN I@@?@? RC@I ><GGDIB GPP(), DA OC<O Q<MD<=G@
R@M@ IJO DHHPO<=G@ OJ =@BDI RDOC:
GPP(NVUBCMF4MJDF.JEVQ);
1@HKG<O@N ><I KMJQD?@ C@GK. (4@ RDGG N@@ O@HKG<O@N DI G<O@M >C<KO@MN.) AGOCJPBC & ?JI'O @SK@>O
TJP OJ APGGT PI?@MNO<I? OC@ AJGGJRDIB API>ODJI <O OCDN KJDIO DI OC@ =JJF, & RDGG KM@N@IO DO <N <
NJGPODJI OJ OCDN KMJ=G@H. 1C@ AJGGJRDIB API>ODJI O@HKG<O@ GPP() ><I =@ ><GG@? =JOC =T
HPO<=G@ <I? =T JNNVUBCMF Q<MD<=G@N. 1C@ K<M<H@O@M RJPG? =@ >JKD@? JIGT DA OC@ JMDBDI<G
Q<MD<=G@ C<N =@@I HPO<=G@; IJ >JKTDIB RJPG? O<F@ KG<>@ DA DO C<N =@@I JNNVUBCMF:
JNQPSU TUE.DPOW;
// ...
/* #FDBVTF JU JT B UFNQMBUF, GPP() DBO CF DBMMFE CZ NVUBCMF
* BOE JNNVUBCMF WBSJBCMFT. */
WPJE GPP(5)(5<> TMJDF)
\
/* 'UP()' EPFT OPU NBLF B DPQZ JG UIF PSJHJOBM WBSJBCMF JT
* BMSFBEZ JNNVUBCMF. */
CBS(UP!(JNNVUBCMF 5<>)(TMJDF));
^
Immutability of the slice versus the elements
36.3
4@ C<Q@ N@@I <=JQ@ OC<O OC@ OTK@ JA <I JNNVUBCMF NGD>@ C<N =@@I KMDIO@? <N
JNNVUBCMF(JOU<>). AN OC@ K<M@IOC@N@N <AO@M JNNVUBCMF DI?D><O@, DO DN OC@ @IODM@ NGD>@ OC<O DN
JNNVUBCMF. 0P>C < NGD>@ ><IIJO =@ HJ?DAD@? DI <IT R<T: @G@H@ION H<T IJO =@ <??@? JM
M@HJQ@?, OC@DM Q<GP@N H<T IJO =@ HJ?DAD@?, <I? OC@ NGD>@ H<T IJO NO<MO KMJQD?DIB <>>@NN OJ <
?DAA@M@IO N@O JA @G@H@ION:
JNNVUBCMF JOU<> JNN4MJDF = < 1, 2 >;
JNN4MJDF _= 3; // j DPNQJMBUJPO &3303
JNN4MJDF<0> = 3; // j DPNQJMBUJPO &3303
JNN4MJDF.MFOHUI = 1; // j DPNQJMBUJPO &3303
JNNVUBCMF JOU<> JNN0UIFS4MJDF = < 10, 11 >;
JNN4MJDF = JNN0UIFS4MJDF; // j DPNQJMBUJPO &3303
1<FDIB DHHPO<=DGDOT OJ OC<O @SOM@H@ H<T IJO =@ NPDO<=G@ DI @Q@MT ><N@. &I HJNO ><N@N, RC<O DN
DHKJMO<IO DN OC@ DHHPO<=DGDOT JA EPNO OC@ @G@H@ION. 0DI>@ < NGD>@ DN EPNO <I <>>@NN OJJG OJ
@G@H@ION, DO NCJPG? IJO H<OO@M OJ H<F@ >C<IB@N OJ OC@ NGD>@ DON@GA <N GJIB <N OC@ @G@H@ION <M@
IJO HJ?DAD@?.
1J NK@>DAT OC<O JIGT OC@ @G@H@ION <M@ DHHPO<=G@, JIGT OC@ @G@H@IO OTK@ DN RMDOO@I RDOCDI
K<M@IOC@N@N. 4C@I OC@ >J?@ DN HJ?DAD@? <>>JM?DIBGT, IJR JIGT OC@ @G@H@ION <M@ DHHPO<=G@,
IJO OC@ NGD>@ DON@GA:
JNNVUBCMF(JOU)<> JNN4MJDF = < 1, 2 >;
JNN4MJDF _= 3; // DBO BEE FMFNFOUT
JNN4MJDF<0> = 3; // j DPNQJMBUJPO &3303
JNN4MJDF.MFOHUI = 1; // DBO MPTF FMFNFOUT
!??GF34;>;FK
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
166
JNNVUBCMF JOU<> JNN0UIFS4MJDF = < 10, 11 >;
JNN4MJDF = JNN0UIFS4MJDF; // DBO QSPWJEF BDDFTT UP PUIFS FMFNFOUT
AGOCJPBC OC@ ORJ NTIO<S@N <M@ Q@MT NDHDG<M, OC@T C<Q@ ?DAA@M@IO H@<IDIBN. 1J NPHH<MDU@:
JNNVUBCMF JOU<> B = <1>; /* /FJUIFS UIF FMFNFOUT OPS UIF
* TMJDF DBO CF NPEJGJFE */
JNNVUBCMF(JOU<>) C = <1>; /* 5IF TBNF NFBOJOH BT BCPWF */
JNNVUBCMF(JOU)<> D = <1>; /* 5IF FMFNFOUT DBOOPU CF
* NPEJGJFE CVU UIF TMJDF DBO CF */
1CDN ?DNODI>ODJI C<Q@ =@@I DI @AA@>O DI NJH@ JA OC@ KMJBM<HN OC<O R@ C<Q@ RMDOO@I NJ A<M. AN
TJP H<T M@H@H=@M, OC@ OCM@@ NOMDIB <GD<N@N DIQJGQ@ DHHPO<=DGDOT:
t TUSJOH DN <I <GD<N AJM JNNVUBCMF(DIBS)<>
t XTUSJOH DN <I <GD<N AJM JNNVUBCMF(XDIBS)<>
t ETUSJOH DN <I <GD<N AJM JNNVUBCMF(EDIBS)<>
)DF@RDN@, NOMDIB GDO@M<GN <M@ DHHPO<=G@ <N R@GG:
t 1C@ OTK@ JA GDO@M<G "IFMMP"D DN TUSJOH
t 1C@ OTK@ JA GDO@M<G "IFMMP"X DN XTUSJOH
t 1C@ OTK@ JA GDO@M<G "IFMMP"E DN ETUSJOH
A>>JM?DIB OJ OC@N@ ?@ADIDODJIN, ! NOMDIBN <M@ IJMH<GGT <MM<TN JA ;??GF34>7 5:3D35F7DE.
.EVQ and .JEVQ 36.3.1
1C@M@ H<T =@ HDNH<O>C@N DI DHHPO<=DGDOT RC@I NOMDIBN <M@ K<NN@? OJ API>ODJIN <N
K<M<H@O@MN. 1C@ .EVQ <I? .JEVQ KMJK@MOD@N H<F@ >JKD@N JA <MM<TN RDOC OC@ ?@NDM@?
DHHPO<=DGDOT:
t .EVQ H<F@N < HPO<=G@ >JKT JA OC@ <MM<T; DON I<H@ >JH@N AMJH "?PKGD><O@"
t .JEVQ H<F@N <I DHHPO<=G@ >JKT JA OC@ <MM<T
#JM @S<HKG@, < API>ODJI OC<O DINDNON JI OC@ DHHPO<=DGDOT JA < K<M<H@O@M H<T C<Q@ OJ =@ ><GG@?
RDOC <I DHHPO<=G@ >JKT JA < HPO<=G@ NOMDIB:
WPJE GPP(TUSJOH T)
\
// ...
^
WPJE NBJO()
\
DIBS<> TBMVUBUJPO;
GPP(TBMVUBUJPO); // j DPNQJMBUJPO &3303
GPP(TBMVUBUJPO.JEVQ); // j UIJT DPNQJMFT
^
How to use
36.4
t AN < B@I@M<G MPG@, KM@A@M DHHPO<=G@ Q<MD<=G@N JQ@M HPO<=G@ JI@N.
t !@ADI@ >JINO<IO Q<GP@N <N FOVN DA OC@DM Q<GP@N ><I =@ ><G>PG<O@? <O >JHKDG@ ODH@. #JM
@S<HKG@, OC@ >JINO<IO Q<GP@ JA E75A@6E B7D ?;@GF7 ><I =@ <I FOVN:
FOVN JOU TFDPOET1FS.JOVUF = 60;
!??GF34;>;FK
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
167
1C@M@ DN IJ I@@? OJ NK@>DAT OC@ OTK@ @SKGD>DOGT DA DO ><I =@ DIA@MM@? AMJH OC@ MDBCO C<I?
ND?@:
FOVN TFDPOET1FS.JOVUF = 60;
t JIND?@M OC@ CD??@I >JNO JA FOVN <MM<TN <I? FOVN <NNJ>D<ODQ@ <MM<TN. !@ADI@ OC@H <N
JNNVUBCMF Q<MD<=G@N DA OC@ <MM<TN <M@ G<MB@ <I? OC@T <M@ PN@? HJM@ OC<I JI>@ DI OC@
KMJBM<H.
t 0K@>DAT Q<MD<=G@N <N JNNVUBCMF DA OC@DM Q<GP@N RDGG I@Q@M >C<IB@ =PO ><IIJO =@ FIJRI <O
>JHKDG@ ODH@. AB<DI, OC@ OTK@ ><I =@ DIA@MM@?:
JNNVUBCMF HVFTT = SFBE@JOU("8IBU JT ZPVS HVFTT");
t &A < API>ODJI ?J@N IJO HJ?DAT < K<M<H@O@M, NK@>DAT OC<O K<M<H@O@M <N DPOTU. 1CDN RJPG?
<GGJR =JOC HPO<=G@ <I? JNNVUBCMF Q<MD<=G@N OJ =@ K<NN@? <N <MBPH@ION:
WPJE GPP(DPOTU DIBS<> T)
\
// ...
^
WPJE NBJO()
\
DIBS<> NVUBCMF4USJOH;
TUSJOH JNNVUBCMF4USJOH;
GPP(NVUBCMF4USJOH); // j DPNQJMFT
GPP(JNNVUBCMF4USJOH); // j DPNQJMFT
^
t #JGGJRDIB AMJH OC@ KM@QDJPN BPD?@GDI@, >JIND?@M OC<O DPOTU K<M<H@O@MN ><IIJO =@ K<NN@?
OJ API>ODJIN O<FDIB JNNVUBCMF. 0@@ OC@ N@>ODJI ODOG@? "0CJPG? < K<M<H@O@M =@ DPOTU JM
JNNVUBCMF?" <=JQ@.
t &A OC@ API>ODJI HJ?DAD@N < K<M<H@O@M, G@<Q@ OC<O K<M<H@O@M <N HPO<=G@ (DPOTU JM
JNNVUBCMF RJPG? IJO <GGJR HJ?DAD><ODJIN <ITR<T):
JNQPSU TUE.TUEJP;
WPJE SFWFSTF(EDIBS<> T)
\
GPSFBDI (J; 0 .. T.MFOHUI / 2) \
JNNVUBCMF UFNQ = T<J>;
T<J> = T<$ - 1 - J>;
T<$ - 1 - J> = UFNQ;
^
^
WPJE NBJO()
\
EDIBS<> TBMVUBUJPO = "IFMMP"E.EVQ;
SFWFSTF(TBMVUBUJPO);
XSJUFMO(TBMVUBUJPO);
^
1C@ JPOKPO:
PMMFI
!??GF34;>;FK
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
168
Summary
36.5
t FOVN Q<MD<=G@N M@KM@N@IO DHHPO<=G@ >JI>@KON OC<O <M@ FIJRI <O >JHKDG@ ODH@.
t JNNVUBCMF Q<MD<=G@N M@KM@N@IO DHHPO<=G@ >JI>@KON OC<O HPNO =@ ><G>PG<O@? <O MPI ODH@.
t DPOTU K<M<H@O@MN <M@ OC@ JI@N OC<O API>ODJIN ?J IJO HJ?DAT. BJOC HPO<=G@ <I? JNNVUBCMF
Q<MD<=G@N ><I =@ K<NN@? <N <MBPH@ION JA DPOTU K<M<H@O@MN.
t JNNVUBCMF K<M<H@O@MN <M@ OC@ JI@N OC<O API>ODJIN NK@>DAD><GGT M@LPDM@ OC@H OJ =@ NJ. ,IGT
JNNVUBCMF Q<MD<=G@N ><I =@ K<NN@? <N <MBPH@ION JA JNNVUBCMF K<M<H@O@MN.
t JNNVUBCMF(JOU<>) NK@>DAD@N OC<O I@DOC@M OC@ NGD>@ IJM DON @G@H@ION ><I =@ HJ?DAD@?.
t JNNVUBCMF(JOU)<> NK@>DAD@N OC<O JIGT OC@ @G@H@ION ><IIJO =@ HJ?DAD@?.
t &HHPO<=DGDOT DN < Q@MT KJR@MAPG OJJG DI KMJBM<HHDIB. &O DN C@GKAPG OJ FIJR OC<O Q<MD<=G@N
<I? K<M<H@O@MN ?J IJO >C<IB@ DI NK@>DAD> >JIO@SON <I? ?PMDIB NK@>DAD> JK@M<ODJIN.
!??GF34;>;FK
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
169
Function Parameters 37
1CDN >C<KO@M >JQ@MN ?DAA@M@IO R<TN JA ?@ADIDIB API>ODJI K<M<H@O@MN.
0JH@ JA OC@ >JI>@KON JA OCDN >C<KO@M C<Q@ <GM@<?T <KK@<M@? DI KM@QDJPN >C<KO@MN. #JM
@S<HKG@, OC@ SFG F@TRJM? OC<O R@ C<Q@ N@@I DI OC@ GPSFBDI )JJK >C<KO@M R<N H<FDIB <>OP<G
@G@H@ION <Q<DG<=G@ DI GPSFBDI GJJKN <N JKKJN@? OJ >JKD@N JA OCJN@ @G@H@ION.
A??DODJI<GGT, R@ C<Q@ >JQ@M@? OC@ DPOTU <I? JNNVUBCMF F@TRJM?N DI OC@ KM@QDJPN >C<KO@M.
4@ C<Q@ RMDOO@I API>ODJIN OC<O KMJ?P>@? M@NPGON =T H<FDIB PN@ JA OC@DM K<M<H@O@MN. #JM
@S<HKG@, OC@ AJGGJRDIB API>ODJI PN@N DON K<M<H@O@MN DI < ><G>PG<ODJI:
EPVCMF XFJHIUFE"WFSBHF(EPVCMF RVJ[(SBEF, EPVCMF GJOBM(SBEF)
\
SFUVSO RVJ[(SBEF * 0.4 + GJOBM(SBEF * 0.6;
^
1C<O API>ODJI ><G>PG<O@N OC@ <Q@M<B@ BM<?@ =T O<FDIB 40% JA OC@ LPDU BM<?@ <I? 60% JA OC@
ADI<G BM<?@. %@M@ DN CJR DO H<T =@ PN@?:
JOU RVJ[(SBEF = 76;
JOU GJOBM(SBEF = 80;
XSJUFGMO("8FJHUIFE BWFSBHF: %2.0G",
XFJHIUFE"WFSBHF(RVJ[(SBEF, GJOBM(SBEF));
Most parameters are copied
37.1
&I OC@ >J?@ <=JQ@, OC@ ORJ Q<MD<=G@N <M@ K<NN@? <N <MBPH@ION OJ XFJHIUFE"WFSBHF() <I? OC@
API>ODJI GE7E DON K<M<H@O@MN. 1CDN A<>O H<T BDQ@ OC@ A<GN@ DHKM@NNDJI OC<O OC@ API>ODJI PN@N
OC@ <>OP<G Q<MD<=G@N OC<O C<Q@ =@@I K<NN@? <N <MBPH@ION. &I M@<GDOT, RC<O OC@ API>ODJI PN@N
<M@ 5AB;7E JA OCJN@ Q<MD<=G@N.
1CDN ?DNODI>ODJI DN DHKJMO<IO =@><PN@ HJ?DATDIB < K<M<H@O@M >C<IB@N JIGT OC@ >JKT. 1CDN ><I
=@ N@@I DI OC@ AJGGJRDIB API>ODJI OC<O DN OMTDIB OJ HJ?DAT DON K<M<H@O@M (D.@. H<FDIB < ND?@
@AA@>O). )@O'N <NNPH@ OC<O OC@ AJGGJRDIB API>ODJI DN RMDOO@I AJM M@?P>DIB OC@ @I@MBT JA < B<H@
>C<M<>O@M:
WPJE SFEVDF&OFSHZ(EPVCMF FOFSHZ)
\
FOFSHZ /= 4;
^
%@M@ DN < KMJBM<H OC<O O@NON SFEVDF&OFSHZ():
JNQPSU TUE.TUEJP;
WPJE SFEVDF&OFSHZ(EPVCMF FOFSHZ)
\
FOFSHZ /= 4;
^
WPJE NBJO()
\
EPVCMF FOFSHZ = 100;
SFEVDF&OFSHZ(FOFSHZ);
XSJUFMO("/FX FOFSHZ: ", FOFSHZ);
^
FG@5F;A@ &3D3?7F7DE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
170
1C@ JPOKPO:
/FX FOFSHZ: 100 l /PU DIBOHFE!
AGOCJPBC SFEVDF&OFSHZ() ?MJKN OC@ Q<GP@ JA DON K<M<H@O@M OJ < LP<MO@M JA DON JMDBDI<G Q<GP@,
OC@ Q<MD<=G@ FOFSHZ DI NBJO() ?J@N IJO >C<IB@. 1C@ M@<NJI AJM OCDN DN OC<O OC@ FOFSHZ
Q<MD<=G@ DI NBJO() <I? OC@ FOFSHZ K<M<H@O@M JA SFEVDF&OFSHZ() <M@ N@K<M<O@; OC@
K<M<H@O@M DN < >JKT JA OC@ Q<MD<=G@ DI NBJO().
1J J=N@MQ@ OCDN HJM@ >GJN@GT, G@O'N DIN@MO NJH@ XSJUFMO() @SKM@NNDJIN:
JNQPSU TUE.TUEJP;
WPJE SFEVDF&OFSHZ(EPVCMF FOFSHZ)
\
XSJUFMO("&OUFSFE UIF GVODUJPO : ", FOFSHZ);
FOFSHZ /= 4;
XSJUFMO("-FBWJOH UIF GVODUJPO : ", FOFSHZ);
^
WPJE NBJO()
\
EPVCMF FOFSHZ = 100;
XSJUFMO("$BMMJOH UIF GVODUJPO : ", FOFSHZ);
SFEVDF&OFSHZ(FOFSHZ);
XSJUFMO("3FUVSOFE GSPN UIF GVODUJPO: ", FOFSHZ);
^
1C@ JPOKPO:
$BMMJOH UIF GVODUJPO : 100
&OUFSFE UIF GVODUJPO : 100
-FBWJOH UIF GVODUJPO : 25 l UIF QBSBNFUFS DIBOHFT,
3FUVSOFE GSPN UIF GVODUJPO: 100 l UIF WBSJBCMF SFNBJOT UIF TBNF
Objects of reference types are not copied
37.2
"G@H@ION JA NGD>@N <I? <NNJ>D<ODQ@ <MM<TN, <I? >G<NN J=E@>ON <M@ IJO >JKD@? RC@I K<NN@? <N
K<M<H@O@MN. 0P>C Q<MD<=G@N <M@ K<NN@? OJ API>ODJIN <N D787D7@57E. &I @AA@>O, OC@ K<M<H@O@M
=@>JH@N < M@A@M@I>@ OJ OC@ <>OP<G J=E@>O; HJ?DAD><ODJIN H<?@ OCMJPBC OC@ M@A@M@I>@ HJ?DAD@N
OC@ <>OP<G J=E@>O.
B@DIB NGD>@N, NOMDIBN <M@ K<NN@? <N M@A@M@I>@N <N R@GG:
JNQPSU TUE.TUEJP;
WPJE NBLF'JSTU-FUUFS%PU(EDIBS<> TUS)
\
TUS<0> = '.';
^
WPJE NBJO()
\
EDIBS<> TUS = "BCD"E.EVQ;
NBLF'JSTU-FUUFS%PU(TUS);
XSJUFMO(TUS);
^
1C@ >C<IB@ H<?@ OJ OC@ ADMNO @G@H@IO JA OC@ K<M<H@O@M <AA@>ON OC@ <>OP<G @G@H@IO DI NBJO():
FG@5F;A@ &3D3?7F7DE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
171
.CD
Parameter qualifiers
37.3
-<M<H@O@MN <M@ K<NN@? OJ API>ODJIN <>>JM?DIB OJ OC@ B@I@M<G MPG@N ?@N>MD=@? <=JQ@:
t 3<GP@ OTK@N <M@ >JKD@?
t /@A@M@I>@ OTK@N <M@ K<NN@? <N M@A@M@I>@N
1CJN@ <M@ OC@ ?@A<PGO MPG@N OC<O <M@ <KKGD@? RC@I K<M<H@O@M ?@ADIDODJIN C<Q@ IJ LP<GDAD@MN.
1C@ AJGGJRDIB LP<GDAD@MN >C<IB@ OC@ R<T K<M<H@O@MN <M@ K<NN@? <I? RC<O JK@M<ODJIN <M@
<GGJR@? JI OC@H.
JO 37.3.1
4@ C<Q@ N@@I OC<O API>ODJIN <M@ < A<>DGDOT OC<O KMJ?P>@N Q<GP@N <I? ><I C<Q@ ND?@ @AA@>ON. 1C@
JO F@TRJM? NK@>DAD@N OC<O < K<M<H@O@M DN BJDIB =@ PN@? JIGT <N <I DIKPO ?<O< =T OCDN A<>DGDOT.
0P>C K<M<H@O@MN ><IIJO =@ HJ?DAD@? =T OC@ API>ODJI:
JNQPSU TUE.TUEJP;
EPVCMF XFJHIUFE5PUBM(JO EPVCMF DVSSFOU5PUBM,
JO EPVCMF XFJHIU,
JO EPVCMF BEEFOE)
\
SFUVSO DVSSFOU5PUBM + (XFJHIU * BEEFOE);
^
WPJE NBJO()
\
XSJUFMO(XFJHIUFE5PUBM(1.23, 4.56, 7.89));
^
JO K<M<H@O@MN ><IIJO =@ HJ?DAD@?:
WPJE GPP(JO JOU WBMVF)
\
WBMVF = 1; // j DPNQJMBUJPO &3303
^
JO DN OC@ @LPDQ<G@IO JA DPOTU TDPQF.
PVU 37.3.2
4@ C<Q@ N@@I OC<O OC@ API>ODJIN M@OPMI OC@ Q<GP@N OC<O OC@T KMJ?P>@ <N OC@DM M@OPMI Q<GP@N.
1C@ A<>O OC<O OC@M@ DN JIGT JI@ M@OPMI Q<GP@ DN NJH@ODH@N GDHDODIB <N NJH@ API>ODJIN H<T I@@?
OJ KMJ?P>@ HJM@ OC<I JI@ M@NPGO. (Note: !F ;E 35FG3>>K BAEE;4>7 FA D7FGD@ ?AD7 F:3@ A@7 D7EG>F
4K 678;@;@9 F:7 D7FGD@ FKB7 3E 3 Tuple AD 3 struct. ,7 I;>> E77 F:7E7 873FGD7E ;@ >3F7D
5:3BF7DE.)
1C@ PVU F@TRJM? H<F@N DO KJNND=G@ AJM API>ODJIN OJ M@OPMI M@NPGON OCMJPBC OC@DM K<M<H@O@MN.
4C@I PVU K<M<H@O@MN <M@ HJ?DAD@? RDOCDI OC@ API>ODJI, OCJN@ HJ?DAD><ODJIN @AA@>O OC@ <>OP<G
Q<MD<=G@ OC<O C<N =@@I K<NN@? OJ OC@ API>ODJI. &I < N@IN@, OC@ <NNDBI@? Q<GP@ BJ@N AGF JA OC@
API>ODJI OCMJPBC PVU K<M<H@O@MN.
)@O'N C<Q@ < GJJF <O < API>ODJI OC<O ?DQD?@N ORJ IPH=@MN <I? KMJ?P>@N =JOC OC@ LPJOD@IO <I?
OC@ M@H<DI?@M. 1C@ M@OPMI Q<GP@ ><I =@ PN@? AJM OC@ LPJOD@IO <I? OC@ M@H<DI?@M ><I =@
M@OPMI@? OCMJPBC <I PVU K<M<H@O@M:
FG@5F;A@ &3D3?7F7DE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
172
JNQPSU TUE.TUEJP;
JOU EJWJEF(JO JOU EJWJEFOE, JO JOU EJWJTPS, PVU JOU SFNBJOEFS)
\
SFNBJOEFS = EJWJEFOE % EJWJTPS;
SFUVSO EJWJEFOE / EJWJTPS;
^
WPJE NBJO()
\
JOU SFNBJOEFS;
JOU SFTVMU = EJWJEF(7, 3, SFNBJOEFS);
XSJUFMO("SFTVMU: ", SFTVMU, ", SFNBJOEFS: ", SFNBJOEFS);
^
*J?DATDIB OC@ SFNBJOEFS K<M<H@O@M JA OC@ API>ODJI HJ?DAD@N OC@ SFNBJOEFS Q<MD<=G@ DI
NBJO() (OC@DM I<H@N I@@? IJO =@ OC@ N<H@):
SFTVMU: 2, SFNBJOEFS: 1
/@B<M?G@NN JA OC@DM Q<GP@N <O OC@ ><GG NDO@, PVU K<M<H@O@MN <M@ ADMNO <POJH<OD><GGT <NNDBI@? OJ
OC@ .JOJU Q<GP@ JA OC@DM OTK@N:
JNQPSU TUE.TUEJP;
WPJE GPP(PVU JOU QBSBNFUFS)
\
XSJUFMO(""GUFS FOUFSJOH UIF GVODUJPO : ", QBSBNFUFS);
^
WPJE NBJO()
\
JOU WBSJBCMF = 100;
XSJUFMO("#FGPSF DBMMJOH UIF GVODUJPO : ", WBSJBCMF);
GPP(WBSJBCMF);
XSJUFMO(""GUFS SFUVSOJOH GSPN UIF GVODUJPO: ", WBSJBCMF);
^
"Q@I OCJPBC OC@M@ DN IJ @SKGD>DO <NNDBIH@IO OJ OC@ K<M<H@O@M DI OC@ API>ODJI, OC@ Q<GP@ JA OC@
K<M<H@O@M <POJH<OD><GGT =@>JH@N OC@ DIDOD<G Q<GP@ JA JOU, <AA@>ODIB OC@ Q<MD<=G@ DI NBJO():
#FGPSF DBMMJOH UIF GVODUJPO : 100
"GUFS FOUFSJOH UIF GVODUJPO : 0 l UIF WBMVF PG JOU.JOJU
"GUFS SFUVSOJOH GSPN UIF GVODUJPO: 0
AN OCDN ?@HJINOM<O@N, PVU K<M<H@O@MN ><IIJO K<NN Q<GP@N DIOJ API>ODJIN; OC@T <M@ NOMD>OGT AJM
K<NNDIB Q<GP@N JPO JA API>ODJIN.
4@ RDGG N@@ DI G<O@M >C<KO@MN OC<O M@OPMIDIB 5VQMF JM TUSVDU OTK@N H<T =@ =@OO@M <GO@MI<ODQ@N
OJ PVU K<M<H@O@MN.
DPOTU 37.3.3
AN R@ C<Q@ N@@I DI OC@ KM@QDJPN >C<KO@M, DPOTU BP<M<IO@@N OC<O OC@ K<M<H@O@M RDGG IJO =@
HJ?DAD@? DIND?@ OC@ API>ODJI. &O DN C@GKAPG AJM OC@ KMJBM<HH@MN OJ FIJR OC<O >@MO<DI Q<MD<=G@N
RDGG IJO =@ >C<IB@? =T OC@ API>ODJI. DPOTU <GNJ H<F@N API>ODJIN HJM@ PN@APG =T <GGJRDIB
?GF34>7, DPOTU <I? JNNVUBCMF Q<MD<=G@N OJ =@ K<NN@? <N K<M<H@O@MN:
FG@5F;A@ &3D3?7F7DE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
173
JNQPSU TUE.TUEJP;
EDIBS MBTU-FUUFS(DPOTU EDIBS<> TUS)
\
SFUVSO TUS<$ - 1>;
^
WPJE NBJO()
\
XSJUFMO(MBTU-FUUFS("DPOTUBOU"));
^
JNNVUBCMF 37.3.4
AN R@ C<Q@ N@@I DI OC@ KM@QDJPN >C<KO@M, JNNVUBCMF H<F@N API>ODJIN M@LPDM@ OC<O >@MO<DI
<MBPH@ION HPNO >JINDNO JA JNNVUBCMF @G@H@ION. B@><PN@ JA NP>C < M@LPDM@H@IO, OC@
AJGGJRDIB API>ODJI ><I JIGT =@ ><GG@? RDOC JNNVUBCMF NOMDIBN (@.B. RDOC NOMDIB GDO@M<GN):
JNQPSU TUE.TUEJP;
EDIBS<> NJY(JNNVUBCMF EDIBS<> GJSTU,
JNNVUBCMF EDIBS<> TFDPOE)
\
EDIBS<> SFTVMU;
JOU J;
GPS (J = 0; (J < GJSTU.MFOHUI) && (J < TFDPOE.MFOHUI); ++J) \
SFTVMU _= GJSTU<J>;
SFTVMU _= TFDPOE<J>;
^
SFTVMU _= GJSTU<J..$>;
SFTVMU _= TFDPOE<J..$>;
SFUVSO SFTVMU;
^
WPJE NBJO()
\
XSJUFMO(NJY(")&--0", "XPSME"));
^
0DI>@ DO =MDIBN < M@LPDM@H@IO JI OC@ K<M<H@O@M, JNNVUBCMF K<M<H@O@MN NCJPG? =@ PN@? JIGT
RC@I M@<GGT I@>@NN<MT. B@><PN@ DO DN HJM@ R@G>JHDIB, DPOTU DN HJM@ PN@APG.
SFG 37.3.5
1CDN F@TRJM? <GGJRN K<NNDIB < K<M<H@O@M =T M@A@M@I>@ @Q@I OCJPBC DO RJPG? IJMH<GGT =@
K<NN@? <N < >JKT.
#JM OC@ SFEVDF&OFSHZ() API>ODJI <=JQ@ OJ =@ <=G@ OJ HJ?DAT OC@ <>OP<G Q<MD<=G@ OC<O DN
K<NN@? <N DON <MBPH@IO, DO HPNO O<F@ OC@ K<M<H@O@M <N SFG:
JNQPSU TUE.TUEJP;
WPJE SFEVDF&OFSHZ(SFG EPVCMF FOFSHZ)
\
FOFSHZ /= 4;
^
WPJE NBJO()
\
EPVCMF FOFSHZ = 100;
SFEVDF&OFSHZ(FOFSHZ);
FG@5F;A@ &3D3?7F7DE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
174
XSJUFMO("/FX FOFSHZ: ", FOFSHZ);
^
1CDN ODH@, OC@ HJ?DAD><ODJI OC<O DN H<?@ OJ OC@ K<M<H@O@M >C<IB@N OC@ <>OP<G Q<MD<=G@ OC<O DN
K<NN@? OJ OC@ API>ODJI DI NBJO():
/FX FOFSHZ: 25
AN ><I =@ N@@I, SFG K<M<H@O@MN ><I =@ PN@? =JOC <N DIKPO <I? JPOKPO. SFG K<M<H@O@MN ><I
<GNJ =@ OCJPBCO JA <N <GD<N@N JA <>OP<G Q<MD<=G@N. 1C@ API>ODJI K<M<H@O@M FOFSHZ <=JQ@ DN <I
<GD<N JA OC@ Q<MD<=G@ FOFSHZ DI NBJO().
0DHDG<M OJ PVU K<M<H@O@MN, SFG K<M<H@O@MN <GGJR API>ODJIN H<F@ ND?@ @AA@>ON <N R@GG. &I A<>O,
SFEVDF&OFSHZ() ?J@N IJO M@OPMI < Q<GP@; DO JIGT H<F@N < ND?@ @AA@>O OCMJPBC DON JIGT
K<M<H@O@M.
1C@ KMJBM<HHDIB NOTG@ ><GG@? 8G@5F;A@3> BDA9D3??;@9 A<QJMN M@OPMI Q<GP@N JQ@M ND?@ @AA@>ON,
NJ HP>C NJ OC<O NJH@ API>ODJI<G KMJBM<HHDIB G<IBP<B@N ?J IJO <GGJR ND?@ @AA@>ON <O <GG. 1CDN
DN =@><PN@ API>ODJIN OC<O KMJ?P>@ M@NPGON BGD7>K OCMJPBC OC@DM M@OPMI Q<GP@N <M@ @<ND@M OJ
PI?@MNO<I?, OJ RMDO@ >JMM@>OGT, <I? OJ H<DIO<DI.
1C@ N<H@ API>ODJI ><I =@ RMDOO@I DI API>ODJI<G KMJBM<HHDIB NOTG@ =T M@OPMIDIB OC@ M@NPGO,
DINO@<? JA H<FDIB < ND?@ @AA@>O. 1C@ K<MON JA OC@ KMJBM<H OC<O C<N >C<IB@? <M@ CDBCGDBCO@? DI
T@GGJR:
JNQPSU TUE.TUEJP;
EPVCMF SFEVDFE&OFSHZ(EPVCMF FOFSHZ)
\
SFUVSO FOFSHZ / 4;
^
WPJE NBJO()
\
EPVCMF FOFSHZ = 100;
FOFSHZ = SFEVDFE&OFSHZ(FOFSHZ);
XSJUFMO("/FX FOFSHZ: ", FOFSHZ);
^
+JO@ OC@ >C<IB@ DI OC@ I<H@ JA OC@ API>ODJI <N R@GG. +JR DO DN < IJPI <N JKKJN@? OJ < Q@M=.
JOPVU 37.3.6
!@NKDO@ DON I<H@ >JINDNODIB JA JO <I? PVU, OCDN F@TRJM? ?J@N IJO H@<I =JOC DIKPO <I?
JPOKPO; R@ C<Q@ <GM@<?T N@@I OC<O OC@ F@TRJM? OC<O <>CD@Q@N =JOC DIKPO <I? JPOKPO DN SFG.
JOPVU ><MMD@N OC@ ?GF34;>;FK JA OC@ K<M<H@O@M OJ OC@ M@OPMI OTK@. &A OC@ K<M<H@O@M DN ?GF34>7,
DPOTU, JM JNNVUBCMF, OC@I OC@ M@OPMI Q<GP@ DN ?GF34>7, DPOTU, JM JNNVUBCMF, M@NK@>ODQ@GT.
1J N@@ CJR JOPVU C@GKN DI KMJBM<HN, G@O'N GJJF <O < API>ODJI OC<O M@OPMIN < NGD>@ C<QDIB JI@
G@NN @G@H@IO AMJH =JOC OC@ AMJIO <I? OC@ =<>F JA OC@ JMDBDI<G NGD>@:
JNQPSU TUE.TUEJP;
JOU<> USJNNFE(JOU<> TMJDF)
\
JG (TMJDF.MFOHUI) \
--TMJDF.MFOHUI; // USJN GSPN UIF FOE
JG (TMJDF.MFOHUI) \
FG@5F;A@ &3D3?7F7DE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
175
TMJDF = TMJDF<1 .. $>; // USJN GSPN UIF CFHJOOJOH
^
^
SFUVSO TMJDF;
^
WPJE NBJO()
\
JOU<> OVNCFST = < 5, 6, 7, 8, 9 >;
XSJUFMO(USJNNFE(OVNCFST));
^
1C@ JPOKPO:
<6, 7, 8>
A>>JM?DIB OJ OC@ KM@QDJPN >C<KO@M, DI JM?@M AJM OC@ API>ODJI OJ =@ HJM@ PN@APG, DON K<M<H@O@M
NCJPG? =@ DPOTU(JOU)<> =@><PN@ OC@ K<M<H@O@M DN IJO =@DIB HJ?DAD@? DIND?@ OC@ API>ODJI.
(+JO@ OC<O OC@M@ DN IJ C<MH DI HJ?DATDIB OC@ K<M<H@O@M NGD>@ DON@GA <N DO DN < >JKT JA OC@
JMDBDI<G <MBPH@IO.)
%JR@Q@M, ?@ADIDIB OC@ API>ODJI OC<O R<T RJPG? ><PN@ < >JHKDG<ODJI @MMJM:
JOU<> USJNNFE(DPOTU(JOU)<> TMJDF)
\
// ...
SFUVSO TMJDF; // j DPNQJMBUJPO &3303
^
1C@ >JHKDG<ODJI @MMJM DI?D><O@N OC<O < NGD>@ JA DPOTU(JOU) ><IIJO =@ M@OPMI@? <N < NGD>@ JA
HPO<=G@ JOU:
&SSPS: DBOOPU JNQMJDJUMZ DPOWFSU FYQSFTTJPO (TMJDF) PG UZQF
DPOTU(JOU)<> UP JOU<>
,I@ H<T OCDIF OC<O NK@>DATDIB OC@ M@OPMI OTK@ <GNJ <N DPOTU(JOU)<> H<T =@ OC@ NJGPODJI:
DPOTU(JOU)<> USJNNFE(DPOTU(JOU)<> TMJDF)
\
// ...
SFUVSO TMJDF; // OPX DPNQJMFT
^
AGOCJPBC OC@ >J?@ ><I IJR =@ >JHKDG@?, DO =MDIBN < GDHDO<ODJI: "Q@I DA OC@ API>ODJI DN ><GG@?
RDOC < NGD>@ JA ?GF34>7 @G@H@ION, OC@ M@OPMI@? NGD>@ @I?N PK >JINDNODIB JA DPOTU @G@H@ION. 1J
N@@ CJR GDHDODIB OCDN RJPG? =@, G@O'N GJJF <O OC@ AJGGJRDIB >J?@ OC<O DN OMTDIB OJ HJ?DAT OC@
@G@H@ION JA < NGD>@ JOC@M OC<I OC@ JI@N <O OC@ AMJIO <I? <O OC@ =<>F:
JOU<> OVNCFST = < 5, 6, 7, 8, 9 >;
JOU<> NJEEMF = USJNNFE(OVNCFST); // j DPNQJMBUJPO &3303
NJEEMF<> *= 10;
&O RJPG? =@ @SK@>O@? OC<O OC@ M@OPMI@? NGD>@ JA OTK@ DPOTU(JOU)<> ><IIJO =@ <NNDBI@? OJ <
NGD>@ JA OTK@ JOU<>:
&SSPS: DBOOPU JNQMJDJUMZ DPOWFSU FYQSFTTJPO (USJNNFE(OVNCFST))
PG UZQF DPOTU(JOU)<> UP JOU<>
FG@5F;A@ &3D3?7F7DE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
176
%JR@Q@M, NDI>@ OC@ JMDBDI<G NGD>@ DN JA HPO<=G@ @G@H@ION OJ =@BDI RDOC, OCDN GDHDO<ODJI ><I =@
N@@I <N <MODAD>D<G <I? PIAJMOPI<O@. JOPVU NJGQ@N OCDN HPO<=DGDOT KMJ=G@H <=JPO K<M<H@O@MN
<I? M@OPMI Q<GP@N. &O DN NK@>DAD@? =JOC JI OC@ K<M<H@O@M <I? JI OC@ M@OPMI OTK@ <I? ><MMD@N
OC@ HPO<=DGDOT JA OC@ AJMH@M OJ OC@ G<OO@M:
JOPVU(JOU)<> USJNNFE(JOPVU(JOU)<> TMJDF)
\
// ...
SFUVSO TMJDF;
^
4DOC OC<O >C<IB@, OC@ N<H@ API>ODJI ><I IJR =@ ><GG@? RDOC ?GF34>7, DPOTU, <I? JNNVUBCMF
NGD>@N:
\
JOU<> OVNCFST = < 5, 6, 7, 8, 9 >;
// 5IF SFUVSO UZQF JT TMJDF PG NVUBCMF FMFNFOUT
JOU<> NJEEMF = USJNNFE(OVNCFST);
NJEEMF<> *= 10;
XSJUFMO(NJEEMF);
^
\
JNNVUBCMF JOU<> OVNCFST = < 10, 11, 12 >;
// 5IF SFUVSO UZQF JT TMJDF PG JNNVUBCMF FMFNFOUT
JNNVUBCMF JOU<> NJEEMF = USJNNFE(OVNCFST);
XSJUFMO(NJEEMF);
^
\
DPOTU JOU<> OVNCFST = < 13, 14, 15, 16 >;
// 5IF SFUVSO UZQF JT TMJDF PG DPOTU FMFNFOUT
DPOTU JOU<> NJEEMF = USJNNFE(OVNCFST);
XSJUFMO(NJEEMF);
^
MB[Z 37.3.7
&O DN I<OPM<G OJ @SK@>O OC<O <MBPH@ION <M@ @Q<GP<O@? 478AD7 @IO@MDIB API>ODJIN OC<O PN@ OCJN@
<MBPH@ION. #JM @S<HKG@, OC@ API>ODJI BEE() =@GJR DN ><GG@? RDOC OC@ M@OPMI Q<GP@N JA ORJ
JOC@M API>ODJIN:
SFTVMU = BEE(BO"NPVOU(), BOPUIFS"NPVOU());
&I JM?@M AJM BEE() OJ =@ ><GG@?, ADMNO BO"NPVOU() <I? BOPUIFS"NPVOU() HPNO =@ ><GG@?.
,OC@MRDN@, OC@ Q<GP@N OC<O BEE() I@@?N RJPG? IJO =@ <Q<DG<=G@.
"Q<GP<ODIB <MBPH@ION =@AJM@ ><GGDIB < API>ODJI DN 7397D.
%JR@Q@M, NJH@ K<M<H@O@MN H<T IJO B@O < >C<I>@ OJ =@ PN@? DI OC@ API>ODJI <O <GG ?@K@I?DIB
JI >@MO<DI >JI?DODJIN. &I NP>C ><N@N, OC@ @<B@M @Q<GPODJIN JA OC@ <MBPH@ION RJPG? =@
R<NO@APG.
)@O'N GJJF <O NP>C < KMJBM<H OC<O PN@N JI@ JA DON K<M<H@O@MN JIGT RC@I I@@?@?. 1C@ AJGGJRDIB
API>ODJI OMD@N OJ B@O OC@ M@LPDM@? IPH=@M JA @BBN ADMNO AMJH OC@ M@AMDB@M<OJM. 4C@I OC@M@ DN
NPAAD>D@IO IPH=@M JA @BBN DI OC@M@, DO ?J@NI'O I@@? OJ FIJR OC@ IPH=@M JA @BBN OC<O OC@
I@DBC=JMN C<Q@:
WPJE NBLF0NFMFU(JO JOU SFRVJSFE&HHT,
JO JOU FHHT*O'SJEHF,
JO JOU FHHT"U/FJHICPST)
\
FG@5F;A@ &3D3?7F7DE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
177
XSJUFGMO("/FFE UP NBLF B %T-FHH PNFMFU", SFRVJSFE&HHT);
JG (SFRVJSFE&HHT <= FHHT*O'SJEHF) \
XSJUFMO("5BLF BMM PG UIF FHHT GSPN UIF GSJEHF");
^ FMTF JG (SFRVJSFE&HHT <= (FHHT*O'SJEHF + FHHT"U/FJHICPST)) \
XSJUFGMO("5BLF %T FHHT GSPN UIF GSJEHF"
" BOE %T FHHT GSPN UIF OFJHICPST",
FHHT*O'SJEHF, SFRVJSFE&HHT - FHHT*O'SJEHF);
^ FMTF \
XSJUFGMO("$BOOPU NBLF B %T-PNFMFU", SFRVJSFE&HHT);
^
^
A??DODJI<GGT, G@O'N <NNPH@ OC<O OC@M@ DN < API>ODJI OC<O ><G>PG<O@N <I? M@OPMIN OC@ OJO<G IPH=@M
JA @BBN <Q<DG<=G@ <O OC@ I@DBC=JMN. #JM ?@HJINOM<ODJI KPMKJN@N, OC@ API>ODJI KMDION NJH@
DIAJMH<ODJI <N R@GG:
JOU DPVOU&HHT(JO JOU<TUSJOH> BWBJMBCMF&HHT)
\
JOU SFTVMU;
GPSFBDI (OFJHICPS, DPVOU; BWBJMBCMF&HHT) \
XSJUFMO(OFJHICPS, ": ", DPVOU, " FHHT");
SFTVMU += DPVOU;
^
XSJUFGMO("" UPUBM PG %T FHHT BWBJMBCMF BU UIF OFJHICPST",
SFTVMU);
SFUVSO SFTVMU;
^
1C<O API>ODJI DO@M<O@N JQ@M OC@ @G@H@ION JA <I <NNJ>D<ODQ@ <MM<T <I? <??N PK <GG JA OC@ @BB
>JPION.
1C@ NBLF0NFMFU() API>ODJI ><I =@ ><GG@? RDOC OC@ M@OPMI Q<GP@ JA DPVOU&HHT() <N DI OC@
AJGGJRDIB KMJBM<H:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
JOU<TUSJOH> BU/FJHCPST = < "+BOF":5, "+JN":3, "#JMM":7 >;
NBLF0NFMFU(2, 5, DPVOU&HHT(BU/FJHCPST));
^
AN N@@I DI OC@ JPOKPO JA OC@ KMJBM<H, ADMNO DPVOU&HHT() API>ODJI DN @S@>PO@? <I? OC@I
NBLF0NFMFU() DN ><GG@?:
+BOF: 5 FHHT n
#JMM: 7 FHHT o DPVOUJOH UIF FHHT BU UIF OFJHICPST
+JN: 3 FHHT p
" UPUBM PG 15 FHHT BWBJMBCMF BU UIF OFJHICPST
/FFE UP NBLF B 2-FHH PNFMFU
5BLF BMM PG UIF FHHT GSPN UIF GSJEHF
AGOCJPBC DO DN KJNND=G@ OJ H<F@ OC@ ORJ-@BB JH@G@O RDOC JIGT OC@ @BBN DI OC@ AMD?B@, OC@ @BBN
<O OC@ I@DBC=JMN C<Q@ <GM@<?T =@@I >JPIO@? @<B@MGT.
FG@5F;A@ &3D3?7F7DE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
178
1C@ MB[Z F@TRJM? NK@>DAD@N OC<O <I @SKM@NNDJI OC<O C<N =@@I K<NN@? OJ < API>ODJI <N <
K<M<H@O@M RDGG =@ @Q<GP<O@? JIGT DA <I? RC@I I@@?@?:
WPJE NBLF0NFMFU(JO JOU SFRVJSFE&HHT,
JO JOU FHHT*O'SJEHF,
MB[Z JOU FHHT"U/FJHICPST)
\
// ... UIF CPEZ PG UIF GVODUJPO JT UIF TBNF BT CFGPSF ...
^
AN N@@I DI OC@ I@R JPOKPO, RC@I OC@ IPH=@M JA @BBN DI OC@ AMD?B@ N<ODNAT OC@ M@LPDM@? @BBN,
OC@ >JPIODIB JA OC@ @BBN <O OC@ I@DBC=JMN ?J@N IJO C<KK@I <ITHJM@:
/FFE UP NBLF B 2-FHH PNFMFU
5BLF BMM PG UIF FHHT GSPN UIF GSJEHF
1C<O >JPIO RJPG? NODGG C<KK@I DA I@@?@?. #JM @S<HKG@, G@O'N O<F@ < GJJF <O < ><N@ RC@M@ OC@
M@LPDM@? @BBN <M@ HJM@ OC<I OC@ @BBN DI OC@ AMD?B@:
NBLF0NFMFU(9, 5, DPVOU&HHT(BU/FJHCPST));
1CDN ODH@ OC@ OJO<G IPH=@M JA @BBN <O OC@ I@DBC=JMN DN M@<GGT I@@?@?:
/FFE UP NBLF B 9-FHH PNFMFU
+BOF: 5 FHHT
#JMM: 7 FHHT
+JN: 3 FHHT
" UPUBM PG 15 FHHT BWBJMBCMF BU UIF OFJHICPST
5BLF 5 FHHT GSPN UIF GSJEHF BOE 4 FHHT GSPN UIF OFJHICPST
1C@ Q<GP@N JA MB[Z K<M<H@O@MN <M@ @Q<GP<O@? @Q@MT ODH@ OC<O OC@T <M@ PN@? DI OC@ API>ODJI.
#JM @S<HKG@, =@><PN@ OC@ MB[Z K<M<H@O@M JA OC@ AJGGJRDIB API>ODJI DN PN@? OCM@@ ODH@N DI OC@
API>ODJI, OC@ @SKM@NNDJI OC<O KMJQD?@N DON Q<GP@ DN @Q<GP<O@? OCM@@ ODH@N:
JNQPSU TUE.TUEJP;
JOU WBMVF0G"SHVNFOU()
\
XSJUFMO("$BMDVMBUJOH...");
SFUVSO 1;
^
WPJE GVODUJPO8JUI-B[Z1BSBNFUFS(MB[Z JOU WBMVF)
\
JOU SFTVMU = WBMVF + WBMVF + WBMVF;
XSJUFMO(SFTVMU);
^
WPJE NBJO()
\
GVODUJPO8JUI-B[Z1BSBNFUFS(WBMVF0G"SHVNFOU());
^
1C@ JPOKPO
FG@5F;A@ &3D3?7F7DE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
179
$BMDVMBUJOH
$BMDVMBUJOH
$BMDVMBUJOH
3
TDPQF 37.3.8
1CDN F@TRJM? NK@>DAD@N OC<O < K<M<H@O@M RDGG IJO =@ PN@? =@TJI? OC@ N>JK@ JA OC@ API>ODJI:
JOU<> HMPCBM4MJDF;
JOU<> GPP(TDPQF JOU<> QBSBNFUFS)
\
HMPCBM4MJDF = QBSBNFUFS; // j DPNQJMBUJPO &3303
SFUVSO QBSBNFUFS; // j DPNQJMBUJPO &3303
^
WPJE NBJO()
\
JOU<> TMJDF = < 10, 20 >;
JOU<> SFTVMU = GPP(TMJDF);
^
1C<O API>ODJI =M@<F@N OC@ KMJHDN@ JA TDPQF DI ORJ KG<>@N: &O <NNDBIN OC@ K<M<H@O@M OJ <
BGJ=<G Q<MD<=G@ <I? M@OPMIN DO. BJOC JA OCJN@ RJPG? H<F@ DO KJNND=G@ AJM OC@ K<M<H@O@M OJ =@
<>>@NN@? <AO@M OC@ API>ODJI ADIDNC@N.
(Note: 6?6 2.062, F:7 5A?B;>7D F:3F :3E 477@ GE76 I:7@ 5A?B;>;@9 F:7 7J3?B>7E ;@ F:;E
5:3BF7D 6A7E @AF EGBBADF F:7 scope =7KIAD6. )
TIBSFE 37.3.9
1CDN F@TRJM? M@LPDM@N OC<O OC@ K<M<H@O@M DN NC<M<=G@ =@OR@@I OCM@<?N:
WPJE GPP(TIBSFE JOU<> J)
\
// ...
^
WPJE NBJO()
\
JOU<> OVNCFST = < 10, 20 >;
GPP(OVNCFST); // j DPNQJMBUJPO &3303
^
1C@ KMJBM<H <=JQ@ ><IIJO =@ >JHKDG@? =@><PN@ OC@ <MBPH@IO DN IJO TIBSFE. 1C@ KMJBM<H
><I =@ >JHKDG@? RDOC OC@ AJGGJRDIB >C<IB@:
TIBSFE JOU<> OVNCFST = < 10, 20 >;
GPP(OVNCFST); // OPX DPNQJMFT
4@ RDGG PN@ OC@ TIBSFE F@TRJM? G<O@M DI OC@ !<O< 0C<MDIB JI>PMM@I>T >C<KO@M.
Summary
37.4
t &3D3?7F7D DN RC<O OC@ API>ODJI O<F@N AMJH DON ><GG@M OJ <>>JHKGDNC DON O<NF.
t AD9G?7@F DN <I @SKM@NNDJI (@.B. < Q<MD<=G@) OC<O DN K<NN@? OJ < API>ODJI <N < K<M<H@O@M.
t AMBPH@ION JA Q<GP@ OTK@N <M@ K<NN@? =T->JKT; <MBPH@ION JA M@A@M@I>@ OTK@N <M@ K<NN@?
=T-M@A@M@I>@. (4@ RDGG N@@ OCDN OJKD> <B<DI DI G<O@M >C<KO@MN.)
FG@5F;A@ &3D3?7F7DE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
180
t JO NK@>DAD@N OC<O OC@ K<M<H@O@M DN JIGT AJM ?<O< DIKPO.
t PVU NK@>DAD@N OC<O OC@ K<M<H@O@M DN JIGT AJM ?<O< JPOKPO.
t SFG NK@>DAD@N OC<O OC@ K<M<H@O@M DN AJM ?<O< DIKPO <I? ?<O< JPOKPO.
t DPOTU BP<M<IO@@N OC<O OC@ K<M<H@O@M DN IJO HJ?DAD@? DIND?@ OC@ API>ODJI.
t JNNVUBCMF M@LPDM@N OC<O OC@ <MBPH@IO DN JNNVUBCMF.
t JOPVU <KK@<MN =JOC <O OC@ K<M<H@O@M <I? OC@ M@OPMI OTK@, <I? OM<INA@MN OC@ ?GF34;>;FK JA
OC@ K<M<H@O@M OJ OC@ M@OPMI OTK@.
t MB[Z @Q<GP<O@N OC@ K<M<H@O@M RC@I (<I? @Q@MT ODH@) DON Q<GP@ DN <>OP<GGT PN@?.
t TDPQF BP<M<IO@@N OC<O IJ M@A@M@I>@ OJ OC@ K<M<H@O@M RDGG =@ G@<F@? AMJH OC@ API>ODJI.
t TIBSFE M@LPDM@N OC<O OC@ K<M<H@O@M DN TIBSFE.
Exercise
37.5
t 1C@ AJGGJRDIB KMJBM<H DN OMTDIB OJ NR<K OC@ Q<GP@N JA ORJ <MBPH@ION:
JNQPSU TUE.TUEJP;
WPJE TXBQ(JOU GJSTU, JOU TFDPOE)
\
JOU UFNQ = GJSTU;
GJSTU = TFDPOE;
TFDPOE = UFNQ;
^
WPJE NBJO()
\
JOU B = 1;
JOU C = 2;
TXBQ(B, C);
XSJUFMO(B, ' ', C);
^
1C@ KMJBM<H ?J@N IJO C<Q@ <IT @AA@>O JI B JM C:
1 2 l OPU TXBQQFE
#DS OC@ API>ODJI NJ OC<O OC@ Q<GP@N JA B <I? C <M@ NR<KK@?.
... F:7 EA>GF;A@
FG@5F;A@ &3D3?7F7DE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
181
Lazy Operators 38
)<UT @Q<GP<ODJIN DN <=JPO ?@G<TDIB @S@>PODJIN JA @SKM@NNDJIN PIODG OC@ M@NPGON JA OCJN@
@SKM@NNDJIN <M@ I@@?@?. )<UT @Q<GP<ODJIN <M@ <HJIB OC@ API?<H@IO<G A@<OPM@N JA NJH@ JA OC@
KMJBM<HHDIB G<IBP<B@N.
+<OPM<GGT, ?@G<TDIB @S@>PODJIN JA @SKM@NNDJIN PIODG OC@DM M@NPGON <M@ M@<GGT I@>@NN<MT H<T
H<F@ KMJBM<HN MPI A<NO@M.
A >JI>@KO OC<O DN NDHDG<M OJ G<UT @Q<GP<ODJIN DN OC@ NCJMO>PO =@C<QDJM JA OCM@@ JK@M<OJMN:
t ]] (AD) JK@M<OJM: 1C@ N@>JI? @SKM@NNDJI DN @Q<GP<O@? JIGT DA OC@ ADMNO @SKM@NNDJI DN GBMTF.
JG (BO&YQSFTTJPO() ]] NBZ/PU#F&WBMVBUFE()) \
// ...
^
&A OC@ M@NPGO JA BO&YQSFTTJPO() DN USVF, OC@ M@NPGO JA OC@ ]] @SKM@NNDJI DN <GNJ USVF
<I? OC@ N@>JI? @SKM@NNDJI DN IJO @Q<GP<O@?.
t && (3@6) JK@M<OJM: 1C@ N@>JI? @SKM@NNDJI DN @Q<GP<O@? JIGT DA OC@ ADMNO @SKM@NNDJI DN USVF.
JG (BO&YQSFTTJPO() && NBZ/PU#F&WBMVBUFE()) \
// ...
^
&A OC@ M@NPGO JA BO&YQSFTTJPO() DN GBMTF, OC@ M@NPGO JA OC@ && @SKM@NNDJI DN <GNJ
GBMTF <I? OC@ N@>JI? @SKM@NNDJI DN IJO @Q<GP<O@?.
t : (F7D@3DK) JK@M<OJM: "DOC@M OC@ ADMNO JM OC@ N@>JI? @SKM@NNDJI DN @Q<GP<O@? ?@K@I?DIB JI
RC@OC@M OC@ >JI?DODJI DN USVF JM GBMTF, M@NK@>ODQ@GT.
JOU J = DPOEJUJPO() FJUIFS5IJT() : PS5IJT();
1C@ G<UDI@NN JA OC@N@ JK@M<OJMN DN IJO JIGT <=JPO K@MAJMH<I>@. 0JH@ODH@N, @Q<GP<ODIB JI@ JA
OC@ @SKM@NNDJIN ><I =@ <I @MMJM.
#JM @S<HKG@, OC@ ;8 F:7 8;DEF >7FF7D ;E A >JI?DODJI >C@>F =@GJR RJPG? =@ <I @MMJM RC@I OC@
NOMDIB DN @HKOT:
ETUSJOH T;
// ...
JG (T<0> == '"') \
// ...
^
&I JM?@M OJ <>>@NN OC@ U@MJ-DI?@S@? @G@H@IO JA T, DO HPNO ADMNO =@ @INPM@? OC<O OC@ NOMDIB ?J@N
C<Q@ NP>C <I @G@H@IO. #JM OC<O M@<NJI, OC@ AJGGJRDIB >JI?DODJI >C@>F HJQ@N OC<O KJO@IOD<GGT
@MMJI@JPN GJBD><G @SKM@NNDJI OJ OC@ MDBCO-C<I? ND?@ JA OC@ && JK@M<OJM OJ @INPM@ OC<O DO RDGG =@
@Q<GP<O@? JIGT RC@I DO DN N<A@ OJ ?J NJ:
ETUSJOH T;
// ...
JG ((T.MFOHUI >= 1) && (T<0> == '"')) \
// ...
^
)<UT @Q<GP<ODJIN ><I =@ <>CD@Q@? =T API>ODJI KJDIO@MN, ?@G@B<O@N, <I? M<IB@N <N R@GG. 4@ RDGG
N@@ OC@N@ DI G<O@M >C<KO@M.
"3LK %B7D3FADE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
182
Program Environment 39
4@ C<Q@ N@@I OC<O NBJO() DN < API>ODJI. -MJBM<H @S@>PODJI NO<MON RDOC NBJO() <I? =M<I>C@N
OJ JOC@M API>ODJIN AMJH OC@M@. 1C@ ?@ADIDODJI JA NBJO() OC<O R@ C<Q@ PN@? NJ A<M C<N =@@I OC@
AJGGJRDIB:
WPJE NBJO()
A>>JM?DIB OJ OC<O ?@ADIDODJI NBJO() ?J@N IJO O<F@ <IT K<M<H@O@MN <I? ?J@N IJO M@OPMI <
Q<GP@. &O DN <>OP<GGT IJO KJNND=G@ OJ IJO M@OPMI < Q<GP@, =@><PN@ @IQDMJIH@ION OC<O NO<MO
KMJBM<HN @SK@>O M@OPMI Q<GP@N AMJH OC@H. AGOCJPBC DO DN KJNND=G@ OJ NK@>DAT OC@ M@OPMI OTK@ JA
NBJO() <N WPJE, DO ?J@N DI?@@? M@OPMI < Q<GP@.
The return value of NBJO()
39.1
-MJBM<HN <M@ <GR<TN NO<MO@? =T <I @IODOT DI < K<MOD>PG<M @IQDMJIH@IO. 1C@ @IODOT OC<O NO<MON
OC@ KMJBM<H H<T =@ OC@ NC@GG RC@M@ OC@ PN@M OTK@N OC@ I<H@ JA OC@ KMJBM<H <I? KM@NN@N OC@
"IO@M F@T, JM DO H<T =@ < ?@Q@GJKH@IO @IQDMJIH@IO RC@M@ OC@ KMJBM<HH@M >GD>FN OC@ 8/PI:
=POOJI, @O>.
1C@ KMJBM<H >JHHPID><O@N DON @SDO NO<OPN OJ DON @IQDMJIH@IO =T OC@ M@OPMI Q<GP@ JA NBJO().
A M@OPMI Q<GP@ JA 0 H@<IN NP>>@NNAPG >JHKG@ODJI <I? <IT JOC@M Q<GP@ H@<IN NJH@ OTK@ JA
A<DGPM@. AGOCJPBC OC@ M@OPMI Q<GP@ DN PK OJ OC@ KMJBM<HH@M, =T >JIQ@IODJI OC@ Q<GP@ 0 <GR<TN
H@<IN NP>>@NN.
Note: %@>K H3>G7E ;@ F:7 D3@97 00,1271 3D7 BADF34>7; @AF 3>> 7@H;DA@?7@FE EGBBADF AF:7D
H3>G7E.
3<GP@N JOC@M OC<I 0 ><I C<Q@ ?DAA@M@IO H@<IDIBN ?@K@I?DIB JI @<>C KMJBM<H. #JM @S<HKG@,
OC@ >JHHJI 2IDS KMJBM<H MT, RCD>C DN PN@? AJM GDNODIB >JIO@ION JA ?DM@>OJMD@N, M@OPMIN 1 AJM
HDIJM @MMJMN <I? 2 AJM N@MDJPN JI@N. &I H<IT @IQDMJIH@ION, OC@ M@OPMI Q<GP@ JA OC@ KMJBM<H
OC<O C<N =@@I @S@>PO@? HJNO M@>@IOGT DI OC@ >JINJG@ ><I =@ N@@I OCMJPBC OC@ $ @IQDMJIH@IO
Q<MD<=G@. #JM @S<HKG@, RC@I R@ <NF MT OJ GDNO < ADG@ OC<O ?J@N IJO @SDNO, DON IJI-U@MJ M@OPMI
Q<GP@ ><I =@ J=N@MQ@? RDOC $ <N N@@I =@GJR.
Note: !@ F:7 5A??3@6 >;@7 ;@F7D35F;A@E 47>AI, F:7 >;@7E F:3F EF3DF I;F: # ;@6;53F7 F:7 >;@7E
F:3F F:7 GE7D FKB7E. !8 KAG I3@F FA FDK F:7 E3?7 5A??3@6E, KAG ?GEF 7@F7D F:7 5A@F7@FE A8
F:AE7 >;@7E 7J57BF F:7 # 5:3D35F7D. A>EA, F:7 5A??3@6E 47>AI EF3DF 3 BDA9D3? @3?76
deneme; D7B>357 F:3F @3?7 I;F: F:7 @3?7 A8 KAGD F7EF BDA9D3?.
A66;F;A@3>>K, 3>F:AG9: F:7 8A>>AI;@9 7J3?B>7E E:AI ;@F7D35F;A@E ;@ 3 ";@GJ 5A@EA>7, F:7K
IAG>6 47 E;?;>3D 4GF @AF 7J35F>K F:7 E3?7 ;@ 5A@EA>7E ;@ AF:7D AB7D3F;@9 EKEF7?E.
# MT B@GJMF@UIBU@EPFT@OPU@FYJTU
MT: DBOOPU BDDFTT B@GJMF@UIBU@EPFT@OPU@FYJTU: /P TVDI GJMF PS EJSFDUPSZ
# FDIP $
2 l UIF SFUVSO WBMVF PG MT
NBJO() always returns a value 39.1.1
0JH@ JA OC@ KMJBM<HN OC<O R@ C<Q@ RMDOO@I NJ A<M C<Q@ OCMJRI @S>@KODJIN RC@I OC@T >JPG?
IJO >JIODIP@ RDOC OC@DM O<NFN. AN HP>C <N R@ C<Q@ N@@I NJ A<M, RC@I <I @S>@KODJI DN OCMJRI,
OC@ KMJBM<H @I?N RDOC <I PCKFDU.&YDFQUJPO @MMJM H@NN<B@.
&DA9D3? E@H;DA@?7@F
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
183
4C@I OC<O C<KK@IN, @Q@I DA NBJO() C<N =@@I ?@ADI@? <N M@OPMIDIB WPJE, < Q<GP@ JA 1 DN
<POJH<OD><GGT M@OPMI@? OJ OC@ KMJBM<H'N @IQDMJIH@IO. )@O'N N@@ OCDN DI <>ODJI =T OC@ AJGGJRDIB
NDHKG@ KMJBM<H OC<O O@MHDI<O@N RDOC <I @S>@KODJI:
WPJE NBJO()
\
UISPX OFX &YDFQUJPO("5IFSF IBT CFFO BO FSSPS.");
^
AGOCJPBC OC@ M@OPMI OTK@ DN NK@>DAD@? <N WPJE, OC@ M@OPMI Q<GP@ DN 1:
# ./EFOFNF
PCKFDU.&YDFQUJPO: 5IFSF IBT CFFO BO FSSPS.
...
# FDIP $
1
0DHDG<MGT, WPJE NBJO() API>ODJIN OC<O O@MHDI<O@ NP>>@NNAPGGT <GNJ <POJH<OD><GGT M@OPMI 0 <N
OC@DM M@OPMI Q<GP@N. )@O'N N@@ OCDN RDOC OC@ AJGGJRDIB KMJBM<H OC<O O@MHDI<O@N EG557EE8G>>K:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
XSJUFMO("%POF!");
^
1C@ KMJBM<H M@OPMIN 0:
# ./EFOFNF
%POF!
# FDIP $
0
Specifying the return value 39.1.2
/@OPMIDIB < NK@>DAD> Q<GP@ AMJH NBJO() DN OC@ N<H@ <N M@OPMIDIB < Q<GP@ AMJH <IT JOC@M
API>ODJI. 1C@ M@OPMI OTK@ HPNO =@ NK@>DAD@? <N JOU <I? OC@ Q<GP@ HPNO =@ M@OPMI@? =T OC@
SFUVSO NO<O@H@IO:
JNQPSU TUE.TUEJP;
JOU NBJO()
\
JOU OVNCFS;
XSJUF("1MFBTF FOUFS B OVNCFS CFUXFFO 3 BOE 6: ");
SFBEG(" %T", &OVNCFS);
JG ((OVNCFS < 3) ]] (OVNCFS > 6)) \
TUEFSS.XSJUFGMO("&3303: %T JT OPU WBMJE!", OVNCFS);
SFUVSO 111;
^
XSJUFGMO("5IBOL ZPV GPS %T.", OVNCFS);
SFUVSO 0;
^
4C@I OC@ @IO@M@? IPH=@M DN RDOCDI OC@ Q<GD? M<IB@, OC@ M@OPMI Q<GP@ JA OC@ KMJBM<H DN 0:
&DA9D3? E@H;DA@?7@F
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
184
# ./EFOFNF
1MFBTF FOUFS B OVNCFS CFUXFFO 3 BOE 6: 5
5IBOL ZPV GPS 5.
# FDIP $
0
4C@I OC@ IPH=@M DN JPOND?@ JA OC@ Q<GD? M<IB@, OC@ M@OPMI Q<GP@ JA OC@ KMJBM<H DN 111:
# ./EFOFNF
1MFBTF FOUFS B OVNCFS CFUXFFO 3 BOE 6: 10
&3303: 10 JT OPU WBMJE!
# FDIP $
111
1C@ Q<GP@ JA 111 DI OC@ <=JQ@ KMJBM<H DN <M=DOM<MT; IJMH<GGT 1 DN NPDO<=G@ <N OC@ A<DGPM@ >J?@.
Standard error stream TUEFSS
39.2
1C@ KMJBM<H <=JQ@ PN@N OC@ NOM@<H TUEFSS. 1C<O NOM@<H DN OC@ OCDM? JA OC@ NO<I?<M? NOM@<HN.
&O DN PN@? AJM RMDODIB @MMJM H@NN<B@N:
t TUEJO: NO<I?<M? DIKPO NOM@<H
t TUEPVU: NO<I?<M? JPOKPO NOM@<H
t TUEFSS: NO<I?<M? @MMJM NOM@<H
4C@I < KMJBM<H DN NO<MO@? DI < >JINJG@, IJMH<GGT OC@ H@NN<B@N OC<O <M@ RMDOO@I OJ TUEPVU
<I? TUEFSS =JOC <KK@<M JI OC@ >JINJG@. 4C@I I@@?@?, DO DN KJNND=G@ OJ M@?DM@>O OC@N@ JPOKPON
DI?DQD?P<GGT. 1CDN NP=E@>O DN JPOND?@ JA OC@ AJ>PN JA OCDN >C<KO@M <I? OC@ ?@O<DGN H<T Q<MT AJM
@<>C NC@GG KMJBM<H.
Parameters of NBJO()
39.3
&O DN >JHHJI AJM KMJBM<HN OJ O<F@ K<M<H@O@MN AMJH OC@ @IQDMJIH@IO OC<O NO<MO@? OC@H. #JM
@S<HKG@, R@ C<Q@ <GM@<?T K<NN@? < ADG@ I<H@ <N < >JHH<I? GDI@ JKODJI OJ MT <=JQ@. 1C@M@
<M@ ORJ >JHH<I? GDI@ JKODJIN DI OC@ AJGGJRDIB GDI@:
# MT -M EFOFNF
-SXYS-YS-Y 1 BDFISFMJ VTFST 460668 /PW 6 20:38 EFOFNF
1C@ N@O JA >JHH<I? GDI@ K<M<H@O@MN <I? OC@DM H@<IDIBN <M@ ?@ADI@? @IODM@GT =T OC@ KMJBM<H.
"Q@MT KMJBM<H ?J>PH@ION DON PN<B@, DI>GP?DIB RC<O @Q@MT K<M<H@O@M H@<IN.
1C@ <MBPH@ION OC<O <M@ PN@? RC@I NO<MODIB < ! KMJBM<H <M@ K<NN@? OJ OC<O KMJBM<H'N
NBJO() <N < NGD>@ JA TUSJOHN. !@ADIDIB NBJO() <N O<FDIB < K<M<H@O@M JA OTK@ TUSJOH<> DN
NPAAD>D@IO OJ C<Q@ <>>@NN OJ KMJBM<H <MBPH@ION. 1C@ I<H@ JA OCDN K<M<H@O@M DN >JHHJIGT
<==M@QD<O@? <N BSHT. 1C@ AJGGJRDIB KMJBM<H KMDION <GG JA OC@ <MBPH@ION OC<O OC@ KMJBM<H C<N
=@@I NO<MO@? RDOC:
JNQPSU TUE.TUEJP;
WPJE NBJO(TUSJOH<> BSHT)
\
GPSFBDI (J, BSH; BSHT) \
XSJUFGMO(""SHVNFOU %-3T: %T", J, BSH);
&DA9D3? E@H;DA@?7@F
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
185
^
^
)@O'N NO<MO OC@ KMJBM<H RDOC <M=DOM<MT <MBPH@ION:
# ./EFOFNF TPNF BSHVNFOUT PO UIF DPNNBOE MJOF 42 --BO-PQUJPO
"SHVNFOU 0 : ./EFOFNF
"SHVNFOU 1 : TPNF
"SHVNFOU 2 : BSHVNFOUT
"SHVNFOU 3 : PO
"SHVNFOU 4 : UIF
"SHVNFOU 5 : DPNNBOE
"SHVNFOU 6 : MJOF
"SHVNFOU 7 : 42
"SHVNFOU 8 : --BO-PQUJPO
1C@ ADMNO <MBPH@IO DN <GR<TN OC@ I<H@ JA OC@ KMJBM<H, DI OC@ R<T DO C<N =@@I @IO@M@? =T OC@
PN@M. 1C@ JOC@M <MBPH@ION <KK@<M DI OC@ N<H@ JM?@M OC<O OC@T C<Q@ =@@I @IO@M@?.
&O DN >JHKG@O@GT PK OJ OC@ KMJBM<H CJR DO H<F@N PN@ JA OC@ <MBPH@ION. 1C@ AJGGJRDIB KMJBM<H
KMDION DON ORJ <MBPH@ION DI M@Q@MN@ JM?@M:
JNQPSU TUE.TUEJP;
JOU NBJO(TUSJOH<> BSHT)
\
JG (BSHT.MFOHUI != 3) \
TUEFSS.XSJUFGMO("&3303! $PSSFDU VTBHF:=O"
" %T XPSE1 XPSE2", BSHT<0>);
SFUVSO 1;
^
XSJUFMO(BSHT<2>, ' ', BSHT<1>);
SFUVSO 0;
^
1C@ KMJBM<H <GNJ NCJRN DON >JMM@>O PN<B@ DA OC@M@ <M@ IJO ORJ RJM?N @S<>OGT:
# ./EFOFNF
&3303! $PSSFDU VTBHF:
./EFOFNF XPSE1 XPSE2
# ./EFOFNF XPSME IFMMP
IFMMP XPSME
Command line options and the TUE.HFUPQU module
39.4
1C<O DN <GG OC@M@ DN OJ FIJR <=JPO OC@ K<M<H@O@MN <I? OC@ M@OPMI Q<GP@ JA NBJO(). %JR@Q@M,
K<MNDIB OC@ <MBPH@ION DN < M@K@ODODQ@ O<NF. 1C@ TUE.HFUPQU HJ?PG@ DN ?@NDBI@? OJ C@GK RDOC
K<MNDIB OC@ >JHH<I? GDI@ JKODJIN JA KMJBM<HN.
0JH@ K<M<H@O@MN GDF@ "RJMG?" <I? "C@GGJ" <=JQ@ <M@ KPM@GT ?<O< AJM OC@ KMJBM<H OJ PN@.
,OC@M FDI?N JA K<M<H@O@MN <M@ ><GG@? 5A??3@6 >;@7 ABF;A@E, <I? <M@ AJM >C<IBDIB =@C<QDJMN
JA KMJBM<HN. AI @S<HKG@ JA < >JHH<I? GDI@ JKODJI C<N =@@I -M OC<O C<N =@@I K<NN@? OJ MT
<=JQ@.
&DA9D3? E@H;DA@?7@F
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
186
JHH<I? GDI@ JKODJIN H<F@ KMJBM<HN HJM@ PN@APG =T M@HJQDIB OC@ I@@? AJM < CPH<I PN@M OJ
DIO@M<>O RDOC OC@ KMJBM<H OJ C<Q@ DO =@C<Q@ DI < >@MO<DI R<T. 4DOC >JHH<I? GDI@ JKODJIN,
KMJBM<HN ><I =@ NO<MO@? AMJH N>MDKO KMJBM<HN <I? OC@DM =@C<QDJMN ><I =@ NK@>DAD@? OCMJPBC
>JHH<I? GDI@ JKODJIN.
AGOCJPBC OC@ NTIO<S <I? H@<IDIBN JA >JHH<I? GDI@ <MBPH@ION JA @Q@MT KMJBM<H DN NK@>DAD>
OJ OC<O KMJBM<H, OC@DM AJMH<O DN NJH@RC<O NO<I?<M?. #JM @S<HKG@, DI -,0&5, >JHH<I? GDI@
JKODJIN NO<MO RDOC -- AJGGJR@? =T OC@ I<H@ JA OC@ JKODJI, <I? Q<GP@N >JH@ <AO@M = >C<M<>O@MN:
# ./EFOFNF --BO-PQUJPO=17
1C@ TUE.HFUPQU HJ?PG@ NDHKGDAD@N K<MNDIB NP>C JKODJIN. &O C<N HJM@ ><K<=DGDOD@N OC<I RC<O DN
>JQ@M@? DI OCDN N@>ODJI.
)@O'N ?@NDBI < KMJBM<H OC<O KMDION M<I?JH IPH=@MN. )@O'N O<F@ OC@ HDIDHPH, H<SDHPH, <I?
OJO<G IPH=@M JA OC@N@ IPH=@MN <N KMJBM<H <MBPH@ION. )@O'N @SK@>O OC@ AJGGJRDIB NTIO<S OJ
B@O OC@N@ Q<GP@N AMJH OC@ >JHH<I? GDI@:
# ./EFOFNF --DPVOU=7 --NJOJNVN=10 --NBYJNVN=15
1C@ HFUPQU() API>ODJI K<MN@N <I? <NNDBIN OCJN@ Q<GP@N OJ Q<MD<=G@N. 0DHDG<M OJ SFBEG(), OC@
<??M@NN@N JA Q<MD<=G@N HPNO =@ NK@>DAD@? =T OC@ & JK@M<OJM:
JNQPSU TUE.TUEJP;
JNQPSU TUE.HFUPQU;
JNQPSU TUE.SBOEPN;
WPJE NBJO(TUSJOH<> BSHT)
\
JOU DPVOU;
JOU NJOJNVN;
JOU NBYJNVN;
HFUPQU(BSHT,
"DPVOU", &DPVOU,
"NJOJNVN", &NJOJNVN,
"NBYJNVN", &NBYJNVN);
GPSFBDI (J; 0 .. DPVOU) \
XSJUF(VOJGPSN(NJOJNVN, NBYJNVN + 1), ' ');
^
XSJUFMO();
^
# ./EFOFNF --DPVOU=7 --NJOJNVN=10 --NBYJNVN=15
11 11 13 11 14 15 10
*JNO >JHH<I? GDI@ JKODJIN JA HJNO KMJBM<HN C<Q@ NCJMO@M NTIO<S <N R@GG. #JM @S<HKG@, -D
H<T C<Q@ OC@ N<H@ H@<IDIB <N --DPVOU. 0P>C <GO@MI<ODQ@ NTIO<S AJM @<>C JKODJI DN NK@>DAD@?
<AO@M < ] >C<M<>O@M. 1C@M@ H<T =@ HJM@ OC<I JI@ NCJMO>PO AJM @<>C JKODJI:
HFUPQU(BSHT,
"DPVOU]D", &DPVOU,
"NJOJNVN]O", &NJOJNVN,
"NBYJNVN]Y", &NBYJNVN);
&O DN >JHHJI OJ PN@ < NDIBG@ ?<NC AJM OC@ NCJMO Q@MNDJIN <I? OC@ = >C<M<>O@M DN PNP<GGT
JHDOO@?:
&DA9D3? E@H;DA@?7@F
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
187
# ./EFOFNF -D7 -O10 -Y15
11 13 10 15 14 15 14
HFUPQU() >JIQ@MON OC@ <MBPH@ION AMJH TUSJOH OJ OC@ OTK@ JA @<>C Q<MD<=G@. #JM @S<HKG@,
NDI>@ DPVOU <=JQ@ DN JOU, HFUPQU() >JIQ@MON OC@ Q<GP@ NK@>DAD@? AJM OC@ --DPVOU <MBPH@IO OJ
JOU. 4C@I I@@?@?, NP>C >JIQ@MNDJIN H<T <GNJ =@ K@MAJMH@? @SKGD>DOGT =T UP.
0J A<M R@ C<Q@ PN@? TUE.DPOW.UP JIGT RC@I >JIQ@MODIB OJ TUSJOH. UP ><I DI A<>O >JIQ@MO
AMJH <IT OTK@ OJ <IT OTK@ <N GJIB <N OC<O >JIQ@MNDJI DN KJNND=G@. #JM @S<HKG@, OC@ AJGGJRDIB
KMJBM<H O<F@N <?Q<IO<B@ JA UP RC@I >JIQ@MODIB DON <MBPH@IO OJ TJ[F@U:
JNQPSU TUE.TUEJP;
JNQPSU TUE.DPOW;
WPJE NBJO(TUSJOH<> BSHT)
\
// 5IF EFGBVMU DPVOU JT 10
TJ[F@U DPVOU = 10;
JG (BSHT.MFOHUI > 1) \
// 5IFSF JT BO BSHVNFOU
DPVOU = UP!TJ[F@U(BSHT<1>);
^
GPSFBDI (J; 0 .. DPVOU) \
XSJUF(J * 2, ' ');
^
XSJUFMO();
^
1C@ KMJBM<H KMJ?P>@N 10 IPH=@MN RC@I OC@M@ DN IJ <MBPH@IO NK@>DAD@?:
# ./EFOFNF
0 2 4 6 8 10 12 14 16 18
# ./EFOFNF 3
0 2 4
Environment variables
39.5
1C@ @IQDMJIH@IO OC<O < KMJBM<H DN NO<MO@? DI KMJQD?@N NJH@ Q<MD<=G@N OC<O OC@ KMJBM<H H<T
H<F@ PN@ JA. 1C@ @IQDMJIH@IO Q<MD<=G@N ><I =@ <>>@NN@? =T TUE.QSPDFTT.HFUFOW. 1C@
AJGGJRDIB KMJBM<H DN <>>@NNDIB <I? KMDIODIB OC@ 1"5) @IQDMJIH@IO Q<MD<=G@:
JNQPSU TUE.TUEJP;
JNQPSU TUE.QSPDFTT;
WPJE NBJO()
\
XSJUFMO(HFUFOW("1"5)"));
^
1C@ JPOKPO:
# ./EFOFNF
/VTS/MPDBM/CJO:/VTS/CJO:/IPNF/BDFISFMJ/ENE/MJOVY/CJO
TUE.QSPDFTT.FOWJSPONFOU KMJQD?@N <>>@NN OJ OC@ @IQDMJIH@IO Q<MD<=G@N OCMJPBC OC@
<NNJ>D<ODQ@ <MM<T NTIO<S:
&DA9D3? E@H;DA@?7@F
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
188
JNQPSU TUE.QSPDFTT;
// ...
XSJUFMO(FOWJSPONFOU<"1"5)">);
%JR@Q@M, FOWJSPONFOU DON@GA DN IJO <I <NNJ>D<ODQ@ <MM<T. 4C@I I@@?@?, OC@ @IQDMJIH@IO
Q<MD<=G@N ><I =@ >JIQ@MO@? OJ <I <NNJ>D<ODQ@ <MM<T =T UP""():
TUSJOH<TUSJOH> FOW7BST = FOWJSPONFOU.UP""();
Starting other programs
39.6
-MJBM<HN H<T NO<MO JOC@M KMJBM<HN <I? =@>JH@ OC@ 7@H;DA@?7@F AJM OCJN@ KMJBM<HN. 1RJ
API>ODJIN OC<O @I<=G@ OCDN <M@ TZTUFN <I? TIFMM AMJH OC@ TUE.QSPDFTT HJ?PG@.
TZTUFN @S@>PO@N DON K<M<H@O@M <N DA OC@ >JHH<I? C<N =@@I OTK@? <O OC@ >JINJG@. &O OC@I
M@OPMIN OC@ M@OPMI Q<GP@ JA OC<O >JHH<I?:
JNQPSU TUE.TUEJP;
JNQPSU TUE.QSPDFTT;
WPJE NBJO()
\
JNNVUBCMF SFU7BM = TZTUFN("MT -M EFOFNF");
XSJUFGMO("MT IBT SFUVSOFE %T.", SFU7BM);
^
1C@ JPOKPO DI>GP?@N OC@ JPOKPO JA MT AJGGJR@? =T OC@ GDI@ OC<O OCDN KMJBM<H KMDION:
# ./EFOFNF
-SXYS-YS-Y 1 BDFISFMJ VTFST 461107 /PW 7 17:33 EFOFNF
MT IBT SFUVSOFE 0.
TIFMM @S@>PO@N DON K<M<H@O@M DI < NC@GG @IQDMJIH@IO <I? M@OPMIN OC@ NO<I?<M? JPOKPO JA OC<O
>JHH<I?. &O OCMJRN <I @S>@KODJI DA OC@ KMJBM<H >JPG? IJO =@ NO<MO@? JM ADIDNC@? RDOC < IJI-
U@MJ @MMJM >J?@:
JNQPSU TUE.TUEJP;
JNQPSU TUE.QSPDFTT;
WPJE NBJO()
\
JNNVUBCMF PVUQVU = TIFMM("MT -M EFOFNF*");
XSJUFMO("5IF PVUQVU PG MT:");
XSJUFMO(PVUQVU);
^
1C@ JPOKPO:
# ./EFOFNF
5IF PVUQVU PG MT:
-SXYSXYS-Y 1 BDFISFMJ BDFISFMJ 923117 2012-03-25 11:19 EFOFNF
-SXYS-YS-Y 1 BDFISFMJ BDFISFMJ 1091303 2012-03-25 11:19 EFOFNF.E
&DA9D3? E@H;DA@?7@F
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
189
Summary
39.7
t "Q@I RC@I DO DN ?@ADI@? RDOC M@OPMI OTK@ WPJE, NBJO() <POJH<OD><GGT M@OPMIN 0 AJM NP>>@NN
<I? 1 AJM A<DGPM@.
t TUEFSS DN NPDO<=G@ OJ KMDIO @MMJM H@NN<B@N.
t NBJO ><I O<F@ K<M<H@O@MN <N TUSJOH<>.
t TUE.HFUPQU C@GKN RDOC K<MNDIB >JHH<I? GDI@ JKODJIN.
t TUE.QSPDFTT C@GKN RDOC <>>@NNDIB @IQDMJIH@IO Q<MD<=G@N <I? NO<MODIB JOC@M KMJBM<HN.
Exercises
39.8
1. 4MDO@ < ><G>PG<OJM KMJBM<H OC<O O<F@N <I JK@M<OJM <I? ORJ JK@M<I?N <N >JHH<I? GDI@
<MBPH@ION. %<Q@ OC@ KMJBM<H NPKKJMO OC@ AJGGJRDIB PN<B@:
# ./EFOFNF 3.4 Y 7.8
26.52
Note: B753GE7 F:7 * 5:3D35F7D :3E 3 EB75;3> ?73@;@9 A@ ?AEF 5A@EA>7E, ! :3H7 GE76
x. .AG ?3K EF;>> GE7 * 3E >A@9 3E ;F ;E 7E53B76 3E \*.
2. 4MDO@ < KMJBM<H OC<O <NFN OC@ PN@M RCD>C KMJBM<H OJ NO<MO, NO<MON OC<O KMJBM<H, <I?
M@OPMIN DON M@OPMI Q<GP@.
... F:7 EA>GF;A@E
&DA9D3? E@H;DA@?7@F
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
190
Exceptions 40
2I@SK@>O@? NDOP<ODJIN <M@ K<MON JA KMJBM<HN: PN@M HDNO<F@N, KMJBM<HHDIB @MMJMN, >C<IB@N DI
OC@ KMJBM<H @IQDMJIH@IO, @O>. -MJBM<HN HPNO =@ RMDOO@I DI R<TN OJ <QJD? KMJ?P>DIB
DI>JMM@>O M@NPGON RC@I A<>@? RDOC NP>C 7J57BF;A@3> >JI?DODJIN.
0JH@ JA OC@N@ >JI?DODJIN H<T =@ N@Q@M@ @IJPBC OJ NOJK OC@ @S@>PODJI JA OC@ KMJBM<H. #JM
@S<HKG@, < M@LPDM@? KD@>@ JA DIAJMH<ODJI H<T =@ HDNNDIB JM DIQ<GD?, JM < ?@QD>@ H<T IJO =@
API>ODJIDIB >JMM@>OGT. 1C@ @S>@KODJI C<I?GDIB H@>C<IDNH JA ! C@GKN RDOC NOJKKDIB KMJBM<H
@S@>PODJI RC@I I@>@NN<MT, <I? OJ M@>JQ@M AMJH OC@ PI@SK@>O@? NDOP<ODJIN RC@I KJNND=G@.
AN <I @S<HKG@ JA < N@Q@M@ >JI?DODJI, R@ ><I OCDIF JA K<NNDIB <I PIFIJRI JK@M<OJM OJ <
API>ODJI OC<O FIJRN JIGT OC@ AJPM <MDOCH@OD> JK@M<OJMN, <N R@ C<Q@ N@@I DI OC@ @S@M>DN@N JA
OC@ KM@QDJPN >C<KO@M:
TXJUDI (PQFSBUPS) \
DBTF "+":
XSJUFMO(GJSTU + TFDPOE);
CSFBL;
DBTF "-":
XSJUFMO(GJSTU - TFDPOE);
CSFBL;
DBTF "Y":
XSJUFMO(GJSTU * TFDPOE);
CSFBL;
DBTF "/":
XSJUFMO(GJSTU / TFDPOE);
CSFBL;
EFGBVMU:
UISPX OFX &YDFQUJPO(GPSNBU("*OWBMJE PQFSBUPS: %T", PQFSBUPS));
^
1C@ TXJUDI NO<O@H@IO <=JQ@ ?J@N IJO FIJR RC<O OJ ?J RDOC JK@M<OJMN OC<O <M@ IJO GDNO@? JI
OC@ DBTF NO<O@H@ION; NJ OCMJRN <I @S>@KODJI.
1C@M@ <M@ H<IT @S<HKG@N JA OCMJRI @S>@KODJIN DI -CJ=JN. #JM @S<HKG@, UP!JOU, RCD>C ><I
=@ PN@? OJ >JIQ@MO < NOMDIB M@KM@N@IO<ODJI JA <I DIO@B@M OJ <I JOU Q<GP@ OCMJRN <I @S>@KODJI
RC@I OC<O M@KM@N@IO<ODJI DN IJO Q<GD?:
JNQPSU TUE.DPOW;
WPJE NBJO()
\
DPOTU JOU WBMVF = UP!JOU("IFMMP");
^
1C@ KMJBM<H O@MHDI<O@N RDOC <I @S>@KODJI OC<O DN OCMJRI =T UP!JOU:
TUE.DPOW.$POW&YDFQUJPO!TUE/DPOW.E(38): TUE.DPOW(1157): $BO'U
DPOWFSU WBMVF AIFMMP' PG UZQF DPOTU(DIBS)<> UP UZQF JOU
TUE.DPOW.$POW&YDFQUJPO <O OC@ =@BDIIDIB JA OC@ H@NN<B@ DN OC@ OTK@ JA OC@ OCMJRI
@S>@KODJI J=E@>O. 4@ ><I O@GG AMJH OC@ I<H@ OC<O OC@ OTK@ DN $POW&YDFQUJPO OC<O DN ?@ADI@? DI
OC@ TUE.DPOW HJ?PG@.
EJ57BF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
191
The UISPX statement to throw exceptions
40.1
4@'Q@ N@@I OC@ UISPX NO<O@H@IO =JOC DI OC@ @S<HKG@N <=JQ@ <I? DI OC@ KM@QDJPN >C<KO@MN.
UISPX OCMJRN <I 7J57BF;A@ A4<75F <I? OCDN O@MHDI<O@N OC@ >PMM@IO JK@M<ODJI JA OC@ KMJBM<H.
1C@ @SKM@NNDJIN <I? NO<O@H@ION OC<O <M@ RMDOO@I <AO@M OC@ UISPX NO<O@H@IO <M@ IJO @S@>PO@?.
1CDN =@C<QDJM DN <>>JM?DIB OJ OC@ I<OPM@ JA @S>@KODJIN: OC@T HPNO =@ OCMJRI RC@I OC@
KMJBM<H ><IIJO >JIODIP@ RDOC DON >PMM@IO O<NF.
JIQ@MN@GT, DA OC@ KMJBM<H >JPG? >JIODIP@ OC@I OC@ NDOP<ODJI RJPG? IJO R<MM<IO OCMJRDIB <I
@S>@KODJI. &I NP>C ><N@N OC@ API>ODJI RJPG? ADI? < R<T <I? >JIODIP@.
The exception types &YDFQUJPO and &SSPS 40.1.1
,IGT OC@ OTK@N OC<O <M@ DIC@MDO@? AMJH OC@ 5ISPXBCMF >G<NN ><I =@ OCMJRI. 5ISPXBCMF DN
<GHJNO I@Q@M PN@? ?DM@>OGT DI KMJBM<HN. 1C@ OTK@N OC<O <M@ <>OP<GGT OCMJRI <M@ OTK@N OC<O <M@
DIC@MDO@? AMJH &YDFQUJPO JM &SSPS, RCD>C OC@HN@GQ@N <M@ OC@ OTK@N OC<O <M@ DIC@MDO@? AMJH
5ISPXBCMF. #JM @S<HKG@, <GG JA OC@ @S>@KODJIN OC<O -CJ=JN OCMJRN <M@ DIC@MDO@? AMJH @DOC@M
&YDFQUJPO JM &SSPS.
&SSPS M@KM@N@ION PIM@>JQ@M<=G@ >JI?DODJIN <I? DN IJO M@>JHH@I?@? OJ =@ 53G9:F. #JM OC<O
M@<NJI, HJNO JA OC@ @S>@KODJIN OC<O < KMJBM<H OCMJRN <M@ OC@ OTK@N OC<O <M@ DIC@MDO@? AMJH
&YDFQUJPO. (Note: !@:7D;F3@57 ;E 3 FAB;5 D7>3F76 FA 5>3EE7E. ,7 I;>> E77 5>3EE7E ;@ 3 >3F7D
5:3BF7D.)
&YDFQUJPO J=E@>ON <M@ >JINOMP>O@? RDOC < TUSJOH Q<GP@ OC<O M@KM@N@ION <I @MMJM H@NN<B@.
6JP H<T ADI? DO @<NT OJ >M@<O@ OCDN H@NN<B@ RDOC OC@ GPSNBU() API>ODJI AMJH OC@ TUE.TUSJOH
HJ?PG@:
JNQPSU TUE.TUEJP;
JNQPSU TUE.SBOEPN;
JNQPSU TUE.TUSJOH;
JOU<> SBOEPN%JDF7BMVFT(JOU DPVOU)
\
JG (DPVOU < 0) \
UISPX OFX &YDFQUJPO(
GPSNBU("*OWBMJE EJDF DPVOU: %T", DPVOU));
^
JOU<> WBMVFT;
GPSFBDI (J; 0 .. DPVOU) \
WBMVFT _= VOJGPSN(1, 7);
^
SFUVSO WBMVFT;
^
WPJE NBJO()
\
XSJUFMO(SBOEPN%JDF7BMVFT(-5));
^
PCKFDU.&YDFQUJPO...: *OWBMJE EJDF DPVOU: -5
EJ57BF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
192
Thrown exception terminates all scopes 40.1.2
4@ C<Q@ N@@I OC<O OC@ KMJBM<H @S@>PODJI NO<MON AMJH OC@ NBJO API>ODJI <I? =M<I>C@N DIOJ
JOC@M API>ODJIN AMJH OC@M@. 1CDN G<T@M@? @S@>PODJI JA BJDIB ?@@K@M DIOJ API>ODJIN <I?
@Q@IOP<GGT M@OPMIDIB AMJH OC@H ><I =@ N@@I <N OC@ =M<I>C@N JA < OM@@.
#JM @S<HKG@, NBJO() H<T ><GG < API>ODJI I<H@? NBLF0NFMFU, RCD>C DI OPMI H<T ><GG <IJOC@M
API>ODJI I<H@? QSFQBSF"MM, RCD>C DI OPMI H<T ><GG <IJOC@M API>ODJI I<H@? QSFQBSF&HHT,
@O>. ANNPHDIB OC<O OC@ <MMJRN DI?D><O@ API>ODJI ><GGN, OC@ =M<I>CDIB JA NP>C < KMJBM<H ><I
=@ NCJRI <N DI OC@ AJGGJRDIB API>ODJI ><GG OM@@:
NBJO
]
+--r NBLF0NFMFU
] ]
] +--r QSFQBSF"MM
] ] ]
] ] +-r QSFQBSF&HHT
] ] +-r QSFQBSF#VUUFS
] ] +-r QSFQBSF1BO
] ]
] +--r DPPL&HHT
] +--r DMFBO"MM
]
+--r FBU0NFMFU
1C@ AJGGJRDIB KMJBM<H ?@HJINOM<O@N OC@ =M<I>CDIB <=JQ@ =T PNDIB ?DAA@M@IO G@Q@GN JA
DI?@IO<ODJI DI DON JPOKPO. 1C@ KMJBM<H ?J@NI'O ?J <ITOCDIB PN@APG JOC@M OC<I KMJ?P>DIB <I
JPOKPO NPDO<=G@ OJ JPM KPMKJN@N:
JNQPSU TUE.TUEJP;
WPJE JOEFOU(JO JOU MFWFM)
\
GPSFBDI (J; 0 .. MFWFM * 2) \
XSJUF(' ');
^
^
WPJE FOUFSJOH(JO DIBS<> GVODUJPO/BNF, JO JOU MFWFM)
\
JOEFOU(MFWFM);
XSJUFMO("r ", GVODUJPO/BNF, "'T GJSTU MJOF");
^
WPJE FYJUJOH(JO DIBS<> GVODUJPO/BNF, JO JOU MFWFM)
\
JOEFOU(MFWFM);
XSJUFMO("t ", GVODUJPO/BNF, "'T MBTU MJOF");
^
WPJE NBJO()
\
FOUFSJOH("NBJO", 0);
NBLF0NFMFU();
FBU0NFMFU();
FYJUJOH("NBJO", 0);
^
WPJE NBLF0NFMFU()
\
FOUFSJOH("NBLF0NFMFU", 1);
QSFQBSF"MM();
DPPL&HHT();
DMFBO"MM();
FYJUJOH("NBLF0NFMFU", 1);
^
EJ57BF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
193
WPJE FBU0NFMFU()
\
FOUFSJOH("FBU0NFMFU", 1);
FYJUJOH("FBU0NFMFU", 1);
^
WPJE QSFQBSF"MM()
\
FOUFSJOH("QSFQBSF"MM", 2);
QSFQBSF&HHT();
QSFQBSF#VUUFS();
QSFQBSF1BO();
FYJUJOH("QSFQBSF"MM", 2);
^
WPJE DPPL&HHT()
\
FOUFSJOH("DPPL&HHT", 2);
FYJUJOH("DPPL&HHT", 2);
^
WPJE DMFBO"MM()
\
FOUFSJOH("DMFBO"MM", 2);
FYJUJOH("DMFBO"MM", 2);
^
WPJE QSFQBSF&HHT()
\
FOUFSJOH("QSFQBSF&HHT", 3);
FYJUJOH("QSFQBSF&HHT", 3);
^
WPJE QSFQBSF#VUUFS()
\
FOUFSJOH("QSFQBSF#VUUFS", 3);
FYJUJOH("QSFQBSF#VUUFS", 3);
^
WPJE QSFQBSF1BO()
\
FOUFSJOH("QSFQBSF1BO", 3);
FYJUJOH("QSFQBSF1BO", 3);
^
1C@ KMJBM<H KMJ?P>@N OC@ AJGGJRDIB JPOKPO:
EJ57BF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
194
q NBJO, GJSTU MJOF
q NBLF0NFMFU, GJSTU MJOF
q QSFQBSF"MM, GJSTU MJOF
q QSFQBSF&HHT, GJSTU MJOF
r QSFQBSF&HHT, MBTU MJOF
q QSFQBSF#VUUFS, GJSTU MJOF
r QSFQBSF#VUUFS, MBTU MJOF
q QSFQBSF1BO, GJSTU MJOF
r QSFQBSF1BO, MBTU MJOF
r QSFQBSF"MM, MBTU MJOF
q DPPL&HHT, GJSTU MJOF
r DPPL&HHT, MBTU MJOF
q DMFBO"MM, GJSTU MJOF
r DMFBO"MM, MBTU MJOF
r NBLF0NFMFU, MBTU MJOF
q FBU0NFMFU, GJSTU MJOF
r FBU0NFMFU, MBTU MJOF
r NBJO, MBTU MJOF
1C@ API>ODJIN FOUFSJOH <I? FYJUJOH <M@ PN@? OJ DI?D><O@ OC@ ADMNO <I? G<NO GDI@N JA API>ODJIN
RDOC OC@ C@GK JA OC@ q <I? r >C<M<>O@MN. 1C@ KMJBM<H NO<MON RDOC OC@ ADMNO GDI@ JA NBJO(),
=M<I>C@N ?JRI OJ JOC@M API>ODJIN, <I? ADI<GGT @I?N RDOC OC@ G<NO GDI@ JA NBJO.
)@O'N HJ?DAT OC@ QSFQBSF&HHT API>ODJI OJ O<F@ OC@ IPH=@M JA @BBN <N < K<M<H@O@M. 0DI>@
>@MO<DI Q<GP@N JA OCDN K<M<H@O@M RJPG? =@ <I @MMJM, G@O'N C<Q@ OCDN API>ODJI OCMJR <I
@S>@KODJI RC@I OC@ IPH=@M JA @BBN DN G@NN OC<I JI@:
WPJE QSFQBSF&HHT(JOU DPVOU)
\
FOUFSJOH("QSFQBSF&HHT", 3);
JG (DPVOU < 1) \
UISPX OFX &YDFQUJPO(
GPSNBU("$BOOPU UBLF %T FHHT GSPN UIF GSJEHF", DPVOU));
^
FYJUJOH("QSFQBSF&HHT", 3);
^
&I JM?@M OJ =@ <=G@ OJ >JHKDG@ OC@ KMJBM<H, R@ HPNO HJ?DAT JOC@M GDI@N JA OC@ KMJBM<H OJ =@
>JHK<OD=G@ RDOC OCDN >C<IB@. 1C@ IPH=@M JA @BBN OJ O<F@ JPO JA OC@ AMD?B@ ><I =@ C<I?@?
?JRI AMJH API>ODJI OJ API>ODJI, NO<MODIB RDOC NBJO(). 1C@ K<MON JA OC@ KMJBM<H OC<O I@@? OJ
>C<IB@ <M@ OC@ AJGGJRDIB. 1C@ DIQ<GD? Q<GP@ JA -8 DN DIO@IODJI<G OJ NCJR CJR OC@ JPOKPO JA OC@
KMJBM<H RDGG =@ ?DAA@M@IO AMJH OC@ KM@QDJPN JPOKPO RC@I <I @S>@KODJI DN OCMJRI:
// ...
WPJE NBJO()
\
FOUFSJOH("NBJO", 0);
NBLF0NFMFU(-8);
FBU0NFMFU();
FYJUJOH("NBJO", 0);
^
WPJE NBLF0NFMFU(JOU FHH$PVOU)
\
FOUFSJOH("NBLF0NFMFU", 1);
QSFQBSF"MM(FHH$PVOU);
EJ57BF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
195
DPPL&HHT();
DMFBO"MM();
FYJUJOH("NBLF0NFMFU", 1);
^
// ...
WPJE QSFQBSF"MM(JOU FHH$PVOU)
\
FOUFSJOH("QSFQBSF"MM", 2);
QSFQBSF&HHT(FHH$PVOU);
QSFQBSF#VUUFS();
QSFQBSF1BO();
FYJUJOH("QSFQBSF"MM", 2);
^
// ...
4C@I R@ NO<MO OC@ KMJBM<H IJR, R@ N@@ OC<O OC@ GDI@N OC<O PN@? OJ =@ KMDIO@? <AO@M OC@ KJDIO
RC@M@ OC@ @S>@KODJI DN OCMJRI <M@ HDNNDIB:
q NBJO, GJSTU MJOF
q NBLF0NFMFU, GJSTU MJOF
q QSFQBSF"MM, GJSTU MJOF
q QSFQBSF&HHT, GJSTU MJOF
PCKFDU.&YDFQUJPO: $BOOPU UBLF -8 FHHT GSPN UIF GSJEHF
4C@I OC@ @S>@KODJI DN OCMJRI, OC@ KMJBM<H @S@>PODJI @SDON OC@ QSFQBSF&HHT, QSFQBSF"MM,
NBLF0NFMFU <I? NBJO() API>ODJIN DI OC<O JM?@M, AMJH OC@ =JOOJH G@Q@G OJ OC@ OJK G@Q@G. +J
<??DODJI<G NO@KN <M@ @S@>PO@? <N OC@ KMJBM<H @SDON OC@N@ API>ODJIN.
1C@ M<ODJI<G@ AJM NP>C < ?M<NOD> O@MHDI<ODJI DN OC<O < A<DGPM@ DI < GJR@M G@Q@G API>ODJI RJPG?
H@<I OC<O OC@ CDBC@M G@Q@G API>ODJIN OC<O I@@?@? DO NCJPG? <GNJ =@ >JIND?@M@? <N A<DG@?.
1C@ @S>@KODJI J=E@>O OC<O DN OCMJRI AMJH < GJR@M G@Q@G API>ODJI DN OM<INA@MM@? OJ OC@ CDBC@M
G@Q@G API>ODJIN JI@ G@Q@G <O < ODH@ <I? ><PN@N OC@ KMJBM<H OJ ADI<GGT @SDO OC@ NBJO() API>ODJI.
1C@ K<OC OC<O OC@ @S>@KODJI O<F@N ><I =@ NCJRI <N OC@ M@? K<OC DI OC@ AJGGJRDIB OM@@:
q
]
NBJO s---+
] ]
+--r NBLF0NFMFU s-+
] ] ]
] +--r QSFQBSF"MM s------------+
] ] ] ]FYDFQUJPO
] ] +-r QSFQBSF&HHT 9-+
] ] +-r QSFQBSF#VUUFS
] ] +-r QSFQBSF1BO
] ]
] +--r DPPL&HHT
] +--r DMFBO"MM
]
+--r FBU0NFMFU
1C@ KJDIO JA OC@ @S>@KODJI H@>C<IDNH DN KM@>DN@GT OCDN =@C<QDJM JA @SDODIB <GG JA OC@ G<T@MN JA
API>ODJI ><GGN MDBCO <R<T. 0JH@ODH@N DO H<F@N N@IN@ OJ 53F5: OC@ OCMJRI @S>@KODJI OJ ADI? <
R<T OJ >JIODIP@ OC@ @S@>PODJI JA OC@ KMJBM<H. & RDGG DIOMJ?P>@ OC@ DBUDI F@TRJM? =@GJR.
EJ57BF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
196
When to use UISPX 40.1.3
2N@ UISPX DI NDOP<ODJIN RC@I DO DN IJO KJNND=G@ OJ >JIODIP@. #JM @S<HKG@, < API>ODJI OC<O M@<?N
OC@ IPH=@M JA NOP?@ION AMJH < ADG@ H<T OCMJR <I @S>@KODJI DA OCDN DIAJMH<ODJI DN IJO <Q<DG<=G@
JM DI>JMM@>O.
,I OC@ JOC@M C<I?, DA OC@ KMJ=G@H DN ><PN@? =T NJH@ PN@M <>ODJI GDF@ @IO@MDIB DIQ<GD? ?<O<, DO
H<T H<F@ HJM@ N@IN@ OJ Q<GD?<O@ OC@ ?<O< DINO@<? JA OCMJRDIB <I @S>@KODJI. !DNKG<TDIB <I
@MMJM H@NN<B@ <I? <NFDIB OC@ PN@M OJ M@-@IO@M OC@ ?<O< DN HJM@ <KKMJKMD<O@ DI H<IT ><N@N.
The USZ-DBUDI statement to catch exceptions
40.2
AN R@'Q@ N@@I <=JQ@, < OCMJRI @S>@KODJI ><PN@N OC@ KMJBM<H @S@>PODJI OJ @SDO <GG API>ODJIN
<I? OCDN ADI<GGT O@MHDI<O@N OC@ RCJG@ KMJBM<H.
1C@ @S>@KODJI J=E@>O ><I =@ ><PBCO =T < USZ-DBUDI NO<O@H@IO <O <IT KJDIO JI DON K<OC <N DO
@SDON OC@ API>ODJIN. 1C@ USZ-DBUDI NO<O@H@IO HJ?@GN OC@ KCM<N@ "FDK OJ ?J NJH@OCDIB, <I?
53F5: @S>@KODJIN OC<O H<T =@ OCMJRI." %@M@ DN OC@ NTIO<S JA USZ-DBUDI:
USZ \
// UIF DPEF CMPDL UIBU JT CFJOH FYFDVUFE, XIFSF BO
// FYDFQUJPO NBZ CF UISPXO
^ DBUDI (an_exception_type) \
// FYQSFTTJPOT UP FYFDVUF JG BO FYDFQUJPO PG UIJT
// UZQF JT DBVHIU
^ DBUDI (another_exception_type) \
// FYQSFTTJPOT UP FYFDVUF JG BO FYDFQUJPO PG UIJT
// PUIFS UZQF JT DBVHIU
// ... NPSF DBUDI CMPDLT BT BQQSPQSJBUF ...
^ GJOBMMZ \
// FYQSFTTJPOT UP FYFDVUF SFHBSEMFTT PG XIFUIFS BO
// FYDFQUJPO JT UISPXO
^
)@O'N NO<MO RDOC OC@ AJGGJRDIB KMJBM<H OC<O ?J@N IJO PN@ < USZ-DBUDI NO<O@H@IO <O OCDN NO<O@.
1C@ KMJBM<H M@<?N OC@ Q<GP@ JA < ?D@ AMJH < ADG@ <I? KMDION DO OJ OC@ NO<I?<M? JPOKPO:
JNQPSU TUE.TUEJP;
JOU SFBE%JF'SPN'JMF()
\
BVUP GJMF = 'JMF("UIF@GJMF@UIBU@DPOUBJOT@UIF@WBMVF", "S");
JOU EJF;
GJMF.SFBEG(" %T", &EJF);
SFUVSO EJF;
^
WPJE NBJO()
\
DPOTU JOU EJF = SFBE%JF'SPN'JMF();
XSJUFMO("%JF WBMVF: ", EJF);
^
+JO@ OC<O OC@ SFBE%JF'SPN'JMF API>ODJI DN RMDOO@I DI < R<T OC<O DBIJM@N @MMJM >JI?DODJIN,
@SK@>ODIB OC<O OC@ ADG@ <I? OC@ Q<GP@ OC<O DO >JIO<DIN <M@ <Q<DG<=G@. &I JOC@M RJM?N, OC@
API>ODJI DN ?@<GDIB JIGT RDOC DON JRI O<NF DINO@<? JA K<TDIB <OO@IODJI OJ @MMJM >JI?DODJIN. 1CDN
EJ57BF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
197
DN < =@I@ADO JA @S>@KODJIN: H<IT API>ODJIN ><I =@ RMDOO@I DI R<TN OC<O AJ>PN JI OC@DM <>OP<G
O<NFN, M<OC@M OC<I AJ>PNDIB JI @MMJM >JI?DODJIN.
)@O'N NO<MO OC@ KMJBM<H RC@I UIF@GJMF@UIBU@DPOUBJOT@UIF@WBMVF DN HDNNDIB:
TUE.FYDFQUJPO.&SSOP&YDFQUJPO!TUE/TUEJP.E(286): $BOOPU PQFO
GJMF AUIF@GJMF@UIBU@DPOUBJOT@UIF@WBMVF' JO NPEF AS' (/P TVDI
GJMF PS EJSFDUPSZ)
AI @S>@KODJI JA OTK@ &SSOP&YDFQUJPO DN OCMJRI <I? OC@ KMJBM<H O@MHDI<O@N RDOCJPO KMDIODIB
"!D@ Q<GP@: ".
)@O'N <?? <I DIO@MH@?D<O@ API>ODJI OJ OC@ KMJBM<H OC<O ><GGN SFBE%JF'SPN'JMF AMJH RDOCDI <
USZ =GJ>F <I? G@O'N C<Q@ NBJO() ><GG OCDN I@R API>ODJI:
JNQPSU TUE.TUEJP;
JOU SFBE%JF'SPN'JMF()
\
BVUP GJMF = 'JMF("UIF@GJMF@UIBU@DPOUBJOT@UIF@WBMVF", "S");
JOU EJF;
GJMF.SFBEG(" %T", &EJF);
SFUVSO EJF;
^
JOU USZ3FBEJOH'SPN'JMF()
\
JOU EJF;
USZ \
EJF = SFBE%JF'SPN'JMF();
^ DBUDI (TUE.FYDFQUJPO.&SSOP&YDFQUJPO FYD) \
XSJUFMO("($PVME OPU SFBE GSPN GJMF; BTTVNJOH 1)");
EJF = 1;
^
SFUVSO EJF;
^
WPJE NBJO()
\
DPOTU JOU EJF = USZ3FBEJOH'SPN'JMF();
XSJUFMO("%JF WBMVF: ", EJF);
^
4C@I R@ NO<MO OC@ KMJBM<H <B<DI RC@I UIF@GJMF@UIBU@DPOUBJOT@UIF@WBMVF DN NODGG HDNNDIB,
OCDN ODH@ OC@ KMJBM<H ?J@N IJO O@MHDI<O@ RDOC <I @S>@KODJI:
($PVME OPU SFBE GSPN GJMF; BTTVNJOH 1)
%JF WBMVF: 1
1C@ I@R KMJBM<H FD;7E @S@>PODIB SFBE%JF'SPN'JMF DI < USZ =GJ>F. &A OC<O =GJ>F @S@>PO@N
NP>>@NNAPGGT, OC@ API>ODJI @I?N IJMH<GGT RDOC OC@ SFUVSO EJF; NO<O@H@IO. &A OC@ @S@>PODJI JA
OC@ USZ =GJ>F @I?N RDOC OC@ NK@>DAD@? TUE.FYDFQUJPO.&SSOP&YDFQUJPO, OC@I OC@ KMJBM<H
@S@>PODJI @IO@MN OC@ DBUDI =GJ>F.
1C@ AJGGJRDIB DN < NPHH<MT JA @Q@ION RC@I OC@ KMJBM<H DN NO<MO@? RC@I OC@ ADG@ DN HDNNDIB:
EJ57BF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
198
t GDF@ DI OC@ KM@QDJPN KMJBM<H, < TUE.FYDFQUJPO.&SSOP&YDFQUJPO J=E@>O DN OCMJRI (=T
'JMF(), IJO =T JPM >J?@),
t OCDN @S>@KODJI DN ><PBCO =T DBUDI,
t OC@ Q<GP@ JA 1 DN <NNPH@? ?PMDIB OC@ IJMH<G @S@>PODJI JA OC@ DBUDI =GJ>F,
t <I? OC@ KMJBM<H >JIODIP@N DON IJMH<G JK@M<ODJIN.
DBUDI DN OJ ><O>C OCMJRI @S>@KODJIN KM@NPH<=GT OJ ADI? < R<T OJ >JIODIP@ @S@>PODIB OC@
KMJBM<H.
AN <IJOC@M @S<HKG@, G@O'N BJ =<>F OJ OC@ JH@G@O KMJBM<H <I? <?? < USZ-DBUDI NO<O@H@IO OJ
DON NBJO() API>ODJI:
WPJE NBJO()
\
FOUFSJOH("NBJO", 0);
USZ \
NBLF0NFMFU(-8);
FBU0NFMFU();
^ DBUDI (&YDFQUJPO FYD) \
XSJUF("'BJMFE UP FBU PNFMFU: ");
XSJUFMO('"', FYD.NTH, '"');
XSJUFMO("4IBMM FBU BU UIF OFJHICPS'T...");
^
FYJUJOH("NBJO", 0);
^
1C<O USZ =GJ>F >JIO<DIN ORJ GDI@N JA >J?@. AIT @S>@KODJI OCMJRI AMJH @DOC@M JA OCJN@ GDI@N
RJPG? =@ ><PBCO =T OC@ DBUDI =GJ>F.
q NBJO, GJSTU MJOF
q NBLF0NFMFU, GJSTU MJOF
q QSFQBSF"MM, GJSTU MJOF
q QSFQBSF&HHT, GJSTU MJOF
'BJMFE UP FBU PNFMFU: "$BOOPU UBLF -8 FHHT GSPN UIF GSJEHF"
4IBMM FBU BU UIF OFJHICPS'T...
r NBJO, MBTU MJOF
AN ><I =@ N@@I AMJH OC@ JPOKPO, OC@ KMJBM<H ?J@NI'O O@MHDI<O@ =@><PN@ JA OC@ OCMJRI
@S>@KODJI <ITHJM@. &O M@>JQ@MN AMJH OC@ @MMJM >JI?DODJI <I? >JIODIP@N @S@>PODIB IJMH<GGT ODGG
OC@ @I? JA OC@ NBJO() API>ODJI.
DBUDI blocks are looked up sequentially 40.2.1
1C@ OTK@ &YDFQUJPO, RCD>C R@ C<Q@ PN@? NJ A<M DI OC@ @S<HKG@N DN < B@I@M<G @S>@KODJI OTK@.
1CDN OTK@ H@M@GT NK@>DAD@N OC<O <I @MMJM J>>PMM@? DI OC@ KMJBM<H. &O <GNJ >JIO<DIN < H@NN<B@
OC<O ><I @SKG<DI OC@ @MMJM APMOC@M, =PO DO ?J@N IJO >JIO<DI DIAJMH<ODJI <=JPO OC@ FKB7 JA OC@
@MMJM.
$POW&YDFQUJPO <I? &SSOP&YDFQUJPO OC<O R@ C<Q@ N@@I @<MGD@M DI OCDN >C<KO@M <M@ HJM@
NK@>DAD> @S>@KODJI OTK@N: OC@ AJMH@M DN <=JPO < >JIQ@MNDJI @MMJM, <I? OC@ G<OO@M DN <=JPO <
NTNO@H @MMJM. )DF@ H<IT JOC@M @S>@KODJI OTK@N DI -CJ=JN <I? <N OC@DM I<H@N NPBB@NO,
$POW&YDFQUJPO <I? &SSOP&YDFQUJPO <M@ =JOC DIC@MDO@? AMJH OC@ &YDFQUJPO >G<NN.
&YDFQUJPO <I? DON ND=GDIB &SSPS <M@ APMOC@M DIC@MDO@? AMJH 5ISPXBCMF, OC@ HJNO B@I@M<G
@S>@KODJI OTK@.
EJ57BF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
199
AGOCJPBC KJNND=G@, DO DN IJO M@>JHH@I?@? OJ ><O>C J=E@>ON JA OTK@ &SSPS <I? J=E@>ON JA OTK@N
OC<O <M@ DIC@MDO@? AMJH &SSPS. 0DI>@ DO DN HJM@ B@I@M<G OC<I &SSPS, DO DN IJO M@>JHH@I?@? OJ
><O>C 5ISPXBCMF @DOC@M. 4C<O NCJPG? IJMH<GGT =@ ><PBCO <M@ OC@ OTK@N OC<O <M@ PI?@M OC@
&YDFQUJPO CD@M<M>CT.
5ISPXBCMF (OPU SFDPNNFOEFE UP DBUDI)
o n
&YDFQUJPO &SSPS (OPU SFDPNNFOEFE UP DBUDI)
o n o n
... ... ... ...
Note: ! I;>> 7JB>3;@ F:7 :;7D3D5:K D7BD7E7@F3F;A@E >3F7D ;@ F:7 !@:7D;F3@57 5:3BF7D. ):7 FD77
34AH7 ;@6;53F7E F:3F Throwable ;E F:7 ?AEF 97@7D3> 3@6 Exception 3@6 Error 3D7 ?AD7
EB75;8;5.
&O DN KJNND=G@ OJ ><O>C @S>@KODJI J=E@>ON JA < K<MOD>PG<M OTK@. #JM @S<HKG@, DO DN KJNND=G@ OJ
><O>C <I &SSOP&YDFQUJPO J=E@>O NK@>DAD><GGT OJ ?@O@>O <I? C<I?G@ < NTNO@H @MMJM.
"S>@KODJIN <M@ ><PBCO JIGT DA OC@T H<O>C < OTK@ OC<O DN NK@>DAD@? DI < DBUDI =GJ>F. #JM
@S<HKG@, < ><O>C =GJ>F OC<O DN OMTDIB OJ ><O>C < 4QFDJBM&YDFQUJPO5ZQF RJPG? IJO ><O>C <I
&SSOP&YDFQUJPO.
1C@ OTK@ JA OC@ @S>@KODJI J=E@>O OC<O DN OCMJRI ?PMDIB OC@ @S@>PODJI JA < USZ =GJ>F DN
H<O>C@? OJ OC@ OTK@N OC<O <M@ NK@>DAD@? =T OC@ DBUDI =GJ>FN, DI OC@ JM?@M DI RCD>C OC@ DBUDI
=GJ>FN <M@ RMDOO@I. &A OC@ OTK@ JA OC@ J=E@>O H<O>C@N OC@ OTK@ JA OC@ DBUDI =GJ>F, OC@I OC@
@S>@KODJI DN >JIND?@M@? OJ =@ ><PBCO =T OC<O DBUDI =GJ>F, <I? OC@ >J?@ OC<O DN RDOCDI OC<O
=GJ>F DN @S@>PO@?. ,I>@ < H<O>C DN AJPI?, OC@ M@H<DIDIB DBUDI =GJ>FN <M@ DBIJM@?.
B@><PN@ OC@ DBUDI =GJ>FN <M@ H<O>C@? DI JM?@M AMJH OC@ ADMNO OJ OC@ G<NO, OC@ DBUDI =GJ>FN
HPNO =@ JM?@M@? AMJH OC@ HJNO NK@>DAD> @S>@KODJI OTK@N OJ OC@ HJNO B@I@M<G @S>@KODJI OTK@N.
A>>JM?DIBGT, <I? DA DO H<F@N N@IN@ OJ ><O>C OC<O OTK@ JA @S>@KODJIN, OC@ &YDFQUJPO OTK@ HPNO
=@ NK@>DAD@? <O OC@ G<NO DBUDI =GJ>F.
#JM @S<HKG@, < USZ-DBUDI NO<O@H@IO OC<O DN OMTDIB OJ ><O>C N@Q@M<G NK@>DAD> OTK@N JA
@S>@KODJIN <=JPO NOP?@IO M@>JM?N H<T JM?@M OC@ DBUDI =GJ>FN AMJH OC@ HJNO NK@>DAD> OJ OC@
HJNO B@I@M<G <N DI OC@ AJGGJRDIB >J?@:
USZ \
// PQFSBUJPOT BCPVU TUVEFOU SFDPSET UIBU NBZ UISPX ...
^ DBUDI (4UVEFOU*E%JHJU&YDFQUJPO FYD) \
// BO FYDFQUJPO UIBU JT TQFDJGJDBMMZ BCPVU FSSPST XJUI
// UIF EJHJUT PG TUVEFOU JET
^ DBUDI (4UVEFOU*E&YDFQUJPO FYD) \
// B NPSF HFOFSBM FYDFQUJPO BCPVU TUVEFOU JET CVU OPU
// OFDFTTBSJMZ BCPVU UIFJS EJHJUT
^ DBUDI (4UVEFOU3FDPSE&YDFQUJPO FYD) \
// FWFO NPSF HFOFSBM FYDFQUJPO BCPVU TUVEFOU SFDPSET
^ DBUDI (&YDFQUJPO FYD) \
// UIF NPTU HFOFSBM FYDFQUJPO UIBU NBZ OPU CF SFMBUFE
// UP TUVEFOU SFDPSET
^
EJ57BF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
200
The GJOBMMZ block 40.2.2
GJOBMMZ DN <I JKODJI<G =GJ>F JA OC@ USZ-DBUDI NO<O@H@IO. &O DI>GP?@N @SKM@NNDJIN OC<O NCJPG?
=@ @S@>PO@? M@B<M?G@NN JA RC@OC@M <I @S>@KODJI DN OCMJRI JM IJO.
1J N@@ CJR GJOBMMZ RJMFN, G@O'N GJJF <O < KMJBM<H OC<O OCMJRN <I @S>@KODJI 50% JA OC@ ODH@:
JNQPSU TUE.TUEJP;
JNQPSU TUE.SBOEPN;
WPJE UISPXT)BMG5IF5JNF()
\
JG (VOJGPSN(0, 2) == 1) \
UISPX OFX &YDFQUJPO("UIF FSSPS NFTTBHF");
^
^
WPJE GPP()
\
XSJUFMO("UIF GJSTU MJOF PG GPP()");
USZ \
XSJUFMO("UIF GJSTU MJOF PG UIF USZ CMPDL");
UISPXT)BMG5IF5JNF();
XSJUFMO("UIF MBTU MJOF PG UIF USZ CMPDL");
// ... UIFSF NBZ CF POF PS NPSF DBUDI CMPDLT IFSF ...
^ GJOBMMZ \
XSJUFMO("UIF CPEZ PG UIF GJOBMMZ CMPDL");
^
XSJUFMO("UIF MBTU MJOF PG GPP()");
^
WPJE NBJO()
\
GPP();
^
1C@ JPOKPO JA OC@ KMJBM<H DN OC@ AJGGJRDIB RC@I OC@ API>ODJI ?J@N IJO OCMJR:
UIF GJSTU MJOF PG GPP()
UIF GJSTU MJOF PG UIF USZ CMPDL
UIF MBTU MJOF PG UIF USZ CMPDL
UIF CPEZ PG UIF GJOBMMZ CMPDL
UIF MBTU MJOF PG GPP()
1C@ JPOKPO JA OC@ KMJBM<H DN OC@ AJGGJRDIB RC@I OC@ API>ODJI ?J@N OCMJR:
UIF GJSTU MJOF PG GPP()
UIF GJSTU MJOF PG UIF USZ CMPDL
UIF CPEZ PG UIF GJOBMMZ CMPDL
PCKFDU.&YDFQUJPO!EFOFNF.E: UIF FSSPS NFTTBHF
AN ><I =@ N@@I, <GOCJPBC "OC@ G<NO GDI@ JA OC@ OMT =GJ>F" <I? "OC@ G<NO GDI@ JA AJJ()" <M@ IJO
KMDIO@?, OC@ >JIO@IO JA OC@ GJOBMMZ =GJ>F DN NODGG @S@>PO@? RC@I <I @S>@KODJI DN OCMJRI.
When to use the USZ-DBUDI statement 40.2.3
1C@ USZ-DBUDI NO<O@H@IO DN PN@APG OJ ><O>C @S>@KODJIN OJ ?J NJH@OCDIB NK@>D<G <=JPO OC@H.
EJ57BF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
201
#JM OC<O M@<NJI, OC@ USZ-DBUDI NO<O@H@IO NCJPG? =@ PN@? JIGT RC@I OC@M@ DN NJH@OCDIB
NK@>D<G OJ =@ ?JI@. !J IJO ><O>C @S>@KODJIN JOC@MRDN@ <I? G@<Q@ OC@H OJ CDBC@M G@Q@G
API>ODJIN OC<O H<T R<IO OJ ><O>C OC@H.
Types of errors
40.3
4@ C<Q@ N@@I CJR PN@APG OC@ @S>@KODJI H@>C<IDNH DN. &O @I<=G@N =JOC OC@ GJR@M <I? CDBC@M
G@Q@G JK@M<ODJIN OJ =@ <=JMO@? MDBCO <R<T, DINO@<? JA OC@ KMJBM<H >JIODIPDIB RDOC DI>JMM@>O JM
HDNNDIB ?<O<, JM =@C<QDIB DI <IT JOC@M DI>JMM@>O R<T.
1CDN ?J@N IJO H@<I OC<O @Q@MT @MMJM >JI?DODJI R<MM<ION OCMJRDIB <I @S>@KODJI. 1C@M@ H<T =@
=@OO@M OCDIBN OJ ?J ?@K@I?DIB JI OC@ OTK@N JA @MMJMN.
User errors 40.3.1
0JH@ JA OC@ @MMJMN <M@ ><PN@? =T OC@ PN@M. AN R@ C<Q@ N@@I <=JQ@, OC@ PN@M H<T C<Q@
@IO@M@? < NOMDIB GDF@ "C@GGJ" @Q@I OCJPBC OC@ KMJBM<H C<N =@@I @SK@>ODIB < IPH=@M. &O H<T
=@ HJM@ <KKMJKMD<O@ OJ ?DNKG<T <I @MMJM H@NN<B@ <I? <NF OC@ PN@M OJ @IO@M <KKMJKMD<O@ ?<O<
<B<DI.
"Q@I NJ, DO H<T =@ ADI@ OJ <>>@KO <I? PN@ OC@ ?<O< ?DM@>OGT RDOCJPO Q<GD?<ODIB OC@ ?<O< PK
AMJIO; <N GJIB <N OC@ >J?@ OC<O PN@N OC@ ?<O< RJPG? OCMJR <ITR<T. 4C<O DN DHKJMO<IO DN OJ =@
<=G@ OJ IJODAT OC@ PN@M RCT OC@ ?<O< DN IJO NPDO<=G@.
#JM @S<HKG@, G@O'N GJJF <O < KMJBM<H OC<O O<F@N < ADG@ I<H@ AMJH OC@ PN@M. 1C@M@ <M@ <O G@<NO
ORJ R<TN JA ?@<GDIB RDOC KJO@IOD<GGT DIQ<GD? ADG@ I<H@N:
t Validating the data before use: 4@ ><I ?@O@MHDI@ RC@OC@M OC@ ADG@ RDOC OC@ BDQ@I I<H@
@SDNON =T ><GGDIB FYJTUT() JA OC@ TUE.GJMF HJ?PG@:
JG (FYJTUT(GJMF/BNF)) \
// ZFT, UIF GJMF FYJTUT
^ FMTF \
// OP, UIF GJMF EPFTO'U FYJTU
^
1CDN BDQ@N PN OC@ >C<I>@ OJ =@ <=G@ OJ JK@I OC@ ?<O< JIGT DA DO @SDNON. 2IAJMOPI<O@GT, DO
DN NODGG KJNND=G@ OC<O OC@ ADG@ ><IIJO =@ JK@I@? @Q@I DA FYJTUT() M@OPMIN USVF, DA AJM
@S<HKG@ <IJOC@M KMJ>@NN JI OC@ NTNO@H ?@G@O@N JM M@I<H@N OC@ ADG@ =@AJM@ OCDN
KMJBM<H <>OP<GGT JK@IN DO.
#JM OC<O M@<NJI, OC@ AJGGJRDIB H@OCJ? H<T =@ HJM@ PN@APG.
t Using the data without first validating it: 4@ ><I <NNPH@ OC<O OC@ ?<O< DN Q<GD? <I?
NO<MO PNDIB DO MDBCO <R<T, =@><PN@ 'JMF RJPG? OCMJR <I @S>@KODJI DA OC@ ADG@ ><IIJO =@
JK@I@? <ITR<T.
JNQPSU TUE.TUEJP;
JNQPSU TUE.TUSJOH;
WPJE VTF5IF'JMF(TUSJOH GJMF/BNF)
\
BVUP GJMF = 'JMF(GJMF/BNF, "S");
// ...
^
TUSJOH SFBE@TUSJOH(JO DIBS<> QSPNQU)
\
XSJUF(QSPNQU, ": ");
EJ57BF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
202
SFUVSO DIPNQ(SFBEMO());
^
WPJE NBJO()
\
CPPM JT@GJMF6TFE = GBMTF;
XIJMF (!JT@GJMF6TFE) \
USZ \
VTF5IF'JMF(
SFBE@TUSJOH("1MFBTF FOUFS B GJMF OBNF"));
/*
* *G XF BSF BU UIJT MJOF, JU NFBOT UIBU
* VTF5IF'JMF() GVODUJPO IBT CFFO DPNQMFUFE
* TVDDFTTGVMMZ. 5IJT JOEJDBUFT UIBU UIF GJMF
* OBNF IBT CFFO WBMJE.
*
* 8F DBO OPX TFU UIF WBMVF PG UIF MPPQ GMBH UP
* UFSNJOBUF UIF XIJMF MPPQ.
*/
JT@GJMF6TFE = USVF;
XSJUFMO("5IF GJMF IBT CFFO VTFE TVDDFTTGVMMZ");
^ DBUDI (TUE.FYDFQUJPO.&SSOP&YDFQUJPO FYD) \
TUEFSS.XSJUFMO("5IJT GJMF DPVME OPU CF PQFOFE");
^
^
^
Programmer errors 40.3.2
0JH@ @MMJMN <M@ ><PN@? =T KMJBM<HH@M HDNO<F@N. #JM @S<HKG@ OC@ KMJBM<HH@M H<T OCDIF
OC<O < API>ODJI OC<O C<N EPNO =@@I RMDOO@I RDGG <GR<TN =@ ><GG@? RDOC < Q<GP@ BM@<O@M OC<I JM
@LP<G U@MJ, <I? OCDN H<T =@ OMP@ <>>JM?DIB OJ OC@ ?@NDBI JA OC@ KMJBM<H. 1C@ API>ODJI C<QDIB
NODGG =@@I ><GG@? RDOC < Q<GP@ G@NN OC<I U@MJ RJPG? DI?D><O@ @DOC@M < HDNO<F@ DI OC@ ?@NDBI JA
OC@ KMJBM<H JM DI OC@ DHKG@H@IO<ODJI JA OC<O ?@NDBI. BJOC JA OC@N@ ><I =@ OCJPBCO JA <N
KMJBM<HHDIB @MMJMN.
&O DN HJM@ <KKMJKMD<O@ OJ PN@ BTTFSU DINO@<? JA OC@ @S>@KODJI H@>C<IDNH AJM @MMJMN OC<O <M@
><PN@? =T KMJBM<HH@M HDNO<F@N. (Note: ,7 I;>> 5AH7D assert ;@ 3 >3F7D 5:3BF7D.)
WPJE QSPDFTT.FOV4FMFDUJPO(JOU TFMFDUJPO)
\
BTTFSU(TFMFDUJPO >= 0);
// ...
^
WPJE NBJO()
\
QSPDFTT.FOV4FMFDUJPO(-1);
^
1C@ KMJBM<H O@MHDI<O@N RDOC <I BTTFSU A<DGPM@:
DPSF.FYDFQUJPO."TTFSU&SSPS!EFOFNF.E(3): "TTFSUJPO GBJMVSF
BTTFSU Q<GD?<O@N KMJBM<H NO<O@ <I? KMDION OC@ ADG@ I<H@ <I? GDI@ IPH=@M JA OC@ Q<GD?<ODJI DA
DO A<DGN. 1C@ H@NN<B@ <=JQ@ DI?D><O@N OC<O OC@ <NN@MODJI <O GDI@ 3 JA ?@I@H@.? C<N A<DG@?.
EJ57BF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
203
Unexpected situations 40.3.3
#JM PI@SK@>O@? NDOP<ODJIN OC<O <M@ JPOND?@ JA OC@ ORJ B@I@M<G ><N@N <=JQ@, DO DN NODGG
<KKMJKMD<O@ OJ OCMJR @S>@KODJIN. &A OC@ KMJBM<H ><IIJO >JIODIP@ DON @S@>PODJI, OC@M@ DN
IJOCDIB @GN@ OJ ?J =PO OJ OCMJR.
&O DN PK OJ OC@ CDBC@M G<T@M API>ODJIN OC<O ><GG OCDN API>ODJI OJ ?@>D?@ RC<O OJ ?J RDOC OCMJRI
@S>@KODJIN. 1C@T H<T ><O>C OC@ @S>@KODJIN OC<O R@ OCMJR OJ M@H@?T OC@ NDOP<ODJI.
Summary
40.4
t 4C@I A<>@? RDOC < PN@M @MMJM @DOC@M R<MI OC@ PN@M MDBCO <R<T JM @INPM@ OC<O <I @S>@KODJI
DN OCMJRI; OC@ @S>@KODJI H<T =@ OCMJRI <ITR<T =T <IJOC@M API>ODJI RC@I PNDIB DI>JMM@>O
?<O<, JM TJP H<T OCMJR ?DM@>OGT.
t 2N@ BTTFSU OJ Q<GD?<O@ KMJBM<H GJBD> <I? DHKG@H@IO<ODJI. (Note: ! I;>> 7JB>3;@ assert ;@
3 >3F7D 5:3BF7D.)
t 4C@I DI ?JP=O, UISPX <I @S>@KODJI.
t <O>C @S>@KODJIN DA <I? JIGT DA TJP ><I ?J NJH@OCDIB PN@APG <=JPO OC<O @S>@KODJI.
,OC@MRDN@, ?J IJO @I><KNPG<O@ >J?@ RDOC < USZ-DBUDI NO<O@H@IO; DINO@<?, G@<Q@ OC@
@S>@KODJIN OJ CDBC@M G<T@MN JA OC@ >J?@ OC<O H<T ?J NJH@OCDIB <=JPO OC@H.
t ,M?@M OC@ DBUDI =GJ>FN AMJH OC@ HJNO NK@>DAD> OJ OC@ HJNO B@I@M<G.
t -PO OC@ @SKM@NNDJIN OC<O HPNO <GR<TN =@ @S@>PO@? RC@I G@<QDIB < N>JK@, DI GJOBMMZ
=GJ>FN.
EJ57BF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
204
TDPQF 41
AN R@ C<Q@ N@@I, @SKM@NNDJIN OC<O HPNO <GR<TN =@ @S@>PO@? <M@ RMDOO@I DI OC@ GJOBMMZ =GJ>F,
<I? @SKM@NNDJIN OC<O HPNO =@ @S@>PO@? RC@I OC@M@ <M@ @MMJM >JI?DODJIN <M@ RMDOO@I DI DBUDI
=GJ>FN.
4@ ><I H<F@ OC@ AJGGJRDIB J=N@MQ<ODJIN <=JPO OC@ PN@ JA OC@N@ =GJ>FN:
t DBUDI <I? GJOBMMZ ><IIJO =@ PN@? RDOCJPO < USZ =GJ>F.
t 0JH@ JA OC@ Q<MD<=G@N OC<O OC@N@ =GJ>FN I@@? H<T IJO =@ <>>@NND=G@ RDOCDI OC@N@ =GJ>FN:
WPJE GPP(SFG JOU S)
\
USZ \
JOU BEEFOE = 42;
S += BEEFOE;
NBZ5ISPX();
^ DBUDI (&YDFQUJPO FYD) \
S -= BEEFOE; // j DPNQJMBUJPO &3303
^
^
1C<O API>ODJI ADMNO HJ?DAD@N OC@ M@A@M@I>@ K<M<H@O@M, <I? OC@I M@Q@MON OCDN
HJ?DAD><ODJI RC@I <I @S>@KODJI DN OCMJRI. 2IAJMOPI<O@GT, BEEFOE DN <>>@NND=G@ JIGT DI
OC@ USZ =GJ>F, RC@M@ DO DN ?@ADI@?. (Note: ):;E ;E D7>3F76 FA @3?7 EB357E; 3E I7>> 3E
A4<75F >;87F;?7E F:3F I;>> 47 7JB>3;@76 ;@ 3 >3F7D 5:3BF7D.)
t 4MDODIB <GG JA KJO@IOD<GGT PIM@G<O@? @SKM@NNDJIN DI OC@ NDIBG@ GJOBMMZ =GJ>F <O OC@ =JOOJH
N@K<M<O@N OCJN@ @SKM@NNDJIN AMJH OC@ <>OP<G >J?@ OC<O OC@T <M@ M@G<O@? OJ.
1C@ TDPQF NO<O@H@ION C<Q@ NDHDG<M API>ODJI<GDOT RDOC OC@ DBUDI <I? GJOBMMZ N>JK@N =PO OC@T
<M@ =@OO@M DI H<IT M@NK@>ON. 1C@ OCM@@ TDPQF NO<O@H@ION <M@ <GNJ <=JPO @SKM@NNDJIN OC<O
NCJPG? =@ @S@>PO@? RC@I G@<QDIB N>JK@N:
t TDPQF(FYJU): OC@ @SKM@NNDJI DN <GR<TN @S@>PO@? RC@I @SDODIB OC@ N>JK@, M@B<M?G@NN JA
RC@OC@M NP>>@NNAPGGT JM ?P@ OJ <I @S>@KODJI
t TDPQF(TVDDFTT): OC@ @SKM@NNDJI DN @S@>PO@? JIGT DA OC@ N>JK@ DN =@DIB @SDO@? NP>>@NNAPGGT
t TDPQF(GBJMVSF): OC@ @SKM@NNDJI DN @S@>PO@? JIGT DA OC@ N>JK@ DN =@DIB @SDO@? ?P@ OJ <I
@S>@KODJI
AGOCJPBC OC@N@ NO<O@H@ION <M@ >GJN@GT M@G<O@? OJ @S>@KODJIN, OC@T ><I =@ PN@? RDOCJPO < USZ-
DBUDI =GJ>F.
AN <I @S<HKG@, G@O'N RMDO@ OC@ API>ODJI <=JQ@ RDOC < TDPQF(GBJMVSF) NO<O@H@IO:
WPJE GPP(SFG JOU S)
\
JOU BEEFOE = 42;
S += BEEFOE;
TDPQF(GBJMVSF) S -= BEEFOE;
NBZ5ISPX();
^
1C@ TDPQF(GBJMVSF) NO<O@H@IO <=JQ@ @INPM@N OC<O OC@ S -= BEEFOE @SKM@NNDJI RDGG =@
@S@>PO@? DA OC@ API>ODJI'N N>JK@ DN @SDO@? ?P@ OJ <I @S>@KODJI. A =@I@ADO JA TDPQF(GBJMVSF) DN
OC@ A<>O OC<O OC@ @SKM@NNDJI OC<O M@Q@MON <IJOC@M @SKM@NNDJI DN RMDOO@I >GJN@ OJ DO.
E5AB7
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
205
TDPQF NO<O@H@ION ><I =@ NK@>DAD@? <N =GJ>FN <N R@GG:
TDPQF(FYJU) \
// ... FYQSFTTJPOT ...
^
%@M@ DN <IJOC@M API>ODJI OC<O O@NON <GG OCM@@ JA OC@N@ NO<O@H@ION:
WPJE UFTU()
\
TDPQF(FYJU) XSJUFMO("XIFO FYJUJOH 1");
TDPQF(TVDDFTT) \
XSJUFMO("JG TVDDFTTGVM 1");
XSJUFMO("JG TVDDFTTGVM 2");
^
TDPQF(GBJMVSF) XSJUFMO("JG UISPXO 1");
TDPQF(FYJU) XSJUFMO("XIFO FYJUJOH 2");
TDPQF(GBJMVSF) XSJUFMO("JG UISPXO 2");
UISPXT)BMG5IF5JNF();
^
&A IJ @S>@KODJI DN OCMJRI, OC@ JPOKPO JA OC@ API>ODJI DI>GP?@N JIGT OC@ TDPQF(FYJU) <I?
TDPQF(TVDDFTT) @SKM@NNDJIN:
XIFO FYJUJOH 2
JG TVDDFTTGVM 1
JG TVDDFTTGVM 2
XIFO FYJUJOH 1
&A <I @S>@KODJI DN OCMJRI, OC@ JPOKPO DI>GP?@N OC@ TDPQF(FYJU) <I? TDPQF(GBJMVSF)
@SKM@NNDJIN:
JG UISPXO 2
XIFO FYJUJOH 2
JG UISPXO 1
XIFO FYJUJOH 1
PCKFDU.&YDFQUJPO!...: UIF FSSPS NFTTBHF
AN N@@I DI OC@ JPOKPON, OC@ =GJ>FN JA OC@ TDPQF NO<O@H@ION <M@ @S@>PO@? DI M@Q@MN@ JM?@M. 1CDN
DN =@><PN@ G<O@M >J?@ H<T ?@K@I? JI KM@QDJPN Q<MD<=G@N. "S@>PODIB OC@ TDPQF NO<O@H@ION DI
M@Q@MN@ JM?@M @I<=G@N PI?JDIB ND?@ @AA@>ON JA @<MGD@M @SKM@NNDJIN DI < >JINDNO@IO JM?@M.
E5AB7
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
206
BTTFSU and FOGPSDF 42
&I OC@ KM@QDJPN ORJ >C<KO@MN R@ C<Q@ N@@I CJR @S>@KODJIN <I? TDPQF NO<O@H@ION <M@ PN@?
OJR<M?N KMJBM<H >JMM@>OI@NN. BTTFSU DN <IJOC@M KJR@MAPG OJJG OJ <>CD@Q@ OC@ N<H@ BJ<G =T
@INPMDIB OC<O >@MO<DI <NNPHKODJIN OC<O OC@ KMJBM<H DN =<N@? JI <M@ Q<GD?.
&O H<T NJH@ODH@N =@ ?DAAD>PGO OJ ?@>D?@ RC@OC@M OJ OCMJR <I @S>@KODJI JM OJ ><GG BTTFSU. & RDGG
PN@ BTTFSU DI <GG JA OC@ @S<HKG@N =@GJR RDOCJPO HP>C EPNODAD><ODJI. & RDGG @SKG<DI OC@
?DAA@M@I>@N G<O@M DI OC@ >C<KO@M.
AGOCJPBC IJO <GR<TN J=QDJPN, KMJBM<HN <M@ APGG JA <NNPHKODJIN. #JM @S<HKG@, OC@ AJGGJRDIB
API>ODJI DN RMDOO@I PI?@M OC@ <NNPHKODJI OC<O =JOC <B@ K<M<H@O@MN <M@ BM@<O@M OC<I JM @LP<G
OJ U@MJ:
EPVCMF BWFSBHF"HF(EPVCMF GJSTU, EPVCMF TFDPOE)
\
SFUVSO (GJSTU + TFDPOE) / 2;
^
AGOCJPBC DO H<T =@ DIQ<GD? AJM OC@ KMJBM<H OJ @Q@M C<Q@ <I <B@ Q<GP@ OC<O DN I@B<ODQ@, OC@
API>ODJI RJPG? NODGG KMJ?P>@ <I <Q@M<B@, RCD>C H<T =@ PN@? DI OC@ KMJBM<H PIIJOD>@?,
M@NPGODIB DI OC@ KMJBM<H'N >JIODIPDIB RDOC DI>JMM@>O ?<O<.
AN <IJOC@M @S<HKG@, OC@ AJGGJRDIB API>ODJI <NNPH@N OC<O DO RDGG <GR<TN =@ ><GG@? RDOC ORJ
>JHH<I?N: "NDIB" JM "?<I>@":
WPJE BQQMZ$PNNBOE(TUSJOH DPNNBOE)
\
JG (DPNNBOE == "TJOH") \
SPCPU4JOH();
^ FMTF \
SPCPU%BODF();
^
^
B@><PN@ JA OC<O <NNPHKODJI, OC@ SPCPU%BODF() API>ODJI RJPG? =@ ><GG@? AJM @Q@MT >JHH<I?
JOC@M OC<I "NDIB", Q<GD? JM DIQ<GD?.
4C@I NP>C <NNPHKODJIN <M@ F@KO JIGT DI OC@ KMJBM<HH@M'N HDI?, OC@ KMJBM<H H<T @I? PK
RJMFDIB DI>JMM@>OGT. BTTFSU >C@>FN <NNPHKODJIN <I? O@MHDI<O@N KMJBM<HN DHH@?D<O@GT RC@I
OC@T <M@ IJO Q<GD?.
Syntax
42.1
BTTFSU ><I =@ PN@? DI ORJ R<TN:
BTTFSU(logical_expression);
BTTFSU(logical_expression, message);
1C@ GJBD><G @SKM@NNDJI M@KM@N@ION <I <NNPHKODJI <=JPO OC@ KMJBM<H. BTTFSU @Q<GP<O@N OC<O
@SKM@NNDJI OJ Q<GD?<O@ OC<O <NNPHKODJI. &A OC@ Q<GP@ JA OC@ GJBD><G @SKM@NNDJI DN USVF OC@I OC@
<NNPHKODJI DN >JIND?@M@? OJ =@ Q<GD?. ,OC@MRDN@ OC@ <NNPHKODJI DN DIQ<GD? <I? <I
"TTFSU&SSPS DN OCMJRI.
AN DON I<H@ NPBB@NON, OCDN @S>@KODJI DN DIC@MDO@? AMJH &SSPS, <I? <N TJP H<T M@H@H=@M AMJH
OC@ "S>@KODJIN >C<KO@M, @S>@KODJIN OC<O <M@ DIC@MDO@? AMJH &SSPS HPNO I@Q@M =@ ><PBCO. &O DN
3EE7DF 3@6 7@8AD57
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
207
DHKJMO<IO AJM OC@ KMJBM<H OJ =@ O@MHDI<O@? MDBCO <R<T DINO@<? JA >JIODIPDIB PI?@M DIQ<GD?
<NNPHKODJIN.
1C@ ORJ DHKGD>DO <NNPHKODJIN JA BWFSBHF"HF() <=JQ@ H<T =@ NK@GG@? JPO =T ORJ BTTFSU ><GGN
<N DI OC@ AJGGJRDIB API>ODJI:
EPVCMF BWFSBHF"HF(EPVCMF GJSTU, EPVCMF TFDPOE)
\
BTTFSU(GJSTU >= 0);
BTTFSU(TFDPOE >= 0);
SFUVSO (GJSTU + TFDPOE) / 2;
^
WPJE NBJO()
\
BVUP SFTVMU = BWFSBHF"HF(-1, 10);
^
1CJN@ BTTFSU >C@>FN ><MMT OC@ H@<IDIB "<NNPHDIB OC<O =JOC JA OC@ <B@N BM@<O@M OC<I JM
@LP<G OJ U@MJ". &O ><I <GNJ =@ OCJPBCO JA <N H@<IDIB "OCDN API>ODJI ><I RJMF >JMM@>OGT JIGT DA
=JOC JA OC@ <B@N <M@ BM@<O@M OC<I JM @LP<G OJ U@MJ".
BTTFSU >C@>FN OCJN@ <NNPHKODJIN <I? O@MHDI<O@N OC@ KMJBM<H RDOC <I "TTFSU&SSPS RC@I
OC@T <M@ IJO Q<GD?:
DPSF.FYDFQUJPO."TTFSU&SSPS!EFOFNF(3): "TTFSUJPO GBJMVSF
1C@ K<MO <AO@M OC@ ! >C<M<>O@M DI OC@ H@NN<B@ DI?D><O@N OC@ NJPM>@ ADG@ <I? OC@ GDI@ IPH=@M JA
OC@ BTTFSU >C@>F OC<O C<N A<DG@?. A>>JM?DIB OJ OC@ JPOKPO <=JQ@, OC@ BTTFSU OC<O C<N A<DG@? DN
JI GDI@ 3 JA ADG@ EFOFNF.E.
1C@ JOC@M NTIO<S JA BTTFSU <GGJRN KMDIODIB < >PNOJH H@NN<B@ RC@I OC@ BTTFSU >C@>F A<DGN:
BTTFSU(GJSTU >= 0, ""HF DBOOPU CF OFHBUJWF.");
1C@ JPOKPO:
DPSF.FYDFQUJPO."TTFSU&SSPS!EFOFNF.E(3): "HF DBOOPU CF OFHBUJWF.
0JH@ODH@N DO DN OCJPBCO OJ =@ DHKJNND=G@ AJM OC@ KMJBM<H OJ @Q@M @IO@M < >J?@ K<OC. &I NP>C
><N@N DO DN >JHHJI OJ PN@ OC@ GDO@M<G GBMTF <N OC@ GJBD><G @SKM@NNDJI OJ A<DG <I BTTFSU >C@>F.
#JM @S<HKG@, OJ DI?D><O@ OC<O BQQMZ$PNNBOE() API>ODJI DN I@Q@M @SK@>O@? OJ =@ ><GG@? RDOC <
>JHH<I? JOC@M OC<I "NDIB" <I? "?<I>@", <I? OJ BP<M? <B<DINO NP>C < KJNND=DGDOT, <I
BTTFSU(GBMTF) ><I =@ DIN@MO@? DIOJ OC@ ;?BAEE;4>7 =M<I>C:
WPJE BQQMZ$PNNBOE(TUSJOH DPNNBOE)
\
JG (DPNNBOE == "TJOH") \
SPCPU4JOH();
^ FMTF JG (DPNNBOE == "EBODF") \
SPCPU%BODF();
^ FMTF \
BTTFSU(GBMTF);
^
^
3EE7DF 3@6 7@8AD57
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
208
1C@ API>ODJI DN BP<M<IO@@? OJ RJMF RDOC OC@ JIGT ORJ >JHH<I?N OC<O DO FIJRN <=JPO. (Note:
A@ 3>F7D@3F;H7 5:A;57 :7D7 IAG>6 47 FA GE7 3 final switch EF3F7?7@F.)
TUBUJD BTTFSU
42.2
0DI>@ BTTFSU >C@>FN <M@ AJM >JMM@>O @S@>PODJI JA KMJBM<HN, OC@T <M@ <KKGD@? RC@I OC@
KMJBM<H DN <>OP<GGT MPIIDIB. ,OC@M >C@>FN <M@ <=JPO OC@ NOMP>OPM@ JA OC@ KMJBM<H <I? ><I =@
<KKGD@? @Q@I <O >JHKDG@ ODH@.
TUBUJD BTTFSU DN OC@ >JPIO@MK<MO JA BTTFSU OC<O DN <KKGD@? <O >JHKDG@ ODH@. 1C@ <?Q<IO<B@ DN
OC<O DO ?J@N IJO <GGJR @Q@I >JHKDGDIB < KMJBM<H OC<O RJPG? C<Q@ JOC@MRDN@ MPI DI>JMM@>OGT. A
I<OPM<G M@LPDM@H@IO DN OC<O DO HPNO =@ KJNND=G@ OJ @Q<GP<O@ OC@ GJBD><G @SKM@NNDJI <O >JHKDG@
ODH@.
#JM @S<HKG@, <NNPHDIB OC<O OC@ ODOG@ JA < H@IP RDGG =@ KMDIO@? JI <I JPOKPO ?@QD>@ OC<O C<N
GDHDO@? RD?OC, OC@ AJGGJRDIB TUBUJD BTTFSU @INPM@N OC<O DO RDGG I@Q@M =@ RD?@M OC<I OC<O
GDHDO:
FOVN ETUSJOH NFOV5JUMF = "$PNNBOE .FOV";
TUBUJD BTTFSU(NFOV5JUMF.MFOHUI <= 16);
+JO@ OC<O OC@ NOMDIB DN ?@ADI@? <N FOVN NJ OC<O DON G@IBOC ><I =@ @Q<GP<O@? <O >JHKDG@ ODH@.
)@O'N <NNPH@ OC<O < KMJBM<HH@M >C<IB@N OC<O ODOG@ OJ H<F@ DO HJM@ ?@N>MDKODQ@:
FOVN ETUSJOH NFOV5JUMF = "%JSFDUJPOBM $PNNBOET .FOV";
TUBUJD BTTFSU(NFOV5JUMF.MFOHUI <= 16);
1C@ TUBUJD BTTFSU >C@>F KM@Q@ION >JHKDGDIB OC@ KMJBM<H:
&SSPS: TUBUJD BTTFSU (25V <= 16V) JT GBMTF
1CDN RJPG? M@HDI? OC@ KMJBM<HH@M JA OC@ GDHDO<ODJI JA OC@ JPOKPO ?@QD>@.
TUBUJD BTTFSU DN @Q@I HJM@ PN@APG RC@I PN@? DI O@HKG<O@N. 4@ RDGG N@@ O@HKG<O@N DI G<O@M
>C<KO@MN.
BTTFSU even if absolutely true
42.3
& @HKC<NDU@ "<=NJGPO@GT OMP@" =@><PN@ <NNPHKODJIN <=JPO OC@ KMJBM<H <M@ I@Q@M @SK@>O@? OJ
=@ A<GN@ <ITR<T. A G<MB@ N@O JA KMJBM<H @MMJMN <M@ =<N@? JI <NNPHKODJIN OC<O <M@ OCJPBCO OJ
=@ <=NJGPO@GT OMP@.
#JM OC<O M@<NJI, O<F@ <?Q<IO<B@ JA BTTFSU >C@>FN @Q@I DA OC@T A@@G PII@>@NN<MT. )@O'N GJJF <O
OC@ AJGGJRDIB API>ODJI OC<O M@OPMIN OC@ ?<TN JA HJIOCN DI < BDQ@I T@<M:
JOU<> NPOUI%BZT(JO JOU ZFBS)
\
JOU<> EBZT = <
31, GFCSVBSZ%BZT(ZFBS),
31, 30, 31, 30, 31, 31, 30, 31, 30, 31
>;
BTTFSU((TVN(EBZT) == 365) ]]
(TVN(EBZT) == 366));
SFUVSO EBZT;
^
3EE7DF 3@6 7@8AD57
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
209
1C<O BTTFSU >C@>F H<T =@ N@@I <N PII@>@NN<MT =@><PN@ OC@ API>ODJI RJPG? I<OPM<GGT M@OPMI
@DOC@M 365 JM 366. %JR@Q@M, OCJN@ >C@>FN <M@ BP<M?DIB <B<DINO KJO@IOD<G HDNO<F@N @Q@I DI OC@
GFCSVBSZ%BZT() API>ODJI. #JM @S<HKG@, OC@ KMJBM<H RJPG? =@ O@MHDI<O@? DA GFCSVBSZ%BZT()
M@OPMI@? 30.
AIJOC@M N@@HDIBGT PII@>@NN<MT >C@>F ><I @INPM@ OC<O OC@ G@IBOC JA OC@ NGD>@ RJPG? <GR<TN
=@ 12:
BTTFSU(EBZT.MFOHUI == 12);
1C<O R<T, ?@G@ODIB JM <??DIB @G@H@ION OJ OC@ NGD>@ PIDIO@IOD<GGT RJPG? <GNJ =@ ><PBCO. 0P>C
>C@>FN <M@ DHKJMO<IO OJJGN OJR<M?N KMJBM<H >JMM@>OI@NN.
BTTFSU DN <GNJ OC@ =<ND> OJJG OC<O DN PN@? DI G@;F F7EF;@9 <I? 5A@FD35F BDA9D3??;@9, =JOC JA
RCD>C RDGG =@ >JQ@M@? DI G<O@M >C<KO@MN.
No value nor side effect
42.4
4@ C<Q@ N@@I OC<O @SKM@NNDJIN KMJ?P>@ Q<GP@N JM H<F@ ND?@ @AA@>ON. BTTFSU >C@>FN ?J IJO
C<Q@ Q<GP@N IJM OC@T E:AG>6 C<Q@ <IT ND?@ @AA@>ON.
1C@ ! G<IBP<B@ M@LPDM@N OC<O OC@ @Q<GP<ODJI JA OC@ GJBD><G @SKM@NNDJI HPNO IJO C<Q@ <IT ND?@
@AA@>O. BTTFSU HPNO M@H<DI <N < K<NNDQ@ J=N@MQ@M JA KMJBM<H NO<O@.
Disabling BTTFSU checks
42.5
0DI>@ BTTFSU DN <=JPO KMJBM<H >JMM@>OI@NN, OC@T ><I =@ N@@I <N PII@>@NN<MT JI>@ OC@
KMJBM<H C<N =@@I O@NO@? NPAAD>D@IOGT. #PMOC@M, NDI>@ BTTFSU >C@>FN KMJ?P>@ IJ Q<GP@N IJM
OC@T C<Q@ ND?@ @AA@>ON, M@HJQDIB OC@H AMJH OC@ KMJBM<H NCJPG? IJO H<F@ <IT ?DAA@M@I>@.
1C@ >JHKDG@M NRDO>C -SFMFBTF ><PN@N OC@ BTTFSU >C@>FN OJ =@ DBIJM@? <N DA OC@T C<Q@ I@Q@M
=@@I DI>GP?@? DI OC@ KMJBM<H:
ENE EFOFNF.E -SFMFBTF
1CDN RJPG? <GGJR KMJBM<HN MPI A<NO@M =T IJO @Q<GP<ODIB KJO@IOD<GGT NGJR GJBD><G @SKM@NNDJIN
JA OC@ BTTFSU >C@>FN.
AN <I @S>@KODJI, OC@ BTTFSU >C@>FN OC<O C<Q@ OC@ GDO@M<G GBMTF (JM 0) <N OC@ GJBD><G
@SKM@NNDJI <M@ IJO ?DN<=G@? @Q@I RC@I OC@ KMJBM<H DN >JHKDG@? RDOC jSFMFBTF. 1CDN DN
=@><PN@ BTTFSU(GBMTF) DN AJM @INPMDIB OC<O < =GJ>F JA >J?@ DN I@Q@M M@<>C@?, <I? OC<O NCJPG?
=@ KM@Q@IO@? @Q@I AJM jSFMFBTF =PDG?N.
FOGPSDF for throwing exceptions
42.6
+JO @Q@MT PI@SK@>O@? NDOP<ODJI DN <I DI?D><ODJI JA < KMJBM<H @MMJM. -MJBM<HN H<T <GNJ
@SK@MD@I>@ PI@SK@>O@? DIKPON <I? PI@SK@>O@? @IQDMJIH@IO<G NO<O@. #JM @S<HKG@, OC@ ?<O<
OC<O DN @IO@M@? =T OC@ PN@M NCJPG? IJO =@ Q<GD?<O@? =T <I BTTFSU >C@>F =@><PN@ DIQ<GD? ?<O<
C<N IJOCDIB OJ ?J RDOC OC@ >JMM@>OI@NN JA OC@ KMJBM<H DON@GA. &I NP>C ><N@N DO DN <KKMJKMD<O@ OJ
OCMJR @S>@KODJIN GDF@ R@ C<Q@ =@@I ?JDIB DI KM@QDJPN KMJBM<HN.
TUE.FYDFQUJPO.FOGPSDF DN < >JIQ@ID@IO R<T JA OCMJRDIB @S>@KODJIN. #JM @S<HKG@, G@O'N
<NNPH@ OC<O <I @S>@KODJI HPNO =@ OCMJRI RC@I < NK@>DAD> >JI?DODJI DN IJO H@O:
3EE7DF 3@6 7@8AD57
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
210
JG (DPVOU < 3) \
UISPX OFX &YDFQUJPO(".VTU CF BU MFBTU 3.");
^
FOGPSDF() DN < RM<KK@M <MJPI? OC@ >JI?DODJI >C@>F <I? OC@ UISPX NO<O@H@IO. 1C@ AJGGJRDIB
DN OC@ @LPDQ<G@IO JA OC@ KM@QDJPN >J?@:
JNQPSU TUE.FYDFQUJPO;
// ...
FOGPSDF(DPVOU >= 3, ".VTU CF BU MFBTU 3.");
+JO@ CJR OC@ GJBD><G @SKM@NNDJI DN I@B<O@? >JHK<M@? RDOC OC@ JG NO<O@H@IO, <N DO IJR NK@GGN
JPO RC<O DN =@DIB 7@8AD576.
How to use
42.7
BTTFSU DN AJM ><O>CDIB KMJBM<HH@M @MMJMN. 1C@ >JI?DODJIN OC<O BTTFSU BP<M?N <B<DINO DI OC@
NPOUI%BZT() API>ODJI <I? OC@ NFOV5JUMF Q<MD<=G@ <=JQ@ <M@ <GG <=JPO KMJBM<HH@M HDNO<F@N.
0JH@ODH@N DO DN ?DAAD>PGO OJ ?@>D?@ RC@OC@M OJ M@GT JI <I BTTFSU >C@>F JM OJ OCMJR <I
@S>@KODJI. 1C@ ?@>DNDJI NCJPG? =@ =<N@? JI RC@OC@M OC@ PI@SK@>O@? NDOP<ODJI DN ?P@ OJ <
KMJ=G@H RDOC CJR OC@ KMJBM<H C<N =@@I >J?@?.
,OC@MRDN@, OC@ KMJBM<H HPNO OCMJR <I @S>@KODJI RC@I DO DN IJO KJNND=G@ OJ <>>JHKGDNC < O<NF.
FOGPSDF() DN @SKM@NNDQ@ <I? >JIQ@ID@IO RC@I OCMJRDIB @S>@KODJIN.
AIJOC@M KJDIO OJ >JIND?@M DN RC@OC@M OC@ PI@SK@>O@? NDOP<ODJI ><I =@ M@H@?D@? DI <IT R<T. &A
OC@ KMJBM<H ><I ?J <ITOCDIB NK@>D<G, @Q@I =T NDHKGT KMDIODIB <I @MMJM H@NN<B@ <=JPO OC@
KMJ=G@H RDOC NJH@ DIKPO ?<O<, OC@I DO DN <KKMJKMD<O@ OJ OCMJR <I @S>@KODJI. 1C<O R<T, ><GG@MN
JA OC@ >J?@ OC<O OCM@R OC@ @S>@KODJI ><I ><O>C DO OJ ?J NJH@OCDIB NK@>D<G OJ M@>JQ@M AMJH OC@
@MMJM >JI?DODJI.
Exercises
42.8
1. 1C@ AJGGJRDIB KMJBM<H DI>GP?@N < IPH=@M JA BTTFSU >C@>FN. JHKDG@ <I? MPI OC@
KMJBM<H OJ ?DN>JQ@M DON =PBN OC<O <M@ M@Q@<G@? =T OCJN@ BTTFSU >C@>FN.
1C@ KMJBM<H O<F@N < NO<MO ODH@ <I? < ?PM<ODJI AMJH OC@ PN@M <I? ><G>PG<O@N OC@ @I?
ODH@ =T <??DIB OC@ ?PM<ODJI OJ OC@ NO<MO ODH@:
10 IPVST BOE 8 NJOVUFT BGUFS 06:09 JT 16:17.
+JO@ OC<O OCDN KMJ=G@H ><I =@ RMDOO@I DI < HP>C >G@<I@M R<T =T ?@ADIDIB TUSVDU
OTK@N. 4@ RDGG M@A@M OJ OCDN KMJBM<H DI G<O@M >C<KO@MN.
JNQPSU TUE.TUEJP;
JNQPSU TUE.TUSJOH;
JNQPSU TUE.FYDFQUJPO;
/* 3FBET UIF UJNF BT IPVS BOE NJOVUF BGUFS QSJOUJOH B
* NFTTBHF. */
WPJE SFBE5JNF(JO TUSJOH NFTTBHF, PVU JOU IPVS, PVU JOU NJOVUF)
\
XSJUF(NFTTBHF, " ()):..) ");
SFBEG(" %T:%T", &IPVS, &NJOVUF);
FOGPSDF((IPVS >= 0) && (IPVS <= 23) &&
(NJOVUF >= 0) && (NJOVUF <= 59),
3EE7DF 3@6 7@8AD57
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
211
"*OWBMJE UJNF!");
^
/* 3FUVSOT UIF UJNF JO TUSJOH GPSNBU. */
TUSJOH UJNF5P4USJOH(JO JOU IPVS, JO JOU NJOVUF)
\
BTTFSU((IPVS >= 0) && (IPVS <= 23));
BTTFSU((NJOVUF >= 0) && (NJOVUF <= 59));
SFUVSO GPSNBU("%02T:%02T", IPVS, NJOVUF);
^
/* "EET EVSBUJPO UP TUBSU UJNF BOE SFUVSOT UIF SFTVMU BT UIF
* UIJSE QBJS PG QBSBNFUFST. */
WPJE BEE%VSBUJPO(JO JOU TUBSU)PVS, JO JOU TUBSU.JOVUF,
JO JOU EVSBUJPO)PVS, JO JOU EVSBUJPO.JOVUF,
PVU JOU SFTVMU)PVS, PVU JOU SFTVMU.JOVUF)
\
SFTVMU)PVS = TUBSU)PVS + EVSBUJPO)PVS;
SFTVMU.JOVUF = TUBSU.JOVUF + EVSBUJPO.JOVUF;
JG (SFTVMU.JOVUF > 59) \
++SFTVMU)PVS;
^
^
WPJE NBJO()
\
JOU TUBSU)PVS;
JOU TUBSU.JOVUF;
SFBE5JNF("4UBSU UJNF", TUBSU.JOVUF, TUBSU)PVS);
JOU EVSBUJPO)PVS;
JOU EVSBUJPO.JOVUF;
SFBE5JNF("%VSBUJPO", EVSBUJPO)PVS, EVSBUJPO.JOVUF);
JOU FOE)PVS;
JOU FOE.JOVUF;
BEE%VSBUJPO(TUBSU)PVS, TUBSU.JOVUF,
EVSBUJPO)PVS, EVSBUJPO.JOVUF,
FOE)PVS, FOE.JOVUF);
XSJUFGMO("%T IPVST BOE %T NJOVUFT BGUFS %T JT %T.",
EVSBUJPO)PVS, EVSBUJPO.JOVUF,
UJNF5P4USJOH(TUBSU)PVS, TUBSU.JOVUF),
UJNF5P4USJOH(FOE)PVS, FOE.JOVUF));
^
/PI OC@ KMJBM<H <I? @IO@M 06:09 <N OC@ NO<MO ODH@ <I? 1:2 <N OC@ ?PM<ODJI. ,=N@MQ@
OC<O OC@ KMJBM<H O@MHDI<O@N IJMH<GGT.
Note: .AG ?3K @AF;57 3 BDA4>7? I;F: F:7 AGFBGF. !9@AD7 F:3F BDA4>7? 8AD @AI 3E KAG
I;>> 6;E5AH7D ;F 4K F:7 :7>B A8 assert 5:75=E EAA@.
2. 1CDN ODH@ @IO@M 06:09 <I? 15:2. ,=N@MQ@ OC<O OC@ KMJBM<H DN O@MHDI<O@? =T <I
"TTFSU&SSPS. $J OJ OC@ GDI@ JA OC@ KMJBM<H OC<O DN DI?D><O@? DI OC@ <NN@MO H@NN<B@ <I?
N@@ RCD>C JI@ JA OC@ BTTFSU >C@>FN C<Q@ A<DG@?. &O H<T O<F@ < RCDG@ OJ ?DN>JQ@M OC@ ><PN@
JA OCDN K<MOD>PG<M A<DGPM@.
3. "IO@M 06:09 <I? 20:0 <I? J=N@MQ@ OC<O OC@ N<H@ BTTFSU >C@>F NODGG A<DGN <I? ADS OC<O =PB
<N R@GG.
4. *J?DAT OC@ KMJBM<H OJ KMDIO OC@ ODH@N DI 12-CJPM AJMH<O RDOC <I "<H" JM "KH" DI?D><OJM.
... F:7 EA>GF;A@E
3EE7DF 3@6 7@8AD57
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
212
Unit Testing 43
AN DO NCJPG? =@ FIJRI =T HJNO K@JKG@, <IT ?@QD>@ OC<O MPIN NJH@ KD@>@ JA >JHKPO@M KMJBM<H
>JIO<DIN NJAOR<M@ =PBN. 0JAOR<M@ =PBN KG<BP@ >JHKPO@M ?@QD>@N AMJH OC@ NDHKG@NO OJ OC@
HJNO >JHKG@S. !@=PBBDIB <I? ADSDIB NJAOR<M@ =PBN DN <HJIB OC@ G@NN A<QJM<=G@ ?<DGT
<>ODQDOD@N JA < KMJBM<HH@M.
Causes of bugs
43.1
1C@M@ <M@ H<IT M@<NJI RCT NJAOR<M@ =PBN J>>PM. 1C@ AJGGJRDIB DN <I DI>JHKG@O@ GDNO MJPBCGT
AMJH OC@ ?@NDBI NO<B@ JA < KMJBM<H OCMJPBC OC@ <>OP<G >J?DIB JA DO:
t 1C@ M@LPDM@H@ION <I? OC@ NK@>DAD><ODJIN JA OC@ KMJBM<H H<T IJO =@ >G@<M. 4C<O OC@
KMJBM<H NCJPG? <>OP<GGT ?J H<T IJO =@ FIJRI <O OC@ ?@NDBI NO<B@.
t 1C@ KMJBM<HH@M H<T HDNPI?@MNO<I? NJH@ JA OC@ M@LPDM@H@ION JA OC@ KMJBM<H.
t 1C@ KMJBM<HHDIB G<IBP<B@ H<T IJO =@ @SKM@NNDQ@ @IJPBC. JIND?@MDIB OC<O OC@M@ <M@
>JIAPNDJIN @Q@I =@OR@@I I<ODQ@ NK@<F@MN JA CPH<I G<IBP<B@N, OC@ PII<OPM<G NTIO<S <I?
MPG@N JA < KMJBM<HHDIB G<IBP<B@ H<T =@ ><PN@ JA HDNO<F@N.
t @MO<DI <NNPHKODJIN JA OC@ KMJBM<HH@M H<T =@ DI>JMM@>O. #JM @S<HKG@, OC@ KMJBM<HH@M
H<T =@ <NNPHDIB OC<O 3.14 RJPG? =@ KM@>DN@ @IJPBC OJ M@KM@N@IO h.
t 1C@ KMJBM<HH@M H<T C<Q@ DI>JMM@>O DIAJMH<ODJI JI < OJKD> JM IJI@ <O <GG. #JM @S<HKG@,
OC@ KMJBM<HH@M H<T IJO FIJR OC<O PNDIB < AGJ<ODIB KJDIO Q<MD<=G@ DI < K<MOD>PG<M GJBD><G
@SKM@NNDJI RJPG? IJO =@ M@GD<=G@.
t 1C@ KMJBM<H H<T @I>JPIO@M <I PIAJM@N@@I NDOP<ODJI. #JM @S<HKG@, JI@ JA OC@ ADG@N JA <
?DM@>OJMT H<T =@ ?@G@O@? JM M@I<H@? RCDG@ OC@ KMJBM<H DN PNDIB OC@ ADG@N JA OC<O ?DM@>OJMT
DI < GPSFBDI GJJK.
t 1C@ KMJBM<HH@M H<T H<F@ NDGGT HDNO<F@N. #JM @S<HKG@, OC@ I<H@ JA < Q<MD<=G@ H<T =@
HDNOTK@? <I? <>>D?@IO<GGT H<O>C@? OC@ I<H@ JA <IJOC@M Q<MD<=G@.
t @O>.
2IAJMOPI<O@GT, OC@M@ DN NODGG IJ NJAOR<M@ ?@Q@GJKH@IO H@OCJ?JGJBT OC<O @INPM@N OC<O <
KMJBM<H RDGG <GR<TN RJMF >JMM@>OGT. 1CDN DN NODGG < CJO NJAOR<M@ @IBDI@@MDIB OJKD> RC@M@
KMJHDNDIB NJGPODJIN @H@MB@ @Q@MT ?@><?@ JM NJ.
Discovering the bugs
43.2
0JAOR<M@ =PBN <M@ ?DN>JQ@M@? <O Q<MDJPN NO<B@N JA OC@ GDA@ODH@ JA OC@ KMJBM<H =T Q<MDJPN
OTK@N JA OJJGN <I? K@JKG@. 1C@ AJGGJRDIB DN < K<MOD<G GDNO JA RC@I < =PB H<T =@ ?DN>JQ@M@?,
AMJH OC@ @<MGD@NO OJ OC@ G<O@NO:
t 4C@I RMDODIB OC@ KMJBM<H
w BT OC@ KMJBM<HH@M
w BT <IJOC@M KMJBM<HH@M ?PMDIB B3;D BDA9D3??;@9
w BT OC@ >JHKDG@M OCMJPBC >JHKDG@M H@NN<B@N
w BT PIDO O@NON <N < K<MO JA =PDG?DIB OC@ KMJBM<H
t 4C@I M@QD@RDIB OC@ >J?@
w BT OJJGN OC<O <I<GTU@ OC@ >J?@ <O >JHKDG@ ODH@
w BT JOC@M KMJBM<HH@MN ?PMDIB 5A67 D7H;7IE
t 4C@I MPIIDIB OC@ KMJBM<H
w BT OJJGN OC<O <I<GTU@ OC@ @S@>PODJI JA OC@ KMJBM<H <O MPI ODH@ (@.B. =T Q<GBMDI?)
*@;F )7EF;@9
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
213
w !PMDIB .A O@NODIB, @DOC@M =T OC@ A<DGPM@ JA BTTFSU >C@>FN JM =T OC@ J=N@MQ@?
=@C<QDJM JA OC@ KMJBM<H
w BT OC@ 47F3 PN@MN =@AJM@ OC@ M@G@<N@ JA OC@ KMJBM<H
w BT OC@ @I? PN@MN <AO@M OC@ M@G@<N@ JA OC@ KMJBM<H
!@O@>ODIB OC@ =PB <N @<MGT <N KJNND=G@ M@?P>@N GJNN JA HJI@T, ODH@, <I? DI NJH@ ><N@N CPH<I
GDQ@N. A??DODJI<GGT, D?@IODATDIB OC@ ><PN@N JA =PBN OC<O C<Q@ =@@I ?DN>JQ@M@? =T OC@ @I? PN@MN
<M@ C<M?@M OC<I D?@IODATDIB OC@ ><PN@N JA =PBN OC<O <M@ ?DN>JQ@M@? @<MGT, ?PMDIB ?@Q@GJKH@IO.
Unit testing for catching bugs
43.3
0DI>@ KMJBM<HN <M@ RMDOO@I =T KMJBM<HH@MN <I? ! DN < >JHKDG@? G<IBP<B@, OC@ KMJBM<HH@MN
<I? OC@ >JHKDG@M RDGG <GR<TN =@ OC@M@ OJ ?DN>JQ@M =PBN. 1CJN@ ORJ <ND?@, OC@ @<MGD@NO <I?
K<MOGT AJM OC<O M@<NJI OC@ HJNO @AA@>ODQ@ R<T JA ><O>CDIB =PBN DN PIDO O@NODIB.
2IDO O@NODIB DN <I DI?DNK@IN<=G@ K<MO JA HJ?@MI KMJBM<HHDIB. &O DN OC@ HJNO @AA@>ODQ@ H@OCJ?
JA M@?P>DIB >J?DIB @MMJMN. A>>JM?DIB OJ NJH@ ?@Q@GJKH@IO H@OCJ?JGJBD@N, >J?@ OC<O DN IJO
BP<M?@? =T PIDO O@NON DN =PBBT >J?@.
2IAJMOPI<O@GT, OC@ JKKJNDO@ DN IJO OMP@: 2IDO O@NON ?J IJO BP<M<IO@@ OC<O OC@ >J?@ DN AM@@ JA
=PBN. AGOCJPBC OC@T <M@ Q@MT @AA@>ODQ@, OC@T ><I JIGT M@?P>@ OC@ MDNF JA =PBN.
2IDO O@NODIB <GNJ @I<=G@N M@A<>OJMDIB OC@ >J?@ (D.@. H<FDIB DHKMJQ@H@ION OJ DO) RDOC @<N@ <I?
>JIAD?@I>@. ,OC@MRDN@, DO DN >JHHJI OJ <>>D?@IO<GGT =M@<F NJH@ JA OC@ @SDNODIB API>ODJI<GDOT
JA < KMJBM<H RC@I <??DIB I@R A@<OPM@N OJ DO. BPBN JA OCDN OTK@ <M@ ><GG@? D79D7EE;A@E.
4DOCJPO PIDO O@NODIB, M@BM@NNDJIN <M@ NJH@ODH@N ?DN>JQ@M@? <N G<O@ <N ?PMDIB OC@ .A O@NODIB
JA APOPM@ M@G@<N@N, JM RJMN@, =T OC@ @I? PN@MN.
/DNF JA M@BM@NNDJIN ?DN>JPM<B@ KMJBM<HH@MN AMJH M@A<>OJMDIB OC@ >J?@, NJH@ODH@N
KM@Q@IODIB OC@H AMJH K@MAJMHDIB OC@ NDHKG@NO JA DHKMJQ@H@ION GDF@ >JMM@>ODIB OC@ I<H@ JA <
Q<MD<=G@. 1CDN DI OPMI ><PN@N 5A67 DAF, < >JI?DODJI RC@M@ OC@ >J?@ =@>JH@N HJM@ <I? HJM@
PIH<DIO<DI<=G@. #JM @S<HKG@, <GOCJPBC NJH@ GDI@N JA >J?@ RJPG? =@OO@M =@ HJQ@? OJ < I@RGT
?@ADI@? API>ODJI DI JM?@M OJ =@ ><GG@? AMJH HJM@ OC<I JI@ KG<>@, A@<M JA M@BM@NNDJIN H<F@
KMJBM<HH@MN >JKT <I? K<NO@ OC@ @SDNODIB GDI@N OJ JOC@M KG<>@N DINO@<?, G@<?DIB OJ OC@
KMJ=G@H JA 5A67 6GB>;53F;A@.
-CM<N@N GDF@ "DA DO DNI'O =MJF@I, ?JI'O ADS DO" <M@ M@G<O@? OJ A@<M JA M@BM@NNDJIN. AGOCJPBC OC@T
N@@H OJ =@ >JIQ@TDIB RDN?JH, NP>C BPD?@GDI@N ><PN@ OC@ >J?@ OJ MJO NGJRGT <I? =@>JH@ <I
PIOJP>C<=G@ H@NN.
*J?@MI KMJBM<HHDIB M@E@>ON NP>C "RDN?JH". 1J OC@ >JIOM<MT, OJ KM@Q@IO DO AMJH =@>JHDIB <
NJPM>@ JA =PBN, OC@ >J?@ DN NPKKJN@? OJ =@ "M@A<>OJM@? H@M>DG@NNGT". 1C@ HJNO KJR@MAPG OJJG JA
OCDN HJ?@MI <KKMJ<>C DN PIDO O@NODIB.
2IDO O@NODIB DIQJGQ@N O@NODIB OC@ NH<GG@NO PIDON JA >J?@ DI?@K@I?@IOGT. 4C@I PIDON JA >J?@ <M@
O@NO@? DI?@K@I?@IOGT, DO DN G@NN GDF@GT OC<O OC@M@ <M@ =PBN DI CDBC@M-G@Q@G >J?@ OC<O PN@ OCJN@
PIDON. 4C@I OC@ K<MON RJMF >JMM@>OGT, DO DN HJM@ GDF@GT OC<O OC@ RCJG@ RDGG RJMF >JMM@>OGT <N
R@GG.
2IDON O@NON <M@ KMJQD?@? <N GD=M<MT NJGPODJIN DI JOC@M G<IBP<B@N (@.B. '2IDO, KK2IDO,
2IDOO@NO++, @O>.) &I !, PIDO O@NODIB DN < >JM@ A@<OPM@ JA OC@ G<IBP<B@. &O DN ?@=<O<=G@ RC@OC@M
< GD=M<MT NJGPODJI JM < G<IBP<B@ A@<OPM@ DN =@OO@M AJM PIDO O@NODIB. B@><PN@ ! ?J@N IJO KMJQD?@
NJH@ JA OC@ A@<OPM@N OC<O <M@ >JHHJIGT AJPI? DI PIDO O@NODIB GD=M<MD@N, DO H<T =@ RJMOCRCDG@
OJ >JIND?@M GD=M<MT NJGPODJIN <N R@GG.
1C@ PIDO O@NODIB A@<OPM@N JA ! <M@ <N NDHKG@ <N DIN@MODIB BTTFSU >C@>FN DIOJ VOJUUFTU =GJ>FN.
*@;F )7EF;@9
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
214
Activating the unit tests
43.4
2IDO O@NON <M@ IJO < K<MO JA OC@ <>OP<G @S@>PODJI JA OC@ KMJBM<H. 1C@T NCJPG? =@ <>ODQ<O@?
JIGT ?PMDIB KMJBM<H ?@Q@GJKH@IO RC@I @SKGD>DOGT M@LP@NO@?.
1C@ ENE >JHKDG@M NRDO>C OC<O <>ODQ<O@N PIDO O@NON DN jVOJUUFTU.
ANNPHDIB OC<O OC@ KMJBM<H DN RMDOO@I DI < NDIBG@ NJPM>@ ADG@ I<H@? EFOFNF.E, DON PIDO O@NON
><I =@ <>ODQ<O@? =T OC@ AJGGJRDIB >JHH<I?:
ENE EFOFNF.E -X -VOJUUFTU
4C@I < KMJBM<H OC<O DN =PDGO =T OC@ jVOJUUFTU NRDO>C DN NO<MO@?, DON PIDO O@NO =GJ>FN <M@
@S@>PO@? ADMNO. ,IGT DA <GG JA OC@ PIDO O@NON K<NN OC<O OC@ KMJBM<H @S@>PODJI >JIODIP@N RDOC
NBJO().
VOJUUFTU blocks
43.5
1C@ GDI@N JA >J?@ OC<O DIQJGQ@ PIDO O@NON <M@ RMDOO@I DIND?@ VOJUUFTU =GJ>FN. 1C@N@ =GJ>FN ?J
IJO C<Q@ <IT NDBIDAD><I>@ AJM OC@ KMJBM<H JOC@M OC<I >JIO<DIDIB OC@ PIDO O@NON:
VOJUUFTU
\
/* ... UIF UFTUT BOE UIF DPEF UIBU TVQQPSU UIFN ... */
^
AGOCJPBC VOJUUFTU =GJ>FN ><I <KK@<M <ITRC@M@, DO DN >JIQ@ID@IO OJ ?@ADI@ OC@H MDBCO <AO@M
OC@ >J?@ OC<O OC@T O@NO.
AN <I @S<HKG@, G@O'N O@NO < API>ODJI OC<O M@OPMIN OC@ JM?DI<G AJMH JA OC@ NK@>DAD@? IPH=@M <N
DI "1NO", "2I?", @O>. A VOJUUFTU =GJ>F JA OCDN API>ODJI ><I NDHKGT >JIO<DI BTTFSU NO<O@H@ION
OC<O >JHK<M@ OC@ M@OPMI Q<GP@N JA OC@ API>ODJI OJ OC@ @SK@>O@? Q<GP@N. 1C@ AJGGJRDIB API>ODJI
DN =@DIB O@NO@? RDOC OC@ AJPM ?DNODI>O @SK@>O@? JPO>JH@N JA OC@ API>ODJI:
TUSJOH PSEJOBM(TJ[F@U OVNCFS)
\
// ...
^
VOJUUFTU
\
BTTFSU(PSEJOBM(1) == "1TU");
BTTFSU(PSEJOBM(2) == "2OE");
BTTFSU(PSEJOBM(3) == "3SE");
BTTFSU(PSEJOBM(10) == "10UI");
^
1C@ AJPM O@NON <=JQ@ O@NO OC<O OC@ API>ODJI RJMFN >JMM@>OGT <O G@<NO AJM OC@ Q<GP@N JA 1, 2, 3,
<I? 10 =T H<FDIB AJPM N@K<M<O@ ><GGN OJ OC@ API>ODJI <I? >JHK<MDIB OC@ M@OPMI@? Q<GP@N OJ
OC@ @SK@>O@? JI@N.
AGOCJPBC PIDO O@NON <M@ =<N@? JI BTTFSU >C@>FN, VOJUUFTU =GJ>FN ><I >JIO<DI <IT ! >J?@.
1CDN <GGJRN AJM KM@K<M<ODJIN =@AJM@ <>OP<GGT NO<MODIB OC@ O@NON JM <IT JOC@M NPKKJMODIB >J?@
OC<O OC@ O@NON H<T I@@?. #JM @S<HKG@, OC@ AJGGJRDIB =GJ>F ADMNO ?@ADI@N < Q<MD<=G@ OJ M@?P>@
>J?@ ?PKGD><ODJI:
ETUSJOH UP'SPOU(ETUSJOH TUS, JO EDIBS MFUUFS)
\
// ...
*@;F )7EF;@9
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
215
^
VOJUUFTU
\
JNNVUBCMF TUS = "IFMMP"E;
BTTFSU(UP'SPOU(TUS, 'I') == "IFMMP");
BTTFSU(UP'SPOU(TUS, 'P') == "PIFMM");
BTTFSU(UP'SPOU(TUS, 'M') == "MMIFP");
^
1C@ OCM@@ BTTFSU >C@>FN <=JQ@ O@NO OC<O UP'SPOU() RJMFN <>>JM?DIB OJ DON NK@>DAD><ODJI.
AN OC@N@ @S<HKG@N NCJR, PIDO O@NON <M@ <GNJ PN@APG <N @S<HKG@N JA CJR K<MOD>PG<M API>ODJIN
NCJPG? =@ ><GG@?. 2NP<GGT DO DN @<NT OJ B@O <I D?@< JI RC<O < API>ODJI ?J@N EPNO =T M@<?DIB DON
PIDO O@NON.
Test driven development
43.6
1@NO ?MDQ@I ?@Q@GJKH@IO (1!!) DN < NJAOR<M@ ?@Q@GJKH@IO H@OCJ?JGJBT OC<O KM@N>MD=@N
RMDODIB PIDO O@NON =@AJM@ DHKG@H@IODIB API>ODJI<GDOT. &I 1!!, OC@ AJ>PN DN JI PIDO O@NODIB.
J?DIB DN < N@>JI?<MT <>ODQDOT OC<O H<F@N OC@ O@NON K<NN.
&I <>>JM?<I>@ OJ 1!!, OC@ PSEJOBM() API>ODJI <=JQ@ ><I ADMNO =@ DHKG@H@IO@? DIO@IOD<GGT
DI>JMM@>OGT:
JNQPSU TUE.TUSJOH;
TUSJOH PSEJOBM(TJ[F@U OVNCFS)
\
SFUVSO ""; // j JOUFOUJPOBMMZ XSPOH
^
VOJUUFTU
\
BTTFSU(PSEJOBM(1) == "1TU");
BTTFSU(PSEJOBM(2) == "2OE");
BTTFSU(PSEJOBM(3) == "3SE");
BTTFSU(PSEJOBM(10) == "10UI");
^
WPJE NBJO()
\^
AGOCJPBC OC@ API>ODJI DN J=QDJPNGT RMJIB, OC@ I@SO NO@K RJPG? =@ OJ MPI OC@ PIDO O@NON OJ N@@
OC<O OC@ O@NON ?J DI?@@? ><O>C KMJ=G@HN RDOC OC@ API>ODJI:
$ ENE EFOFNF.E -X -0 -VOJUUFTU
$ ./EFOFNF
DPSF.FYDFQUJPO."TTFSU&SSPS!EFOFNF(10): VOJUUFTU GBJMVSF
1C@ API>ODJI NCJPG? =@ DHKG@H@IO@? JIGT 38F7D N@@DIB OC@ A<DGPM@, <I? JIGT OJ H<F@ OC@ O@NON
K<NN. %@M@ DN EPNO JI@ DHKG@H@IO<ODJI OC<O K<NN@N OC@ O@NON:
JNQPSU TUE.TUSJOH;
TUSJOH PSEJOBM(TJ[F@U OVNCFS)
\
TUSJOH TVGGJY;
TXJUDI (OVNCFS) \
DBTF 1: TVGGJY = "TU"; CSFBL;
*@;F )7EF;@9
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
216
DBTF 2: TVGGJY = "OE"; CSFBL;
DBTF 3: TVGGJY = "SE"; CSFBL;
EFGBVMU: TVGGJY = "UI"; CSFBL;
^
SFUVSO GPSNBU("%T%T", OVNCFS, TVGGJY);
^
VOJUUFTU
\
BTTFSU(PSEJOBM(1) == "1TU");
BTTFSU(PSEJOBM(2) == "2OE");
BTTFSU(PSEJOBM(3) == "3SE");
BTTFSU(PSEJOBM(10) == "10UI");
^
WPJE NBJO()
\^
0DI>@ OC@ DHKG@H@IO<ODJI <=JQ@ ?J@N K<NN OC@ PIDO O@NON, OC@M@ DN M@<NJI OJ OMPNO OC<O OC@
PSEJOBM() API>ODJI DN >JMM@>O. 2I?@M OC@ <NNPM<I>@ OC<O OC@ O@NON =MDIB, OC@ DHKG@H@IO<ODJI
JA OC@ API>ODJI ><I =@ >C<IB@? DI H<IT R<TN RDOC >JIAD?@I>@.
Unit tests before bug fixes 43.6.1
2IDO O@NON <M@ IJO < K<I<>@<; OC@M@ RDGG <GR<TN =@ =PBN. &A < =PB DN ?DN>JQ@M@? RC@I <>OP<GGT
MPIIDIB OC@ KMJBM<H, DO ><I =@ N@@I <N <I DI?D><ODJI OC<O OC@ PIDO O@NON C<Q@ =@@I
DI>JHKG@O@. #JM OC<O M@<NJI, DO DN =@OO@M OJ 8;DEF RMDO@ < PIDO O@NO OC<O M@KMJ?P>@N OC@ =PB <I?
JIGT F:7@ OJ ADS OC@ =PB OJ K<NN OC@ I@R O@NO.
)@O'N C<Q@ < GJJF <O OC@ AJGGJRDIB API>ODJI OC<O M@OPMIN OC@ NK@GGDIB JA OC@ JM?DI<G AJMH JA <
IPH=@M NK@>DAD@? <N < ETUSJOH:
JNQPSU TUE.FYDFQUJPO;
JNQPSU TUE.TUSJOH;
ETUSJOH PSEJOBM4QFMMFE(ETUSJOH OVNCFS)
\
FOGPSDF(OVNCFS.MFOHUI, "OVNCFS DBOOPU CF FNQUZ");
ETUSJOH<ETUSJOH> FYDFQUJPOT = <
"POF": "GJSTU", "UXP" : "TFDPOE", "UISFF" : "UIJSE",
"GJWF" : "GJGUI", "FJHIU": "FJHIUI", "OJOF" : "OJOUI",
"UXFMWF" : "UXFMGUI"
>;
ETUSJOH SFTVMU;
JG (OVNCFS JO FYDFQUJPOT) \
SFTVMU = FYDFQUJPOT<OVNCFS>;
^ FMTF \
SFTVMU = OVNCFS _ "UI";
^
SFUVSO SFTVMU;
^
VOJUUFTU
\
BTTFSU(PSEJOBM4QFMMFE("POF") == "GJSTU");
BTTFSU(PSEJOBM4QFMMFE("UXP") == "TFDPOE");
BTTFSU(PSEJOBM4QFMMFE("UISFF") == "UIJSE");
BTTFSU(PSEJOBM4QFMMFE("UFO") == "UFOUI");
^
*@;F )7EF;@9
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
217
WPJE NBJO()
\^
1C@ API>ODJI O<F@N ><M@ JA @S>@KODJI<G NK@GGDIBN <I? @Q@I DI>GP?@N < PIDO O@NO AJM OC<O. 0ODGG,
OC@ API>ODJI C<N < =PB T@O OJ =@ ?DN>JQ@M@?:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
XSJUFGMO(")F DBNF UIF %T JO UIF SBDF.",
PSEJOBM4QFMMFE("UXFOUZ"));
^
1C@ NK@GGDIB @MMJM DI OC@ JPOKPO JA OC@ KMJBM<H DN ?P@ OJ < =PB DI PSEJOBM4QFMMFE(), RCD>C
DON PIDO O@NON C<Q@ PIAJMOPI<O@GT A<DG OJ ><O>C:
)F DBNF UIF UXFOUZUI JO UIF SBDF.
AGOCJPBC DO DN @<NT OJ N@@ OC<O OC@ API>ODJI ?J@N IJO KMJ?P>@ OC@ >JMM@>O NK@GGDIB AJM IPH=@MN
OC<O @I? RDOC OC@ G@OO@M T, 1!! KM@N>MD=@N OC<O ADMNO < PIDO O@NO HPNO =@ RMDOO@I OJ M@KMJ?P>@
OC@ =PB =@AJM@ <>OP<GGT ADSDIB DO:
VOJUUFTU
\
// ...
BTTFSU(PSEJOBM4QFMMFE("UXFOUZ") == "UXFOUJFUI");
^
4DOC OC<O DHKMJQ@H@IO OJ OC@ O@NON, IJR OC@ =PB DI OC@ API>ODJI DN =@DIB ><PBCO ?PMDIB
?@Q@GJKH@IO:
DPSF.FYDFQUJPO."TTFSU&SSPS!EFOFNF(3274338): VOJUUFTU GBJMVSF
1C@ API>ODJI NCJPG? =@ ADS@? JIGT OC@I:
ETUSJOH PSEJOBM4QFMMFE(ETUSJOH OVNCFS)
\
// ...
JG (OVNCFS JO FYDFQUJPOT) \
SFTVMU = FYDFQUJPOT<OVNCFS>;
^ FMTF \
JG (OVNCFS<$-1> == 'Z') \
SFTVMU = OVNCFS<0..$-1> _ "JFUI";
^ FMTF \
SFTVMU = OVNCFS _ "UI";
^
^
SFUVSO SFTVMU;
^
Exercise
43.7
t &HKG@H@IO UP'SPOU() <>>JM?DIB OJ 1!!. 0O<MO RDOC OC@ DIO@IODJI<GGT DI>JHKG@O@
DHKG@H@IO<ODJI =@GJR. ,=N@MQ@ OC<O OC@ PIDO O@NON A<DG <I? KMJQD?@ <I DHKG@H@IO<ODJI OC<O
K<NN@N OC@ O@NON.
*@;F )7EF;@9
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
218
ETUSJOH UP'SPOU(ETUSJOH TUS, JO EDIBS MFUUFS)
\
ETUSJOH SFTVMU;
SFUVSO SFTVMU;
^
VOJUUFTU
\
JNNVUBCMF TUS = "IFMMP"E;
BTTFSU(UP'SPOU(TUS, 'I') == "IFMMP");
BTTFSU(UP'SPOU(TUS, 'P') == "PIFMM");
BTTFSU(UP'SPOU(TUS, 'M') == "MMIFP");
^
WPJE NBJO()
\^
... F:7 EA>GF;A@
*@;F )7EF;@9
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
219
Contract Programming 44
JIOM<>O KMJBM<HHDIB DN < NJAOR<M@ ?@NDBI <KKMJ<>C OC<O OM@<ON K<MON JA NJAOR<M@ <N
DI?DQD?P<G @IODOD@N OC<O KMJQD?@ N@MQD>@N OJ @<>C JOC@M. 1CDN <KKMJ<>C M@<GDU@N OC<O NJAOR<M@
><I RJMF <>>JM?DIB OJ DON NK@>DAD><ODJI <N GJIB <N OC@ KMJQD?@M <I? OC@ >JINPH@M JA OC@
N@MQD>@ =JOC J=@T < 5A@FD35F.
!'N >JIOM<>O KMJBM<HHDIB A@<OPM@N DIQJGQ@ API>ODJIN <N OC@ PIDON JA NJAOR<M@ N@MQD>@N. )DF@ DI
PIDO O@NODIB, >JIOM<>O KMJBM<HHDIB DN <GNJ =<N@? JI BTTFSU >C@>FN.
JIOM<>O KMJBM<HHDIB DI ! DN DHKG@H@IO@? =T OCM@@ OTK@N JA >J?@ =GJ>FN:
t #PI>ODJI JO =GJ>FN
t #PI>ODJI PVU =GJ>FN
t 0OMP>O <I? >G<NN JOWBSJBOU =GJ>FN
4@ RDGG N@@ JOWBSJBOU =GJ>FN <I? 5A@FD35F ;@:7D;F3@57 DI < G<O@M >C<KO@M <AO@M >JQ@MDIB
NOMP>ON <I? >G<NN@N.
JO blocks for entry conditions
44.1
JMM@>O @S@>PODJI JA API>ODJIN PNP<GGT ?@K@I? JI RC@OC@M OC@ Q<GP@N JA OC@DM K<M<H@O@MN <M@
Q<GD?. #JM @S<HKG@, < NLP<M@ MJJO API>ODJI H<T M@LPDM@ OC<O DON K<M<H@O@M ><IIJO =@ I@B<ODQ@.
A API>ODJI OC<O ?@<GN RDOC ?<O@N H<T M@LPDM@ OC<O OC@ IPH=@M JA OC@ HJIOC HPNO =@ =@OR@@I
1 <I? 12.
4@ C<Q@ <GM@<?T N@@I NP>C >JI?DODJI >C@>FN DI OC@ BTTFSU <I? FOGPSDF >C<KO@M. JI?DODJIN
JI K<M<H@O@M Q<GP@N ><I =@ @IAJM>@? =T BTTFSU >C@>FN RDOCDI API>ODJI ?@ADIDODJIN:
TUSJOH UJNF5P4USJOH(JO JOU IPVS, JO JOU NJOVUF)
\
BTTFSU((IPVS >= 0) && (IPVS <= 23));
BTTFSU((NJOVUF >= 0) && (NJOVUF <= 59));
SFUVSO GPSNBU("%02T:%02T", IPVS, NJOVUF);
^
&I >JIOM<>O KMJBM<HHDIB, OC@ N<H@ >C@>FN <M@ RMDOO@I DIND?@ OC@ JO =GJ>FN JA API>ODJIN.
4C@I <I JO JM PVU =GJ>F DN PN@?, OC@ <>OP<G =J?T JA OC@ API>ODJI HPNO =@ NK@>DAD@? <N < CPEZ
=GJ>F:
JNQPSU TUE.TUEJP;
JNQPSU TUE.TUSJOH;
TUSJOH UJNF5P4USJOH(JO JOU IPVS, JO JOU NJOVUF)
JO
\
BTTFSU((IPVS >= 0) && (IPVS <= 23));
BTTFSU((NJOVUF >= 0) && (NJOVUF <= 59));
^
CPEZ
\
SFUVSO GPSNBU("%02T:%02T", IPVS, NJOVUF);
^
WPJE NBJO()
\
XSJUFMO(UJNF5P4USJOH(12, 34));
^
CA@FD35F &DA9D3??;@9
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
220
A =@I@ADO JA <I JO =GJ>F DN OC<O <GG JA OC@ @IOMT >JI?DODJIN ><I =@ F@KO OJB@OC@M <I? N@K<M<O@
AMJH OC@ <>OP<G =J?T JA OC@ API>ODJI. 1CDN R<T, OC@ API>ODJI =J?T RJPG? =@ AM@@ JA BTTFSU
>C@>FN <=JPO OC@ @IOMT >JI?DODJIN. AN I@@?@?, DO DN NODGG KJNND=G@ <I? <?QDN<=G@ OJ C<Q@ JOC@M
BTTFSU >C@>FN DIND?@ OC@ API>ODJI =J?T <N PIM@G<O@? >C@>FN OC<O BP<M? <B<DINO KJO@IOD<G
KMJBM<HHDIB @MMJMN DI OC@ API>ODJI =J?T.
1C@ >J?@ OC<O DN DIND?@ OC@ JO =GJ>F DN @S@>PO@? <POJH<OD><GGT @Q@MT ODH@ OC@ API>ODJI DN
><GG@?. 1C@ <>OP<G @S@>PODJI JA OC@ API>ODJI NO<MON JIGT DA <GG JA OC@ BTTFSU >C@>FN DIND?@ OC@
JO =GJ>F K<NN. 1CDN KM@Q@ION @S@>PODIB OC@ API>ODJI RDOC DIQ<GD? @IOMT >JI?DODJIN <I? <N <
>JIN@LP@I>@, <QJD?N KMJ?P>DIB DI>JMM@>O M@NPGON.
AI BTTFSU >C@>F OC<O A<DGN DIND?@ OC@ JO =GJ>F DI?D><O@N OC<O OC@ >JIOM<>O C<N =@@I QDJG<O@?
=T OC@ ><GG@M.
PVU blocks for exit conditions
44.2
1C@ JOC@M ND?@ JA OC@ >JIOM<>O DIQJGQ@N BP<M<IO@@N OC<O OC@ API>ODJI KMJQD?@N. AI @S<HKG@ JA
< API>ODJI RDOC <I @SDO >JI?DODJI RJPG? =@ < API>ODJI OC<O M@OPMIN OC@ IPH=@M JA ?<TN DI
#@=MP<MT; OC@ M@OPMI@? Q<GP@ RJPG? <GR<TN =@ @DOC@M 28 JM 29.
1C@ @SDO >JI?DODJIN <M@ >C@>F@? DIND?@ OC@ PVU =GJ>FN JA API>ODJIN.
B@><PN@ OC@ Q<GP@ OC<O < API>ODJI M@OPMIN =T OC@ SFUVSO NO<O@H@IO I@@? IJO =@ ?@ADI@? <N <
Q<MD<=G@ DIND?@ OC@ API>ODJI, OC@M@ DN PNP<GGT IJ I<H@ OJ M@A@M OJ OC@ M@OPMI Q<GP@. 1CDN ><I =@
N@@I <N < KMJ=G@H =@><PN@ OC@ BTTFSU >C@>FN DIND?@ OC@ PVU =GJ>F ><IIJO M@A@M OJ OC@
M@OPMI@? Q<MD<=G@ =T I<H@.
! NJGQ@N OCDN KMJ=G@H =T KMJQD?DIB < R<T JA I<HDIB OC@ M@OPMI Q<GP@ MDBCO <AO@M OC@ PVU
F@TRJM?. 1C<O I<H@ M@KM@N@ION OC@ Q@MT Q<GP@ OC<O OC@ API>ODJI DN DI OC@ KMJ>@NN JA
M@OPMIDIB:
JOU EBZT*O'FCSVBSZ(JO JOU ZFBS)
PVU (SFTVMU)
\
BTTFSU((SFTVMU == 28) ]] (SFTVMU == 29));
^
CPEZ
\
SFUVSO JT-FBQ:FBS(ZFBS) 29 : 28;
^
AGOCJPBC SFTVMU DN < M@<NJI<=G@ I<H@ AJM OC@ M@OPMI@? Q<GP@, JOC@M Q<GD? I<H@N H<T <GNJ =@
PN@?.
0JH@ API>ODJIN ?J IJO C<Q@ M@OPMI Q<GP@N JM OC@ M@OPMI Q<GP@ I@@? IJO =@ >C@>F@?. &I OC<O
><N@ OC@ PVU =GJ>F ?J@N IJO NK@>DAT < I<H@:
PVU
\
// ...
^
0DHDG<M OJ JO =GJ>FN, OC@ PVU =GJ>FN <M@ @S@>PO@? <POJH<OD><GGT <AO@M OC@ =J?T JA OC@ API>ODJI
DN @S@>PO@?.
AI BTTFSU >C@>F OC<O A<DGN DIND?@ OC@ PVU =GJ>F DI?D><O@N OC<O OC@ >JIOM<>O C<N =@@I QDJG<O@?
=T OC@ API>ODJI.
CA@FD35F &DA9D3??;@9
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
221
AN DO C<N =@@I J=QDJPN, JO <I? PVU =GJ>FN <M@ JKODJI<G. JIND?@MDIB OC@ VOJUUFTU =GJ>FN <N
R@GG, RCD>C <M@ <GNJ JKODJI<G, ! API>ODJIN H<T >JINDNO JA PK OJ AJPM =GJ>FN JA >J?@:
t JO: ,KODJI<G
t PVU: ,KODJI<G
t CPEZ: *<I?<OJMT =PO OC@ CPEZ F@TRJM? H<T =@ NFDKK@? DA IJ JO JM PVU =GJ>F DN ?@ADI@?.
t VOJUUFTU: ,KODJI<G <I? O@>CID><GGT IJO < K<MO JA < API>ODJI'N ?@ADIDODJI =PO >JHHJIGT
?@ADI@? MDBCO <AO@M OC@ API>ODJI.
%@M@ DN <I @S<HKG@ OC<O PN@N <GG JA OC@N@ =GJ>FN:
JNQPSU TUE.TUEJP;
/*
* %JTUSJCVUFT UIF TVN CFUXFFO UXP WBSJBCMFT.
*
* %JTUSJCVUFT UP UIF GJSTU WBSJBCMF GJSTU, CVU OFWFS HJWFT
* NPSF UIBO 7 UP JU. 5IF SFTU PG UIF TVN JT EJTUSJCVUFE UP
* UIF TFDPOE WBSJBCMF.
*/
WPJE EJTUSJCVUF(JO JOU TVN, PVU JOU GJSTU, PVU JOU TFDPOE)
JO
\
BTTFSU(TVN >= 0);
^
PVU
\
BTTFSU(TVN == (GJSTU + TFDPOE));
^
CPEZ
\
GJSTU = (TVN >= 7) 7 : TVN;
TFDPOE = TVN - GJSTU;
^
VOJUUFTU
\
JOU GJSTU;
JOU TFDPOE;
// #PUI NVTU CF 0 JG UIF TVN JT 0
EJTUSJCVUF(0, GJSTU, TFDPOE);
BTTFSU(GJSTU == 0);
BTTFSU(TFDPOE == 0);
// *G UIF TVN JT MFTT UIBO 7, UIFO BMM PG JU NVTU CF HJWFO
// UP GJSTU
EJTUSJCVUF(3, GJSTU, TFDPOE);
BTTFSU(GJSTU == 3);
BTTFSU(TFDPOE == 0);
// 5FTUJOH B CPVOEBSZ DPOEJUJPO
EJTUSJCVUF(7, GJSTU, TFDPOE);
BTTFSU(GJSTU == 7);
BTTFSU(TFDPOE == 0);
// *G UIF TVN JT NPSF UIBO 7, UIFO UIF GJSTU NVTU HFU 7
// BOE UIF SFTU NVTU CF HJWFO UP TFDPOE
EJTUSJCVUF(8, GJSTU, TFDPOE);
BTTFSU(GJSTU == 7);
BTTFSU(TFDPOE == 1);
// " SBOEPN MBSHF WBMVF
EJTUSJCVUF(1@000@007, GJSTU, TFDPOE);
BTTFSU(GJSTU == 7);
BTTFSU(TFDPOE == 1@000@000);
^
CA@FD35F &DA9D3??;@9
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
222
WPJE NBJO()
\
JOU GJSTU;
JOU TFDPOE;
EJTUSJCVUF(123, GJSTU, TFDPOE);
XSJUFMO("GJSTU: ", GJSTU, " TFDPOE: ", TFDPOE);
^
1C@ KMJBM<H ><I =@ >JHKDG@? <I? MPI JI OC@ >JINJG@ =T OC@ AJGGJRDIB >JHH<I?N:
$ ENE EFOFNF.E -X -VOJUUFTU
$ ./EFOFNF
GJSTU: 7 TFDPOE: 116
AGOCJPBC OC@ <>OP<G RJMF JA OC@ API>ODJI >JINDNON JA JIGT ORJ GDI@N, OC@M@ <M@ < OJO<G JA 19
IJIOMDQD<G GDI@N OC<O NPKKJMO DON API>ODJI<GDOT. &O H<T =@ <MBP@? OC<O NJ HP>C @SOM< >J?@ DN OJJ
HP>C AJM NP>C < NCJMO API>ODJI. %JR@Q@M, =PBN <M@ I@Q@M DIO@IODJI<G. 1C@ KMJBM<HH@M <GR<TN
RMDO@N >J?@ OC<O DN 7JB75F76 FA IAD= 5ADD75F>K, RCD>C >JHHJIGT @I?N PK >JIO<DIDIB Q<MDJPN
OTK@N JA =PBN.
4C@I @SK@>O<ODJIN <M@ G<D? JPO @SKGD>DOGT =T PIDO O@NON <I? >JIOM<>ON, API>ODJIN OC<O <M@
DIDOD<GGT >JMM@>O C<Q@ < BM@<O@M >C<I>@ JA NO<TDIB >JMM@>O. & M@>JHH@I? OC<O TJP O<F@ APGG
<?Q<IO<B@ JA <IT A@<OPM@ OC<O DHKMJQ@N KMJBM<H >JMM@>OI@NN. BJOC PIDO O@NON <I? >JIOM<>ON
<M@ @AA@>ODQ@ OJJGN OJR<M?N OC<O BJ<G. 1C@T C@GK M@?P>@ ODH@ NK@IO AJM ?@=PBBDIB, @AA@>ODQ@GT
DI>M@<NDIB ODH@ NK@IO AJM <>OP<GGT RMDODIB >J?@.
Disabling contract programming
44.3
JIOM<MT OJ PIDO O@NODIB, >JIOM<>O KMJBM<HHDIB A@<OPM@N <M@ @I<=G@? =T ?@A<PGO. 1C@
jSFMFBTF >JHKDG@M NRDO>C ?DN<=G@N >JIOM<>O KMJBM<HHDIB:
ENE EFOFNF.E -X -SFMFBTF
4C@I OC@ KMJBM<H DN >JHKDG@? RDOC OC@ jSFMFBTF NRDO>C, OC@ >JIO@ION JA JO, PVU, <I?
JOWBSJBOU =GJ>FN <M@ DBIJM@?.
JO blocks versus FOGPSDF checks
44.4
4@ C<Q@ N@@I DI OC@ BTTFSU <I? FOGPSDF >C<KO@M OC<O NJH@ODH@N DO DN ?DAAD>PGO OJ ?@>D?@
RC@OC@M OJ PN@ BTTFSU JM FOGPSDF >C@>FN. 0DHDG<MGT, NJH@ODH@N DO DN ?DAAD>PGO OJ ?@>D?@
RC@OC@M OJ PN@ BTTFSU >C@>FN RDOCDI JO =GJ>FN Q@MNPN FOGPSDF >C@>FN RDOCDI API>ODJI
=J?D@N.
1C@ A<>O OC<O DO DN KJNND=G@ OJ ?DN<=G@ >JIOM<>O KMJBM<HHDIB DN <I DI?D><ODJI OC<O >JIOM<>O
KMJBM<HHDIB DN AJM KMJO@>ODIB <B<DINO KMJBM<HH@M @MMJMN. #JM OC<O M@<NJI, OC@ ?@>DNDJI C@M@
NCJPG? =@ =<N@? JI OC@ N<H@ BPD?@GDI@N OC<O R@ C<Q@ N@@I DI OC@ BTTFSU <I? FOGPSDF
>C<KO@M:
t &A OC@ >C@>F DN BP<M?DIB <B<DINO < >J?DIB @MMJM, OC@I DO NCJPG? =@ DI OC@ JO =GJ>F. #JM
@S<HKG@, DA OC@ API>ODJI DN ><GG@? JIGT AMJH JOC@M K<MON JA OC@ KMJBM<H, GDF@GT OJ C@GK RDOC
<>CD@QDIB < API>ODJI<GDOT JA DO, OC@I OC@ K<M<H@O@M Q<GP@N <M@ @IODM@GT OC@ M@NKJIND=DGDOT JA
OC@ KMJBM<HH@M. #JM OC<O M@<NJI, OC@ @IOMT >JI?DODJIN JA NP>C < API>ODJI NCJPG? =@
>C@>F@? DI DON JO =GJ>F.
CA@FD35F &DA9D3??;@9
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
223
t &A OC@ API>ODJI ><IIJO <>CD@Q@ NJH@ O<NF AJM <IT JOC@M M@<NJI, DI>GP?DIB DIQ<GD? K<M<H@O@M
Q<GP@N, OC@I DO HPNO OCMJR <I @S>@KODJI, >JIQ@ID@IOGT =T FOGPSDF.
1J N@@ <I @S<HKG@ JA OCDN, G@O'N ?@ADI@ < API>ODJI OC<O M@OPMIN < NGD>@ JA OC@ HD??G@ JA
<IJOC@M NGD>@. )@O'N <NNPH@ OC<O OCDN API>ODJI DN AJM OC@ >JINPHKODJI JA OC@ PN@MN JA
OC@ HJ?PG@, <N JKKJN@? OJ =@DIB <I DIO@MI<G API>ODJI PN@? =T OC@ HJ?PG@ DON@GA. 0DI>@
OC@ PN@MN JA OCDN HJ?PG@ ><I ><GG OCDN API>ODJI =T Q<MDJPN <I? KJO@IOD<GGT DIQ<GD?
K<M<H@O@M Q<GP@N, DO RJPG? =@ <KKMJKMD<O@ OJ >C@>F OC@ K<M<H@O@M Q<GP@N @Q@MT ODH@
OC@ API>ODJI DN ><GG@?. &O RJPG? =@ DINPAAD>D@IO OJ JIGT >C@>F OC@H <O KMJBM<H
?@Q@GJKH@IO ODH@, <AO@M RCD>C >JIOM<>ON ><I =@ ?DN<=G@? =T jSFMFBTF.
#JM OC<O M@<NJI, OC@ AJGGJRDIB API>ODJI Q<GD?<O@N DON K<M<H@O@MN =T ><GGDIB FOGPSDF DI
OC@ API>ODJI =J?T DINO@<? JA <I BTTFSU >C@>F DI OC@ JO =GJ>F:
JNQPSU TUE.FYDFQUJPO;
JOPVU(JOU)<> NJEEMF(JOPVU(JOU)<> PSJHJOBM4MJDF, TJ[F@U XJEUI)
PVU (SFTVMU)
\
BTTFSU(SFTVMU.MFOHUI == XJEUI);
^
CPEZ
\
FOGPSDF(PSJHJOBM4MJDF.MFOHUI >= XJEUI);
JNNVUBCMF TUBSU = (PSJHJOBM4MJDF.MFOHUI - XJEUI) / 2;
JNNVUBCMF FOE = TUBSU + XJEUI;
SFUVSO PSJHJOBM4MJDF<TUBSU .. FOE>;
^
VOJUUFTU
\
BVUP TMJDF = <1, 2, 3, 4, 5>;
BTTFSU(NJEEMF(TMJDF, 3) == <2, 3, 4>);
BTTFSU(NJEEMF(TMJDF, 2) == <2, 3>);
BTTFSU(NJEEMF(TMJDF, 5) == TMJDF);
^
WPJE NBJO()
\^
1C@M@ DNI'O < NDHDG<M KMJ=G@H RDOC OC@ PVU =GJ>FN. 0DI>@ OC@ M@OPMI Q<GP@ JA @Q@MT
API>ODJI DN OC@ M@NKJIND=DGDOT JA OC@ KMJBM<HH@M, @SDO >JI?DODJIN HPNO <GR<TN =@
>C@>F@? DI OC@ PVU =GJ>FN. 1C@ API>ODJI <=JQ@ AJGGJRN OCDN BPD?@GDI@.
t AIJOC@M >MDO@MDJI OJ >JIND?@M RC@I ?@>D?DIB =@OR@@I JO =GJ>FN Q@MNPN FOGPSDF DN OJ
>JIND?@M RC@OC@M OC@ >JI?DODJI DN M@>JQ@M<=G@. &A DO DN M@>JQ@M<=G@ =T OC@ CDBC@M G<T@MN JA
>J?@, OC@I DO H<T =@ HJM@ <KKMJKMD<O@ OJ OCMJR <I @S>@KODJI, >JIQ@ID@IOGT =T FOGPSDF.
Exercise
44.5
t 4MDO@ < KMJBM<H OC<O DI>M@<N@N OC@ OJO<G KJDION JA ORJ AJJO=<GG (NJ>>@M) O@<HN <>>JM?DIB OJ
OC@ M@NPGO JA < B<H@.
1C@ ADMNO ORJ K<M<H@O@MN JA OCDN API>ODJI <M@ OC@ BJ<GN OC<O @<>C O@<H C<N N>JM@?. 1C@
JOC@M ORJ K<M<H@O@MN <M@ OC@ KJDION JA @<>C O@<H =@AJM@ OC@ B<H@. 1CDN API>ODJI
NCJPG? <?EPNO OC@ KJDION JA OC@ O@<HN <>>JM?DIB OJ OC@ BJ<GN OC<O OC@T C<Q@ N>JM@?. AN
< M@HDI?@M, OC@ RDII@M O<F@N 3 KJDION <I? OC@ GJN@M O<F@N IJ KJDIO. &I OC@ @Q@IO JA <
?M<R, =JOC O@<HN B@O 1 KJDIO @<>C.
CA@FD35F &DA9D3??;@9
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
224
A??DODJI<GGT, OC@ API>ODJI NCJPG? DI?D><O@ RCD>C O@<H C<N =@@I OC@ RDII@M: 1 DA OC@
ADMNO O@<H C<N RJI, 2 DA OC@ N@>JI? O@<H C<N RJI, <I? 0 DA OC@ B<H@ C<N @I?@? DI <
?M<R.
0O<MO RDOC OC@ AJGGJRDIB KMJBM<H <I? ADGG DI OC@ AJPM =GJ>FN JA OC@ API>ODJI
<KKMJKMD<O@GT. !J IJO M@HJQ@ OC@ BTTFSU >C@>FN DI NBJO(); OC@T ?@HJINOM<O@ CJR
OCDN API>ODJI DN @SK@>O@? OJ RJMF.
JOU BEE1PJOUT(JO JOU HPBMT1,
JO JOU HPBMT2,
SFG JOU QPJOUT1,
SFG JOU QPJOUT2)
JO
\
// ...
^
PVU (SFTVMU)
\
// ...
^
CPEZ
\
JOU XJOOFS;
// ...
SFUVSO XJOOFS;
^
VOJUUFTU
\
// ...
^
WPJE NBJO()
\
JOU QPJOUT1 = 10;
JOU QPJOUT2 = 7;
JOU XJOOFS;
XJOOFS = BEE1PJOUT(3, 1, QPJOUT1, QPJOUT2);
BTTFSU(QPJOUT1 == 13);
BTTFSU(QPJOUT2 == 7);
BTTFSU(XJOOFS == 1);
XJOOFS = BEE1PJOUT(2, 2, QPJOUT1, QPJOUT2);
BTTFSU(QPJOUT1 == 14);
BTTFSU(QPJOUT2 == 8);
BTTFSU(XJOOFS == 0);
^
Note: !F ?3K 47 47FF7D FA D7FGD@ 3@ enum H3>G7 8DA? F:;E 8G@5F;A@:
FOVN (BNF3FTVMU
\
GJSTU8PO, TFDPOE8PO, ESBX
^
(BNF3FTVMU BEE1PJOUT(JO JOU HPBMT1,
JO JOU HPBMT2,
SFG JOU QPJOUT1,
SFG JOU QPJOUT2)
// ...
& >CJN@ OJ M@OPMI <I JOU AJM OCDN @S@M>DN@, NJ OC<O OC@ M@OPMI Q<GP@ ><I =@ >C@>F@?
<B<DINO OC@ Q<GD? Q<GP@N JA 0, 1, <I? 2.
CA@FD35F &DA9D3??;@9
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
225
... F:7 EA>GF;A@
CA@FD35F &DA9D3??;@9
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
226
Lifetimes and Fundamental Operations 45
4@ RDGG NJJI >JQ@M NOMP>ON, OC@ =<ND> A@<OPM@ OC<O <GGJRN OC@ KMJBM<HH@M OJ ?@ADI@
<KKGD><ODJI-NK@>DAD> OTK@N. 0OMP>ON <M@ AJM >JH=DIDIB API?<H@IO<G OTK@N <I? JOC@M NOMP>ON
OJB@OC@M OJ ?@ADI@ CDBC@M-G@Q@G OTK@N OC<O =@C<Q@ <>>JM?DIB OJ NK@>D<G I@@?N JA KMJBM<HN.
AAO@M NOMP>ON, R@ RDGG G@<MI <=JPO >G<NN@N, RCD>C <M@ OC@ =<NDN JA OC@ J=E@>O JMD@IO@?
KMJBM<HHDIB A@<OPM@N JA !.
B@AJM@ B@OODIB OJ NOMP>ON <I? >G<NN@N, DO RDGG =@ =@OO@M OJ O<GF <=JPO NJH@ DHKJMO<IO >JI>@KON
ADMNO. 1C@N@ >JI>@KON RDGG C@GK PI?@MNO<I? NOMP>ON <I? >G<NN@N <I? NJH@ JA OC@DM ?DAA@M@I>@N.
4@ C<Q@ =@@I ><GGDIB <IT KD@>@ JA ?<O< OC<O M@KM@N@IO@? < >JI>@KO DI < KMJBM<H < H3D;34>7. &I
< A@R KG<>@N R@ C<Q@ ><GG@? NOMP>O <I? >G<NN Q<MD<=G@N NK@>DAD><GGT <N A4<75FE. & RDGG >JIODIP@
><GGDIB =JOC JA OC@N@ >JI>@KON Q<MD<=G@N DI OCDN >C<KO@M.
AGOCJPBC OCDN >C<KO@M DI>GP?@N JIGT API?<H@IO<G OTK@N, NGD>@N, <I? <NNJ>D<ODQ@ <MM<TN; OC@N@
>JI>@KON <KKGT OJ PN@?-?@ADI@? OTK@N <N R@GG.
Lifetime of a variable
45.1
1C@ ODH@ =@OR@@I RC@I < Q<MD<=G@ DN ?@ADI@? <I? RC@I DO DN 8;@3>;L76 DN OC@ GDA@ODH@ JA OC<O
Q<MD<=G@. AGOCJPBC DO DN OC@ ><N@ AJM H<IT OTK@N, 475A?;@9 G@3H3;>34>7 <I? 47;@9 8;@3>;L76
I@@? IJO =@ <O OC@ N<H@ ODH@.
6JP RJPG? M@H@H=@M AMJH OC@ +<H@ 0K<>@ >C<KO@M CJR Q<MD<=G@N =@>JH@ PI<Q<DG<=G@. &I
NDHKG@ ><N@N, @SDODIB OC@ N>JK@ RC@M@ < Q<MD<=G@ C<N =@@I ?@ADI@? RJPG? H<F@ OC<O Q<MD<=G@
PI<Q<DG<=G@.
)@O'N >JIND?@M OC@ AJGGJRDIB @S<HKG@ <N < M@HDI?@M:
WPJE TQFFE5FTU()
\
JOU TQFFE; // 4JOHMF WBSJBCMF ...
GPSFBDI (J; 0 .. 10) \
TQFFE = 100 + J; // ... UBLFT 10 EJGGFSFOU WBMVFT.
// ...
^
^ // j 'TQFFE' JT VOBWBJMBCMF CFZPOE UIJT QPJOU.
1C@ GDA@ODH@ JA OC@ TQFFE Q<MD<=G@ DI OC<O >J?@ @I?N PKJI @SDODIB OC@ TQFFE5FTU() API>ODJI.
1C@M@ DN < NDIBG@ Q<MD<=G@ DI OC@ >J?@ <=JQ@, RCD>C O<F@N O@I ?DAA@M@IO Q<GP@N AMJH 100 OJ 109.
4C@I DO >JH@N OJ Q<MD<=G@ GDA@ODH@N, OC@ AJGGJRDIB >J?@ DN Q@MT ?DAA@M@IO >JHK<M@? OJ OC@
KM@QDJPN JI@:
WPJE TQFFE5FTU()
\
GPSFBDI (J; 0 .. 10) \
JOU TQFFE = 100 + J; // 5FO TFQBSBUF WBSJBCMFT.
// ...
^ // j -JGFUJNF PG FBDI WBSJBCMF FOET IFSF.
^
1C@M@ <M@ O@I N@K<M<O@ Q<MD<=G@N DI OC<O >J?@, @<>C O<FDIB < NDIBG@ Q<GP@. 2KJI @Q@MT
DO@M<ODJI JA OC@ GJJK, < I@R Q<MD<=G@ NO<MON DON GDA@, RCD>C @Q@IOP<GGT @I?N <O OC@ @I? JA @<>C
DO@M<ODJI.
";87F;?7E 3@6 FG@63?7@F3> %B7D3F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
227
Lifetime of a parameter
45.2
1C@ GDA@ODH@ JA < K<M<H@O@M ?@K@I?N JI DON LP<GDAD@MN:
SFG: 1C@ K<M<H@O@M DN EPNO <I <GD<N JA OC@ <>OP<G Q<MD<=G@ OC<O DN NK@>DAD@? RC@I ><GGDIB OC@
API>ODJI. SFG K<M<H@O@MN ?J IJO <AA@>O OC@ GDA@ODH@N JA <>OP<G Q<MD<=G@N.
JO: #JM H3>G7 FKB7E, OC@ GDA@ODH@ JA OC@ K<M<H@O@M NO<MON PKJI @IO@MDIB OC@ API>ODJI <I? @I?N
PKJI @SDODIB DO. #JM D787D7@57 FKB7E, OC@ GDA@ODH@ JA OC@ K<M<H@O@M DN OC@ N<H@ <N RDOC SFG.
(4@ RDGG N@@ Q<GP@ OTK@N <I? M@A@M@I>@ OTK@N DI OC@ I@SO >C<KO@M.)
PVU: 0<H@ RDOC SFG, OC@ K<M<H@O@M DN EPNO <I <GD<N JA OC@ <>OP<G Q<MD<=G@ OC<O DN NK@>DAD@?
RC@I ><GGDIB OC@ API>ODJI. 1C@ JIGT ?DAA@M@I>@ DN OC<O OC@ Q<MD<=G@ DN N@O OJ DON .JOJU Q<GP@
<POJH<OD><GGT PKJI @IO@MDIB OC@ API>ODJI.
MB[Z: 1C@ GDA@ JA OC@ K<M<H@O@M NO<MON RC@I OC@ K<M<H@O@M DN <>OP<GGT PN@? <I? @I?N MDBCO
OC@I.
1C@ AJGGJRDIB @S<HKG@ PN@N OC@N@ AJPM OTK@N JA K<M<H@O@MN <I? @SKG<DIN OC@DM GDA@ODH@N DI
KMJBM<H >JHH@ION:
WPJE NBJO()
\
JOU NBJO@JO; /* 5IF WBMVF PG NBJO@JO JT DPQJFE UP UIF
* QBSBNFUFS. */
JOU NBJO@SFG; /* NBJO@SFG JT QBTTFE UP UIF GVODUJPO BT
* JUTFMG. */
JOU NBJO@PVU; /* NBJO@PVU JT QBTTFE UP UIF GVODUJPO BT
* JUTFMG. *UT WBMVF JT TFU UP JOU.JOJU
* VQPO FOUFSJOH UIF GVODUJPO. */
GPP(NBJO@JO, NBJO@SFG, NBJO@PVU, B$BMDVMBUJPO());
^
WPJE GPP(
JO JOU Q@JO, /* 5IF MJGFUJNF PG Q@JO TUBSUT VQPO
* FOUFSJOH UIF GVODUJPO BOE FOET VQPO
* FYJUJOH UIF GVODUJPO. */
SFG JOU Q@SFG, /* Q@SFG JT BO BMJBT PG NBJO@SFG. */
PVU JOU Q@PVU, /* Q@PVU JT BO BMJBT PG NBJO@PVU. *UT
* WBMVF JT TFU UP JOU.JOJU VQPO
* FOUFSJOH UIF GVODUJPO. */
MB[Z JOU Q@MB[Z) /* 5IF MJGFUJNF PG Q@MB[Z TUBSUT XIFO JU
* JT VTFE BOE FOET XIFO JUT VTF
* FOET. *UT WBMVF JT DBMDVMBUFE CZ
* DBMMJOH B$BMDVMBUJPO() FWFSZ UJNF
* Q@MB[Z JT VTFE JO UIF GVODUJPO. */
\
// ...
^
JOU B$BMDVMBUJPO()
\
JOU SFTVMU;
// ...
SFUVSO SFTVMU;
^
";87F;?7E 3@6 FG@63?7@F3> %B7D3F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
228
Fundamental operations
45.3
/@B<M?G@NN JA DON OTK@, OC@M@ <M@ OCM@@ API?<H@IO<G JK@M<ODJIN OCMJPBCJPO OC@ GDA@ODH@ JA <
Q<MD<=G@:
t Initialization: 1C@ NO<MO JA DON GDA@.
t Finalization: 1C@ @I? JA DON GDA@.
t Assignment: C<IBDIB DON Q<GP@ <O JI>@.
1J =@ >JIND?@M@? <I J=E@>O, DO HPNO ADMNO =@ DIDOD<GDU@?. 1C@M@ H<T =@ ADI<G JK@M<ODJIN AJM NJH@
OTK@N. 1C@ Q<GP@ JA < Q<MD<=G@ H<T >C<IB@ ?PMDIB DON GDA@ODH@.
Initialization 45.3.1
"Q@MT Q<MD<=G@ HPNO =@ DIDOD<GDU@? =@AJM@ =@DIB PN@?. &IDOD<GDU<ODJI DIQJGQ@N ORJ NO@KN:
1. Reserving space for the variable: 1CDN NK<>@ DN RC@M@ OC@ Q<GP@ JA OC@ Q<MD<=G@ DN NOJM@?
DI H@HJMT.
2. Construction: 0@OODIB OC@ ADMNO Q<GP@ JA OC@ Q<MD<=G@ JI OC<O NK<>@ (JM OC@ ADMNO Q<GP@N JA
OC@ H@H=@MN JA NOMP>ON <I? >G<NN@N).
"Q@MT Q<MD<=G@ GDQ@N DI < KG<>@ DI H@HJMT OC<O DN M@N@MQ@? AJM DO. 0JH@ JA OC@ >J?@ OC<O OC@
>JHKDG@M B@I@M<O@N DN <=JPO M@N@MQDIB NK<>@ AJM @<>C Q<MD<=G@.
)@O'N >JIND?@M OC@ AJGGJRDIB Q<MD<=G@:
JOU TQFFE = 123;
1C@ IPH=@M JA =TO@N OC<O OC@ Q<MD<=G@ TQFFE J>>PKD@N DN OC@ NDU@ JA <I JOU. &A R@ QDNP<GDU@ OC@
H@HJMT <N < MD==JI BJDIB AMJH G@AO OJ MDBCO, R@ ><I DH<BDI@ OC@ Q<MD<=G@ GDQDIB JI NJH@ K<MO
JA DO:
--+-----+-----+-----+--
] ] 123 ] ]
--+-----+-----+-----+--
1C@ H@HJMT GJ><ODJI OC<O < Q<MD<=G@ DN KG<>@? <O DN ><GG@? DON <??M@NN. &I < N@IN@, OC@ Q<MD<=G@
GDQ@N <O OC<O <??M@NN. 4C@I OC@ Q<GP@ JA < Q<MD<=G@ DN >C<IB@?, OC@ I@R Q<GP@ DN NOJM@? <O OC@
N<H@ KG<>@:
++TQFFE;
1C@ I@R Q<GP@ RJPG? =@ <O OC@ N<H@ KG<>@ RC@M@ OC@ JG? Q<GP@ C<N =@@I:
--+-----+-----+-----+--
] ] 124 ] ]
--+-----+-----+-----+--
JINOMP>ODJI DN I@>@NN<MT OJ KM@K<M@ Q<MD<=G@N AJM PN@. 0DI>@ < Q<MD<=G@ ><IIJO =@ PN@?
M@GD<=GT =@AJM@ =@DIB >JINOMP>O@?, DO DN K@MAJMH@? =T OC@ >JHKDG@M <POJH<OD><GGT.
3<MD<=G@N ><I =@ >JINOMP>O@? DI OCM@@ R<TN:
t By their default value: RC@I OC@ KMJBM<HH@M ?J@N IJO NK@>DAT < Q<GP@ @SKGD>DOGT
t By copying: RC@I OC@ Q<MD<=G@ DN >JINOMP>O@? <N < >JKT JA <IJOC@M Q<MD<=G@ JA OC@ N<H@
OTK@
t By a specific value: RC@I OC@ KMJBM<HH@M NK@>DAD@N < Q<GP@ @SKGD>DOGT
";87F;?7E 3@6 FG@63?7@F3> %B7D3F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
229
4C@I < Q<GP@ DN IJO NK@>DAD@?, OC@ Q<GP@ JA OC@ Q<MD<=G@ RJPG? =@ OC@ 6783G>F Q<GP@ JA DON OTK@,
D.@. DON .JOJU Q<GP@.
JOU TQFFE;
1C@ Q<GP@ JA TQFFE <=JQ@ DN JOU.JOJU, RCD>C C<KK@IN OJ =@ U@MJ. +<OPM<GGT, < Q<MD<=G@ OC<O DN
>JINOMP>O@? =T DON ?@A<PGO Q<GP@ H<T C<Q@ JOC@M Q<GP@N ?PMDIB DON GDA@ODH@ (PIG@NN DO DN
JNNVUBCMF).
'JMF GJMF;
4DOC OC@ ?@ADIDODJI <=JQ@, OC@ Q<MD<=G@ GJMF DN < 'JMF J=E@>O OC<O DN IJO T@O <NNJ>D<O@? RDOC <I
<>OP<G ADG@ JI OC@ ADG@ NTNO@H. &O DN IJO PN<=G@ PIODG DO DN HJ?DAD@? OJ =@ <NNJ>D<O@? RDOC < ADG@.
3<MD<=G@N <M@ NJH@ODH@N >JINOMP>O@? <N < >JKT JA <IJOC@M Q<MD<=G@:
JOU TQFFE = PUIFS4QFFE;
TQFFE <=JQ@ DN >JINOMP>O@? =T OC@ Q<GP@ JA PUIFS4QFFE.
AN R@ RDGG N@@ DI G<O@M >C<KO@MN, OCDN JK@M<ODJI C<N < ?DAA@M@IO H@<IDIB AJM >G<NN Q<MD<=G@N:
BVUP DMBTT7BSJBCMF = PUIFS$MBTT7BSJBCMF;
AGOCJPBC DMBTT7BSJBCMF NO<MON DON GDA@ <N < >JKT JA PUIFS$MBTT7BSJBCMF, OC@M@ DN <
API?<H@IO<G ?DAA@M@I>@ RDOC >G<NN@N: AGOCJPBC TQFFE <I? PUIFS4QFFE <M@ ?DNODI>O Q<GP@N,
DMBTT7BSJBCMF <I? PUIFS$MBTT7BSJBCMF =JOC KMJQD?@ <>>@NN OJ OC@ N<H@ Q<GP@. 1CDN DN OC@
API?<H@IO<G ?DAA@M@I>@ =@OR@@I Q<GP@ OTK@N <I? M@A@M@I>@ OTK@N. 4@ RDGG >JQ@M OCDN OJKD> DI
OC@ I@SO >C<KO@M.
#DI<GGT, Q<MD<=G@N ><I =@ >JINOMP>O@? =T OC@ Q<GP@ JA <I @SKM@NNDJI JA < >JHK<OD=G@ OTK@:
JOU TQFFE = TPNF$BMDVMBUJPO();
TQFFE <=JQ@ RJPG? =@ >JINOMP>O@? =T OC@ M@OPMI Q<GP@ JA TPNF$BMDVMBUJPO().
Finalization 45.3.2
#DI<GDUDIB DN OC@ ADI<G JK@M<ODJIN OC<O <M@ @S@>PO@? AJM < Q<MD<=G@ <I? M@>G<DHDIB DON H@HJMT:
1. Destruction: 1C@ ADI<G JK@M<ODJIN OC<O HPNO =@ @S@>PO@? AJM OC@ Q<MD<=G@.
2. Reclaiming the variable's memory: /@>G<DHDIB OC@ KD@>@ JA H@HJMT OC<O OC@ Q<MD<=G@
C<N =@@I GDQDIB JI.
#JM NDHKG@ API?<H@IO<G OTK@N, OC@M@ <M@ IJ ADI<G JK@M<ODJIN OJ @S@>PO@. #JM @S<HKG@, OC@
Q<GP@ JA < Q<MD<=G@ JA OTK@ JOU DN IJO N@O =<>F OJ U@MJ. #JM NP>C Q<MD<=G@N OC@M@ DN JIGT
M@>G<DHDIB OC@DM H@HJMT, NJ OC<O DO RDGG =@ PN@? AJM JOC@M Q<MD<=G@N G<O@M.
,I OC@ JOC@M C<I?, NJH@ OTK@N JA Q<MD<=G@N M@LPDM@ NK@>D<G JK@M<ODJIN ?PMDIB ADI<GDU<ODJI. #JM
@S<HKG@, < 'JMF J=E@>O RJPG? I@@? OJ RMDO@ OC@ >C<M<>O@MN OC<O <M@ NODGG DI DON JPOKPO =PAA@M OJ
?DNF <I? IJODAT OC@ ADG@ NTNO@H OC<O DO IJ GJIB@M PN@N OC@ ADG@. 1C@N@ JK@M<ODJIN <M@ OC@
?@NOMP>ODJI JA < 'JMF J=E@>O.
#DI<G JK@M<ODJIN JA <MM<TN <M@ <O < GDOOG@ CDBC@M-G@Q@G: B@AJM@ ADI<GDUDIB OC@ <MM<T, ADMNO DON
@G@H@ION <M@ ?@NOMP>O@?. &A OC@ @G@H@ION <M@ JA < NDHKG@ API?<H@IO<G OTK@ GDF@ JOU, OC@I
OC@M@ <M@ IJ NK@>D<G ADI<G JK@M<ODJIN AJM OC@H. &A OC@ @G@H@ION <M@ JA < NOMP>O JM < >G<NN OTK@
OC<O I@@?N ADI<GDU<ODJI, OC@I OCJN@ JK@M<ODJIN <M@ @S@>PO@? AJM @<>C @G@H@IO.
";87F;?7E 3@6 FG@63?7@F3> %B7D3F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
230
ANNJ>D<ODQ@ <MM<TN <M@ NDHDG<M OJ <MM<TN. A??DODJI<GGT, OC@ F@TN H<T <GNJ =@ ADI<GDU@? DA OC@T
<M@ JA < OTK@ OC<O I@@?N ?@NOMP>ODJI.
The garbage collector: ! DN < 93D4397-5A>>75F76 G<IBP<B@. &I NP>C G<IBP<B@N ADI<GDUDIB <I
J=E@>O I@@? IJO =@ DIDOD<O@? @SKGD>DOGT =T OC@ KMJBM<HH@M. 4C@I < Q<MD<=G@'N GDA@ODH@ @I?N, DON
ADI<GDU<ODJI DN <POJH<OD><GGT C<I?G@? =T OC@ B<M=<B@ >JGG@>OJM. 4@ RDGG >JQ@M OC@ B<M=<B@
>JGG@>OJM <I? NK@>D<G H@HJMT H<I<B@H@IO DI < G<O@M >C<KO@M.
3<MD<=G@N ><I =@ ADI<GDU@? DI ORJ R<TN:
t When the lifetime ends: 1C@ ADI<GDU<ODJI C<KK@IN PKJI OC@ @I? JA GDA@ JA OC@ Q<MD<=G@.
t Some time in the future: 1C@ ADI<GDU<ODJI C<KK@IN <O <I DI?@O@MHDI<O@ ODH@ DI OC@
APOPM@ =T OC@ B<M=<B@ >JGG@>OJM.
4CD>C JA OC@ ORJ R<TN < Q<MD<=G@ RDGG =@ ADI<GDU@? ?@K@I?N KMDH<MDGT JI DON OTK@. 0JH@ OTK@N
GDF@ <MM<TN, <NNJ>D<ODQ@ <MM<TN <I? >G<NN@N <M@ IJMH<GGT ?@NOMP>O@? =T OC@ B<M=<B@ >JGG@>OJM
NJH@ ODH@ DI OC@ APOPM@.
Assignment 45.3.3
1C@ JOC@M API?<H@IO<G JK@M<ODJI OC<O < Q<MD<=G@ @SK@MD@I>@N ?PMDIB DON GDA@ODH@ DN
<NNDBIH@IO.
#JM NDHKG@ API?<H@IO<G OTK@N <NNDBIH@IO DN H@M@GT >C<IBDIB OC@ Q<GP@ JA OC@ Q<MD<=G@. AN R@
C<Q@ N@@I <=JQ@ JI OC@ H@HJMT M@KM@N@IO<ODJI, <I JOU Q<MD<=G@ RJPG? NO<MO C<QDIB OC@ Q<GP@
124 DINO@<? JA 123. %JR@Q@M, HJM@ B@I@M<GGT, <NNDBIH@IO >JINDNON JA ORJ NO@KN, RCD>C <M@ IJO
I@>@NN<MDGT @S@>PO@? DI OC@ AJGGJRDIB JM?@M:
t Destructing the old value
t Constructing the new value
1C@N@ ORJ NO@KN <M@ IJO DHKJMO<IO AJM NDHKG@ API?<H@IO<G OTK@N OC<O ?JI'O I@@? ?@NOMP>ODJI.
#JM OTK@N OC<O I@@? ?@NOMP>ODJI, DO DN DHKJMO<IO OJ M@H@H=@M OC<O <NNDBIH@IO DN <
>JH=DI<ODJI JA OC@ ORJ NO@KN <=JQ@.
";87F;?7E 3@6 FG@63?7@F3> %B7D3F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
231
Value Types and Reference Types 46
1CDN >C<KO@M DIOMJ?P>@N OC@ >JI>@KON JA Q<GP@ OTK@N <I? M@A@M@I>@ OTK@N. 1C@N@ >JI>@KON <M@
K<MOD>PG<MGT DHKJMO<IO OJ PI?@MNO<I? OC@ ?DAA@M@I>@N =@OR@@I NOMP>ON <I? >G<NN@N.
1CDN >C<KO@M <GNJ B@ON DIOJ HJM@ ?@O<DG RDOC OC@ & JK@M<OJM.
1C@ >C<KO@M @I?N RDOC < O<=G@ OC<O >JIO<DIN OC@ JPO>JH@N JA OC@ AJGGJRDIB ORJ >JI>@KON AJM
?DAA@M@IO OTK@N JA Q<MD<=G@N:
t 3<GP@ >JHK<MDNJI
t A??M@NN >JHK<MDNJI
Value types
46.1
3<GP@ OTK@N <M@ @<NT OJ ?@N>MD=@: 3<MD<=G@N JA Q<GP@ OTK@N ><MMT Q<GP@N. #JM @S<HKG@, <GG JA OC@
DIO@B@M <I? AGJ<ODIB KJDIO OTK@N <M@ Q<GP@N OTK@N. AGOCJPBC IJO DHH@?D<O@GT J=QDJPN, ADS@?-
G@IBOC <MM<TN <M@ Q<GP@ OTK@N <N R@GG.
#JM @S<HKG@, < Q<MD<=G@ JA OTK@ JOU C<N <I DIO@B@M Q<GP@:
JOU TQFFE = 123;
<MMTDIB JI AMJH OC@ KM@QDJPN >C<KO@M <I? M@KM@N@IODIB OC@ H@HJMT <N < MD==JI BJDIB AMJH
G@AO OJ MDBCO, NP>C < Q<MD<=G@ RJPG? =@ GDQDIB JI NJH@ K<MO JA OC@ H@HJMT:
TQFFE
---+-----+---
] 123 ]
---+-----+---
4C@I Q<MD<=G@N JA Q<GP@ OTK@N <M@ >JKD@?, OC@T B@O OC@DM JRI Q<GP@N:
JOU OFX4QFFE = TQFFE;
1C@ I@R Q<MD<=G@ RJPG? C<Q@ < KG<>@ <I? < Q<GP@ JA DON JRI:
TQFFE OFX4QFFE
---+-----+--- ---+-----+---
] 123 ] ] 123 ]
---+-----+--- ---+-----+---
+<OPM<GGT, HJ?DAD><ODJIN OC<O <M@ H<?@ OJ OC@N@ Q<MD<=G@N <M@ DI?@K@I?@IO:
TQFFE = 200;
1C@ Q<GP@ JA OC@ JOC@M Q<MD<=G@ ?J@N IJO >C<IB@:
TQFFE OFX4QFFE
---+-----+--- ---+-----+---
] 200 ] ] 123 ]
---+-----+--- ---+-----+---
+3>G7 )KB7E 3@6 '787D7@57 )KB7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
232
The use of BTTFSU checks below 46.1.1
1C@ AJGGJRDIB @S<HKG@N >JIO<DI BTTFSU >C@>FN OJ DI?D><O@ OC<O OC@DM >JI?DODJIN <M@ OMP@. &I
JOC@M RJM?N, OC@T <M@ IJO >C@>FN DI OC@ IJMH<G N@IN@, M<OC@M HT R<T JA O@GGDIB OJ OC@ M@<?@M
OC<O "OCDN DN OMP@".
#JM @S<HKG@, OC@ >C@>F BTTFSU(TQFFE == OFX4QFFE) =@GJR H@<IN "NK@@? DN @LP<G OJ
I@R0K@@?".
Value identity 46.1.2
AN OC@ H@HJMT M@KM@N@IO<ODJIN <=JQ@ DI?D><O@, OC@M@ <M@ ORJ OTK@N JA @LP<GDOT OC<O >JI>@MI
Q<MD<=G@N:
t Value equality: 1C@ == JK@M<OJM OC<O <KK@<M DI H<IT @S<HKG@N OCMJPBCJPO OC@ =JJF
>JHK<M@N Q<MD<=G@N =T OC@DM Q<GP@N. 4C@I ORJ Q<MD<=G@N <M@ N<D? OJ =@ 7CG3> DI OC<O N@IN@,
OC@DM Q<GP@N <M@ @LP<G.
t Value identity: &I OC@ N@IN@ JA JRIDIB N@K<M<O@ Q<GP@N, TQFFE <I? OFX4QFFE C<Q@
N@K<M<O@ D?@IODOD@N. "Q@I RC@I OC@DM Q<GP@N <M@ @LP<G, OC@T <M@ ?DAA@M@IO Q<MD<=G@N.
JOU TQFFE = 123;
JOU OFX4QFFE = TQFFE;
BTTFSU(TQFFE == OFX4QFFE);
TQFFE = 200;
BTTFSU(TQFFE != OFX4QFFE);
Address-of operator, & 46.1.3
4@ C<Q@ =@@I PNDIB OC@ & JK@M<OJM NJ A<M RDOC SFBEG(). 1C@ & JK@M<OJM O@GGN SFBEG() RC@M@
OJ KPO OC@ DIKPO ?<O<.
1C@ <??M@NN@N JA Q<MD<=G@N ><I =@ PN@? AJM JOC@M KPMKJN@N <N R@GG. 1C@ AJGGJRDIB >J?@ NDHKGT
KMDION OC@ <??M@NN@N JA ORJ Q<MD<=G@N:
JOU TQFFE = 123;
JOU OFX4QFFE = TQFFE;
XSJUFMO("TQFFE : ", TQFFE, " BEESFTT: ", &TQFFE);
XSJUFMO("OFX4QFFE: ", OFX4QFFE, " BEESFTT: ", &OFX4QFFE);
TQFFE <I? OFX4QFFE C<Q@ OC@ N<H@ Q<GP@ =PO OC@DM <??M@NN@N <M@ ?DAA@M@IO:
TQFFE : 123 BEESFTT: 7'''4#39$738
OFX4QFFE: 123 BEESFTT: 7'''4#39$73$
Note: !F ;E @AD?3> 8AD F:7 366D7EE7E FA :3H7 6;887D7@F H3>G7E 7H7DK F;?7 F:7 BDA9D3? ;E DG@.
+3D;34>7E >;H7 3F B3DFE A8 ?7?ADK F:3F :3BB7@ FA 47 3H3;>34>7 6GD;@9 F:3F B3DF;5G>3D 7J75GF;A@
A8 F:7 BDA9D3?.
A??M@NN@N <M@ IJMH<GGT KMDIO@? DI C@S<?@>DH<G AJMH<O.
A??DODJI<GGT, OC@ A<>O OC<O OC@ ORJ <??M@NN@N <M@ 4 <K<MO DI?D><O@N OC<O OCJN@ ORJ DIO@B@MN <M@
KG<>@? I@SO OJ @<>C JOC@M DI H@HJMT. (+JO@ OC<O OC@ Q<GP@ JA C@S<?@>DH<G DN 12, NJ OC@
?DAA@M@I>@ =@OR@@I 8 <I? 12 DN 4.)
Reference variables
46.2
B@AJM@ B@OODIB OJ M@A@M@I>@ OTK@N G@O'N ADMNO ?@ADI@ M@A@M@I>@ Q<MD<=G@N.
+3>G7 )KB7E 3@6 '787D7@57 )KB7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
233
Terminology: 4@ C<Q@ =@@I PNDIB OC@ KCM<N@ FA BDAH;67 3557EE FA NJ A<M DI N@Q@M<G >JIO@SON
OCMJPBCJPO OC@ =JJF. #JM @S<HKG@, NGD>@N <I? <NNJ>D<ODQ@ <MM<TN ?J IJO JRI <IT @G@H@ION =PO
KMJQD?@ <>>@NN OJ @G@H@ION OC<O <M@ JRI@? =T OC@ ! MPIODH@. AIJOC@M KCM<N@ OC<O DN D?@IOD><G
DI H@<IDIB DN 47;@9 3 D787D7@57 A8 <N DI "NGD>@N <M@ M@A@M@I>@N JA U@MJ JM HJM@ @G@H@ION",
RCD>C DN NJH@ODH@N PN@? @Q@I NCJMO@M <N FA D787D7@57 <N DI "OCDN NGD>@ M@A@M@I>@N ORJ
@G@H@ION". #DI<GGT, OC@ <>O JA <>>@NNDIB < Q<GP@ OCMJPBC < M@A@M@I>@ DN 67D787D7@5;@9.
/@A@M@I>@ Q<MD<=G@N <M@ Q<MD<=G@N OC<O <>O GDF@ <GD<N@N JA JOC@M Q<MD<=G@N. AGOCJPBC OC@T GJJF
<I? <M@ PN@? GDF@ Q<MD<=G@N, OC@T ?J IJO C<Q@ Q<GP@N OC@HN@GQ@N. *J?DAD><ODJIN H<?@ JI <
M@A@M@I>@ Q<MD<=G@ >C<IB@ OC@ Q<GP@ JA OC@ <>OP<G Q<MD<=G@.
4@ C<Q@ <GM@<?T PN@? M@A@M@I>@ Q<MD<=G@N NJ A<M DI ORJ >JIO@SON:
t SFG in GPSFBDI loops: 1C@ SFG F@TRJM? H<F@N OC@ GJJK Q<MD<=G@ OC@ 35FG3> @G@H@IO OC<O
>JMM@NKJI?N OJ OC<O DO@M<ODJI. 4C@I OC@ SFG F@TRJM? DN IJO PN@?, OC@ GJJK Q<MD<=G@ DN <
5ABK JA OC@ <>OP<G @G@H@IO.
1CDN ><I =@ ?@HJINOM<O@? =T OC@ & JK@M<OJM <N R@GG. &A OC@DM <??M@NN@N <M@ OC@ N<H@,
ORJ Q<MD<=G@N RJPG? =@ M@A@M@I>DIB OC@ N<H@ Q<GP@ (JM OC@ E3?7 7>7?7@F DI OCDN
><N@):
JOU<> TMJDF = < 0, 1, 2, 3, 4 >;
GPSFBDI (J, SFG FMFNFOU; TMJDF) \
BTTFSU(&FMFNFOU == &TMJDF<J>);
^
AGOCJPBC OC@T <M@ N@K<M<O@ Q<MD<=G@N, OC@ A<>O OC<O OC@ <??M@NN@N JA FMFNFOU <I?
TMJDF<J> <M@ OC@ N<H@ KMJQ@N OC<O OC@T C<Q@ OC@ N<H@ Q<GP@ D?@IODOT.
&I JOC@M RJM?N, FMFNFOU <I? TMJDF<J> <M@ M@A@M@I>@N JA OC@ N<H@ Q<GP@. *J?DATDIB
@DOC@M JA OCJN@ <AA@>ON OC@ <>OP<G Q<GP@. 1C@ AJGGJRDIB H@HJMT G<TJPO DI?D><O@N <
NI<KNCJO JA OC@ DO@M<ODJI RC@I J DN 3:
TMJDF<0> TMJDF<1> TMJDF<2> TMJDF<3> TMJDF<4>
p p p (FMFNFOU)
--+--------+--------+--------+--------+---------+--
] 0 ] 1 ] 2 ] 3 ] 4 ]
--+--------+--------+--------+--------+---------+--
t SFG and PVU function parameters: #PI>ODJI K<M<H@O@MN OC<O <M@ NK@>DAD@? <N SFG JM
PVU <M@ <GD<N@N JA OC@ <>OP<G Q<MD<=G@ OC@ API>ODJI DN ><GG@? RDOC.
1C@ AJGGJRDIB @S<HKG@ ?@HJINOM<O@N OCDN ><N@ =T K<NNDIB OC@ N<H@ Q<MD<=G@ OJ
N@K<M<O@ SFG <I? PVU K<M<H@O@MN JA < API>ODJI. AB<DI, OC@ & JK@M<OJM DI?D><O@N OC<O
=JOC K<M<H@O@MN C<Q@ OC@ N<H@ Q<GP@ D?@IODOT:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
JOU PSJHJOBM7BSJBCMF;
XSJUFMO("BEESFTT PG PSJHJOBM7BSJBCMF: ", &PSJHJOBM7BSJBCMF);
GPP(PSJHJOBM7BSJBCMF, PSJHJOBM7BSJBCMF);
^
WPJE GPP(SFG JOU SFG1BSBNFUFS, PVU JOU PVU1BSBNFUFS)
\
XSJUFMO("BEESFTT PG SFG1BSBNFUFS : ", &SFG1BSBNFUFS);
XSJUFMO("BEESFTT PG PVU1BSBNFUFS : ", &PVU1BSBNFUFS);
BTTFSU(&SFG1BSBNFUFS == &PVU1BSBNFUFS);
^
+3>G7 )KB7E 3@6 '787D7@57 )KB7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
234
AGOCJPBC OC@T <M@ ?@ADI@? <N N@K<M<O@ K<M<H@O@MN, SFG1BSBNFUFS <I? PVU1BSBNFUFS
<M@ <GD<N@N JA PSJHJOBM7BSJBCMF:
BEESFTT PG PSJHJOBM7BSJBCMF: 7'''24172958
BEESFTT PG SFG1BSBNFUFS : 7'''24172958
BEESFTT PG PVU1BSBNFUFS : 7'''24172958
Reference types
46.3
3<MD<=G@N JA M@A@M@I>@ OTK@N C<Q@ DI?DQD?P<G D?@IODOD@N =PO OC@T ?J IJO C<Q@ DI?DQD?P<G Q<GP@N.
1C@T BDAH;67 3557EE FA @SDNODIB Q<MD<=G@N.
4@ C<Q@ <GM@<?T N@@I OCDN >JI>@KO RDOC NGD>@N. 0GD>@N ?J IJO JRI @G@H@ION, OC@T KMJQD?@
<>>@NN OJ @SDNODIB @G@H@ION:
WPJE NBJO()
\
// "MUIPVHI JU JT OBNFE BT 'BSSBZ' IFSF, UIJT WBSJBCMF JT
// B TMJDF BT XFMM. *U QSPWJEFT BDDFTT UP BMM PG UIF
// JOJUJBM FMFNFOUT:
JOU<> BSSBZ = < 0, 1, 2, 3, 4 >;
// " TMJDF UIBU QSPWJEFT BDDFTT UP FMFNFOUT PUIFS UIBO UIF
// GJSTU BOE UIF MBTU:
JOU<> TMJDF = BSSBZ<1 .. $ - 1>;
// "U UIJT QPJOU TMJDF<0> BOE BSSBZ<1> QSPWJEF BDDFTT UP
// UIF TBNF WBMVF:
BTTFSU(&TMJDF<0> == &BSSBZ<1>);
// $IBOHJOH TMJDF<0> DIBOHFT BSSBZ<1>:
TMJDF<0> = 42;
BTTFSU(BSSBZ<1> == 42);
^
JIOM<MT OJ M@A@M@I>@ Q<MD<=G@N, M@A@M@I>@ OTK@N <M@ IJO NDHKGT <GD<N@N. 1J N@@ OCDN
?DNODI>ODJI, G@O'N ?@ADI@ <IJOC@M NGD>@ <N < >JKT JA JI@ JA OC@ @SDNODIB NGD>@N:
JOU<> TMJDF2 = TMJDF;
1C@ ORJ NGD>@N C<Q@ OC@DM JRI <?M@NN@N. &I JOC@M RJM?N, OC@T C<Q@ N@K<M<O@ D?@IODOD@N:
BTTFSU(&TMJDF != &TMJDF2);
1C@ AJGGJRDIB GDNO DN < NPHH<MT JA OC@ ?DAA@M@I>@N =@OR@@I M@A@M@I>@ Q<MD<=G@N <I? M@A@M@I>@
OTK@N:
t /@A@M@I>@ Q<MD<=G@N ?J IJO C<Q@ D?@IODOD@N, OC@T <M@ <GD<N@N JA @SDNODIB Q<MD<=G@N.
t 3<MD<=G@N JA M@A@M@I>@ OTK@N C<Q@ D?@IODOD@N =PO OC@T ?J IJO JRI Q<GP@N; M<OC@M, OC@T
KMJQD?@ <>>@NN OJ @SDNODIB Q<GP@N.
1C@ R<T TMJDF <I? TMJDF2 GDQ@ DI H@HJMT ><I =@ DGGPNOM<O@? <N DI OC@ AJGGJRDIB ADBPM@:
TMJDF TMJDF2
---+---+---+---+---+---+--- ---+---+--- ---+---+---
] 0 ] 1 ] 2 ] 3 ] 4 ] ] P ] ] P ]
---+---+---+---+---+---+--- ---+-]-+--- ---+-]-+---
q ] ]
] ] ]
+--------------------+------------+
+3>G7 )KB7E 3@6 '787D7@57 )KB7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
235
1C@ OCM@@ @G@H@ION OC<O OC@T =JOC M@A@M@I>@ <M@ CDBCGDBCO@? DI =GP@.
,I@ JA OC@ ?DAA@M@I>@N =@OR@@I ++ <I? ! DN OC<O >G<NN@N <M@ M@A@M@I>@ OTK@N DI !. AGOCJPBC
R@ RDGG >JQ@M >G<NN@N DI G<O@M >C<KO@MN DI ?@O<DG, OC@ AJGGJRDIB DN < NCJMO @S<HKG@ OJ
?@HJINOM<O@ OCDN A<>O:
DMBTT .Z$MBTT
\
JOU NFNCFS;
^
G<NN J=E@>ON <M@ >JINOMP>O@? =T OC@ OFX F@TRJM?:
BVUP WBSJBCMF = OFX .Z$MBTT;
WBSJBCMF DN < M@A@M@I>@ OJ <I <IJITHJPN .Z$MBTT J=E@>O OC<O C<N =@@I >JINOMP>O@? =T OFX:
(BOPOZNPVT .Z$MBTT PCKFDU) WBSJBCMF
---+-------------------+--- ---+---+---
] ... ] ] P ]
---+-------------------+--- ---+-]-+---
q ]
] ]
+--------------------+
'PNO GDF@ RDOC NGD>@N, RC@I WBSJBCMF DN >JKD@?, OC@ >JKT =@>JH@N <IJOC@M M@A@M@I>@ OJ OC@
N<H@ J=E@>O. 1C@ >JKT C<N DON JRI <??M@NN:
BVUP WBSJBCMF = OFX .Z$MBTT;
BVUP WBSJBCMF2 = WBSJBCMF;
BTTFSU(WBSJBCMF == WBSJBCMF2);
BTTFSU(&WBSJBCMF != &WBSJBCMF2);
1C@T <M@ @LP<G AMJH OC@ KJDIO JA QD@R JA M@A@M@I>DIB OC@ N<H@ J=E@>O, =PO OC@T <M@ N@K<M<O@
Q<MD<=G@N:
(BOPOZNPVT .Z$MBTT PCKFDU) WBSJBCMF WBSJBCMF2
---+-------------------+--- ---+---+--- ---+---+---
] ... ] ] P ] ] P ]
---+-------------------+--- ---+-]-+--- ---+-]-+---
q ] ]
] ] ]
+--------------------+------------+
1CDN ><I <GNJ =@ NCJRI =T HJ?DATDIB OC@ H@H=@M JA OC@ J=E@>O:
BVUP WBSJBCMF = OFX .Z$MBTT;
WBSJBCMF.NFNCFS = 1;
BVUP WBSJBCMF2 = WBSJBCMF; // 5IFZ TIBSF UIF TBNF PCKFDU
WBSJBCMF2.NFNCFS = 2;
BTTFSU(WBSJBCMF.NFNCFS == 2); // 5IF PCKFDU UIBU WBSJBCMF
// QSPWJEFT BDDFTT UP IBT
// DIBOHFE.
AIJOC@M M@A@M@I>@ OTK@ DN <NNJ>D<ODQ@ <MM<TN. 4C@I <NNDBI@?, OC@T OJJ KMJQD?@ <>>@NN OJ OC@
N<H@ N@O JA @G@H@ION:
TUSJOH<JOU> CZ/BNF =
<
+3>G7 )KB7E 3@6 '787D7@57 )KB7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
236
1 : "POF",
10 : "UFO",
100 : "IVOESFE",
>;
// 5IF UXP BTTPDJBUJWF BSSBZT XJMM CF TIBSJOH UIF TBNF
// TFU PG FMFNFOUT
TUSJOH<JOU> CZ/BNF2 = CZ/BNF;
// 5IF NBQQJOH BEEFE UISPVHI UIF TFDPOE ...
CZ/BNF2<4> = "GPVS";
// ... JT WJTJCMF UISPVHI UIF GJSTU.
BTTFSU(CZ/BNF<4> == "GPVS");
The difference in the assignment operation 46.3.1
4DOC Q<GP@ OTK@N <I? M@A@M@I>@ Q<MD<=G@N, OC@ <NNDBIH@IO JK@M<ODJI >C<IB@N F:7 35FG3> H3>G7:
WPJE NBJO()
\
JOU OVNCFS = 8;
IBMWF(OVNCFS); // 5IF BDUVBM WBMVF DIBOHFT
BTTFSU(OVNCFS == 4);
^
WPJE IBMWF(SFG JOU EJWJEFOE)
\
EJWJEFOE /= 2;
^
,I OC@ JOC@M C<I?, RDOC M@A@M@I>@ OTK@N, OC@ <NNDBIH@IO JK@M<ODJI >C<IB@N I:;5: H3>G7 ;E
47;@9 3557EE76. #JM @S<HKG@, OC@ <NNDBIH@IO JA OC@ TMJDF3 Q<MD<=G@ =@GJR ?J@N IJO >C<IB@
OC@ Q<GP@ JA <IT @G@H@IO; M<OC@M, DO >C<IB@N RC<O @G@H@ION TMJDF3 DN IJR < M@A@M@I>@ JA:
JOU<> TMJDF1 = < 10, 11, 12, 13, 14 >;
JOU<> TMJDF2 = < 20, 21, 22 >;
JOU<> TMJDF3 = TMJDF1<1 .. 3>; // "DDFTT UP UIF FMFNFOUT
// PG TMJDF1 XJUI JOEFYFT 1
// BOE 2
TMJDF3<0> = 777;
BTTFSU(TMJDF1 == < 10, 777, 12, 13, 14 >);
// 5IJT BTTJHONFOU EPFT OPU NPEJGZ UIF FMFNFOUT UIBU
// TMJDF3 JT QSPWJEJOH BDDFTT UP, JU NBLFT TMJDF3 QSPWJEF
// BDDFTT UP PUIFS FMFNFOUT.
TMJDF3 = TMJDF2<$ - 1 .. $>; // "DDFTT UP UIF MBTU FMFNFOU
TMJDF3<0> = 888;
BTTFSU(TMJDF2 == < 20, 21, 888 >);
)@O'N ?@HJINOM<O@ OC@ N<H@ @AA@>O OCDN ODH@ RDOC ORJ J=E@>ON JA OC@ .Z$MBTT OTK@:
BVUP WBSJBCMF1 = OFX .Z$MBTT;
WBSJBCMF1.NFNCFS = 1;
BVUP WBSJBCMF2 = OFX .Z$MBTT;
WBSJBCMF2.NFNCFS = 2;
BVUP B$PQZ = WBSJBCMF1;
B$PQZ.NFNCFS = 3;
B$PQZ = WBSJBCMF2;
+3>G7 )KB7E 3@6 '787D7@57 )KB7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
237
B$PQZ.NFNCFS = 4;
BTTFSU(WBSJBCMF1.NFNCFS == 3);
BTTFSU(WBSJBCMF2.NFNCFS == 4);
1C@ B$PQZ Q<MD<=G@ <=JQ@ ADMNO M@A@M@I>@N OC@ N<H@ J=E@>O <N WBSJBCMF1, <I? OC@I OC@ N<H@
J=E@>O <N WBSJBCMF2. AN < >JIN@LP@I>@, OC@ .NFNCFS OC<O DN HJ?DAD@? OCMJPBC B$PQZ DN ADMNO
WBSJBCMF1'N <I? OC@I WBSJBCMF2'N.
Variables of reference types may not be referencing any object 46.3.2
4DOC < M@A@M@I>@ Q<MD<=G@, OC@M@ DN <GR<TN <I <>OP<G Q<MD<=G@ OC<O DO DN <I <GD<N JA; DO ><I IJO
NO<MO DON GDA@ RDOCJPO < Q<MD<=G@. ,I OC@ JOC@M C<I?, Q<MD<=G@N JA M@A@M@I>@ OTK@N ><I NO<MO OC@DM
GDQ@N RDOCJPO M@A@M@I>DIB <IT J=E@>O.
#JM @S<HKG@, < .Z$MBTT Q<MD<=G@ ><I =@ ?@ADI@? RDOCJPO <I <>OP<G J=E@>O C<QDIB =@@I >M@<O@?
=T OFX:
.Z$MBTT WBSJBCMF;
0P>C Q<MD<=G@N C<Q@ OC@ NK@>D<G Q<GP@ JA OVMM. 4@ RDGG >JQ@M OVMM <I? OC@ JT F@TRJM? DI OC@
I@SO >C<KO@M.
Fixed-length arrays are value types, slices are reference types
46.4
!'N <MM<TN <I? NGD>@N ?DQ@MB@ RC@I DO >JH@N OJ Q<GP@ OTK@ Q@MNPN M@A@M@I>@ OTK@.
AN R@ C<Q@ <GM@<?T N@@I <=JQ@, NGD>@N <M@ M@A@M@I>@ OTK@N. ,I OC@ JOC@M C<I?, ADS@?-G@IBOC
<MM<TN <M@ Q<GP@ OTK@N. 1C@T JRI OC@DM @G@H@ION <I? =@C<Q@ <N DI?DQD?P<G Q<GP@N:
JOU<3> BSSBZ1 = < 10, 20, 30 >;
BVUP BSSBZ2 = BSSBZ1; // BSSBZ2'T FMFNFOUT BSF EJGGFSFOU
// GSPN BSSBZ1'T
BSSBZ2<0> = 11;
// 'JSTU BSSBZ JT OPU BGGFDUFE:
BTTFSU(BSSBZ1<0> == 10);
BSSBZ1 DN < ADS@?-G@IBOC <MM<T =@><PN@ DON G@IBOC DN NK@>DAD@? RC@I DO C<N =@@I ?@ADI@?. 0DI>@
BVUP H<F@N OC@ >JHKDG@M DIA@M OC@ OTK@ JA BSSBZ2, DO DN < ADS@?-G@IBOC <MM<T <N R@GG. 1C@
Q<GP@N JA BSSBZ2'N @G@H@ION <M@ >JKD@? AMJH OC@ Q<GP@N JA OC@ @G@H@ION JA BSSBZ1. "<>C
<MM<T C<N DON JRI @G@H@ION. *J?DATDIB <I @G@H@IO OCMJPBC JI@ ?J@N IJO <AA@>O OC@ JOC@M.
Experiment
46.5
1C@ AJGGJRDIB KMJBM<H DN <I @SK@MDH@IO JA <KKGTDIB OC@ == JK@M<OJM OJ ?DAA@M@IO OTK@N. &O
<KKGD@N OC@ JK@M<OJM OJ =JOC Q<MD<=G@N JA < >@MO<DI OTK@ <I? OJ OC@ <??M@NN@N JA OCJN@
Q<MD<=G@N. 1C@ KMJBM<H KMJ?P>@N OC@ AJGGJRDIB JPOKPO:
+3>G7 )KB7E 3@6 '787D7@57 )KB7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
238
5ZQF PG WBSJBCMF B == C &B == &C
===========================================================================
WBSJBCMFT XJUI FRVBM WBMVFT (WBMVF UZQF) USVF GBMTF
WBSJBCMFT XJUI EJGGFSFOU WBMVFT (WBMVF UZQF) GBMTF GBMTF
GPSFBDI XJUI 'SFG' WBSJBCMF USVF USVF
GPSFBDI XJUIPVU 'SFG' WBSJBCMF USVF GBMTF
GVODUJPO XJUI 'PVU' QBSBNFUFS USVF USVF
GVODUJPO XJUI 'SFG' QBSBNFUFS USVF USVF
GVODUJPO XJUI 'JO' QBSBNFUFS USVF GBMTF
TMJDFT QSPWJEJOH BDDFTT UP TBNF FMFNFOUT USVF GBMTF
TMJDFT QSPWJEJOH BDDFTT UP EJGGFSFOU FMFNFOUT GBMTF GBMTF
.Z$MBTT WBSJBCMFT UP TBNF PCKFDU (SFGFSFODF UZQF) USVF GBMTF
.Z$MBTT WBSJBCMFT UP EJGGFSFOU PCKFDUT (SFGFSFODF UZQF) GBMTF GBMTF
1C@ O<=G@ <=JQ@ C<N =@@I B@I@M<O@? =T OC@ AJGGJRDIB KMJBM<H:
JNQPSU TUE.TUEJP;
JNQPSU TUE.DPOW;
JNQPSU TUE.BSSBZ;
JOU NPEVMF7BSJBCMF = 9;
DMBTT .Z$MBTT
\
JOU NFNCFS;
^
WPJE QSJOU)FBEFS()
\
JNNVUBCMF EDIBS<> IFBEFS =
" 5ZQF PG WBSJBCMF"
" B == C &B == &C";
XSJUFMO();
XSJUFMO(IFBEFS);
XSJUFMO(SFQMJDBUF("=", IFBEFS.MFOHUI));
^
WPJE QSJOU*OGP(DPOTU EDIBS<> MBCFM,
CPPM WBMVF&RVBMJUZ,
CPPM BEESFTT&RVBMJUZ)
\
XSJUFGMO("%55T%9T%9T",
MBCFM,
UP!TUSJOH(WBMVF&RVBMJUZ),
UP!TUSJOH(BEESFTT&RVBMJUZ));
^
WPJE NBJO()
\
QSJOU)FBEFS();
JOU OVNCFS1 = 12;
JOU OVNCFS2 = 12;
QSJOU*OGP("WBSJBCMFT XJUI FRVBM WBMVFT (WBMVF UZQF)",
OVNCFS1 == OVNCFS2,
&OVNCFS1 == &OVNCFS2);
JOU OVNCFS3 = 3;
QSJOU*OGP("WBSJBCMFT XJUI EJGGFSFOU WBMVFT (WBMVF UZQF)",
OVNCFS1 == OVNCFS3,
&OVNCFS1 == &OVNCFS3);
JOU<> TMJDF = < 4 >;
GPSFBDI (J, SFG FMFNFOU; TMJDF) \
QSJOU*OGP("GPSFBDI XJUI 'SFG' WBSJBCMF",
FMFNFOU == TMJDF<J>,
&FMFNFOU == &TMJDF<J>);
^
+3>G7 )KB7E 3@6 '787D7@57 )KB7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
239
GPSFBDI (J, FMFNFOU; TMJDF) \
QSJOU*OGP("GPSFBDI XJUIPVU 'SFG' WBSJBCMF",
FMFNFOU == TMJDF<J>,
&FMFNFOU == &TMJDF<J>);
^
PVU1BSBNFUFS(NPEVMF7BSJBCMF);
SFG1BSBNFUFS(NPEVMF7BSJBCMF);
JO1BSBNFUFS(NPEVMF7BSJBCMF);
JOU<> MPOH4MJDF = < 5, 6, 7 >;
JOU<> TMJDF1 = MPOH4MJDF;
JOU<> TMJDF2 = TMJDF1;
QSJOU*OGP("TMJDFT QSPWJEJOH BDDFTT UP TBNF FMFNFOUT",
TMJDF1 == TMJDF2,
&TMJDF1 == &TMJDF2);
JOU<> TMJDF3 = TMJDF1<0 .. $ - 1>;
QSJOU*OGP("TMJDFT QSPWJEJOH BDDFTT UP EJGGFSFOU FMFNFOUT",
TMJDF1 == TMJDF3,
&TMJDF1 == &TMJDF3);
BVUP WBSJBCMF1 = OFX .Z$MBTT;
BVUP WBSJBCMF2 = WBSJBCMF1;
QSJOU*OGP(
".Z$MBTT WBSJBCMFT UP TBNF PCKFDU (SFGFSFODF UZQF)",
WBSJBCMF1 == WBSJBCMF1,
&WBSJBCMF1 == &WBSJBCMF2);
BVUP WBSJBCMF3 = OFX .Z$MBTT;
QSJOU*OGP(
".Z$MBTT WBSJBCMFT UP EJGGFSFOU PCKFDUT (SFGFSFODF UZQF)",
WBSJBCMF1 == WBSJBCMF3,
&WBSJBCMF1 == &WBSJBCMF3);
^
WPJE PVU1BSBNFUFS(PVU JOU QBSBNFUFS)
\
QSJOU*OGP("GVODUJPO XJUI 'PVU' QBSBNFUFS",
QBSBNFUFS == NPEVMF7BSJBCMF,
&QBSBNFUFS == &NPEVMF7BSJBCMF);
^
WPJE SFG1BSBNFUFS(SFG JOU QBSBNFUFS)
\
QSJOU*OGP("GVODUJPO XJUI 'SFG' QBSBNFUFS",
QBSBNFUFS == NPEVMF7BSJBCMF,
&QBSBNFUFS == &NPEVMF7BSJBCMF);
^
WPJE JO1BSBNFUFS(JO JOU QBSBNFUFS)
\
QSJOU*OGP("GVODUJPO XJUI 'JO' QBSBNFUFS",
QBSBNFUFS == NPEVMF7BSJBCMF,
&QBSBNFUFS == &NPEVMF7BSJBCMF);
^
+JO@N:
t 1C@ KMJBM<H H<F@N PN@ JA < HJ?PG@ Q<MD<=G@ RC@I >JHK<MDIB ?DAA@M@IO OTK@N JA API>ODJI
K<M<H@O@MN. *J?PG@ Q<MD<=G@N <M@ ?@ADI@? <O HJ?PG@ G@Q@G, JPOND?@ JA <GG JA OC@ API>ODJIN.
1C@T <M@ BGJ=<GGT <>>@NND=G@ OJ <GG JA OC@ >J?@ DI OC@ HJ?PG@.
t 1C@ SFQMJDBUF() API>ODJI JA OC@ TUE.BSSBZ HJ?PG@ O<F@N < M<IB@ (OC@ "=" <=JQ@) <I?
M@K@<ON DO NK@>DAD@? IPH=@M JA ODH@N.
+3>G7 )KB7E 3@6 '787D7@57 )KB7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
240
Summary
46.6
t 3<MD<=G@N JA Q<GP@ OTK@N C<Q@ OC@DM JRI Q<GP@N <I? <?M@NN@N.
t /@A@M@I>@ Q<MD<=G@N ?J IJO C<Q@ OC@DM JRI Q<GP@N IJM <??M@NN@N. 1C@T <M@ <GD<N@N JA
@SDNODIB Q<MD<=G@N.
t 3<MD<=G@N JA M@A@M@I>@ OTK@N C<Q@ OC@DM JRI <??M@NN@N =PO OC@ Q<GP@N OC<O OC@T M@A@M@I>@
?J IJO =@GJIB OJ OC@H.
t 4DOC M@A@M@I>@ OTK@N, <NNDBIH@IO ?J@N IJO >C<IB@ Q<GP@, DO >C<IB@N RCD>C Q<GP@ DN =@DIB
<>>@NN@?.
t 3<MD<=G@N JA M@A@M@I>@ OTK@N H<T =@ OVMM.
+3>G7 )KB7E 3@6 '787D7@57 )KB7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
241
The OVMM Value and the JT Operator 47
&I OC@ KM@QDJPN >C<KO@M R@ C<Q@ N@@I OC<O < Q<MD<=G@ JA < M@A@M@I>@ OTK@ I@@? IJO =@
M@A@M@I>DIB <I J=E@>O:
.Z$MBTT SFGFSFODFT"O0CKFDU = OFX .Z$MBTT;
.Z$MBTT WBSJBCMF; // EPFT OPU SFGFSFODF BO PCKFDU
B@DIB < M@A@M@I>@ OTK@, WBSJBCMF <=JQ@ ?J@N C<Q@ <I D?@IODOT =PO DO ?J@N IJO M@A@M@I>@ <IT
J=E@>O T@O. 0P>C <I J=E@>O ><I =@ KD>OPM@? <N C<QDIB < KG<>@ DI OC@ H@HJMT <N DI OC@
AJGGJRDIB KD>OPM@:
WBSJBCMF
---+------+---
] OVMM ]
---+------+---
A M@A@M@I>@ OC<O ?J@N IJO M@A@M@I>@ <IT Q<GP@ DN OVMM. 4@ RDGG @SK<I? JI OCDN =@GJR.
0P>C < Q<MD<=G@ DN DI <I <GHJNO PN@G@NN NO<O@. 0DI>@ OC@M@ DN IJ .Z$MBTT J=E@>O OC<O DO
M@A@M@I>@N, DO ><IIJO =@ PN@? DI < >JIO@SO RC@M@ <I <>OP<G .Z$MBTT J=E@>O DN I@@?@?:
JNQPSU TUE.TUEJP;
DMBTT .Z$MBTT
\
JOU NFNCFS;
^
WPJE VTF(.Z$MBTT WBSJBCMF)
\
XSJUFMO(WBSJBCMF.NFNCFS); // j #6(
^
WPJE NBJO()
\
.Z$MBTT WBSJBCMF;
VTF(WBSJBCMF);
^
AN OC@M@ DN IJ J=E@>O OC<O DN M@A@M@I>@? =T OC@ K<M<H@O@M OC<O VTF() M@>@DQ@N, <OO@HKODIB OJ
<>>@NN < H@H=@M JA < IJI-@SDNODIB J=E@>O M@NPGON DI < KMJBM<H >M<NC:
$ ./EFOFNF
4FHNFOUBUJPO GBVMU
"0@BH@IO<ODJI A<PGO" DN <I DI?D><ODJI OC<O OC@ KMJBM<H C<N =@@I O@MHDI<O@? =T OC@ JK@M<ODIB
NTNO@H =@><PN@ JA <OO@HKODIB OJ <>>@NN <I DGG@B<G H@HJMT <??M@NN.
The OVMM value
47.1
1C@ NK@>D<G Q<GP@ OVMM ><I =@ KMDIO@? EPNO GDF@ <IT JOC@M Q<GP@.
Note: &D;@F;@9 null 6;D75F>K 6A7E @AF 5A?B;>7 6G7 FA 3 >;?;F3F;A@ A8 F:7 5A?B;>7D F:3F :3E
477@ GE76 I:7@ ID;F;@9 F:;E 5:3BF7D (6?6 2.059). ):3F ;E I:K ;FE H3>G7 ;E 8;DEF 47;@9 53EF76
FA int 47>AI. ():7 cast AB7D3FAD I;>> 47 7JB>3;@76 ;@ F:7 @7JF 5:3BF7D.)
XSJUFMO(DBTU(JOU)OVMM);
):7 @G>> +3>G7 3@6 F:7 ;E %B7D3FAD
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
242
)DF@ DI H<IT JOC@M G<IBP<B@N, OC@ DIO@B@M M@KM@N@IO<ODJI JA OVMM DN 0:
0
A OVMM Q<MD<=G@ ><I =@ PN@? JIGT DI ORJ >JIO@SON:
1. ANNDBIDIB <I J=E@>O OJ DO
WBSJBCMF = OFX .Z$MBTT; // OPX SFGFSFODFT BO PCKFDU
1C@ <NNDBIH@IO <=JQ@ H<F@N WBSJBCMF KMJQD?@ <>>@NN OJ OC@ I@RGT >JINOMP>O@?
J=E@>O. #MJH OC<O KJDIO JI, WBSJBCMF ><I =@ PN@? AJM <IT Q<GD? JK@M<ODJI JA OC@
.Z$MBTT OTK@.
2. !@O@MHDIDIB RC@OC@M DO DN OVMM
%JR@Q@M, =@><PN@ OC@ == JK@M<OJM I@@?N <>OP<G J=E@>ON OJ >JHK<M@, OC@ @SKM@NNDJI
=@GJR ><IIJO =@ >JHKDG@?:
JG (WBSJBCMF == OVMM) // j DPNQJMBUJPO &3303
#JM OC<O M@<NJI, RC@OC@M < Q<MD<=G@ DN OVMM HPNO =@ ?@O@MHDI@? =T OC@ JT JK@M<OJM.
The JT operator
47.2
1CDN JK@M<OJM <INR@MN OC@ LP@NODJI "?J@N C<Q@ OC@ IPGG Q<GP@?":
JG (WBSJBCMF JT OVMM) \
// %PFT OPU SFGFSFODF BOZ PCKFDU
^
JT ><I =@ PN@? RDOC JOC@M OTK@N JA Q<MD<=G@N <N R@GG. &I OC@ AJGGJRDIB PN@, DO >JHK<M@N OC@
WBMVFT JA ORJ DIO@B@MN:
JG (TQFFE JT OFX4QFFE) \
// 5IFJS WBMVFT BSF FRVBM
^ FMTF \
// 5IFJS WBMVFT BSF EJGGFSFOU
^
4C@I PN@? RDOC NGD>@N, DO ?@O@MHDI@N RC@OC@M OC@ ORJ NGD>@N M@A@M@I>@ OC@ N<H@ N@O JA
@G@H@ION:
JG (TMJDF JT TMJDF2) \
// 5IFZ QSPWJEF BDDFTT UP UIF TBNF FMFNFOUT
^
The !JT operator
47.3
!JT DN OC@ JKKJNDO@ JA JT. &O KMJ?P>@N USVF RC@I OC@ Q<GP@N <M@ ?DAA@M@IO:
JG (TQFFE !JT OFX4QFFE) \
// 5IFJS WBMVFT BSF EJGGFSFOU
^
):7 @G>> +3>G7 3@6 F:7 ;E %B7D3FAD
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
243
Assigning the OVMM value
47.4
ANNDBIDIB OC@ OVMM Q<GP@ OJ < Q<MD<=G@ JA < M@A@M@I>@ OTK@ H<F@N OC<O Q<MD<=G@ NOJK
M@A@M@I>DIB DON >PMM@IO J=E@>O.
&A OC<O <NNDBIH@IO C<KK@IN OJ =@ O@MHDI<ODIB OC@ Q@MT G<NO M@A@M@I>@ OJ OC@ <>OP<G J=E@>O,
OC@I OC@ <>OP<G J=E@>O =@>JH@N < ><I?D?<O@ AJM ADI<GDU<ODJI =T OC@ B<M=<B@ >JGG@>OJM. AAO@M <GG,
IJO =@DIB M@A@M@I>@? =T <IT Q<MD<=G@ H@<IN OC<O OC@ J=E@>O DN IJO =@DIB PN@? DI OC@ KMJBM<H
<O <GG.
)@O'N GJJF <O OC@ @S<HKG@ AMJH OC@ KM@QDJPN >C<KO@M RC@M@ ORJ Q<MD<=G@N C<Q@ =@@I
M@A@M@I>DIB OC@ N<H@ J=E@>O:
BVUP WBSJBCMF = OFX .Z$MBTT;
BVUP WBSJBCMF2 = WBSJBCMF;
1C@ AJGGJRDIB DN < M@KM@N@IO<ODJI JA OC@ NO<O@ JA OC@ H@HJMT <AO@M @S@>PODIB OC<O >J?@:
(BOPOZNPVT .Z$MBTT PCKFDU) WBSJBCMF WBSJBCMF2
---+-------------------+--- ---+---+--- ---+---+---
] ... ] ] P ] ] P ]
---+-------------------+--- ---+-]-+--- ---+-]-+---
q ] ]
] ] ]
+--------------------+------------+
ANNDBIDIB OC@ OVMM Q<GP@ OJ JI@ JA OC@N@ Q<MD<=G@N =M@<FN DON M@G<ODJINCDK RDOC OC@ J=E@>O:
WBSJBCMF = OVMM;
AO OCDN KJDIO OC@M@ DN JIGT WBSJBCMF2 OC<O M@A@M@I>@N OC@ .Z$MBTT J=E@>O:
(BOPOZNPVT .Z$MBTT PCKFDU) WBSJBCMF WBSJBCMF2
---+-------------------+--- ---+----+--- ---+---+---
] ... ] ]OVMM] ] P ]
---+-------------------+--- ---+----+--- ---+-]-+---
q ]
] ]
+----------------------------------+
ANNDBIDIB OVMM OJ OC@ G<NO M@A@M@I>@ RJPG? H<F@ OC@ .Z$MBTT J=E@>O PIM@<>C<=G@:
WBSJBCMF2 = OVMM;
0P>C PIM@<>C<=G@ J=E@>ON <M@ ADI<GDU@? =T OC@ B<M=<B@ >JGG@>OJM NJH@ODH@ DI OC@ APOPM@. #MJH
OC@ KJDIO JA QD@R JA OC@ KMJBM<H, OC@ J=E@>O ?J@N IJO @SDNO:
WBSJBCMF WBSJBCMF2
---+-------------------+--- ---+----+--- ---+----+---
] ] ]OVMM] ]OVMM]
---+-------------------+--- ---+----+--- ---+----+--
4@ C<? ?DN>PNN@? R<TN JA @HKOTDIB <I <NNJ>D<ODQ@ <MM<T DI OC@ @S@M>DN@N N@>ODJI JA OC@
ANNJ>D<ODQ@ AMM<TN >C<KO@M. 4@ IJR FIJR < AJPMOC H@OCJ?: ANNDBIDIB OVMM OJ <I <NNJ>D<ODQ@
<MM<T Q<MD<=G@ RDGG =M@<F OC@ M@G<ODJINCDK JA OC<O Q<MD<=G@ RDOC OC@ @G@H@ION:
TUSJOH<JOU> OBNFT;
// ...
OBNFT = OVMM; // /PU QSPWJEJOH BDDFTT UP BOZ FMFNFOU
):7 @G>> +3>G7 3@6 F:7 ;E %B7D3FAD
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
244
0DHDG<M OJ OC@ .Z$MBTT @S<HKG@N, DA OBNFT C<N =@@I OC@ G<NO M@A@M@I>@ OJ OC@ @G@H@ION JA OC@
<NNJ>D<ODQ@ <MM<T, OCJN@ @G@H@ION RJPG? =@ ADI<GDU@? =T OC@ B<M=<B@ >JGG@>OJM.
0GD>@N ><I =@ <NNDBI@? OVMM <N R@GG:
JOU<> TMJDF = PUIFS4MJDF< 10 .. 20 >;
// ...
TMJDF = OVMM; // /PU QSPWJEJOH BDDFTT UP BOZ FMFNFOU
Summary
47.5
t OVMM DN OC@ Q<GP@ DI?D><ODIB OC<O < Q<MD<=G@ ?J@N IJO KMJQD?@ <>>@NN OJ <IT Q<GP@
t /@A@M@I>@N OC<O C<Q@ OC@ OVMM Q<GP@ ><I JIGT =@ PN@? DI ORJ JK@M<ODJIN: <NNDBIDIB < Q<GP@
OJ OC@H <I? ?@O@MHDIDIB RC@OC@M OC@T <M@ OVMM JM IJO
t 0DI>@ OC@ == JK@M<OJM H<T C<Q@ OJ <>>@NN <I <>OP<G J=E@>O, ?@O@MHDIDIB RC@OC@M <
Q<MD<=G@ DN OVMM HPNO =@ K@MAJMH@? =T OC@ JT JK@M<OJM
t !JT DN OC@ JKKJNDO@ JA JT
t ANNDBIDIB OVMM OJ < Q<MD<=G@ H<F@N OC<O Q<MD<=G@ KMJQD?@ <>>@NN OJ IJOCDIB
t ,=E@>ON OC<O <M@ IJO M@A@M@I>@? =T <IT Q<MD<=G@ <M@ ADI<GDU@? =T OC@ B<M=<B@ >JGG@>OJM
):7 @G>> +3>G7 3@6 F:7 ;E %B7D3FAD
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
245
Type Conversions 48
3<MD<=G@N HPNO =@ >JHK<OD=G@ RDOC OC@ @SKM@NNDJIN OC<O OC@T O<F@ K<MON DI. AN DO C<N KMJ=<=GT
=@@I J=QDJPN =T OC@ KMJBM<HN OC<O R@ C<Q@ N@@I NJ A<M, ! DN < EF3F;53>>K FKB76 >3@9G397,
H@<IDIB OC<O OC@ >JHK<OD=DGDOT JA OTK@N DN Q<GD?<O@? <O >JHKDG@ ODH@.
AGG JA OC@ @SKM@NNDJIN OC<O R@ C<Q@ RMDOO@I NJ A<M <GR<TN C<? >JHK<OD=G@ OTK@N =@><PN@
JOC@MRDN@ OC@ >J?@ RJPG? =@ M@E@>O@? =T OC@ >JHKDG@M. 1C@ AJGGJRDIB DN <I @S<HKG@ JA < >J?@
OC<O C<N DI>JHK<OD=G@ OTK@N:
DIBS<> TMJDF;
XSJUFMO(TMJDF + 5); // j DPNQJMBUJPO &3303
1C@ >JHKDG@M M@E@>ON OC@ >J?@ ?P@ OJ OC@ DI>JHK<OD=G@ OTK@N DIBS<> <I? JOU AJM OC@ <??DODJI
JK@M<ODJI:
&SSPS: JODPNQBUJCMF UZQFT GPS ((TMJDF) + (5)): 'DIBS<>' BOE 'JOU'
1TK@ DI>JHK<OD=DGDOT ?J@N IJO H@<I OC<O OC@ OTK@N <M@ ?DAA@M@IO; ?DAA@M@IO OTK@N ><I DI?@@? =@
PN@? DI @SKM@NNDJIN N<A@GT. #JM @S<HKG@, <I JOU Q<MD<=G@ ><I N<A@GT =@ PN@? DI KG<>@ JA <
EPVCMF Q<GP@:
EPVCMF TVN = 1.25;
JOU JODSFNFOU = 3;
TVN += JODSFNFOU;
"Q@I OCJPBC TVN <I? JODSFNFOU <M@ JA ?DAA@M@IO OTK@N, OC@ >J?@ <=JQ@ DN Q<GD? =@><PN@
DI>M@H@IODIB < EPVCMF Q<MD<=G@ =T <I JOU Q<GP@ DN G@B<G.
Automatic type conversions
48.1
APOJH<OD> OTK@ >JIQ@MNDJIN <M@ <GNJ ><GG@? ;?B>;5;F FKB7 5A@H7DE;A@E.
AGOCJPBC EPVCMF <I? JOU <M@ >JHK<OD=G@ OTK@N DI OC@ @SKM@NNDJI <=JQ@, OC@ <??DODJI
JK@M<ODJI HPNO NODGG =@ @Q<GP<O@? <N < NK@>DAD> OTK@ <O OC@ HD>MJKMJ>@NNJM G@Q@G. AN TJP RJPG?
M@H@H=@M AMJH OC@ #GJ<ODIB -JDIO 1TK@N >C<KO@M, OC@ 64-=DO OTK@ EPVCMF DN I;67D (JM >3D97D)
OC<I OC@ 32-=DO OTK@ JOU. A??DODJI<GGT, <IT Q<GP@ OC<O ><I ADO <I JOU ><I ADO < EPVCMF.
4C@I OC@ >JHKDG@M @I>JPIO@MN <I @SKM@NNDJI OC<O DIQJGQ@N HDNH<O>C@? OTK@N, DO ADMNO >JIQ@MON
OC@ K<MON JA OC@ @SKM@NNDJIN OJ < >JHHJI OTK@ <I? OC@I @Q<GP<O@N OC@ JQ@M<GG @SKM@NNDJI. 1C@
<POJH<OD> >JIQ@MNDJIN OC<O <M@ K@MAJMH@? =T OC@ >JHKDG@M <M@ DI OC@ ?DM@>ODJI OC<O <QJD?N
?<O< GJNN. #JM @S<HKG@, EPVCMF ><I CJG? <IT Q<GP@ OC<O JOU ><I CJG? =PO OC@ JKKJNDO@ DN IJO
OMP@. 1C@ += JK@M<ODJI <=JQ@ ><I RJMF =@><PN@ <IT JOU Q<GP@ ><I N<A@GT =@ >JIQ@MO@? OJ
EPVCMF.
1C@ Q<GP@ OC<O C<N =@@I B@I@M<O@? <POJH<OD><GGT <N < M@NPGO JA < >JIQ@MNDJI DN <GR<TN <I
<IJITHJPN (<I? JAO@I O@HKJM<MT) Q<MD<=G@. 1C@ JMDBDI<G Q<GP@ ?J@N IJO >C<IB@. #JM @S<HKG@,
OC@ <POJH<OD> >JIQ@MNDJI ?PMDIB += <=JQ@ ?J@N IJO >C<IB@ OC@ OTK@ JA JODSFNFOU; DO DN
<GR<TN <I JOU. /<OC@M, < O@HKJM<MT Q<GP@ JA OTK@ EPVCMF DN >JINOMP>O@? =T OC@ Q<GP@ JA
JODSFNFOU. 1C@ >JIQ@MNDJI OC<O O<F@N KG<>@ DI OC@ =<>FBMJPI? DN @LPDQ<G@IO OJ OC@ AJGGJRDIB
>J?@:
\
EPVCMF an_anonymous_double_value = JODSFNFOU;
TVN += an_anonymous_double_value;
^
)KB7 CA@H7DE;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
246
1C@ >JHKDG@M >JIQ@MON OC@ JOU Q<GP@ OJ < O@HKJM<MT EPVCMF Q<GP@ <I? PN@N OC<O Q<GP@ DI OC@
JK@M<ODJI. &I OCDN @S<HKG@, OC@ O@HKJM<MT Q<MD<=G@ GDQ@N JIGT ?PMDIB OC@ += JK@M<ODJI.
APOJH<OD> >JIQ@MNDJIN <M@ IJO GDHDO@? OJ <MDOCH@OD> JK@M<ODJIN. 1C@M@ <M@ JOC@M ><N@N RC@M@
OTK@N <M@ >JIQ@MO@? OJ JOC@M OTK@N <POJH<OD><GGT. AN GJIB <N OC@ >JIQ@MNDJIN <M@ Q<GD?, OC@
>JHKDG@M O<F@N <?Q<IO<B@ JA OTK@ >JIQ@MNDJIN OJ =@ <=G@ OJ PN@ Q<GP@N DI @SKM@NNDJIN. #JM
@S<HKG@, < CZUF Q<GP@ ><I =@ K<NN@? AJM <I JOU K<M<H@O@M:
WPJE GVOD(JOU OVNCFS)
\
// ...
^
WPJE NBJO()
\
CZUF TNBMM7BMVF = 7;
GVOD(TNBMM7BMVF); // BVUPNBUJD UZQF DPOWFSTJPO
^
&I OC@ >J?@ <=JQ@, ADMNO < O@HKJM<MT JOU Q<GP@ DN >JINOMP>O@? <I? OC@ API>ODJI DN ><GG@? RDOC
OC<O Q<GP@.
Integer promotions 48.1.1
3<GP@N JA OTK@N OC<O <M@ JI OC@ G@AO-C<I? ND?@ JA OC@ AJGGJRDIB O<=G@ I@Q@M O<F@ K<MO DI
<MDOCH@OD> @SKM@NNDJIN <N OC@DM <>OP<G OTK@N. "<>C OTK@ DN ADMNO KMJHJO@? OJ OC@ OTK@ OC<O DN JI
OC@ MDBCO-C<I? ND?@ JA OC@ O<=G@.
'SPN 5P
CPPM JOU
CZUF JOU
VCZUF JOU
TIPSU JOU
VTIPSU JOU
DIBS JOU
XDIBS JOU
EDIBS VJOU
&IO@B@M KMJHJODJIN <M@ <KKGD@? OJ FOVN Q<GP@N <N R@GG.
1C@ M@<NJIN AJM DIO@B@M KMJHJODJIN <M@ =JOC CDNOJMD><G (RC@M@ OC@ MPG@N >JH@ AMJH ) <I? OC@
A<>O OC<O OC@ I<OPM<G <MDOCH@OD> OTK@ AJM OC@ HD>MJKMJ>@NNJM DN JOU. #JM @S<HKG@, <GOCJPBC OC@
AJGGJRDIB ORJ Q<MD<=G@N <M@ =JOC VCZUF, OC@ <??DODJI JK@M<ODJI DN K@MAJMH@? JIGT <AO@M =JOC JA
OC@ Q<GP@N <M@ DI?DQD?P<GGT KMJHJO@? OJ JOU:
VCZUF B = 1;
VCZUF C = 2;
XSJUFMO(UZQFPG(B + C).TUSJOHPG); // UIF BEEJUJPO JT OPU JO VCZUF
1C@ JPOKPO:
JOU
+JO@ OC<O OC@ OTK@N JA OC@ Q<MD<=G@N B <I? C ?J IJO >C<IB@; JIGT OC@DM Q<GP@N <M@ O@HKJM<MDGT
KMJHJO@? OJ JOU AJM OC@ ?PM<ODJI JA OC@ <??DODJI JK@M<ODJI.
)KB7 CA@H7DE;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
247
Arithmetic conversions 48.1.2
1C@M@ <M@ JOC@M >JIQ@MNDJI MPG@N OC<O <M@ <KKGD@? AJM <MDOCH@OD> JK@M<ODJIN. &I B@I@M<G,
<POJH<OD> <MDOCH@OD> >JIQ@MNDJIN <M@ <KKGD@? DI OC@ N<A@ ?DM@>ODJI: AMJH OC@ @3DDAI OTK@ OJ
OC@ I;67D OTK@. AGOCJPBC OCDN MPG@ DN @<NT OJ M@H@H=@M <I? DN >JMM@>O DI HJNO ><N@N,
<POJH<OD> >JIQ@MNDJI MPG@N <M@ Q@MT >JHKGD><O@? <I? DI OC@ ><N@ JA NDBI@?-OJ-PINDBI@?
>JIQ@MNDJIN, ><MMT NJH@ MDNF JA =PBN.
1C@ <MDOCH@OD> >JIQ@MNDJI MPG@N <M@ OC@ AJGGJRDIB:
1. &A JI@ JA OC@ Q<GP@N DN SFBM, OC@I OC@ JOC@M Q<GP@ DN >JIQ@MO@? OJ SFBM
2. "GN@, DA JI@ JA OC@ Q<GP@N DN EPVCMF, OC@I OC@ JOC@M Q<GP@ DN >JIQ@MO@? OJ EPVCMF
3. "GN@, DA JI@ JA OC@ Q<GP@N DN GMPBU, OC@I OC@ JOC@M Q<GP@ DN >JIQ@MO@? OJ GMPBU
4. "GN@, ADMNO ;@F797D BDA?AF;A@E <M@ <KKGD@? <>>JM?DIB OJ OC@ O<=G@ <=JQ@, <I? OC@I OC@
AJGGJRDIB MPG@N <M@ AJGGJR@?:
1. &A =JOC OTK@N <M@ OC@ N<H@, OC@I IJ HJM@ NO@KN I@@?@?
2. &A =JOC OTK@N <M@ NDBI@? JM =JOC OTK@N <M@ PINDBI@?, OC@I OC@ I<MMJR@M Q<GP@ DN
>JIQ@MO@? OJ OC@ RD?@M OTK@
3. &A OC@ NDBI@? OTK@ DN RD?@M OC<I OC@ PINDBI@? OTK@, OC@I OC@ PINDBI@? Q<GP@ DN
>JIQ@MO@? OJ OC@ NDBI@? OTK@
4. ,OC@MRDN@ OC@ NDBI@? OTK@ DN >JIQ@MO@? OJ OC@ PINDBI@? OTK@
2IAJMOPI<O@GT, OC@ G<NO MPG@ <=JQ@ ><I ><PN@ NP=OG@ =PBN:
JOU B = 0;
JOU C = 1;
TJ[F@U D = 0;
XSJUFMO(B - C + D); // 4VSQSJTJOH SFTVMU!
0PMKMDNDIBGT, OC@ JPOKPO DN IJO -1, =PO TJ[F@U.NBY:
18446744073709551615
AGOCJPBC JI@ RJPG? @SK@>O (0 - 1 + 0) OJ =@ ><G>PG<O@? <N -1, <>>JM?DIB OJ OC@ MPG@N <=JQ@,
OC@ OTK@ JA OC@ @IODM@ @SKM@NNDJI DN TJ[F@U, IJO JOU; <I? NDI>@ TJ[F@U ><IIJO CJG? I@B<ODQ@
Q<GP@N, OC@ M@NPGO PI?@MAGJRN <I? =@>JH@N TJ[F@U.NBY.
DPOTU conversions 48.1.3
AN R@ C<Q@ N@@I @<MGD@M DI OC@ #PI>ODJI -<M<H@O@MN >C<KO@M, M@A@M@I>@ OTK@N ><I
<POJH<OD><GGT =@ >JIQ@MO@? OJ OC@ DPOTU JA OC@ N<H@ OTK@. JIQ@MNDJI OJ DPOTU DN N<A@
=@><PN@ OC@ RD?OC JA OC@ OTK@ ?J@N IJO >C<IB@ <I? DPOTU DN < KMJHDN@ OJ IJO HJ?DAT OC@
Q<MD<=G@:
EDIBS<> QBSFOUIFTJ[FE(DPOTU EDIBS<> UFYU)
\
SFUVSO "\" _ UFYU _ "^";
^
WPJE NBJO()
\
EDIBS<> HSFFUJOH;
HSFFUJOH _= "IFMMP XPSME";
QBSFOUIFTJ[FE(HSFFUJOH);
^
1C@ HPO<=G@ HSFFUJOH <=JQ@ DN <POJH<OD><GGT >JIQ@MO@? OJ < DPOTU EDIBS<> <N DO DN K<NN@?
OJ QBSFOUIFTJ[FE().
)KB7 CA@H7DE;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
248
AN R@ C<Q@ <GNJ N@@I @<MGD@M, OC@ JKKJNDO@ >JIQ@MNDJI DN IJO <POJH<OD>. A DPOTU M@A@M@I>@ DN
IJO <POJH<OD><GGT >JIQ@MO@? OJ < HPO<=G@ M@A@M@I>@:
EDIBS<> QBSFOUIFTJ[FE(DPOTU EDIBS<> UFYU)
\
EDIBS<> BSHVNFOU = UFYU; // j DPNQJMBUJPO &3303
// ...
^
+JO@ OC<O OCDN OJKD> DN JIGT <=JPO M@A@M@I>@N; NDI>@ Q<MD<=G@N JA Q<GP@ OTK@N <M@ >JKD@?, DO DN
IJO KJNND=G@ OJ <AA@>O OC@ JMDBDI<G OCMJPBC OC@ >JKT <ITR<T:
DPOTU JOU UPUBM$PSOFST = 4;
JOU UIF$PQZ = UPUBM$PSOFST; // DPNQJMFT (WBMVF UZQF)
1C@ >JIQ@MNDJI AMJH DPOTU OJ HPO<=G@ <=JQ@ DN G@B<G =@><PN@ OC@ >JKT DN IJO < M@A@M@I>@ OJ
OC@ JMDBDI<G.
JNNVUBCMF conversions 48.1.4
B@><PN@ JNNVUBCMF NK@>DAD@N OC<O < Q<MD<=G@ ><I I@Q@M >C<IB@, I@DOC@M >JIQ@MNDJI AMJH
JNNVUBCMF IJM OJ JNNVUBCMF <M@ <POJH<OD>:
TUSJOH B = "IFMMP"; // JNNVUBCMF DIBSBDUFST
DIBS<> C = B; // j DPNQJMBUJPO &3303
TUSJOH D = C; // j DPNQJMBUJPO &3303
AN RDOC DPOTU >JIQ@MNDJIN <=JQ@, OCDN OJKD> DN <GNJ JIGT <=JPO M@A@M@I>@ OTK@N. 0DI>@
Q<MD<=G@N JA Q<GP@ OTK@N <M@ >JKD@? <ITR<T, >JIQ@MNDJIN OJ <I? AMJH JNNVUBCMF <M@ Q<GD?:
JNNVUBCMF B = 10;
JOU C = B; // DPNQJMFT (WBMVF UZQF)
FOVN conversions 48.1.5
AN R@ C<Q@ N@@I DI OC@ FOVN >C<KO@M, FOVN DN AJM ?@ADIDIB @3?76 5A@EF3@FE:
FOVN 4VJU \ TQBEFT, IFBSUT, EJBNPOET, DMVCT ^
/@H@H=@M OC<O NDI>@ IJ Q<GP@N <M@ NK@>DAD@? @SKGD>DOGT <=JQ@, OC@ Q<GP@N JA OC@ FOVN
H@H=@MN NO<MO RDOC U@MJ <I? <M@ <POJH<OD><GGT DI>M@H@IO@? =T JI@. A>>JM?DIBGT, OC@ Q<GP@ JA
4VJU.DMVCT DN 3.
FOVN Q<GP@N <M@ <OJH<OD><GGT >JIQ@MO@? OJ DIO@BM<G OTK@N. #JM @S<HKG@, OC@ Q<GP@ JA
4VJU.IFBSUT DN O<F@I OJ =@ 1 DI OC@ AJGGJRDIB ><G>PG<ODJI <I? OC@ M@NPGO =@>JH@N 11:
JOU SFTVMU = 10 + 4VJU.IFBSUT;
BTTFSU(SFTVMU == 11);
1C@ JKKJNDO@ >JIQ@MNDJI DN IJO <POJH<OD>: &IO@B@M Q<GP@N <M@ IJO <POJH<OD><GGT >JIQ@MO@? OJ
>JMM@NKJI?DIB FOVN Q<GP@N. #JM @S<HKG@, OC@ TVJU Q<MD<=G@ =@GJR HDBCO =@ @SK@>O@? OJ
=@>JH@ 4VJU.EJBNPOET, =PO OC@ >J?@ ><IIJO =@ >JHKDG@?:
4VJU TVJU = 2; // j DPNQJMBUJPO &3303
AN R@ RDGG N@@ =@GJR, >JIQ@MNDJIN AMJH DIO@B@MN OJ FOVN Q<GP@N <M@ NODGG KJNND=G@ =PO OC@T
HPNO =@ @SKGD>DO.
)KB7 CA@H7DE;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
249
CPPM conversions 48.1.6
GBMTF <I? USVF <M@ <POJH<OD><GGT >JIQ@MO@? OJ 0 <I? 1, M@NK@>ODQ@GT:
JOU B = GBMTF;
BTTFSU(B == 0);
JOU C = USVF;
BTTFSU(C == 1);
1C@ JKKJNDO@ >JIQ@MNDJI DN <GNJ <POJH<OD> =PO JIGT AJM ORJ NK@>D<G Q<GP@N. 1C@ GDO@M<G Q<GP@N 0
<I? 1 <M@ >JIQ@MO@? <POJH<OD><GGT OJ GBMTF <I? USVF, M@NK@>ODQ@GT:
CPPM B = 0;
BTTFSU(!B); // GBMTF
CPPM C = 1;
BTTFSU(C); // USVF
,OC@M GDO@M<G Q<GP@N ><IIJO =@ >JIQ@MO@? OJ CPPM <POJH<OD><GGT:
CPPM C = 2; // j DPNQJMBUJPO &3303
Automatic conversions to CPPM in conditional statements 48.1.7
0JH@ NO<O@H@ION H<F@ PN@ JA GJBD><G @SKM@NNDJIN: JG, XIJMF, @O>. #JM OC@ GJBD><G @SKM@NNDJIN
JA NP>C NO<O@H@ION, IJO JIGT CPPM =PO HJNO JOC@M OTK@N ><I =@ PN@? <N R@GG. 1C@ Q<GP@ U@MJ DN
<POJH<OD><GGT >JIQ@MO@? OJ GBMTF <I? OC@ IJI-U@MJ Q<GP@N <M@ <POJH<OD><GGT >JIQ@MO@? OJ
USVF.
JOU J;
// ...
JG (J) \ // j JOU WBMVF JT CFJOH VTFE BT B MPHJDBM FYQSFTTJPO
// ... 'J' JT OPU [FSP
^ FMTF \
// ... 'J' JT [FSP
^
0DHDG<MGT, OVMM M@A@M@I>@N <M@ <POJH<OD><GGT >JIQ@MO@? OJ GBMTF <I? IJI-OVMM M@A@M@I>@N <M@
<POJH<OD><GGT >JIQ@MO@? OJ USVF. 1CDN H<F@N DO @<NT OJ @INPM@ OC<O < M@A@M@I>@ DN IJI-OVMM
=@AJM@ <>OP<GGT PNDIB DO:
JOU<> B;
// ...
JG (B) \ // j BVUPNBUJD CPPM DPOWFSTJPO
// ... OPU OVMM; 'B' DBO CF VTFE ...
^ FMTF \
// ... OVMM; 'B' DBOOPU CF VTFE ...
^
Explicit type conversions
48.2
AN R@ C<Q@ N@@I <=JQ@, OC@M@ <M@ ><N@N RC@M@ <POJH<OD> >JIQ@MNDJIN <M@ IJO <Q<DG<=G@:
t JIQ@MNDJIN AMJH RD?@M OTK@N OJ I<MMJR@M OTK@N
t JIQ@MNDJIN AMJH DPOTU OJ HPO<=G@
)KB7 CA@H7DE;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
250
t JNNVUBCMF >JIQ@MNDJIN
t JIQ@MNDJIN AMJH DIO@B@MN OJ FOVN Q<GP@N
t @O>.
&A NP>C < >JIQ@MNDJI DN FIJRI OJ =@ N<A@, OC@ KMJBM<HH@M ><I @SKGD>DOGT <NF AJM < OTK@
>JIQ@MNDJI =T JI@ JA OCM@@ H@OCJ?N:
t BT ><GGDIB OC@ TUE.DPOW.UP API>ODJI
t BT ><GGDIB OC@ TUE.FYDFQUJPO.BTTVNF6OJRVF API>ODJI
t BT OC@ DBTU JK@M<OJM
UP() for most conversions 48.2.1
1C@ UP() API>ODJI, RCD>C R@ C<Q@ <GM@<?T PN@? HJNOGT OJ >JIQ@MO Q<GP@N OJ TUSJOH, ><I
<>OP<GGT =@ PN@? AJM H<IT JOC@M OTK@N. &ON >JHKG@O@ NTIO<S DN OC@ AJGGJRDIB:
UP!(DestinationType)(WBMVF)
B@DIB < O@HKG<O@, UP() ><I O<F@ <?Q<IO<B@ JA OC@ NCJMO>PO O@HKG<O@ K<M<H@O@M IJO<ODJI:
4C@I OC@ ?@NODI<ODJI OTK@ >JINDNON JIGT JA < NDIBG@ OJF@I (B@I@M<GGT, 3 E;@9>7 IAD6), DO ><I =@
><GG@? RDOCJPO OC@ ADMNO K<DM JA K<M@IOC@N@N:
UP!DestinationType(WBMVF)
1C@ AJGGJRDIB KMJBM<H DN OMTDIB OJ >JIQ@MO < EPVCMF Q<GP@ OJ TIPSU <I? < TUSJOH Q<GP@ OJ
JOU:
WPJE NBJO()
\
EPVCMF E = -1.75;
TIPSU T = E; // j DPNQJMBUJPO &3303
JOU J = "42"; // j DPNQJMBUJPO &3303
^
0DI>@ IJO @Q@MT EPVCMF Q<GP@ ><I =@ M@KM@N@IO@? <N < TIPSU <I? IJO @Q@MT TUSJOH ><I =@
M@KM@N@IO@? <N <I JOU, OCJN@ >JIQ@MNDJIN <M@ IJO <POJH<OD>. 4C@I DO DN FIJRI =T OC@
KMJBM<HH@M OC<O OC@ >JIQ@MNDJIN <M@ DI A<>O N<A@ JM OC<O OC@ KJO@IOD<G >JIN@LP@I>@N <M@
<>>@KO<=G@, OC@I OC@ OTK@N ><I =@ >JIQ@MO@? =T UP():
JNQPSU TUE.DPOW;
WPJE NBJO()
\
EPVCMF E = -1.75;
TIPSU T = UP!TIPSU(E);
BTTFSU(T == -1);
JOU J = UP!JOU("42");
BTTFSU(J == 42);
^
+JO@ OC<O =@><PN@ TIPSU ><IIJO ><MMT AM<>ODJI<G Q<GP@N, OC@ >JIQ@MO@? Q<GP@ DN -1.
UP() DN N<A@: &O OCMJRN <I @S>@KODJI RC@I < >JIQ@MNDJI DN IJO KJNND=G@.
BTTVNF6OJRVF() for fast JNNVUBCMF conversions 48.2.2
UP() ><I K@MAJMH JNNVUBCMF >JIQ@MNDJIN <N R@GG:
)KB7 CA@H7DE;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
251
JOU<> TMJDF = < 10, 20, 30 >;
BVUP JNNVUBCMF4MJDF = UP!(JNNVUBCMF JOU<>)(TMJDF);
&I JM?@M OJ BP<M<IO@@ OC<O OC@ @G@H@ION JA JNNVUBCMF4MJDF RDGG I@Q@M >C<IB@, DO ><IIJO
NC<M@ OC@ N<H@ @G@H@ION RDOC TMJDF. #JM OC<O M@<NJI, UP() >M@<O@N <I <??DODJI<G NGD>@ RDOC
JNNVUBCMF @G@H@ION <=JQ@. ,OC@MRDN@, HJ?DAD><ODJIN OJ OC@ @G@H@ION JA TMJDF RJPG? ><PN@
OC@ @G@H@ION JA JNNVUBCMF4MJDF >C<IB@ <N R@GG. 1CDN =@C<QDJM DN OC@ N<H@ RDOC OC@ .JEVQ
KMJK@MOT JA <MM<TN.
4@ ><I N@@ OC<O OC@ @G@H@ION JA JNNVUBCMF4MJDF <M@ DI?@@? >JKD@N JA OC@ @G@H@ION JA TMJDF
=T GJJFDIB <O OC@ <??M@NN@N JA OC@DM ADMNO @G@H@ION:
BTTFSU(&(TMJDF<0>) != &(JNNVUBCMF4MJDF<0>));
0JH@ODH@N OCDN >JKT DN PII@>@NN<MT <I? H<T NGJR OC@ NK@@? JA OC@ KMJBM<H IJOD>@<=GT DI
>@MO<DI ><N@N. AN <I @S<HKG@ JA OCDN, G@O'N GJJF <O OC@ AJGGJRDIB API>ODJI OC<O O<F@N <I
JNNVUBCMF NGD>@:
WPJE DBMDVMBUF(JNNVUBCMF JOU<> DPPSEJOBUFT)
\
// ...
^
WPJE NBJO()
\
JOU<> OVNCFST;
OVNCFST _= 10;
// ... WBSJPVT PUIFS NPEJGJDBUJPOT ...
OVNCFST<0> = 42;
DBMDVMBUF(OVNCFST); // j DPNQJMBUJPO &3303
^
1C@ KMJBM<H <=JQ@ ><IIJO =@ >JHKDG@? =@><PN@ OC@ ><GG@M DN IJO K<NNDIB <I JNNVUBCMF
<MBPH@IO OJ DBMDVMBUF(). AN R@ C<Q@ N@@I <=JQ@, <I JNNVUBCMF NGD>@ ><I =@ >M@<O@? =T
UP():
JNQPSU TUE.DPOW;
// ...
BVUP JNNVUBCMF/VNCFST = UP!(JNNVUBCMF JOU<>)(OVNCFST);
DBMDVMBUF(JNNVUBCMF/VNCFST); // j OPX DPNQJMFT
%JR@Q@M, DA OVNCFST DN I@@?@? JIGT OJ KMJ?P>@ OCDN <MBPH@IO <I? RDGG I@Q@M =@ PN@? <AO@M OC@
API>ODJI DN ><GG@?, >JKTDIB DON @G@H@ION OJ JNNVUBCMF/VNCFST RJPG? =@ PII@>@NN<MT.
BTTVNF6OJRVF() H<F@N OC@ @G@H@ION JA < NGD>@ JNNVUBCMF RDOCJPO >JKTDIB:
JNQPSU TUE.FYDFQUJPO;
// ...
BVUP JNNVUBCMF/VNCFST = BTTVNF6OJRVF(OVNCFST);
DBMDVMBUF(JNNVUBCMF/VNCFST);
BTTFSU(OVNCFST JT OVMM); // UIF PSJHJOBM TMJDF CFDPNFT OVMM
BTTVNF6OJRVF() M@OPMIN < I@R NGD>@ OC<O KMJQD?@N JNNVUBCMF <>>@NN OJ OC@ @SDNODIB
@G@H@ION. &O <GNJ H<F@N OC@ JMDBDI<G NGD>@ OVMM OJ KM@Q@IO OC@ @G@H@ION AMJH <>>D?@IO<GGT
=@DIB HJ?DAD@? OCMJPBC DO.
)KB7 CA@H7DE;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
252
The DBTU operator 48.2.3
BJOC UP() <I? BTTVNF6OJRVF() H<F@ PN@ JA OC@ >JIQ@MNDJI JK@M<OJM DBTU, RCD>C DN <Q<DG<=G@
OJ OC@ KMJBM<HH@M <N R@GG.
1C@ DBTU JK@M<OJM O<F@N OC@ ?@NODI<ODJI OTK@ DI K<M@IOC@N@N:
DBTU(DestinationType)WBMVF
DBTU DN KJR@MAPG @Q@I AJM >JIQ@MNDJIN OC<O UP() ><IIJO N<A@GT K@MAJMH. UP() ?J@N IJO
K@MAJMH OC@ AJGGJRDIB >JIQ@MNDJIN:
4VJU TVJU = UP!4VJU(2); // j DPNQJMBUJPO &3303
CPPM C = UP!CPPM(2); // j DPNQJMBUJPO &3303
0JH@ODH@N JIGT OC@ KMJBM<HH@M ><I FIJR RC@OC@M <I DIO@B@M Q<GP@ >JMM@NKJI?N OJ < Q<GD?
FOVN Q<GP@ JM OC<O DO H<F@N N@IN@ OJ OM@<O <I DIO@B@M Q<GP@ <N < CPPM. 1C@ DBTU JK@M<OJM ><I
=@ PN@? RC@I OC@ >JIQ@MNDJI DN FIJRI OJ =@ >JMM@>O <>>JM?DIB OC@ KMJBM<H'N GJBD>:
4VJU TVJU = DBTU(4VJU)2;
BTTFSU(TVJU == 4VJU.EJBNPOET);
CPPM C = DBTU(CPPM)2;
BTTFSU(C);
Summary
48.3
t APOJH<OD> OTK@ >JIQ@MNDJIN <M@ HJNOGT DI OC@ N<A@ ?DM@>ODJI: #MJH OC@ I<MMJR@M OTK@ OJ
OC@ RD?@M OTK@ <I? AMJH HPO<=G@ OJ DPOTU.
t %JR@Q@M, >JIQ@MNDJIN OJ PINDBI@? OTK@N H<T C<Q@ NPMKMDNDIB @AA@>ON =@><PN@ PINDBI@?
OTK@N ><IIJO C<Q@ I@B<ODQ@ Q<GP@N.
t FOVN OTK@N ><I <POJH<OD><GGT =@ >JIQ@MO@? OJ DIO@B@M Q<GP@N =PO OC@ JKKJNDO@ >JIQ@MNDJI
DN IJO <POJH<OD>.
t GBMTF <I? USVF <M@ <POJH<OD><GGT >JIQ@MO@? OJ 0 <I? 1 M@NK@>ODQ@GT. 0DHDG<MGT, U@MJ Q<GP@N
<M@ <POJH<OD><GGT >JIQ@MO@? OJ GBMTF <I? IJI-U@MJ Q<GP@N <M@ <POJH<OD><GGT >JIQ@MO@? OJ
USVF.
t OVMM M@A@M@I>@N <M@ <POJH<OD><GGT >JIQ@MO@? OJ GBMTF <I? IJI-OVMM M@A@M@I>@N <M@
<POJH<OD><GGT >JIQ@MO@? OJ USVF.
t UP() >JQ@MN HJNO JA OC@ @SKGD>DO >JIQ@MNDJIN.
t BTTVNF6OJRVF() >JIQ@MON OJ JNNVUBCMF RDOCJPO >JKTDIB.
t 1C@ DBTU JK@M<OJM DN OC@ HJNO KJR@MAPG >JIQ@MNDJI OJJG.
)KB7 CA@H7DE;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
253
Structs 49
AN C<N =@@I H@IODJI@? N@Q@M<G ODH@N @<MGD@M DI OC@ =JJF, API?<H@IO<G OTK@N <M@ IJO NPDO<=G@
OJ M@KM@N@IO CDBC@M-G@Q@G >JI>@KON. #JM @S<HKG@, <GOCJPBC < Q<GP@ JA OTK@ JOU DN NPDO<=G@ OJ
M@KM@N@IO OC@ CJPM JA ?<T, ORJ JOU Q<MD<=G@N RJPG? =@ HJM@ NPDO<=G@ OJB@OC@M OJ M@KM@N@IO <
KJDIO DI ODH@: JI@ AJM OC@ CJPM <I? OC@ JOC@M AJM OC@ HDIPO@.
0OMP>ON <M@ OC@ A@<OPM@ OC<O <GGJR ?@ADIDIB I@R OTK@N =T >JH=DIDIB <GM@<?T @SDNODIB JOC@M
OTK@N. 1C@ I@R OTK@ DN ?@ADI@? =T OC@ TUSVDU F@TRJM?. *JNO JA OC@ >JIO@IO JA OCDN >C<KO@M DN
?DM@>OGT <KKGD><=G@ OJ >G<NN@N <N R@GG. "NK@>D<GGT OC@ >JI>@KO JA 5A?4;@;@9 7J;EF;@9 FKB7E FA
678;@7 3 @7I FKB7 DN @S<>OGT OC@ N<H@ AJM OC@H.
1J PI?@MNO<I? CJR PN@APG NOMP>ON <M@, G@O'N O<F@ < GJJF <O OC@ BEE%VSBUJPO() API>ODJI OC<O R@
C<? ?@ADI@? @<MGD@M DI OC@ BTTFSU <I? FOGPSDF >C<KO@M. 1C@ AJGGJRDIB ?@ADIDODJI DN AMJH OC@
@S@M>DN@ NJGPODJI JA OC<O >C<KO@M:
WPJE BEE%VSBUJPO(JO JOU TUBSU)PVS, JO JOU TUBSU.JOVUF,
JO JOU EVSBUJPO)PVS, JO JOU EVSBUJPO.JOVUF,
PVU JOU SFTVMU)PVS, PVU JOU SFTVMU.JOVUF)
\
SFTVMU)PVS = TUBSU)PVS + EVSBUJPO)PVS;
SFTVMU.JOVUF = TUBSU.JOVUF + EVSBUJPO.JOVUF;
SFTVMU)PVS += SFTVMU.JOVUF / 60;
SFTVMU.JOVUF %= 60;
SFTVMU)PVS %= 24;
^
Note: ! I;>> ;9@AD7 F:7 in, out, 3@6 unittest 4>A5=E ;@ F:;E 5:3BF7D FA =77B F:7 5A67 E3?B>7E
E:ADF.
AGOCJPBC OC@ API>ODJI <=JQ@ >G@<MGT O<F@N NDS K<M<H@O@MN, RC@I OC@ OCM@@ K<DMN JA K<M<H@O@MN
<M@ >JIND?@M@?, DO DN >JI>@KOP<GGT O<FDIB JIGT OCM@@ =DON JA DIAJMH<ODJI AJM OC@ NO<MODIB ODH@,
OC@ ?PM<ODJI, <I? OC@ M@NPGO.
Definition
49.1
1C@ TUSVDU F@TRJM? ?@ADI@N < I@R OTK@ =T >JH=DIDIB Q<MD<=G@N OC<O <M@ M@G<O@? DI NJH@ R<T:
TUSVDU 5JNF0G%BZ
\
JOU IPVS;
JOU NJOVUF;
^
1C@ >J?@ <=JQ@ ?@ADI@N < I@R OTK@ I<H@? 5JNF0G%BZ, RCD>C >JINDNON JA ORJ Q<MD<=G@N I<H@?
IPVS <I? NJOVUF. 1C<O ?@ADIDODJI <GGJRN OC@ I@R 5JNF0G%BZ OTK@ OJ =@ PN@? DI OC@ KMJBM<H
EPNO GDF@ <IT JOC@M OTK@. 1C@ AJGGJRDIB >J?@ ?@HJINOM<O@N CJR NDHDG<M DON PN@ DN OJ <I JOU'N:
JOU OVNCFS; // B WBSJBCMF
OVNCFS = PUIFS/VNCFS; // UBLJOH UIF WBMVF PG PUIFS/VNCFS
5JNF0G%BZ UJNF; // BO PCKFDU
UJNF = PUIFS5JNF; // UBLJOH UIF WBMVF PG PUIFS5JNF
1C@ NTIO<S JA TUSVDU ?@ADIDODJI DN OC@ AJGGJRDIB:
TUSVDU TypeName
\
(FDG5FE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
254
// ... NFNCFS WBSJBCMFT BOE GVODUJPOT ...
^
4@ RDGG N@@ H@H=@M API>ODJIN DI G<O@M >C<KO@MN.
1C@ Q<MD<=G@N OC<O < NOMP>O >JH=DI@N <M@ ><GG@? DON ?7?47DE. A>>JM?DIB OJ OCDN ?@ADIDODJI,
5JNF0G%BZ C<N ORJ H@H=@MN: IPVS <I? NJOVUF.
TUSVDU defines a type, not a variable 49.1.1
1C@M@ DN <I DHKJMO<IO ?DNODI>ODJI C@M@: "NK@>D<GGT <AO@M OC@ +<H@ 0K<>@ <I? )DA@ODH@N <I?
#PI?<H@IO<G ,K@M<ODJIN >C<KO@MN, OC@ >PMGT =M<>F@ON JA TUSVDU ?@ADIDODJIN H<T BDQ@ OC@
RMJIB DHKM@NNDJI OC<O OC@ NOMP>O H@H=@MN NO<MO <I? @I? OC@DM GDQ@N DIND?@ OC<O N>JK@. 1CDN DN
IJO OMP@.
*@H=@M ?@ADIDODJIN <M@ IJO Q<MD<=G@ ?@ADIDODJIN:
TUSVDU 5JNF0G%BZ
\
JOU IPVS; // j OPU B WBSJBCMF EFGJOJUJPO!
JOU NJOVUF; // j OPU B WBSJBCMF EFGJOJUJPO!
^
1C@ ?@ADIDODJI JA < TUSVDU ?@O@MHDI@N OC@ OTK@N <I? OC@ I<H@N JA OC@ H@H=@MN OC<O OC@
J=E@>ON JA OC<O TUSVDU RDGG C<Q@:
TUSVDU 5JNF0G%BZ
\
JOU IPVS; // j XJMM CFDPNF B QBSU PG B WBSJBCMF
JOU NJOVUF; // j XJMM CFDPNF B QBSU PG B WBSJBCMF
^
1CJN@ H@H=@M Q<MD<=G@N RDGG =@ >JINOMP>O@? <N K<MON JA 5JNF0G%BZ J=E@>ON OC<O O<F@ K<MO DI
OC@ KMJBM<H:
5JNF0G%BZ CFE5JNF; // 5IJT PCKFDU DPOUBJOT JUT PXO IPVS
// BOE NJOVUF NFNCFS WBSJBCMFT.
5JNF0G%BZ XBLF6Q5JNF; // 5IJT PCKFDU DPOUBJOT JUT PXO IPVS
// BOE NJOVUF NFNCFS WBSJBCMFT BT
// XFMM. 5IF NFNCFS WBSJBCMFT PG
// UIJT PCKFDU BSF OPU SFMBUFE UP
// UIF NFNCFS WBSJBCMFT PG UIF
// QSFWJPVT PCKFDU.
Coding convenience 49.1.2
B@DIB <=G@ OJ >JH=DI@ OC@ >JI>@KON JA CJPM <I? HDIPO@ OJB@OC@M <N < I@R OTK@ DN < BM@<O
>JIQ@ID@I>@. #JM @S<HKG@, OC@ API>ODJI <=JQ@ ><I =@ M@RMDOO@I DI < HJM@ H@<IDIBAPG R<T =T
O<FDIB OCM@@ 5JNF0G%BZ K<M<H@O@MN DINO@<? JA OC@ @SDNODIB NDS JOU K<M<H@O@MN:
WPJE BEE%VSBUJPO(JO 5JNF0G%BZ TUBSU,
JO 5JNF0G%BZ EVSBUJPO,
PVU 5JNF0G%BZ SFTVMU)
\
// ...
^
(FDG5FE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
255
Note: !F ;E @AF @AD?3> FA 366 FIA H3D;34>7E F:3F D7BD7E7@F FIA BA;@FE ;@ F;?7. FAD 7J3?B>7, ;F
;E ?73@;@9>7EE FA 366 F:7 >G@5: F;?7 12:00 FA F:7 4D73=83EF F;?7 7:30. !F IAG>6 ?3=7 ?AD7
E7@E7 FA 678;@7 3@AF:7D FKB7, 3BBDABD;3F7>K 53>>76 Duration, 3@6 FA 366 A4<75FE A8 F:3F FKB7
FA TimeOfDay A4<75FE. D7EB;F7 F:;E 67E;9@ 7DDAD, ! I;>> 5A@F;@G7 GE;@9 A@>K TimeOfDay A4<75FE
;@ F:;E 5:3BF7D 3@6 ;@FDA6G57 Duration ;@ 3 >3F7D 5:3BF7D.
AN TJP M@H@H=@M, API>ODJIN M@OPMI PK-OJ < NDIBG@ Q<GP@. 1C<O C<N KM@>DN@GT =@@I OC@ M@<NJI
RCT OC@ @<MGD@M ?@ADIDODJI JA BEE%VSBUJPO() R<N O<FDIB ORJ PVU K<M<H@O@MN: &O >JPG? IJO
M@OPMI OC@ CJPM <I? HDIPO@ DIAJMH<ODJI <N < NDIBG@ Q<GP@.
0OMP>ON M@HJQ@ OCDN GDHDO<ODJI <N R@GG: 0DI>@ HPGODKG@ Q<GP@N ><I =@ >JH=DI@? <N < NDIBG@
TUSVDU OTK@, API>ODJIN ><I M@OPMI <I J=E@>O JA NP>C < TUSVDU, @AA@>ODQ@GT M@OPMIDIB HPGODKG@
Q<GP@N <O JI>@. BEE%VSBUJPO() ><I IJR =@ ?@ADI@? <N M@OPMIDIB DON M@NPGO:
5JNF0G%BZ BEE%VSBUJPO(JO 5JNF0G%BZ TUBSU,
JO 5JNF0G%BZ EVSBUJPO)
\
// ...
^
AN < >JIN@LP@I>@, BEE%VSBUJPO() IJR =@>JH@N < API>ODJI OC<O KMJ?P>@N < Q<GP@, <N JKKJN@?
OJ =@DIB < API>ODJI OC<O C<N ND?@ @AA@>ON. AN TJP RJPG? M@H@H=@M AMJH OC@ #PI>ODJIN >C<KO@M,
KMJ?P>DIB M@NPGON DN KM@A@MM@? JQ@M C<QDIB ND?@ @AA@>ON.
0OMP>ON ><I =@ H@H=@MN JA JOC@M NOMP>ON. #JM @S<HKG@, OC@ AJGGJRDIB TUSVDU C<N ORJ
5JNF0G%BZ H@H=@MN:
TUSVDU .FFUJOH
\
TUSJOH UPQJD;
TJ[F@U BUUFOEBODF$PVOU;
5JNF0G%BZ TUBSU;
5JNF0G%BZ FOE;
^
.FFUJOH ><I DI OPMI =@ < H@H=@M JA <IJOC@M TUSVDU. ANNPHDIB OC<O OC@M@ DN <GNJ OC@ .FBM
NOMP>O:
TUSVDU %BJMZ1MBO
\
.FFUJOH QSPKFDU.FFUJOH;
.FBM MVODI;
.FFUJOH CVEHFU.FFUJOH;
^
Accessing the members
49.2
0OMP>O H@H=@MN <M@ PN@? GDF@ <IT JOC@M Q<MD<=G@. 1C@ JIGT ?DAA@M@I>@ DN OC<O OC@ <>OP<G NOMP>O
Q<MD<=G@ <I? < 6AF HPNO =@ NK@>DAD@? =@AJM@ OC@ I<H@ JA OC@ H@H=@M:
TUBSU.IPVS = 10;
1C@ GDI@ <=JQ@ <NNDBIN OC@ Q<GP@ 10 OJ OC@ IPVS H@H=@M JA OC@ TUBSU J=E@>O.
)@O'N M@RMDO@ OC@ BEE%VSBUJPO() API>ODJI RDOC RC<O R@ C<Q@ N@@I NJ A<M:
5JNF0G%BZ BEE%VSBUJPO(JO 5JNF0G%BZ TUBSU,
JO 5JNF0G%BZ EVSBUJPO)
\
(FDG5FE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
256
5JNF0G%BZ SFTVMU;
SFTVMU.NJOVUF = TUBSU.NJOVUF + EVSBUJPO.NJOVUF;
SFTVMU.IPVS = TUBSU.IPVS + EVSBUJPO.IPVS;
SFTVMU.IPVS += SFTVMU.NJOVUF / 60;
SFTVMU.NJOVUF %= 60;
SFTVMU.IPVS %= 24;
SFUVSO SFTVMU;
^
+JOD>@ OC<O OC@ I<H@N JA OC@ Q<MD<=G@N <M@ IJR HP>C NCJMO@M DI OCDN Q@MNDJI JA OC@ API>ODJI:
TUBSU, EVSBUJPO, <I? SFTVMU. A??DODJI<GGT, DINO@<? JA PNDIB >JHKG@S I<H@N GDF@ TUBSU)PVS,
DO DN KJNND=G@ OJ <>>@NN NOMP>O H@H=@MN OCMJPBC OC@DM M@NK@>ODQ@ NOMP>O Q<MD<=G@N <N DI
TUBSU.IPVS.
%@M@ DN < >J?@ OC<O PN@N OC@ I@R BEE%VSBUJPO() API>ODJI. $DQ@I OC@ NO<MO ODH@ <I? OC@
?PM<ODJI, OC@ AJGGJRDIB >J?@ ><G>PG<O@N RC@I < >G<NN K@MDJ? <O < N>CJJG RJPG? @I?:
WPJE NBJO()
\
5JNF0G%BZ QFSJPE4UBSU;
QFSJPE4UBSU.IPVS = 8;
QFSJPE4UBSU.NJOVUF = 30;
5JNF0G%BZ QFSJPE%VSBUJPO;
QFSJPE%VSBUJPO.IPVS = 1;
QFSJPE%VSBUJPO.NJOVUF = 15;
JNNVUBCMF QFSJPE&OE = BEE%VSBUJPO(QFSJPE4UBSU,
QFSJPE%VSBUJPO);
XSJUFGMO("1FSJPE FOE: %T:%T",
QFSJPE&OE.IPVS, QFSJPE&OE.NJOVUF);
^
1C@ JPOKPO:
1FSJPE FOE: 9:45
1C@ NBJO() <=JQ@ C<N =@@I RMDOO@I JIGT =T RC<O R@ C<Q@ N@@I NJ A<M. 4@ RDGG H<F@ OCDN >J?@
@Q@I NCJMO@M <I? >G@<I@M NJJI.
Construction
49.3
1C@ ADMNO OCM@@ GDI@N JA NBJO() <M@ <=JPO >JINOMP>ODIB OC@ QFSJPE4UBSU J=E@>O <I? OC@ I@SO
OCM@@ GDI@N <M@ <=JPO >JINOMP>ODIB OC@ QFSJPE%VSBUJPO J=E@>O. &I @<>C OCM@@ GDI@N JA >J?@
ADMNO <I J=E@>O DN =@DIB ?@ADI@? <I? OC@I DON CJPM <I? HDIPO@ Q<GP@N <M@ =@DIB N@O.
&I JM?@M AJM < Q<MD<=G@ OJ =@ PN@? DI < N<A@ R<T, OC<O Q<MD<=G@ HPNO ADMNO =@ >JINOMP>O@? DI <
>JINDNO@IO NO<O@. B@><PN@ >JINOMP>ODJI DN NJ >JHHJI, OC@M@ DN < NK@>D<G >JINOMP>ODJI NTIO<S
AJM NOMP>O J=E@>ON:
5JNF0G%BZ QFSJPE4UBSU = 5JNF0G%BZ(8, 30);
5JNF0G%BZ QFSJPE%VSBUJPO = 5JNF0G%BZ(1, 15);
1C@ Q<GP@N <M@ <POJH<OD><GGT <NNDBI@? OJ OC@ H@H=@MN DI OC@ JM?@M OC<O OC@T <M@ NK@>DAD@?:
B@><PN@ IPVS DN ?@ADI@? ADMNO DI OC@ TUSVDU, OC@ Q<GP@ 8 DN <NNDBI@? OJ QFSJPE4UBSU.IPVS <I?
30 DN <NNDBI@? OJ QFSJPE4UBSU.NJOVUF.
(FDG5FE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
257
Constructing objects as JNNVUBCMF 49.3.1
B@DIB <=G@ OJ >JINOMP>O OC@ J=E@>O =T NK@>DATDIB OC@ Q<GP@N JA DON H@H=@MN <O JI>@ H<F@N DO
KJNND=G@ OJ ?@ADI@ J=E@>ON <N JNNVUBCMF:
JNNVUBCMF QFSJPE4UBSU = 5JNF0G%BZ(8, 30);
JNNVUBCMF QFSJPE%VSBUJPO = 5JNF0G%BZ(1, 15);
,OC@MRDN@ DO RJPG? IJO =@ KJNND=G@ OJ H<MF <I J=E@>O ADMNO <N JNNVUBCMF <I? OC@I HJ?DAT DON
H@H=@MN:
JNNVUBCMF 5JNF0G%BZ QFSJPE4UBSU;
QFSJPE4UBSU.IPVS = 8; // j DPNQJMBUJPO &3303
QFSJPE4UBSU.NJOVUF = 30; // j DPNQJMBUJPO &3303
Trailing members need not be specified 49.3.2
1C@M@ H<T =@ G@NN Q<GP@N NK@>DAD@? OC<I OC@ IPH=@M JA H@H=@MN. &I OC<O ><N@, OC@ M@H<DIDIB
H@H=@MN <M@ DIDOD<GDU@? =T OC@ .JOJU Q<GP@N JA OC@DM M@NK@>ODQ@ OTK@N.
1C@ AJGGJRDIB KMJBM<H >JINOMP>ON 5FTU J=E@>ON @<>C ODH@ RDOC JI@ G@NN >JINOMP>OJM
K<M<H@O@M. 1C@ BTTFSU >C@>FN DI?D><O@ OC<O OC@ PINK@>DAD@? H@H=@MN <M@ DIDOD<GDU@?
<POJH<OD><GGT =T OC@DM .JOJU Q<GP@N. (1C@ M@<NJI AJM I@@?DIB OJ ><GG JT/B/() DN @SKG<DI@?
<AO@M OC@ KMJBM<H):
JNQPSU TUE.NBUI;
TUSVDU 5FTU
\
DIBS D;
JOU J;
EPVCMF E;
^
WPJE NBJO()
\
// 5IF JOJUJBM WBMVFT PG BMM PG UIF NFNCFST BSF TQFDJGJFE
BVUP U1 = 5FTU('B', 1, 2.3);
BTTFSU(U1.D == 'B');
BTTFSU(U1.J == 1);
BTTFSU(U1.E == 2.3);
// -BTU POF JT NJTTJOH
BVUP U2 = 5FTU('B', 1);
BTTFSU(U2.D == 'B');
BTTFSU(U2.J == 1);
BTTFSU(JT/B/(U2.E));
// -BTU UXP BSF NJTTJOH
BVUP U3 = 5FTU('B');
BTTFSU(U3.D == 'B');
BTTFSU(U3.J == JOU.JOJU);
BTTFSU(JT/B/(U3.E));
// /P JOJUJBM WBMVF TQFDJGJFE
BVUP U4 = 5FTU();
BTTFSU(U4.D == DIBS.JOJU);
BTTFSU(U4.J == JOU.JOJU);
BTTFSU(JT/B/(U4.E));
// 5IF TBNF BT BCPWF
5FTU U5;
BTTFSU(U5.D == DIBS.JOJU);
BTTFSU(U5.J == JOU.JOJU);
(FDG5FE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
258
BTTFSU(JT/B/(U5.E));
^
AN TJP RJPG? M@H@H=@M AMJH OC@ #GJ<ODIB -JDIO 1TK@N >C<KO@M, OC@ DIDOD<G Q<GP@ JA EPVCMF DN
EPVCMF.OBO. 0DI>@ OC@ .OBO Q<GP@ DN G@AD67D76, DO DN H@<IDIBG@NN OJ PN@ DO DI @LP<GDOT
>JHK<MDNJIN. 1C<O DN RCT ><GGDIB TUE.NBUI.JT/B/ DN OC@ >JMM@>O R<T JA ?@O@MHDIDIB RC@OC@M
< Q<GP@ @LP<GN OJ .OBO.
Specifying default values for members 49.3.3
&O DN DHKJMO<IO OC<O H@H=@M Q<MD<=G@N <M@ <POJH<OD><GGT DIDOD<GDU@? RDOC FIJRI DIDOD<G Q<GP@N.
1CDN KM@Q@ION OC@ KMJBM<H AMJH >JIODIPDIB RDOC DI?@O@MHDI<O@ Q<GP@N. %JR@Q@M, OC@ .JOJU
Q<GP@ JA OC@DM M@NK@>ODQ@ OTK@N H<T IJO =@ NPDO<=G@ AJM @Q@MT OTK@. #JM @S<HKG@, DIBS.JOJU DN
IJO @Q@I < Q<GD? Q<GP@.
1C@ DIDOD<G Q<GP@N JA OC@ H@H=@MN JA < NOMP>O ><I =@ NK@>DAD@? RC@I OC@ NOMP>O DN ?@ADI@?. 1CDN
DN PN@APG AJM @S<HKG@ OJ DIDOD<GDU@ AGJ<ODIB KJDIO H@H=@MN =T 0.0, DINO@<? JA OC@ HJNOGT-
PIPN<=G@ .OBO.
1C@ ?@A<PGO Q<GP@N <M@ NK@>DAD@? =T OC@ <NNDBIH@IO NTIO<S <N OC@ H@H=@MN <M@ ?@ADI@?:
TUSVDU 5FTU
\
DIBS D = '"';
JOU J = 11;
EPVCMF E = 0.25;
^
-G@<N@ IJO@ OC<O OC@ NTIO<S <=JQ@ DN IJO M@<GGT <NNDBIH@IO. 1C@ >J?@ <=JQ@ H@M@GT
?@O@MHDI@N OC@ ?@A<PGO Q<GP@N OC<O RDGG =@ PN@? RC@I J=E@>ON JA OC<O NOMP>O <M@ <>OP<GGT
>JINOMP>O@? G<O@M DI OC@ KMJBM<H.
#JM @S<HKG@, OC@ AJGGJRDIB 5FTU J=E@>O DN =@DIB >JINOMP>O@? RDOCJPO <IT NK@>DAD> Q<GP@N:
5FTU U; // OP WBMVF JT TQFDJGJFE GPS UIF NFNCFST
XSJUFGMO("%T,%T,%T", U.D, U.J, U.E);
AGG JA OC@ H@H=@MN <M@ DIDOD<GDU@? =T OC@DM ?@A<PGO Q<GP@N:
",11,0.25
Constructing by the \ ^ syntax 49.3.4
0OMP>O J=E@>ON ><I <GNJ =@ >JINOMP>O@? =T OC@ AJGGJRDIB NTIO<S:
5JNF0G%BZ QFSJPE4UBSU = \ 8, 30 ^;
0DHDG<M OJ OC@ @<MGD@M NTIO<S, OC@ NK@>DAD@? Q<GP@N <M@ <NNDBI@? OJ OC@ H@H=@MN DI OC@ JM?@M
OC<O OC@T <M@ NK@>DAD@?. 1C@ OM<DGDIB H@H=@MN B@O OC@DM ?@A<PGO Q<GP@N.
1CDN NTIO<S DN DIC@MDO@? AMJH OC@ KMJBM<HHDIB G<IBP<B@:
BVUP QFSJPE4UBSU = 5JNF0G%BZ(8, 30); // j SFDPNNFOEFE
5JNF0G%BZ QFSJPE&OE = \ 9, 30 ^; // j BT JO $
(FDG5FE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
259
Copying and assignment
49.4
0OMP>ON <M@ Q<GP@ OTK@N. AN C<N =@@I ?@N>MD=@? DI OC@ 3<GP@ 1TK@N <I? /@A@M@I>@ 1TK@N
>C<KO@M, OCDN H@<IN OC<O @Q@MT TUSVDU J=E@>O C<N DON JRI Q<GP@. ,=E@>ON B@O OC@DM JRI Q<GP@N
RC@I >JINOMP>O@?, <I? OC@DM Q<GP@N >C<IB@ RC@I OC@T <M@ <NNDBI@? I@R Q<GP@N.
BVUP ZPVS-VODI5JNF = 5JNF0G%BZ(12, 0);
BVUP NZ-VODI5JNF = ZPVS-VODI5JNF;
// 0OMZ NZ MVODI UJNF CFDPNFT 12:05:
NZ-VODI5JNF.NJOVUF += 5;
// ... ZPVS MVODI UJNF JT TUJMM UIF TBNF:
BTTFSU(ZPVS-VODI5JNF.NJOVUF == 0);
!PMDIB < >JKT, <GG JA OC@ H@H=@MN JA OC@ NJPM>@ J=E@>O <M@ <POJH<OD><GGT >JKD@? OJ OC@
>JMM@NKJI?DIB H@H=@MN JA OC@ ?@NODI<ODJI J=E@>O. 0DHDG<MGT, <NNDBIH@IO DIQJGQ@N <NNDBIDIB
@<>C H@H=@M JA OC@ NJPM>@ OJ OC@ >JMM@NKJI?DIB H@H=@M JA OC@ ?@NODI<ODJI.
0OMP>O H@H=@MN OC<O <M@ JA M@A@M@I>@ OTK@N I@@? @SOM< <OO@IODJI.
Careful with members that are of reference types! 49.4.1
AN TJP M@H@H=@M, >JKTDIB JM <NNDBIDIB Q<MD<=G@N JA M@A@M@I>@ OTK@N ?J@N IJO >C<IB@ <IT
Q<GP@, DO >C<IB@N RC<O J=E@>O DN =@DIB M@A@M@I>@?. AN < M@NPGO, >JKTDIB JM <NNDBIDIB B@I@M<O@N
JI@ HJM@ M@A@M@I>@ OJ OC@ MDBCO-C<I? ND?@ J=E@>O. 1C@ M@G@Q<I>@ JA OCDN AJM NOMP>O H@H=@MN DN
OC<O, OC@ H@H=@MN JA ORJ N@K<M<O@ NOMP>O J=E@>ON RJPG? NO<MO KMJQD?DIB <>>@NN OJ OC@ N<H@
Q<GP@.
1J N@@ <I @S<HKG@ JA OCDN, G@O'N C<Q@ < GJJF <O < NOMP>O RC@M@ JI@ JA OC@ H@H=@MN DN <
M@A@M@I>@ OTK@. 1CDN NOMP>O DN PN@? AJM F@@KDIB OC@ NOP?@IO IPH=@M <I? OC@ BM<?@N JA <
NOP?@IO:
TUSVDU 4UVEFOU
\
JOU OVNCFS;
JOU<> HSBEFT;
^
1C@ AJGGJRDIB >J?@ >JINOMP>ON < N@>JI? 4UVEFOU J=E@>O =T >JKTDIB <I @SDNODIB JI@:
// $POTUSVDUJOH UIF GJSTU PCKFDU:
BVUP TUVEFOU1 = 4UVEFOU(1, < 70, 90, 85 >);
// $POTUSVDUJOH UIF TFDPOE TUVEFOU BT B DPQZ PG UIF GJSTU
// POF BOE UIFO DIBOHJOH JUT OVNCFS:
BVUP TUVEFOU2 = TUVEFOU1;
TUVEFOU2.OVNCFS = 2;
// 8"3/*/(: 5IF HSBEFT BSF OPX CFJOH TIBSFE CZ UIF UXP PCKFDUT!
// $IBOHJOH UIF HSBEFT PG UIF GJSTU TUVEFOU ...
TUVEFOU1.HSBEFT<0> += 5;
// ... BGGFDUT UIF TFDPOE TUVEFOU BT XFMM:
XSJUFMO(TUVEFOU2.HSBEFT<0>);
4C@I TUVEFOU2 DN >JINOMP>O@?, DON H@H=@MN B@O OC@ Q<GP@N JA OC@ H@H=@MN JA TUVEFOU1.
0DI>@ JOU DN < Q<GP@ OTK@, OC@ N@>JI? J=E@>O B@ON DON JRI OVNCFS Q<GP@.
(FDG5FE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
260
1C@ ORJ 4UVEFOU J=E@>ON <GNJ C<Q@ DI?DQD?P<G HSBEFT H@H=@MN <N R@GG. %JR@Q@M, NDI>@ NGD>@N
<M@ M@A@M@I>@ OTK@N, OC@ <>OP<G @G@H@ION OC<O OC@ ORJ NGD>@N NC<M@ <M@ OC@ N<H@.
JIN@LP@IOGT, < >C<IB@ H<?@ OCMJPBC JI@ JA OC@ NGD>@N DN N@@I OCMJPBC OC@ JOC@M NGD>@.
1C@ JPOKPO JA OC@ >J?@ DI?D><O@N OC<O OC@ BM<?@ JA OC@ N@>JI? NOP?@IO C<N =@@I DI>M@<N@? <N
R@GG:
75
#JM OC<O M@<NJI, < =@OO@M <KKMJ<>C HDBCO =@ OJ >JINOMP>O OC@ N@>JI? J=E@>O =T OC@ >JKD@N JA
OC@ BM<?@N JA OC@ ADMNO JI@:
// 5IF TFDPOE 4UVEFOU JT CFJOH DPOTUSVDUFE CZ UIF DPQJFT
// PG UIF HSBEFT PG UIF GJSTU POF:
BVUP TUVEFOU2 = 4UVEFOU(2, TUVEFOU1.HSBEFT.EVQ);
// $IBOHJOH UIF HSBEFT PG UIF GJSTU TUVEFOU ...
TUVEFOU1.HSBEFT<0> += 5;
// ... EPFT OPU BGGFDU UIF HSBEFT PG UIF TFDPOE TUVEFOU:
XSJUFMO(TUVEFOU2.HSBEFT<0>);
0DI>@ OC@ BM<?@N C<Q@ =@@I >JKD@? =T .EVQ, OCDN ODH@ OC@ BM<?@N JA OC@ N@>JI? NOP?@IO DN IJO
<AA@>O@?:
70
$AF7: !F ;E BAEE;4>7 FA :3H7 7H7@ F:7 D787D7@57 ?7?47DE 5AB;76 3GFA?3F;53>>K. ,7 I;>> E77
:AI F:;E ;E 6A@7 >3F7D I:7@ 5AH7D;@9 EFDG5F ?7?47D 8G@5F;A@E.
Struct literals
49.5
0DHDG<M OJ =@DIB <=G@ OJ PN@ DIO@B@M GDO@M<G Q<GP@N GDF@ 10 DI @SKM@NNDJIN RDOCJPO I@@?DIB OJ
?@ADI@ < Q<MD<=G@, NOMP>O J=E@>ON ><I =@ PN@? <N GDO@M<GN <N R@GG.
0OMP>O GDO@M<GN <M@ >JINOMP>O@? =T OC@ J=E@>O >JINOMP>ODJI NTIO<S.
5JNF0G%BZ(8, 30) // j TUSVDU MJUFSBM WBMVF
)@O'N ADMNO M@RMDO@ OC@ NBJO() API>ODJI <=JQ@ RDOC RC<O R@ C<Q@ G@<MI@? NDI>@ DON G<NO Q@MNDJI.
1C@ Q<MD<=G@N <M@ >JINOMP>O@? =T OC@ >JINOMP>ODJI NTIO<S <I? <M@ JNNVUBCMF OCDN ODH@:
WPJE NBJO()
\
JNNVUBCMF QFSJPE4UBSU = 5JNF0G%BZ(8, 30);
JNNVUBCMF QFSJPE%VSBUJPO = 5JNF0G%BZ(1, 15);
JNNVUBCMF QFSJPE&OE = BEE%VSBUJPO(QFSJPE4UBSU,
QFSJPE%VSBUJPO);
XSJUFGMO("1FSJPE FOE: %T:%T",
QFSJPE&OE.IPVS, QFSJPE&OE.NJOVUF);
^
+JO@ OC<O QFSJPE4UBSU <I? QFSJPE%VSBUJPO I@@? IJO =@ ?@ADI@? <N I<H@? Q<MD<=G@N DI OC@
>J?@ <=JQ@. 1CJN@ <M@ DI A<>O O@HKJM<MT Q<MD<=G@N DI OCDN NDHKG@ KMJBM<H, RCD>C <M@ PN@?
JIGT AJM ><G>PG<ODIB OC@ QFSJPE&OE Q<MD<=G@. 1C@T >JPG? =@ K<NN@? OJ BEE%VSBUJPO() <N
GDO@M<G Q<GP@N:
(FDG5FE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
261
WPJE NBJO()
\
JNNVUBCMF QFSJPE&OE = BEE%VSBUJPO(5JNF0G%BZ(8, 30),
5JNF0G%BZ(1, 15));
XSJUFGMO("1FSJPE FOE: %T:%T",
QFSJPE&OE.IPVS, QFSJPE&OE.NJOVUF);
^
TUBUJD members
49.6
AGOCJPBC J=E@>ON HJNOGT I@@? OJ C<Q@ DI?DQD?P<G >JKD@N JA OC@ NOMP>O H@H=@MN, NJH@ODH@N DO
H<F@N N@IN@ AJM OC@ J=E@>ON JA < K<MOD>PG<M NOMP>O OTK@ OJ NC<M@ NJH@ Q<MD<=G@N. 1CDN H<T =@
I@@?@? @.B. RC@I < B@I@M<G DIAJMH<ODJI <=JPO OC<O NOMP>O OTK@ I@@? OJ =@ H<DIO<DI@?.
AN <I @S<HKG@, G@O'N DH<BDI@ < OTK@ OC<O <NNDBIN < N@K<M<O@ D?@IODAD@M AJM @Q@MT J=E@>O OC<O DN
>JINOMP>O@? JA OC<O OTK@:
TUSVDU 1PJOU
\
// 5IF JEFOUJGJFS PG FBDI PCKFDU
TJ[F@U JE;
JOU MJOF;
JOU DPMVNO;
^
&I JM?@M OJ =@ <=G@ OJ <NNDBI ?DAA@M@IO D?N OJ @<>C J=E@>O, < N@K<M<O@ Q<MD<=G@ DN I@@?@? OJ
F@@K OC@ I@SO <Q<DG<=G@ D?. &O RJPG? =@ DI>M@H@IO@? @Q@MT ODH@ < I@R J=E@>O DN >M@<O@?.
ANNPH@ OC<O OFYU*E DN OJ =@ ?@ADI@? @GN@RC@M@ <I? OJ =@ <Q<DG<=G@ DI OC@ AJGGJRDIB API>ODJI:
1PJOU NBLF1PJOU(JOU MJOF, JOU DPMVNO)
\
TJ[F@U JE = OFYU*E;
++OFYU*E;
SFUVSO 1PJOU(JE, MJOF, DPMVNO);
^
A ?@>DNDJI HPNO =@ H<?@ M@B<M?DIB RC@M@ OC@ >JHHJI OFYU*E Q<MD<=G@ DN OJ =@ ?@ADI@?.
TUBUJD H@H=@MN <M@ PN@APG DI NP>C ><N@N. 0P>C >JHHJI DIAJMH<ODJI DN ?@ADI@? <N < TUBUJD
H@H=@M JA OC@ NOMP>O. JIOM<MT OJ OC@ M@BPG<M H@H=@MN, OC@M@ DN < NDIBG@ Q<MD<=G@ JA @<>C
TUBUJD H@H=@M OCMJPBCJPO OC@ KMJBM<H. 1C<O NDIBG@ Q<MD<=G@ DN NC<M@? =T <GG JA OC@ J=E@>ON
JA OC<O NOMP>O:
JNQPSU TUE.TUEJP;
TUSVDU 1PJOU
\
// 5IF JEFOUJGJFS PG FBDI PCKFDU
TJ[F@U JE;
JOU MJOF;
JOU DPMVNO;
// 5IF JE PG UIF OFYU PCKFDU UP DPOTUSVDU
TUBUJD TJ[F@U OFYU*E;
^
1PJOU NBLF1PJOU(JOU MJOF, JOU DPMVNO)
\
TJ[F@U JE = 1PJOU.OFYU*E;
(FDG5FE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
262
++1PJOU.OFYU*E;
SFUVSO 1PJOU(JE, MJOF, DPMVNO);
^
WPJE NBJO()
\
BVUP UPQ = NBLF1PJOU(7, 0);
BVUP NJEEMF = NBLF1PJOU(8, 0);
BVUP CPUUPN = NBLF1PJOU(9, 0);
XSJUFMO(UPQ.JE);
XSJUFMO(NJEEMF.JE);
XSJUFMO(CPUUPN.JE);
^
AN OFYU*E DN DI>M@H@IO@? <O @<>C J=E@>O >JINOMP>ODJI, @<>C J=E@>O B@ON < PIDLP@ D?:
0
1
2
0DI>@ TUBUJD H@H=@MN <M@ JRI@? =T OC@ @IODM@ OTK@, OC@M@ I@@? IJO =@ <I J=E@>O OJ <>>@NN
OC@H. AN R@ C<Q@ N@@I <=JQ@, NP>C J=E@>ON ><I =@ <>>@NN@? =T OC@ I<H@ JA OC@ OTK@, <N R@GG
<N =T OC@ I<H@ JA <IT J=E@>O JA OC<O NOMP>O:
++1PJOU.OFYU*E;
++CPUUPN.OFYU*E; // XPVME CF UIF TBNF BT BCPWF
Exercises
49.7
1. !@NDBI < NOMP>O I<H@? $BSE OJ M@KM@N@IO < KG<TDIB ><M?.
1CDN NOMP>O ><I C<Q@ ORJ H@H=@MN AJM OC@ NPDO <I? OC@ Q<GP@. &O H<T H<F@ N@IN@ OJ
PN@ <I FOVN OJ M@KM@N@IO OC@ NPDO, JM TJP ><I NDHKGT PN@ OC@ >C<M<>O@MN x, y, z, <I?
{.
AI JOU JM < EDIBS Q<GP@ ><I =@ PN@? AJM OC@ ><M? Q<GP@. &A TJP ?@>D?@ OJ PN@ <I JOU,
OC@ Q<GP@N 1, 11, 12, <I? 13 H<T M@KM@N@IO OC@ ><M?N OC<O ?J IJO C<Q@ IPH=@MN (<>@,
E<>F, LP@@I, <I? FDIB).
1C@M@ <M@ JOC@M ?@NDBI >CJD>@N OJ H<F@. #JM @S<HKG@, OC@ ><M? Q<GP@N ><I =@
M@KM@N@IO@? =T <I FOVN OTK@ <N R@GG.
1C@ R<T J=E@>ON JA OCDN NOMP>O RDGG =@ >JINOMP>O@? RDGG ?@K@I? JI OC@ >CJD>@ JA OC@
OTK@N JA DON H@H=@MN. #JM @S<HKG@, DA =JOC H@H=@MN <M@ EDIBS, OC@I $BSE J=E@>ON ><I
=@ >JINOMP>O@? GDF@ OCDN:
BVUP DBSE = $BSE('y', '2');
2. !@ADI@ < API>ODJI I<H@? QSJOU$BSE(), RCD>C O<F@N < $BSE J=E@>O <N < K<M<H@O@M <I?
NDHKGT KMDION DO:
WPJE QSJOU$BSE(JO $BSE DBSE)
\
// ... QMFBTF EFGJOF UIF GVODUJPO CPEZ ...
^
WPJE NBJO()
\
(FDG5FE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
263
BVUP DBSE = $BSE(/* ... */);
QSJOU$BSE(DBSE);
^
#JM @S<HKG@, OC@ API>ODJI ><I KMDIO OC@ 2 JA >GP=N <N:
w2
1C@ DHKG@H@IO<ODJI JA OC<O API>ODJI H<T ?@K@I? JI OC@ >CJD>@ JA OC@ OTK@N JA OC@
H@H=@MN.
3. !@ADI@ < API>ODJI I<H@? OFX%FDL() <I? C<Q@ DO M@OPMI 52 ><M?N JA < ?@>F <N < $BSE NGD>@:
$BSE<> OFX%FDL()
PVU (SFTVMU)
\
BTTFSU(SFTVMU.MFOHUI == 52);
^
CPEZ
\
// ... QMFBTF EFGJOF UIF GVODUJPO CPEZ ...
^
&O NCJPG? =@ KJNND=G@ OJ ><GG OFX%FDL() <N DI OC@ AJGGJRDIB >J?@:
WPJE NBJO()
\
$BSE<> EFDL = OFX%FDL();
GPSFBDI (DBSE; EFDL) \
QSJOU$BSE(DBSE);
XSJUF(' ');
^
XSJUFMO();
^
1C@ JPOKPO NCJPG? =@ NDHDG<M OJ OC@ AJGGJRDIB RDOC 52 ?DNODI>O ><M?N:
t2 t3 t4 t5 t6 t7 t8 t9 t0 t+ t2 t, t" u2 u3 u4
u5 u6 u7 u8 u9 u0 u+ u2 u, u" v2 v3 v4 v5 v6 v7
v8 v9 v0 v+ v2 v, v" w2 w3 w4 w5 w6 w7 w8 w9 w0
w+ w2 w, w"
4. 4MDO@ < API>ODJI OC<O NCPAAG@N OC@ ?@>F. ,I@ R<T DN OJ KD>F ORJ ><M?N <O M<I?JH =T
TUE.SBOEPN.VOJGPSN, OJ NR<K OCJN@ ORJ ><M?N, <I? OJ M@K@<O OCDN KMJ>@NN < NPAAD>D@IO
IPH=@M JA ODH@N. 1C@ API>ODJI NCJPG? O<F@ OC@ IPH=@M JA M@K@ODODJI <N < K<M<H@O@M:
WPJE TIVGGMF($BSE<> EFDL, JO JOU SFQFUJUJPO)
\
// ... QMFBTF EFGJOF UIF GVODUJPO CPEZ ...
^
%@M@ DN CJR DO NCJPG? =@ PN@?:
WPJE NBJO()
\
$BSE<> EFDL = OFX%FDL();
TIVGGMF(EFDL, 1);
GPSFBDI (DBSE; EFDL) \
(FDG5FE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
264
QSJOU$BSE(DBSE);
XSJUF(' ');
^
XSJUFMO();
^
1C@ API>ODJI NCJPG? NR<K ><M?N SFQFUJUJPO IPH=@M JA ODH@N. #JM @S<HKG@, RC@I
><GG@? =T 1, OC@ JPOKPO NCJPG? =@ NDHDG<M OJ OC@ AJGGJRDIB:
t2 t3 t4 t5 t6 t7 t8 t9 t0 t+ t2 t, t" u2 u3 u4
u5 u6 u7 u8 w4 u0 u+ u2 u, u" v2 v3 v4 v5 v6 v7
v8 v9 v0 v+ v2 v, v" w2 w3 u9 w5 w6 w7 w8 w9 w0
w+ w2 w, w"
A CDBC@M Q<GP@ AJM SFQFUJUJPO NCJPG? M@NPGO DI < HJM@ NCPAAG@? ?@>F:
TIVGGMFE(EFDL, 100);
1C@ JPOKPO:
t4 w7 v9 v6 u2 t6 w6 v" w5 v8 v3 u2 v+ w, w8 w4
u+ w2 t2 t9 v0 u" t" u9 t7 u3 v, v2 u0 t+ v7 u7
t8 u4 w+ v4 w0 u6 v5 u5 u, t3 v2 t2 t5 w2 u8 w"
t, w9 t0 w3
Note: A ?G5: 47FF7D I3K A8 E:G88>;@9 F:7 675= ;E 7JB>3;@76 ;@ F:7 EA>GF;A@E.
... F:7 EA>GF;A@E
(FDG5FE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
265
Variable Number of Parameters 50
1CDN >C<KO@M >JQ@MN ORJ ! A@<OPM@N OC<O =MDIB AG@SD=DGDOT JI K<M<H@O@MN RC@I ><GGDIB
API>ODJIN:
t !@A<PGO K<M<H@O@M Q<GP@N
t 3<MD<?D> API>ODJIN
Default parameter values
50.1
A >JIQ@ID@I>@ RDOC API>ODJI K<M<H@O@MN DN OC@ <=DGDOT OJ NK@>DAT ?@A<PGO Q<GP@N AJM OC@H. 1CDN
DN NDHDG<M OJ OC@ ?@A<PGO DIDOD<G Q<GP@N JA NOMP>O H@H=@MN.
0JH@ JA OC@ K<M<H@O@MN JA NJH@ API>ODJIN <M@ ><GG@? HJNOGT =T OC@ N<H@ Q<GP@N. 1J N@@ <I
@S<HKG@ JA OCDN, G@O'N >JIND?@M < API>ODJI OC<O KMDION OC@ @G@H@ION JA <I <NNJ>D<ODQ@ <MM<T JA
OTK@ TUSJOH<TUSJOH>. )@O'N <NNPH@ OC<O OC@ API>ODJI O<F@N OC@ N@K<M<OJM >C<M<>O@MN <N
K<M<H@O@MN <N R@GG:
WPJE QSJOU""(JO DIBS<> UJUMF,
JO TUSJOH<TUSJOH> BB,
JO DIBS<> LFZ4FQBSBUPS,
JO DIBS<> FMFNFOU4FQBSBUPS)
\
XSJUFMO("-- ", UJUMF, " --");
BVUP LFZT = BB.LFZT.TPSU;
GPSFBDI (J, LFZ; LFZT) \
// /P TFQBSBUPS CFGPSF UIF GJSTU FMFNFOU
JG (J != 0) \
XSJUF(FMFNFOU4FQBSBUPS);
^
XSJUF(LFZ, LFZ4FQBSBUPS, BB<LFZ>);
^
XSJUFMO();
^
1C<O API>ODJI DN =@DIB ><GG@? =@GJR =T ":" <N OC@ F@T N@K<M<OJM <I? ", " <N OC@ @G@H@IO
N@K<M<OJM:
TUSJOH<TUSJOH> EJDUJPOBSZ = <
"CMVF":"NBWJ", "SFE":"LfSNf[f", "HSBZ":"HSJ" >;
QSJOU""("$PMPS %JDUJPOBSZ", EJDUJPOBSZ, ":", ", ");
1C@ JPOKPO:
-- $PMPS %JDUJPOBSZ --
CMVF:NBWJ, HSBZ:HSJ, SFE:LgSNg[g
&A OC@ N@K<M<OJMN <M@ <GHJNO <GR<TN BJDIB OJ =@ OCJN@ ORJ, OC@T ><I =@ ?@ADI@? RDOC ?@A<PGO
Q<GP@N:
WPJE QSJOU""(JO DIBS<> UJUMF,
JO TUSJOH<TUSJOH> BB,
JO DIBS<> LFZ4FQBSBUPS = ": ",
JO DIBS<> FMFNFOU4FQBSBUPS = ", ")
\
+3D;34>7 $G?47D A8 &3D3?7F7DE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
266
// ...
^
-<M<H@O@MN RDOC ?@A<PGO Q<GP@N I@@? IJO =@ NK@>DAD@? RC@I OC@ API>ODJI DN ><GG@?:
QSJOU""("$PMPS %JDUJPOBSZ",
EJDUJPOBSZ); /* j /P TFQBSBUPS TQFDJGJFE. #PUI
* QBSBNFUFST XJMM HFU UIFJS
* EFGBVMU WBMVFT. */
1C@ K<M<H@O@M Q<GP@N ><I NODGG =@ NK@>DAD@? RC@I I@@?@?, <I? IJO I@>@NN<MDGT <GG JA OC@H:
QSJOU""("$PMPS %JDUJPOBSZ", EJDUJPOBSZ, "=");
1C@ JPOKPO:
-- $PMPS %JDUJPOBSZ --
CMVF=NBWJ, HSBZ=HSJ, SFE=LgSNg[g
1C@ AJGGJRDIB ><GG NK@>DAD@N =JOC JA OC@ K<M<H@O@MN:
QSJOU""("$PMPS %JDUJPOBSZ", EJDUJPOBSZ, "=", "=O");
1C@ JPOKPO:
-- $PMPS %JDUJPOBSZ --
CMVF=NBWJ
HSBZ=HSJ
SFE=LgSNg[g
!@A<PGO Q<GP@N ><I JIGT =@ ?@ADI@? AJM OC@ K<M<H@O@MN OC<O <M@ <O OC@ @I? JA OC@ K<M<H@O@M
GDNO.
Variadic functions
50.2
!@NKDO@ <KK@<M<I>@N, ?@A<PGO K<M<H@O@M Q<GP@N ?J IJO >C<IB@ OC@ IPH=@M JA K<M<H@O@MN OC<O
< API>ODJI M@>@DQ@N. #JM @S<HKG@, @Q@I OCJPBC NJH@ K<M<H@O@MN H<T =@ <NNDBI@? OC@DM
?@A<PGO Q<GP@N, QSJOU""() <GR<TN O<F@N AJPM K<M<H@O@MN <I? PN@N OC@H <>>JM?DIB OJ DON
DHKG@H@IO<ODJI.
1C@ Q<MD<?D> API>ODJIN A@<OPM@ JI OC@ JOC@M C<I? <GGJRN ><GGDIB API>ODJIN RDOC PINK@>DAD@?
IPH=@M JA <MBPH@ION. 4@ C<Q@ <GM@<?T =@@I O<FDIB <?Q<IO<B@ JA OCDN A@<OPM@ RDOC API>ODJIN
GDF@ XSJUFMO(). XSJUFMO() ><I =@ ><GG@? RDOC <IT IPH=@M JA <MBPH@ION:
XSJUFMO(
"IFMMP", 7, "XPSME", 9.8 /*, BOE BOZ OVNCFS PG PUIFS
* BSHVNFOUT BT OFFEFE */);
1C@M@ <M@ AJPM R<TN JA ?@ADIDIB Q<MD<?D> API>ODJIN DI !:
t 1C@ A@<OPM@ OC<O RJMFN JIGT AJM API>ODJIN OC<O <M@ H<MF@? <N FYUFSO "$". 1CDN A@<OPM@
?@ADI@N OC@ CD??@I @BSHQUS Q<MD<=G@ OC<O DN PN@? AJM <>>@NNDIB OC@ K<M<H@O@MN. 1CDN =JJF
?J@N IJO >JQ@M OCDN A@<OPM@ K<MOGT =@><PN@ DO DN PIN<A@.
t 1C@ A@<OPM@ OC<O RJMFN RDOC M@BPG<M ! API>ODJIN, RCD>C <GNJ PN@N OC@ CD??@I @BSHQUS
Q<MD<=G@, <N R@GG <N OC@ @BSHVNFOUT Q<MD<=G@, OC@ G<OO@M =@DIB JA OTK@ 5ZQF*OGP<>. 1CDN
+3D;34>7 $G?47D A8 &3D3?7F7DE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
267
=JJF ?J@N IJO >JQ@M OCDN A@<OPM@ <N R@GG =JOC =@><PN@ DO M@GD@N JI BA;@F7DE, RCD>C C<Q@ IJO
=@@I >JQ@M@? T@O, <I? =@><PN@ OCDN A@<OPM@ ><I =@ PN@? DI PIN<A@ R<TN <N R@GG.
t A N<A@ A@<OPM@ RDOC OC@ GDHDO<ODJI OC<O OC@ PINK@>DAD@? IPH=@M JA K<M<H@O@MN HPNO <GG =@
JA OC@ N<H@ OTK@. 1CDN DN OC@ A@<OPM@ OC<O DN >JQ@M@? DI OCDN N@>ODJI.
t 2INK@>DAD@? IPH=@M JA O@HKG<O@ K<M<H@O@MN. 1CDN A@<OPM@ RDGG =@ @SKG<DI@? G<O@M DI OC@
O@HKG<O@N >C<KO@MN.
1C@ K<M<H@O@MN JA Q<MD<?D> API>ODJIN <M@ K<NN@? OJ OC@ API>ODJI <N < NGD>@. 3<MD<?D> API>ODJIN
<M@ ?@ADI@? RDOC < NDIBG@ K<M<H@O@M JA < NK@>DAD> OTK@ JA NGD>@ AJGGJR@? DHH@?D<O@GT =T OC@
... >C<M<>O@MN:
EPVCMF TVN(JO EPVCMF<> OVNCFST ...)
\
EPVCMF SFTVMU = 0.0;
GPSFBDI (OVNCFS; OVNCFST) \
SFTVMU += OVNCFS;
^
SFUVSO SFTVMU;
^
1C<O ?@ADIDODJI H<F@N TVN() < Q<MD<?D> API>ODJI, H@<IDIB OC<O DO DN <=G@ OJ M@>@DQ@ <IT
IPH=@M JA <MBPH@ION <N GJIB <N OC@T <M@ EPVCMF JM <IT JOC@M OTK@ OC<O ><I DHKGD>DOGT =@
>JIQ@MOD=G@ OJ EPVCMF:
XSJUFMO(TVN(1.1, 2.2, 3.3));
1C@ NDIBG@ NGD>@ K<M<H@O@M <I? OC@ ... >C<M<>O@MN M@KM@N@IO <GG JA OC@ <MBPH@ION. #JM
@S<HKG@, OC@ NGD>@ RJPG? C<Q@ ADQ@ @G@H@ION DA OC@ API>ODJI R@M@ ><GG@? RDOC ADQ@ EPVCMF
Q<GP@N.
&I A<>O, OC@ Q<MD<=G@ IPH=@M JA K<M<H@O@MN ><I <GNJ =@ K<NN@? <N < NDIBG@ NGD>@:
XSJUFMO(TVN(< 1.1, 2.2, 3.3 >)); // TBNF BT BCPWF
3<MD<?D> API>ODJIN ><I <GNJ C<Q@ M@LPDM@? K<M<H@O@MN, RCD>C HPNO =@ ?@ADI@? ADMNO DI OC@
K<M<H@O@M GDNO. #JM @S<HKG@, OC@ AJGGJRDIB API>ODJI KMDION <I PINK@>DAD@? IPH=@M JA
K<M<H@O@MN RDOCDI K<M@IOC@N@N. AGOCJPBC OC@ API>ODJI G@<Q@N OC@ IPH=@M JA OC@ @G@H@ION
AG@SD=G@, DO M@LPDM@N OC<O OC@ K<M@IOC@N@N <M@ <GR<TN NK@>DAD@?:
DIBS<> QBSFOUIFTJ[F(
JO DIBS<> PQFOJOH, // j 5IF GJSTU UXP QBSBNFUFST NVTU CF
JO DIBS<> DMPTJOH, // TQFDJGJFE XIFO UIF GVODUJPO JT DBMMFE.
JO DIBS<><> XPSET ...) // j /FFE OPU CF TQFDJGJFE
\
DIBS<> SFTVMU;
GPSFBDI (XPSE; XPSET) \
SFTVMU _= PQFOJOH;
SFTVMU _= XPSE;
SFTVMU _= DMPTJOH;
^
SFUVSO SFTVMU;
^
1C@ ADMNO ORJ K<M<H@O@MN <M@ H<I?<OJMT:
QBSFOUIFTJ[F("\"); // j DPNQJMBUJPO &3303
+3D;34>7 $G?47D A8 &3D3?7F7DE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
268
AN GJIB <N OC@ H<I?<OJMT K<M<H@O@MN <M@ NK@>DAD@?, OC@ M@NO <M@ JKODJI<G:
XSJUFMO(QBSFOUIFTJ[F("\", "^", "BQQMF", "QFBS", "CBOBOB"));
1C@ JPOKPO:
\BQQMF^\QFBS^\CBOBOB^
Exercise
50.3
t ANNPH@ OC<O OC@ AJGGJRDIB FOVN DN <GM@<?T ?@ADI@?:
FOVN 0QFSBUJPO \ BEE, TVCUSBDU, NVMUJQMZ, EJWJEF ^
AGNJ <NNPH@ OC<O OC@M@ DN < TUSVDU OC<O M@KM@N@ION OC@ ><G>PG<ODJI JA <I JK@M<ODJI
<I? DON ORJ JK@M<I?N:
TUSVDU $BMDVMBUJPO
\
0QFSBUJPO PQ;
EPVCMF GJSTU;
EPVCMF TFDPOE;
^
#JM @S<HKG@, OC@ J=E@>O $BMDVMBUJPO(0QFSBUJPO.EJWJEF, 7.7, 8.8) RJPG?
M@KM@N@IO OC@ ?DQDNDJI JA 7.7 =T 8.8.
!@NDBI < API>ODJI OC<O M@>@DQ@N <I PINK@>DAD@? IPH=@M JA OC@N@ TUSVDU J=E@>ON,
><G>PG<O@N OC@ M@NPGO JA @<>C $BMDVMBUJPO, <I? OC@I M@OPMIN <GG JA OC@ M@NPGON <N <
NGD>@ JA OTK@ EPVCMF<>.
#JM @S<HKG@, DO NCJPG? =@ KJNND=G@ OJ ><GG OC@ API>ODJI <N DI OC@ AJGGJRDIB >J?@:
WPJE NBJO()
\
XSJUFMO(DBMDVMBUF($BMDVMBUJPO(0QFSBUJPO.BEE, 1.1, 2.2),
$BMDVMBUJPO(0QFSBUJPO.TVCUSBDU, 3.3, 4.4),
$BMDVMBUJPO(0QFSBUJPO.NVMUJQMZ, 5.5, 6.6),
$BMDVMBUJPO(0QFSBUJPO.EJWJEF, 7.7, 8.8)));
^
1C@ JPOKPO JA OC@ >J?@ NCJPG? =@ NDHDG<M OJ OC@ AJGGJRDIB:
<3.3, -1.1, 36.3, 0.875>
... F:7 EA>GF;A@
+3D;34>7 $G?47D A8 &3D3?7F7DE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
269
Function Overloading 51
!@ADIDIB HJM@ OC<I JI@ API>ODJI C<QDIB OC@ N<H@ I<H@ DN 8G@5F;A@ AH7D>A36;@9. &I JM?@M OJ
=@ <=G@ OJ ?DAA@M@IOD<O@ OC@N@ API>ODJIN, OC@DM K<M<H@O@MN HPNO =@ ?DAA@M@IO.
1C@ AJGGJRDIB >J?@ C<N HPGODKG@ JQ@MGJ<?N JA OC@ JOGP() API>ODJI, @<>C O<FDIB < ?DAA@M@IO
OTK@ JA K<M<H@O@M:
JNQPSU TUE.TUEJP;
WPJE JOGP(JO EPVCMF OVNCFS)
\
XSJUFMO("'MPBUJOH QPJOU: ", OVNCFS);
^
WPJE JOGP(JO JOU OVNCFS)
\
XSJUFMO("*OUFHFS : ", OVNCFS);
^
WPJE JOGP(JO DIBS<> TUS)
\
XSJUFMO("4USJOH : ", TUS);
^
WPJE NBJO()
\
JOGP(1.2);
JOGP(3);
JOGP("IFMMP");
^
AGOJPBC <GG JA OC@ API>ODJIN <M@ I<H@? JOGP(), OC@ >JHKDG@M KD>FN OC@ JI@ OC<O H<O>C@N OC@
<MBPH@IO OC<O DN PN@? RC@I H<FDIB OC@ ><GG. #JM @S<HKG@, =@><PN@ OC@ GDO@M<G 1.2 DN JA OTK@
EPVCMF, OC@ JOGP() API>ODJI OC<O O<F@N < EPVCMF B@ON ><GG@? AJM DO.
1C@ >CJD>@ JA RCD>C API>ODJI OJ ><GG DN H<?@ <O >JHKDG@ ODH@, RCD>C H<T IJO <GR<TN =@ @<NT
JM >G@<M. #JM @S<HKG@, =@><PN@ JOU ><I DHKGD>DOGT =@ >JIQ@MO@? OJ =JOC EPVCMF <I? SFBM, OC@
>JHKDG@M ><IIJO ?@>D?@ RCD>C JA OC@ API>ODJIN OJ ><GG DI OC@ AJGGJRDIB KMJBM<H:
SFBM TFWFO5JNFT(JO SFBM WBMVF)
\
SFUVSO 7 * WBMVF;
^
EPVCMF TFWFO5JNFT(JO EPVCMF WBMVF)
\
SFUVSO 7 * WBMVF;
^
WPJE NBJO()
\
JOU WBMVF = 5;
BVUP SFTVMU = TFWFO5JNFT(WBMVF); // j DPNQJMBUJPO &3303
^
Note: !F ;E GEG3>>K G@@757EE3DK FA ID;F7 E7B3D3F7 8G@5F;A@E I:7@ F:7 8G@5F;A@ 4A6;7E 3D7
7J35F>K F:7 E3?7. ,7 I;>> E77 >3F7D ;@ F:7 )7?B>3F7E 5:3BF7D :AI 3 E;@9>7 678;@;F;A@ 53@ 47
GE76 8AD ?G>F;B>7 FKB7E.
%JR@Q@M, DA OC@M@ DN <IJOC@M API>ODJI JQ@MGJ<? OC<O O<F@N < MPOH K<M<H@O@M, OC@I OC@
<H=DBPDOT RJPG? =@ M@NJGQ@? =@><PN@ MPOH DN < 47FF7D ?3F5: AJM JOU OC<I EPVCMF JM SFBM:
FG@5F;A@ %H7D>A36;@9
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
270
MPOH TFWFO5JNFT(JO MPOH WBMVF)
\
SFUVSO 7 * WBMVF;
^
// ...
BVUP SFTVMU = TFWFO5JNFT(WBMVF); // OPX DPNQJMFT
Overload resolution
51.1
1C@ >JHKDG@M KD>FN OC@ JQ@MGJ<? OC<O DN OC@ 47EF ?3F5: AJM OC@ <MBPH@ION. 1CDN DN ><GG@?
JQ@MGJ<? M@NJGPODJI.
AGOJPBC JQ@MGJ<? M@NJGPODJI DN NDHKG@ <I? DIOPDODQ@ DI HJNO ><N@N, DO DN NJH@ODH@N
>JHKGD><O@?. 1C@ AJGGJRDIB <M@ OC@ MPG@N JA JQ@MGJ<? M@NJGPODJI. 1C@T <M@ =@DIB KM@N@IO@? DI <
NDHKGDAD@? R<T DI OCDN =JJF.
1C@M@ <M@ AJPM NO<O@N JA H<O>C, GDNO@? AMJH OC@ RJMNO OJ OC@ =@NO:
t HDNH<O>C
t H<O>C OCMJPBC <POJH<OD> OTK@ >JIQ@MNDJI
t H<O>C OCMJPBC DPOTU LP<GDAD><ODJI
t @S<>O H<O>C
1C@ >JHKDG@M >JIND?@MN <GG JA OC@ JQ@MGJ<?N JA < API>ODJI ?PMDIB JQ@MGJ<? M@NJGPODJI. &O ADMNO
?@O@MHDI@N OC@ H<O>C NO<O@ JA @Q@MT K<M<H@O@M AJM @Q@MT JQ@MGJ<?. #JM @<>C JQ@MGJ<?, OC@
G@<NO H<O>C NO<O@ <HJIB OC@ K<M<H@O@MN DN O<F@I OJ =@ OC@ H<O>C NO<O@ JA OC<O JQ@MGJ<?.
AAO@M <GG JA OC@ H<O>C NO<O@N JA OC@ JQ@MGJ<?N <M@ ?@O@MHDI@?, OC@I OC@ JQ@MGJ<? RDOC OC@ =@NO
H<O>C DN N@G@>O@?. &A OC@M@ <M@ HJM@ OC<I JI@ JQ@MGJ<? OC<O C<N OC@ =@NO H<O>C, OC@I HJM@
>JHKGD><O@? M@NJGPODJI MPG@N <M@ <KKGD@?. & RDGG IJO B@O DIOJ HJM@ ?@O<DGN JA OC@N@ MPG@N DI OCDN
=JJF. &A TJPM KMJBM<H DN DI < NDOP<ODJI RC@M@ DO ?@K@I?N JI >JHKGD><O@? JQ@MGJ<? M@NJGPODJI
MPG@N, DO H<T <I DI?D><ODJI OC<O DO DN ODH@ OJ >C<IB@ OC@ ?@NDBI JA OC@ KMJBM<H. AIJOC@M JKODJI
DN OJ O<F@ <?Q<IO<B@ JA JOC@M A@<OPM@N JA ! GDF@ O@HKG<O@N. AI @Q@I NDHKG@M <KKMJ<>C RJPG?
=@ OJ <=<I?JI API>ODJI JQ@MGJ<?DIB <GOJB@OC@M =T I<HDIB API>ODJIN ?DAA@M@IOGT AJM @<>C OTK@
@.B. GDF@ TFWFO5JNFT@SFBM() <I? TFWFO5JNFT@EPVCMF().
Function overloading for structs
51.2
#PI>ODJI JQ@MGJ<?DIB DN PN@APG RDOC NOMP>ON <I? >G<NN@N <N R@GG. A??DODJI<GGT, JQ@MGJ<?
M@NJGPODJI <H=DBPDOD@N <M@ HP>C G@NN AM@LP@IO RDOC PN@M-?@ADI@? OTK@N. )@O'N JQ@MGJ<? OC@
JOGP() API>ODJI <=JQ@ AJM NJH@ JA OC@ OTK@N OC<O R@ C<Q@ ?@ADI@? DI OC@ 0OMP>ON >C<KO@M:
TUSVDU 5JNF0G%BZ
\
JOU IPVS;
JOU NJOVUF;
^
WPJE JOGP(JO 5JNF0G%BZ UJNF)
\
XSJUFG("%02T:%02T", UJNF.IPVS, UJNF.NJOVUF);
^
1C<O JQ@MGJ<? @I<=G@N 5JNF0G%BZ J=E@>ON OJ =@ PN@? RDOC JOGP(). AN < M@NPGO, Q<MD<=G@N JA
PN@M-?@ADI@? OTK@N ><I =@ KMDIO@? DI @S<>OGT OC@ N<H@ R<T <N API?<H@IO<G OTK@N:
FG@5F;A@ %H7D>A36;@9
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
271
BVUP CSFBLGBTU5JNF = 5JNF0G%BZ(7, 0);
JOGP(CSFBLGBTU5JNF);
1C@ 5JNF0G%BZ J=E@>ON RJPG? =@ H<O>C@? RDOC OC<O JQ@MGJ<? JA JOGP():
07:00
1C@ AJGGJRDIB DN <I JQ@MGJ<? JA JOGP() AJM OC@ .FFUJOH OTK@:
TUSVDU .FFUJOH
\
TUSJOH UPQJD;
TJ[F@U BUUFOEBODF$PVOU;
5JNF0G%BZ TUBSU;
5JNF0G%BZ FOE;
^
WPJE JOGP(JO .FFUJOH NFFUJOH)
\
JOGP(NFFUJOH.TUBSU);
XSJUF('-');
JOGP(NFFUJOH.FOE);
XSJUFG(" ="%T=" NFFUJOH XJUI %T BUUFOEFFT",
NFFUJOH.UPQJD,
NFFUJOH.BUUFOEBODF$PVOU);
^
+JO@ OC<O OCDN JQ@MGJ<? H<F@N PN@ JA OC@ <GM@<?T-?@ADI@? JQ@MGJ<? AJM 5JNF0G%BZ. .FFUJOH
J=E@>ON ><I IJR =@ KMDIO@? DI @S<>OGT OC@ N<H@ R<T <N API?<H@IO<G OTK@N <N R@GG:
BVUP CJLF3JEF.FFUJOH = .FFUJOH("#JLF 3JEF", 3,
5JNF0G%BZ(9, 0),
5JNF0G%BZ(9, 10));
JOGP(CJLF3JEF.FFUJOH);
1C@ JPOKPO:
09:00-09:10 "#JLF 3JEF" NFFUJOH XJUI 3 BUUFOEFFT
Limitations
51.3
AGOCJPBC OC@ JOGP() API>ODJI JQ@MGJ<?N <=JQ@ <M@ < BM@<O >JIQ@ID@I>@, OCDN H@OCJ? C<N
NJH@ GDHDO<ODJIN:
t JOGP() <GR<TN KMDION OJ TUEPVU. &O RJPG? =@ HJM@ PN@APG DA DO >JPG? KMDIO OJ <IT 'JMF. ,I@
R<T JA <>CD@QDIB OCDN DN OJ K<NN OC@ JPOKPO NOM@<H <N < K<M<H@O@M <N R@GG @.B. AJM OC@
5JNF0G%BZ OTK@:
WPJE JOGP('JMF GJMF, JO 5JNF0G%BZ UJNF)
\
GJMF.XSJUFG("%02T:%02T", UJNF.IPVS, UJNF.NJOVUF);
^
1C<O RJPG? @I<=G@ KMDIODIB 5JNF0G%BZ J=E@>ON OJ <IT ADG@, DI>GP?DIB TUEPVU:
JOGP(TUEPVU, CSFBLGBTU5JNF);
BVUP GJMF = 'JMF("B@GJMF", "X");
JOGP(GJMF, CSFBLGBTU5JNF);
FG@5F;A@ %H7D>A36;@9
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
272
Note: ):7 EB75;3> A4<75FE stdin, stdout, 3@6 stderr 3D7 A8 FKB7 File.
t *JM@ DHKJMO<IOGT, JOGP() ?J@N IJO NJGQ@ OC@ HJM@ B@I@M<G KMJ=G@H JA KMJ?P>DIB OC@
NOMDIB M@KM@N@IO<ODJI JA Q<MD<=G@N. #JM @S<HKG@, DO ?J@N IJO C@GK RDOC K<NNDIB J=E@>ON JA
PN@M-?@ADI@? OTK@N OJ XSJUFMO():
XSJUFMO(CSFBLGBTU5JNF); // /PU VTFGVM: QSJOUT JO HFOFSJD GPSNBU
1C@ >J?@ <=JQ@ KMDION OC@ J=E@>O DI < B@I@MD> AJMH<O OC<O DI>GP?@N OC@ I<H@ JA OC@
OTK@ <I? OC@ Q<GP@N JA DON H@H=@MN, IJO DI < R<T OC<O RJPG? =@ PN@APG DI OC@ KMJBM<H:
5JNF0G%BZ(7, 0)
&O RJPG? =@ HP>C HJM@ PN@APG DA OC@M@ R@M@ < API>ODJI OC<O >JIQ@MO@? 5JNF0G%BZ
J=E@>ON OJ TUSJOH DI OC@DM NK@>D<G AJMH<O <N DI "12:34". 4@ RDGG N@@ CJR OJ ?@ADI@
TUSJOH M@KM@N@IO<ODJIN JA NOMP>O J=E@>ON DI OC@ I@SO >C<KO@M.
Exercise
51.4
t ,Q@MGJ<? OC@ JOGP() API>ODJI AJM OC@ AJGGJRDIB NOMP>ON <N R@GG:
TUSVDU .FBM
\
5JNF0G%BZ UJNF;
TUSJOH BEESFTT;
^
TUSVDU %BJMZ1MBO
\
.FFUJOH BN.FFUJOH;
.FBM MVODI;
.FFUJOH QN.FFUJOH;
^
0DI>@ .FBM C<N JIGT OC@ NO<MO ODH@, <?? <I CJPM <I? < C<GA OJ ?@O@MHDI@ DON @I? ODH@.
6JP ><I PN@ OC@ BEE%VSBUJPO() API>ODJI OC<O R@ C<Q@ ?@ADI@? @<MGD@M DI OC@ NOMP>ON
>C<KO@M:
5JNF0G%BZ BEE%VSBUJPO(JO 5JNF0G%BZ TUBSU,
JO 5JNF0G%BZ EVSBUJPO)
\
5JNF0G%BZ SFTVMU;
SFTVMU.NJOVUF = TUBSU.NJOVUF + EVSBUJPO.NJOVUF;
SFTVMU.IPVS = TUBSU.IPVS + EVSBUJPO.IPVS;
SFTVMU.IPVS += SFTVMU.NJOVUF / 60;
SFTVMU.NJOVUF %= 60;
SFTVMU.IPVS %= 24;
SFUVSO SFTVMU;
^
,I>@ OC@ @I? ODH@N JA .FBM J=E@>ON <M@ ><G>PG<O@? =T BEE%VSBUJPO(), %BJMZ1MBO
J=E@>ON NCJPG? =@ KMDIO@? <N DI OC@ AJGGJRDIB JPOKPO:
10:30-11:45 "#JLF 3JEF" NFFUJOH XJUI 4 BUUFOEFFT
12:30-14:00 .FBM, "EESFTT: fTUBOCVM
15:30-17:30 "#VEHFU" NFFUJOH XJUI 8 BUUFOEFFT
FG@5F;A@ %H7D>A36;@9
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
273
... F:7 EA>GF;A@
FG@5F;A@ %H7D>A36;@9
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
274
Member Functions 52
AGOCJPBC OCDN >C<KO@M AJ>PN@N JIGT JI NOMP>ON, HJNO JA OC@ DIAJMH<ODJI DI OCDN >C<KO@M DN
<KKGD><=G@ OJ >G<NN@N <N R@GG.
&I OCDN >C<KO@M R@ RDGG >JQ@M H@H=@M API>ODJIN JA NOMP>ON <I? ?@ADI@ OC@ NK@>D<G UP4USJOH()
H@H=@M API>ODJI OC<O DN PN@? AJM M@KM@N@IODIB J=E@>ON DI OC@ TUSJOH AJMH<O.
4C@I < NOMP>O JM >G<NN DN ?@ADI@?, PNP<GGT < IPH=@M JA API>ODJIN <M@ <GNJ ?@ADI@? <GJIBND?@
RDOC DO. 4@ C<Q@ N@@I @S<HKG@N JA NP>C API>ODJIN DI OC@ @<MGD@M >C<KO@MN: BEE%VSBUJPO() <I?
<I JQ@MGJ<? JA JOGP() C<Q@ =@@I RMDOO@I NK@>DAD><GGT OJ =@ PN@? RDOC OC@ 5JNF0G%BZ OTK@. &I <
N@IN@, OC@N@ ORJ API>ODJIN ?@ADI@ OC@ ;@F7D8357 JA 5JNF0G%BZ.
1C@ ADMNO K<M<H@O@M JA =JOC BEE%VSBUJPO() <I? JOGP() C<N =@@I OC@ 5JNF0G%BZ J=E@>O OC<O
@<>C API>ODJI RJPG? =@ JK@M<ODIB JI. A??DODJI<GGT, EPNO GDF@ <GG JA OC@ JOC@M API>ODJIN OC<O R@
C<Q@ N@@I NJ A<M, =JOC JA OC@ API>ODJIN C<Q@ =@@I ?@ADI@? <O OC@ ?A6G>7 >7H7>, JPOND?@ JA <IT
JOC@M N>JK@.
1C@ >JI>@KO JA < N@O JA API>ODJIN ?@O@MHDIDIB OC@ DIO@MA<>@ JA < NOMP>O DN Q@MT >JHHJI. #JM
OC<O M@<NJI, API>ODJIN OC<O <M@ >GJN@GT M@G<O@? OJ < OTK@ ><I =@ ?@ADI@? RDOCDI OC@ =J?T JA OC<O
OTK@.
Defining member functions
52.1
#PI>ODJIN OC<O <M@ ?@ADI@? RDOCDI OC@ >PMGT =M<>F@ON JA < TUSVDU <M@ ><GG@? ?7?47D
8G@5F;A@E:
TUSVDU 4PNF4USVDU
\
WPJE member_function(/* UIF QBSBNFUFST PG UIF GVODUJPO */)
\
// ... UIF EFGJOJUJPO PG UIF GVODUJPO ...
^
// ... UIF PUIFS NFNCFST PG UIF TUSVDU ...
^
*@H=@M API>ODJIN <M@ <>>@NN@? OC@ N<H@ R<T <N H@H=@M Q<MD<=G@N, N@K<M<O@? AMJH OC@ I<H@
JA OC@ J=E@>O =T < ?JO:
object.member_function(arguments);
4@ C<Q@ PN@? H@H=@M API>ODJIN =@AJM@ RC@I NK@>DATDIB TUEJO <I? TUEPVU @SKGD>DOGT ?PMDIB
DIKPO <I? JPOKPO JK@M<ODJIN:
TUEJO.SFBEG(" %T", &OVNCFS);
TUEPVU.XSJUFMO(OVNCFS);
1C@ SFBEG() <I? XSJUFMO() <=JQ@ <M@ H@H=@M API>ODJI ><GGN, JK@M<ODIB JI OC@ J=E@>ON
TUEJO <I? TUEPVU, M@NK@>ODQ@GT.
)@O'N ?@ADI@ JOGP() <N < H@H=@M API>ODJI. &ON KM@QDJPN ?@ADIDODJI C<N =@@I OC@ AJGGJRDIB:
WPJE JOGP(JO 5JNF0G%BZ UJNF)
\
XSJUFG("%02T:%02T", UJNF.IPVS, UJNF.NJOVUF);
^
#7?47D FG@5F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
275
*<FDIB JOGP() < H@H=@M API>ODJI DN IJO <N NDHKG@ <N HJQDIB DON ?@ADIDODJI DIND?@ OC@ NOMP>O.
1C@ API>ODJI HPNO =@ HJ?DAD@? DI ORJ R<TN:
TUSVDU 5JNF0G%BZ
\
JOU IPVS;
JOU NJOVUF;
WPJE JOGP() // (1)
\
XSJUFG("%02T:%02T", IPVS, NJOVUF); // (2)
^
^
1. 1C@ H@H=@M API>ODJI ?J@N IJO O<F@ OC@ J=E@>O @SKGD>DOGT <N < K<M<H@O@M.
2. #JM OC<O M@<NJI, DO M@A@MN OJ OC@ H@H=@M Q<MD<=G@N NDHKGT <N IPVS <I? NJOVUF.
1C@ M@<NJI DN OC<O H@H=@M API>ODJIN <M@ <GR<TN ><GG@? JI <I @SDNODIB J=E@>O. 1C@ J=E@>O DN
DHKGD>DOGT <Q<DG<=G@ OJ OC@ H@H=@M API>ODJI:
BVUP UJNF = 5JNF0G%BZ(10, 30);
UJNF.JOGP();
1C@ JOGP() H@H=@M API>ODJI DN =@DIB ><GG@? JI OC@ UJNF J=E@>O <=JQ@. 1C@ H@H=@MN IPVS
<I? NJOVUF OC<O <M@ M@A@MM@? OJ RDOCDI OC@ API>ODJI ?@ADIDODJI >JMM@NKJI? OJ OC@ H@H=@MN JA
OC@ UJNF J=E@>O, NK@>DAD><GGT UJNF.IPVS <I? UJNF.NJOVUF.
1C@ H@H=@M API>ODJI ><GG <=JQ@ DN <GHJNO OC@ @LPDQ<G@IO JA OC@ AJGGJRDIB M@BPG<M API>ODJI
><GG:
UJNF.JOGP(); // NFNCFS GVODUJPO
JOGP(UJNF); // SFHVMBS GVODUJPO (UIF QSFWJPVT EFGJOJUJPO)
4C@I@Q@M < H@H=@M API>ODJI DN ><GG@? JI <I J=E@>O, OC@ H@H=@MN JA OC@ J=E@>O <M@ DHKGD>DOGT
<>>@NND=G@ =T OC@ API>ODJI:
BVUP NPSOJOH = 5JNF0G%BZ(10, 0);
BVUP FWFOJOH = 5JNF0G%BZ(22, 0);
NPSOJOH.JOGP();
XSJUF('-');
FWFOJOH.JOGP();
XSJUFMO();
4C@I ><GG@? JI NPSOJOH, OC@ IPVS <I? NJOVUF OC<O <M@ PN@? DIND?@ OC@ H@H=@M API>ODJI
M@A@M OJ NPSOJOH.IPVS <I? NPSOJOH.NJOVUF. 0DHDG<MGT, RC@I ><GG@? JI FWFOJOH, OC@T M@A@M OJ
FWFOJOH.IPVS <I? FWFOJOH.NJOVUF:
10:00-22:00
UP4USJOH() for TUSJOH representations 52.1.1
4@ C<Q@ ?DN>PNN@? OC@ GDHDO<ODJIN JA OC@ JOGP() API>ODJI DI OC@ KM@QDJPN >C<KO@M. 1C@M@ DN <O
G@<NO JI@ HJM@ DI>JIQ@ID@I>@ RDOC DO: AGOCJPBC DO KMDION OC@ ODH@ DI CPH<I-M@<?<=G@ AJMH<O,
KMDIODIB OC@ '-' >C<M<>O@M <I? O@MHDI<ODIB OC@ GDI@ NODGG I@@?N OJ =@ ?JI@ @SKGD>DOGT =T OC@
KMJBM<HH@M.
%JR@Q@M, DO RJPG? =@ HJM@ >JIQ@ID@IO DA 5JNF0G%BZ J=E@>ON >JPG? =@ PN@? <N @<NT <N
API?<H@IO<G OTK@N <N DI OC@ AJGGJRDIB >J?@:
#7?47D FG@5F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
276
XSJUFGMO("%T-%T", NPSOJOH, FWFOJOH);
&I <??DODJI OJ M@?P>DIB AJPM GDI@N JA >J?@ OJ JI@, DO RJPG? <GNJ <GGJR KMDIODIB J=E@>ON OJ <IT
NOM@<H:
BVUP GJMF = 'JMF("UJNF@JOGPSNBUJPO", "X");
GJMF.XSJUFGMO("%T-%T", NPSOJOH, FWFOJOH);
1C@ UP4USJOH() H@H=@M API>DJI JA PN@M-?@ADI@? OTK@N <M@ OM@<O@? NK@>D<GGT: &O DN ><GG@?
<POJH<OD><GGT OJ KMJ?P>@ OC@ TUSJOH M@KM@N@IO<ODJIN JA J=E@>ON. UP4USJOH() HPNO M@OPMI OC@
TUSJOH M@KM@N@IO<ODJI JA OC@ J=E@>O.
4DOCJPO B@OODIB DIOJ HJM@ ?@O<DG, G@O'N ADMNO N@@ CJR OC@ UP4USJOH() API>ODJI DN ?@ADI@?:
JNQPSU TUE.TUEJP;
TUSVDU 5JNF0G%BZ
\
JOU IPVS;
JOU NJOVUF;
TUSJOH UP4USJOH()
\
SFUVSO "UPEP";
^
^
WPJE NBJO()
\
BVUP NPSOJOH = 5JNF0G%BZ(10, 0);
BVUP FWFOJOH = 5JNF0G%BZ(22, 0);
XSJUFGMO("%T-%T", NPSOJOH, FWFOJOH);
^
UP4USJOH() ?J@N IJO KMJ?P>@ <ITOCDIB H@<IDIBAPG T@O, =PO OC@ JPOKPO NCJRN OC<O DO C<N =@@I
><GG@? =T XSJUFGMO() ORD>@ AJM OC@ ORJ J=E@>O:
UPEP-UPEP
AGNJ IJO@ OC<O JOGP() DN IJO I@@?@? <ITHJM@. UP4USJOH() DN M@KG<>DIB DON API>ODJI<GDOT.
1C@ NDHKG@NO DHKG@H@IO<ODJI JA UP4USJOH() RJPG? =@ OJ ><GG GPSNBU() JA OC@ TUE.TUSJOH
HJ?PG@. GPSNBU() RJMFN DI OC@ N<H@ R<T <N OC@ AJMH<OO@? JPOKPO API>ODJIN GDF@ XSJUFG().
1C@ JIGT ?DAA@M@I>@ DN OC<O DINO@<? JA KMDIODIB Q<MD<=G@N, DO M@OPMIN OC@ AJMH<OO@? M@NPGO DI
TUSJOH AJMH<O.
UP4USJOH() ><I NDHKGT M@OPMI OC@ M@NPGO JA GPSNBU() ?DM@>OGT:
JNQPSU TUE.TUSJOH;
// ...
TUSVDU 5JNF0G%BZ
\
// ...
TUSJOH UP4USJOH()
\
SFUVSO GPSNBU("%02T:%02T", IPVS, NJOVUF);
^
^
#7?47D FG@5F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
277
+JO@ OC<O UP4USJOH() M@OPMIN OC@ M@KM@N@IO<ODJI JA JIGT F:;E J=E@>O. 1C@ M@NO JA OC@ JPOKPO DN
C<I?G@? =T XSJUFGMO(): &O ><GGN OC@ UP4USJOH() H@H=@M API>ODJI AJM OC@ ORJ J=E@>ON
N@K<M<O@GT, KMDION OC@ '-' >C<M<>O@M DI =@OR@@I, <I? ADI<GGT O@MHDI<O@N OC@ GDI@:
10:00-22:00
1C@ ?@ADIDODJI JA UP4USJOH() OC<O DN @SKG<DI@? <=JQ@ ?J@N IJO O<F@ <IT K<M<H@O@MN; DO NDHKGT
KMJ?P>@N < TUSJOH <I? M@OPMIN DO. AI <GO@MI<ODQ@ ?@ADIDODJI JA UP4USJOH() O<F@N < EFMFHBUF
K<M<H@O@M. 4@ RDGG N@@ OC<O ?@ADIDODJI G<O@M DI OC@ #PI>ODJI -JDIO@MN, !@G@B<O@N, <I? )<H=?<N
>C<KO@M.
Example: JODSFNFOU() member function 52.1.2
)@O'N ?@ADI@ < H@H=@M API>ODJI OC<O <??N < ?PM<ODJI OJ 5JNF0G%BZ J=E@>ON.
B@AJM@ ?JDIB OC<O, G@O'N ADMNO >JMM@>O < ?@NDBI AG<R OC<O R@ C<Q@ =@@I GDQDIB RDOC. 4@ C<Q@
N@@I DI OC@ 0OMP>ON >C<KO@M OC<O <??DIB ORJ 5JNF0G%BZ J=E@>ON DI BEE%VSBUJPO() DN IJO <
H@<IDIBAPG JK@M<ODJI:
5JNF0G%BZ BEE%VSBUJPO(JO 5JNF0G%BZ TUBSU,
JO 5JNF0G%BZ EVSBUJPO) // NFBOJOHMFTT
\
// ...
^
4C<O DN I<OPM<G OJ <?? OJ < KJDIO DI ODH@ DN 6GD3F;A@. #JM @S<HKG@, <??DIB OC@ OM<Q@G ?PM<ODJI
OJ OC@ ?@K<MOPM@ ODH@ RJPG? M@NPGO DI OC@ <MMDQ<G ODH@.
,I OC@ JOC@M C<I?, NP=OM<>ODIB ORJ KJDION DI ODH@ DN < I<OPM<G JK@M<ODJI, DI RCD>C ><N@ OC@
M@NPGO RJPG? =@ < 6GD3F;A@.
1C@ AJGGJRDIB KMJBM<H ?@ADI@N < %VSBUJPO NOMP>O RDOC HDIPO@-KM@>DNDJI, <I? <I
BEE%VSBUJPO() API>ODJI OC<O PN@N DO:
TUSVDU %VSBUJPO
\
JOU NJOVUF;
^
5JNF0G%BZ BEE%VSBUJPO(JO 5JNF0G%BZ TUBSU,
JO %VSBUJPO EVSBUJPO)
\
// #FHJO XJUI B DPQZ PG TUBSU
5JNF0G%BZ SFTVMU = TUBSU;
// "EE UIF EVSBUJPO UP JU
SFTVMU.NJOVUF += EVSBUJPO.NJOVUF;
// 5BLF DBSF PG PWFSGMPXT
SFTVMU.IPVS += SFTVMU.NJOVUF / 60;
SFTVMU.NJOVUF %= 60;
SFTVMU.IPVS %= 24;
SFUVSO SFTVMU;
^
VOJUUFTU
\
// " USJWJBM UFTU
BTTFSU(BEE%VSBUJPO(5JNF0G%BZ(10, 30), %VSBUJPO(10))
== 5JNF0G%BZ(10, 40));
// " UJNF BU NJEOJHIU
#7?47D FG@5F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
278
BTTFSU(BEE%VSBUJPO(5JNF0G%BZ(23, 9), %VSBUJPO(51))
== 5JNF0G%BZ(0, 0));
// " UJNF JO UIF OFYU EBZ
BTTFSU(BEE%VSBUJPO(5JNF0G%BZ(17, 45), %VSBUJPO(8 * 60))
== 5JNF0G%BZ(1, 45));
^
)@O'N M@?@ADI@ < NDHDG<M API>ODJI OCDN ODH@ <N < H@H=@M API>ODJI. BEE%VSBUJPO() C<N =@@I
KMJ?P>DIB < I@R J=E@>O <N DON M@NPGO. )@O'N ?@ADI@ <I JODSFNFOU() H@H=@M API>ODJI OC<O RDGG
?DM@>OGT HJ?DAT F:;E J=E@>O DINO@<?:
TUSVDU %VSBUJPO
\
JOU NJOVUF;
^
TUSVDU 5JNF0G%BZ
\
JOU IPVS;
JOU NJOVUF;
TUSJOH UP4USJOH()
\
SFUVSO GPSNBU("%02T:%02T", IPVS, NJOVUF);
^
WPJE JODSFNFOU(JO %VSBUJPO EVSBUJPO)
\
NJOVUF += EVSBUJPO.NJOVUF;
IPVS += NJOVUF / 60;
NJOVUF %= 60;
IPVS %= 24;
^
VOJUUFTU
\
BVUP UJNF = 5JNF0G%BZ(10, 30);
// " USJWJBM UFTU
UJNF.JODSFNFOU(%VSBUJPO(10));
BTTFSU(UJNF == 5JNF0G%BZ(10, 40));
// 15 IPVST MBUFS NVTU CF JO UIF OFYU EBZ
UJNF.JODSFNFOU(%VSBUJPO(15 * 60));
BTTFSU(UJNF == 5JNF0G%BZ(1, 40));
// 22 IPVST 20 NJOVUFT MBUFS NVTU CF NJEOJHIU
UJNF.JODSFNFOU(%VSBUJPO(22 * 60 + 20));
BTTFSU(UJNF == 5JNF0G%BZ(0, 0));
^
^
JODSFNFOU() DI>M@H@ION OC@ Q<GP@ JA OC@ J=E@>O =T OC@ NK@>DAD@? <HJPIO JA ?PM<ODJI. &I <
G<O@M >C<KO@M R@ RDGG N@@ CJR OC@ AB7D3FAD AH7D>A36;@9 A@<OPM@ JA ! RDGG H<F@ DO KJNND=G@ OJ
<?? < ?PM<ODJI =T OC@ += JK@M<OJM NTIO<S:
UJNF += %VSBUJPO(10); // UP CF FYQMBJOFE JO B MBUFS DIBQUFS
AGNJ IJO@ OC<O VOJUUFTU =GJ>FN ><I =@ RMDOO@I DIND?@ TUSVDU ?@ADIDODJIN <N R@GG, HJNOGT AJM
O@NODIB H@H=@M API>ODJIN. &O DN NODGG KJNND=G@ OJ HJQ@ NP>C VOJUUFTU =GJ>FN JPOND?@ JA OC@
=J?T JA OC@ NOMP>O:
#7?47D FG@5F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
279
TUSVDU 5JNF0G%BZ
\
// ... TUSVDU EFGJOJUJPO ...
^
VOJUUFTU
\
// ... TUSVDU UFTUT ...
^
Exercises
52.2
1. A?? < EFDSFNFOU() H@H=@M API>ODJI OJ 5JNF0G%BZ, RCD>C NCJPG? M@?P>@ OC@ ODH@ =T OC@
NK@>DAD@? <HJPIO JA ?PM<ODJI. 0DHDG<M OJ JODSFNFOU(), DO NCJPG? G@67D8>AI OJ OC@ KM@QDJPN
?<T RC@I OC@M@ DN IJO @IJPBC ODH@ DI OC@ >PMM@IO ?<T. #JM @S<HKG@, NP=OM<>ODIB 10
HDIPO@N AMJH 00:05 NCJPG? M@NPGO DI 23:55.
&I JOC@M RJM?N, DHKG@H@IO EFDSFNFOU() OJ K<NN OC@ AJGGJRDIB PIDO O@NON:
TUSVDU 5JNF0G%BZ
\
// ...
WPJE EFDSFNFOU(JO %VSBUJPO EVSBUJPO)
\
// ... QMFBTF JNQMFNFOU UIJT GVODUJPO ...
^
VOJUUFTU
\
BVUP UJNF = 5JNF0G%BZ(10, 30);
// " USJWJBM UFTU
UJNF.EFDSFNFOU(%VSBUJPO(12));
BTTFSU(UJNF == 5JNF0G%BZ(10, 18));
// 3 EBZT BOE 11 IPVST FBSMJFS
UJNF.EFDSFNFOU(%VSBUJPO(3 * 24 * 60 + 11 * 60));
BTTFSU(UJNF == 5JNF0G%BZ(23, 18));
// 23 IPVST BOE 18 NJOVUFT FBSMJFS NVTU CF NJEOJHIU
UJNF.EFDSFNFOU(%VSBUJPO(23 * 60 + 18));
BTTFSU(UJNF == 5JNF0G%BZ(0, 0));
// 1 NJOVUF FBSMJFS
UJNF.EFDSFNFOU(%VSBUJPO(1));
BTTFSU(UJNF == 5JNF0G%BZ(23, 59));
^
^
2. JIQ@MO .FFUJOH, .FBM, <I? %BJMZ1MBO JQ@MGJ<?N JA JOGP() OJ UP4USJOH() H@H=@M
API>ODJIN <N R@GG. (0@@ OC@ @S@M>DN@ NJGPODJIN JA OC@ #PI>ODJI ,Q@MGJ<?DIB >C<KO@M AJM
OC@DM JOGP() JQ@MGJ<?N.)
6JP RDGG IJOD>@ OC<O DI <??DODJI OJ H<FDIB OC@DM M@NK@>ODQ@ NOMP>ON HJM@ >JIQ@ID@IO,
OC@ DHKG@H@IO<ODJIN JA OC@ UP4USJOH() H@H=@M API>ODJIN RDGG <GG >JINDNO JA NDIBG@
GDI@N.
... F:7 EA>GF;A@E
#7?47D FG@5F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
280
DPOTU SFG Parameters and DPOTU Member Functions 53
1CDN >C<KO@M DN <=JPO CJR K<M<H@O@MN <I? H@H=@M API>ODJIN <M@ H<MF@? <N DPOTU NJ OC<O
OC@T ><I =@ PN@? RDOC JNNVUBCMF Q<MD<=G@N <N R@GG. AN R@ C<Q@ <GM@<?T >JQ@M@? DPOTU
K<M<H@O@MN DI @<MGD@M >C<KO@MN, NJH@ DIAJMH<ODJI DI OCDN >C<KO@M RDGG =@ < M@QD@R JA NJH@ JA
OC@ A@<OPM@N OC<O TJP <GM@<?T FIJR.
AGOCJPBC OC@ @S<HKG@N DI OCDN >C<KO@M PN@ JIGT NOMP>ON, DPOTU H@H=@M API>ODJIN <KKGT OJ
>G<NN@N <N R@GG.
JNNVUBCMF objects
53.1
4@ C<Q@ <GM@<?T N@@I OC<O DO DN IJO KJNND=G@ OJ HJ?DAT JNNVUBCMF Q<MD<=G@N:
JNNVUBCMF SFBEJOH5JNF = 5JNF0G%BZ(15, 0);
SFBEJOH5JNF ><IIJO =@ HJ?DAD@?:
SFBEJOH5JNF = 5JNF0G%BZ(16, 0); // j DPNQJMBUJPO &3303
SFBEJOH5JNF.NJOVUF += 10; // j DPNQJMBUJPO &3303
1C@ >JHKDG@M ?J@N IJO <GGJR HJ?DATDIB JNNVUBCMF J=E@>ON DI <IT R<T.
SFG parameters that are not DPOTU
53.2
4@ C<Q@ N@@I OCDN >JI>@KO @<MGD@M DI OC@ #PI>ODJI -<M<H@O@MN >C<KO@M. -<M<H@O@MN OC<O <M@
H<MF@? <N SFG ><I AM@@GT =@ HJ?DAD@? =T OC@ API>ODJI. #JM OC<O M@<NJI, @Q@I DA OC@ API>ODJI
?J@N IJO <>OP<GGT HJ?DAT OC@ K<M<H@O@M, OC@ >JHKDG@M ?J@N IJO <GGJR K<NNDIB JNNVUBCMF
J=E@>ON <N OC<O K<M<H@O@M:
/* "MUIPVHI OPU CFJOH NPEJGJFE CZ UIF GVODUJPO, 'EVSBUJPO'
* JT OPU NBSLFE BT 'DPOTU' */
JOU UPUBM4FDPOET(SFG %VSBUJPO EVSBUJPO)
\
SFUVSO 60 * EVSBUJPO.NJOVUF;
^
// ...
JNNVUBCMF XBSN6Q5JNF = %VSBUJPO(3);
UPUBM4FDPOET(XBSN6Q5JNF); // j DPNQJMBUJPO &3303
1C@ >JHKDG@M ?J@N IJO <GGJR K<NNDIB OC@ JNNVUBCMF XBSN6Q5JNF OJ UPUBM4FDPOET =@><PN@
OC<O API>ODJI ?J@N IJO BP<M<IO@@ OC<O OC@ K<M<H@O@M RDGG IJO =@ HJ?DAD@?.
DPOTU SFG parameters
53.3
DPOTU SFG H@<IN OC<O OC@ K<M<H@O@M DN IJO HJ?DAD@? =T OC@ API>ODJI:
JOU UPUBM4FDPOET(DPOTU SFG %VSBUJPO EVSBUJPO)
\
SFUVSO 60 * EVSBUJPO.NJOVUF;
^
// ...
JNNVUBCMF XBSN6Q5JNF = %VSBUJPO(3);
UPUBM4FDPOET(XBSN6Q5JNF); // j OPX DPNQJMFT
5A@EF D78 &3D3?7F7DE 3@6 5A@EF #7?47D FG@5F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
281
0P>C API>ODJIN ><I M@>@DQ@ JNNVUBCMF J=E@>ON <N K<M<H@O@MN =@><PN@ OC@ DHHPO<=DGDOT JA OC@
J=E@>O DN @IAJM>@? =T OC@ >JHKDG@M:
JOU UPUBM4FDPOET(DPOTU SFG %VSBUJPO EVSBUJPO)
\
EVSBUJPO.NJOVUF = 7; // j DPNQJMBUJPO &3303
// ...
^
Non-DPOTU member functions
53.4
AN R@ C<Q@ N@@I RDOC OC@ 5JNF0G%BZ.JODSFNFOU H@H=@M API>ODJI, J=E@>ON ><I =@ HJ?DAD@?
OCMJPBC H@H=@M API>ODJIN <N R@GG. JODSFNFOU() HJ?DAD@N OC@ H@H=@MN JA OC@ J=E@>O OC<O DO DN
><GG@? JI:
TUSVDU 5JNF0G%BZ
\
// ...
WPJE JODSFNFOU(JO %VSBUJPO EVSBUJPO)
\
NJOVUF += EVSBUJPO.NJOVUF;
IPVS += NJOVUF / 60;
NJOVUF %= 60;
IPVS %= 24;
^
// ...
^
// ...
BVUP TUBSU = 5JNF0G%BZ(5, 30);
TUBSU.JODSFNFOU(%VSBUJPO(30)); // 'TUBSU' HFUT NPEJGJFE
DPOTU member functions
53.5
0JH@ H@H=@M API>ODJIN ?J IJO H<F@ <IT HJ?DAD><ODJIN OJ OC@ J=E@>O OC<O OC@T <M@ ><GG@? JI.
AI @S<HKG@ JA NP>C < API>ODJI DN UP4USJOH():
TUSVDU 5JNF0G%BZ
\
// ...
TUSJOH UP4USJOH()
\
SFUVSO GPSNBU("%02T:%02T", IPVS, NJOVUF);
^
// ...
^
0DI>@ OC@ RCJG@ KPMKJN@ JA UP4USJOH() DN OJ M@KM@N@IO OC@ J=E@>O DI NOMDIB AJMH<O <ITR<T, DO
NCJPG? IJO HJ?DAT OC@ J=E@>O.
1C@ A<>O OC<O < H@H=@M API>ODJI ?J@N IJO HJ?DAT OC@ J=E@>O DN ?@>G<M@? =T OC@ DPOTU F@TRJM?
<AO@M OC@ K<M<H@O@M GDNO:
TUSVDU 5JNF0G%BZ
\
// ...
TUSJOH UP4USJOH() DPOTU
\
SFUVSO GPSNBU("%02T:%02T", IPVS, NJOVUF);
^
^
5A@EF D78 &3D3?7F7DE 3@6 5A@EF #7?47D FG@5F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
282
1C<O DPOTU BP<M<IO@@N OC<O OC@ J=E@>O DON@GA DN IJO BJDIB OJ =@ HJ?DAD@? =T OC@ H@H=@M
API>ODJI. AN < >JIN@LP@I>@, UP4USJOH() H@H=@M API>ODJI DN <GGJR@? OJ =@ ><GG@? @Q@I JI
JNNVUBCMF J=E@>ON. ,OC@MRDN@, OC@ NOMP>O'N UP4USJOH() RJPG? IJO =@ ><GG@?:
TUSVDU 5JNF0G%BZ
\
// ...
// *OGFSJPS EFTJHO: /PU NBSLFE BT 'DPOTU'
TUSJOH UP4USJOH()
\
SFUVSO GPSNBU("%02T:%02T", IPVS, NJOVUF);
^
^
// ...
JNNVUBCMF TUBSU = 5JNF0G%BZ(5, 30);
XSJUFMO(TUBSU); // 5JNF0G%BZ.UP4USJOH() JT OPU DBMMFE!
1C@ JPOKPO DN IJO OC@ @SK@>O@? 05:30, DI?D><ODIB OC<O < B@I@MD> API>ODJI B@ON ><GG@? DINO@<? JA
5JNF0G%BZ.UP4USJOH:
JNNVUBCMF(5JNF0G%BZ)(5, 30)
#PMOC@M, ><GGDIB UP4USJOH() JI <I JNNVUBCMF J=E@>O @SKGD>DOGT RJPG? ><PN@ < >JHKDG<ODJI
@MMJM:
BVUP T = TUBSU.UP4USJOH(); // j DPNQJMBUJPO &3303
A>>JM?DIBGT, OC@ UP4USJOH() API>ODJIN OC<O R@ C<Q@ ?@ADI@? DI OC@ KM@QDJPN >C<KO@M C<Q@ <GG
=@@I ?@NDBI@? DI>JMM@>OGT; OC@T NCJPG? C<Q@ =@@I H<MF@? <N DPOTU.
Note: ):7 const =7KIAD6 53@ 47 EB75;8;76 478AD7 F:7 678;@;F;A@ A8 F:7 8G@5F;A@ 3E I7>>:
// 5IF TBNF BT BCPWF
DPOTU TUSJOH UP4USJOH()
\
SFUVSO GPSNBU("%02T:%02T", IPVS, NJOVUF);
^
(;@57 F:;E H7DE;A@ ?3K 9;H7 F:7 ;@5ADD75F ;?BD7EE;A@ F:3F F:7 const ;E 3 B3DF A8 F:7 D7FGD@
FKB7, ! D75A??7@6 F:3F KAG EB75;8K ;F 38F7D F:7 B3D3?7F7D >;EF.
How to use
53.6
t 1J BDQ@ OC@ BP<M<IO@@ OC<O < K<M<H@O@M DN IJO HJ?DAD@? =T OC@ API>ODJI, H<MF OC<O
K<M<H@O@M <N JO, DPOTU, JM DPOTU SFG.
t *<MF H@H=@M API>ODJIN OC<O ?J IJO HJ?DAT OC@ J=E@>O <N DPOTU:
TUSVDU 5JNF0G%BZ
\
// ...
TUSJOH UP4USJOH() DPOTU
\
SFUVSO GPSNBU("%02T:%02T", IPVS, NJOVUF);
^
^
1CDN RJPG? H<F@ OC@ NOMP>O (JM >G<NN) HJM@ PN@APG =T M@HJQDIB <I PII@>@NN<MT
GDHDO<ODJI. 1C@ @S<HKG@N DI OC@ M@NO JA OC@ =JJF RDGG J=N@MQ@ OCDN BPD?@GDI@.
5A@EF D78 &3D3?7F7DE 3@6 5A@EF #7?47D FG@5F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
283
Constructor and Other Special Functions 54
AGOCJPBC OCDN >C<KO@M AJ>PN@N JIGT JI NOMP>ON, OC@ OJKD>N OC<O <M@ >JQ@M@? C@M@ <KKGT HJNOGT
OJ >G<NN@N <N R@GG. 1C@ ?DAA@M@I>@N RDGG =@ @SKG<DI@? DI G<O@M >C<KO@MN.
#JPM H@H=@M API>ODJIN JA NOMP>ON <M@ NK@>D<G =@><PN@ OC@T ?@ADI@ OC@ API?<H@IO<G JK@M<ODJIN
JA OC<O OTK@:
t JINOMP>OJM: UIJT()
t !@NOMP>OJM: _UIJT()
t -JNO=GDO: UIJT(UIJT)
t ANNDBIH@IO JK@M<OJM: PQ"TTJHO()
AGOCJPBC OC@N@ API?<H@IO<G JK@M<ODJIN <M@ C<I?G@? <POJH<OD><GGT AJM NOMP>ON, C@I>@ I@@? IJO
=@ ?@ADI@? =T OC@ KMJBM<HH@M, OC@T ><I =@ JQ@MMD??@I OJ H<F@ OC@ TUSVDU =@C<Q@ DI NK@>D<G
R<TN.
Constructor
54.1
1C@ M@NKJIND=DGDOT JA OC@ >JINOMP>OJM DN OJ KM@K<M@ <I J=E@>O AJM PN@ =T <NNDBIDIB <KKMJKMD<O@
Q<GP@N OJ DON H@H=@MN.
4@ C<Q@ <GM@<?T PN@? >JINOMP>OJMN DI KM@QDJPN >C<KO@MN. 4C@I OC@ I<H@ JA < OTK@ DN PN@?
GDF@ < API>ODJI, DO DN <>OP<GGT OC@ >JINOMP>OJM OC<O B@ON ><GG@?. 4@ ><I N@@ OCDN JI OC@ MDBCO-
C<I? ND?@ JA OC@ AJGGJRDIB GDI@:
BVUP CVT"SSJWBM = 5JNF0G%BZ(8, 30);
0DHDG<MGT, < 5>3EE J=E@>O DN =@DIB >JINOMP>O@? JI OC@ MDBCO C<I? ND?@ JA OC@ AJGGJRDIB GDI@:
BVUP WBSJBCMF = OFX 4PNF$MBTT();
1C@ <MBPH@ION OC<O <M@ NK@>DAD@? RDOCDI K<M@IOC@N@N >JMM@NKJI? OJ OC@ >JINOMP>OJM
K<M<H@O@MN. #JM @S<HKG@, OC@ Q<GP@N 8 <I? 30 <=JQ@ <M@ K<NN@? OJ OC@ 5JNF0G%BZ >JINOMP>OJM
<N DON K<M<H@O@MN.
Constructor syntax 54.1.1
!DAA@M@IO AMJH JOC@M API>ODJIN, >JINOMP>OJMN ?J IJO C<Q@ M@OPMI Q<GP@N. 1C@ I<H@ JA OC@
>JINOMP>OJM DN <GR<TN UIJT:
TUSVDU 4PNF4USVDU
\
// ...
UIJT(/* DPOTUSVDUPS QBSBNFUFST */)
\
// ... PQFSBUJPOT UIBU QSFQBSF UIF PCKFDU GPS VTF ...
^
^
1C@ >JINOMP>OJM K<M<H@O@MN DI>GP?@ DIAJMH<ODJI OC<O DN I@@?@? OJ H<F@ < PN@APG <I?
>JINDNO@IO J=E@>O.
CA@EFDG5FAD 3@6 %F:7D (B75;3> FG@5F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
284
Compiler-generated automatic constructor 54.1.2
AGG JA OC@ NOMP>ON OC<O R@ C<Q@ N@@I NJ A<M C<Q@ =@@I O<FDIB <?Q<IO<B@ JA < >JINOMP>OJM OC<O
C<N =@@I B@I@M<O@? <POJH<OD><GGT =T OC@ >JHKDG@M. 1C@ <POJH<OD> >JINOMP>OJM <NNDBIN OC@
K<M<H@O@M Q<GP@N OJ OC@ H@H=@MN DI OC@ JM?@M OC<O OC@T <M@ NK@>DAD@?.
AN TJP RDGG M@H@H=@M AMJH OC@ 0OMP>ON >C<KO@M, OC@ DIDOD<G Q<GP@N AJM OC@ OM<DGDIB H@H=@MN
I@@? IJO =@ NK@>DAD@?. 1C@ H@H=@MN OC<O <M@ IJO NK@>DAD@? B@O DIDOD<GDU@? =T OC@ .JOJU Q<GP@
JA OC@DM M@NK@>ODQ@ OTK@N. 1C@ .JOJU Q<GP@N JA < H@H=@M >JPG? =@ KMJQD?@? ?PMDIB OC@
?@ADIDODJI JA OC<O H@H=@M <AO@M OC@ = JK@M<OJM:
TUSVDU 5FTU
\
JOU NFNCFS = 42;
^
AGNJ >JIND?@MDIB OC@ 6783G>F B3D3?7F7D H3>G7E A@<OPM@ AMJH OC@ 3<MD<=G@ +PH=@M JA
-<M<H@O@MN >C<KO@M, R@ ><I DH<BDI@ OC<O OC@ <POJH<OD> >JINOMP>OJM AJM OC@ AJGGJRDIB TUSVDU
RJPG? =@ OC@ @LPDQ<G@IO JA OC@ AJGGJRDIB UIJT():
TUSVDU 5FTU
\
DIBS D;
JOU J;
EPVCMF E;
/* 5IF FRVJWBMFOU PG UIF DPNQJMFS-HFOFSBUFE BVUPNBUJD
* DPOTUSVDUPS (/PUF: 5IJT JT POMZ GPS EFNPOTUSBUJPO; UIF
* GPMMPXJOH DPOTUSVDUPS XPVME OPU BDUVBMMZ CF DBMMFE
* XIFO EFGBVMU-DPOTUSVDUJOH UIF PCKFDU BT 5FTU().) */
UIJT(JO DIBS D@QBSBNFUFS = DIBS.JOJU,
JO JOU J@QBSBNFUFS = JOU.JOJU,
JO EPVCMF E@QBSBNFUFS = EPVCMF.JOJU)
\
D = D@QBSBNFUFS;
J = J@QBSBNFUFS;
E = E@QBSBNFUFS;
^
^
#JM HJNO NOMP>ON, OC@ >JHKDG@M-B@I@M<O@? >JINOMP>OJM DN NPAAD>D@IO: 2NP<GGT, KMJQD?DIB
<KKMJKMD<O@ Q<GP@N AJM @<>C H@H=@M DN <GG OC<O DN I@@?@? AJM J=E@>ON OJ =@ >JINOMP>O@?.
Accessing the members by UIJT. 54.1.3
1J <QJD? HDSDIB OC@ K<M<H@O@MN RDOC OC@ H@H=@MN, OC@ K<M<H@O@M I<H@N <=JQ@ C<?
@QBSBNFUFS <KK@I?@? OJ OC@DM I<H@N. 1C@M@ RJPG? =@ >JHKDG<ODJI @MMJMN RDOCJPO ?JDIB OC<O:
TUSVDU 5FTU
\
DIBS D;
JOU J;
EPVCMF E;
UIJT(JO DIBS D = DIBS.JOJU,
JO JOU J = JOU.JOJU,
JO EPVCMF E = EPVCMF.JOJU)
\
// "O BUUFNQU UP BTTJHO BO 'JO' QBSBNFUFS UP JUTFMG!
D = D; // j DPNQJMBUJPO &3303
J = J;
E = E;
^
^
CA@EFDG5FAD 3@6 %F:7D (B75;3> FG@5F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
285
1C@ M@<NJI DN; D <GJI@ RJPG? H@<I OC@ K<M<H@O@M, IJO OC@ H@H=@M, <I? <N OC@ K<M<H@O@MN
<=JQ@ <M@ ?@ADI@? <N JO, OC@T ><IIJO =@ HJ?DAD@?:
&SSPS: WBSJBCMF EFOFNF.5FTU.UIJT.D DBOOPU NPEJGZ DPOTU
A NJGPODJI DN OJ KM@K@I? OC@ H@H=@M I<H@N RDOC UIJT.. &IND?@ H@H=@M API>ODJIN, UIJT
H@<IN "OCDN J=E@>O", H<FDIB UIJT.D H@<I "OC@ > H@H=@M JA OCDN J=E@>O":
UIJT(JO DIBS D = DIBS.JOJU,
JO JOU J = JOU.JOJU,
JO EPVCMF E = EPVCMF.JOJU)
\
UIJT.D = D;
UIJT.J = J;
UIJT.E = E;
^
+JR D <GJI@ H@<IN OC@ K<M<H@O@M <I? UIJT.D H@<IN OC@ H@H=@M, <I? OC@ >J?@ >JHKDG@N
<I? RJMFN <N @SK@>O@?: 1C@ H@H=@M D B@ON DIDOD<GDU@? =T OC@ Q<GP@ JA OC@ K<M<H@O@M D.
User-defined constructors 54.1.4
& C<Q@ ?@N>MD=@? OC@ =@C<QDJM JA OC@ >JHKDG@M-B@I@M<O@? >JINOMP>OJM. 0DI>@ OC<O >JINOMP>OJM
DN NPDO<=G@ AJM HJNO ><N@N, OC@M@ DN IJ I@@? OJ ?@ADI@ < >JINOMP>OJM =T C<I?.
0ODGG, OC@M@ <M@ ><N@N RC@M@ >JINOMP>ODIB <I J=E@>O DIQJGQ@N HJM@ >JHKGD><O@? JK@M<ODJIN
OC<I <NNDBIDIB Q<GP@N OJ @<>C H@H=@M DI JM?@M. AN <I @S<HKG@, G@O'N >JIND?@M %VSBUJPO AMJH
OC@ @<MGD@M >C<KO@MN:
TUSVDU %VSBUJPO
\
JOU NJOVUF;
^
1C@ >JHKDG@M-B@I@M<O@? >JINOMP>OJM DN NPAAD>D@IO AJM OCDN NDIBG@-H@H=@M NOMP>O:
UJNF.EFDSFNFOU(%VSBUJPO(12));
0DI>@ OC<O >JINOMP>OJM O<F@N OC@ ?PM<ODJI DI HDIPO@N, OC@ KMJBM<HH@MN RJPG? NJH@ODH@N
I@@? OJ H<F@ ><G>PG<ODJIN:
// 23 IPVST BOE 18 NJOVUFT FBSMJFS
UJNF.EFDSFNFOU(%VSBUJPO(23 * 60 + 18));
// 22 IPVST BOE 20 NJOVUFT MBUFS
UJNF.JODSFNFOU(%VSBUJPO(22 * 60 + 20));
1J @GDHDI<O@ OC@ I@@? AJM OC@N@ ><G>PG<ODJIN, R@ ><I ?@NDBI < %VSBUJPO >JINOMP>OJM OC<O
O<F@N ORJ K<M<H@O@MN <I? H<F@N OC@ ><G>PG<ODJI <POJH<OD><GGT:
TUSVDU %VSBUJPO
\
JOU NJOVUF;
UIJT(JOU IPVS, JOU NJOVUF)
\
UIJT.NJOVUF = IPVS * 60 + NJOVUF;
^
^
CA@EFDG5FAD 3@6 %F:7D (B75;3> FG@5F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
286
0DI>@ CJPM <I? HDIPO@ <M@ IJR N@K<M<O@ K<M<H@O@MN, OC@ PN@MN NDHKGT KMJQD?@ OC@DM Q<GP@N
RDOCJPO I@@?DIB OJ H<F@ OC@ ><G>PG<ODJI OC@HN@GQ@N:
// 23 IPVST BOE 18 NJOVUFT FBSMJFS
UJNF.EFDSFNFOU(%VSBUJPO(23, 18));
// 22 IPVST BOE 20 NJOVUFT MBUFS
UJNF.JODSFNFOU(%VSBUJPO(22, 20));
User-defined constructor disables compiler-generated constructor 54.1.5
A >JINOMP>OJM OC<O DN ?@ADI@? =T OC@ KMJBM<HH@M H<F@N NJH@ PN@N JA OC@ >JHKDG@M-B@I@M<O@?
>JINOMP>OJM DIQ<GD?: ,=E@>ON ><IIJO =@ >JINOMP>O@? =T 6783G>F B3D3?7F7D H3>G7E <ITHJM@. #JM
@S<HKG@, OMTDIB OJ >JINOMP>O %VSBUJPO =T < NDIBG@ K<M<H@O@M DN < >JHKDG<ODJI @MMJM:
UJNF.EFDSFNFOU(%VSBUJPO(12)); // j DPNQJMBUJPO &3303
<GGDIB OC@ >JINOMP>OJM RDOC < NDIBG@ K<M<H@O@M ?J@N IJO H<O>C OC@ KMJBM<HH@M'N
>JINOMP>OJM <I? OC@ >JHKDG@M-B@I@M<O@? >JINOMP>OJM DN ?DN<=G@?.
,I@ NJGPODJI DN OJ AH7D>A36 OC@ >JINOMP>OJM =T KMJQD?DIB <IJOC@M >JINOMP>OJM OC<O O<F@N EPNO
JI@ K<M<H@O@M:
TUSVDU %VSBUJPO
\
JOU NJOVUF;
UIJT(JOU IPVS, JOU NJOVUF)
\
UIJT.NJOVUF = IPVS * 60 + NJOVUF;
^
UIJT(JOU NJOVUF)
\
UIJT.NJOVUF = NJOVUF;
^
^
A PN@M-?@ADI@? >JINOMP>OJM ?DN<=G@N >JINOMP>ODIB J=E@>ON =T OC@ \ ^ NTIO<S <N R@GG:
%VSBUJPO EVSBUJPO = \ 5 ^; // j DPNQJMBUJPO &3303
&IDOD<GDUDIB RDOCJPO KMJQD?DIB <IT K<M<H@O@M DN NODGG Q<GD?:
BVUP E = %VSBUJPO(); // DPNQJMFT
1C@ M@<NJI DN, DI !, OC@ .JOJU Q<GP@ JA @Q@MT OTK@ HPNO =@ FIJRI <O >JHKDG@ ODH@. 1C@ Q<GP@
JA E <=JQ@ DN @LP<G OJ OC@ DIDOD<G Q<GP@ JA %VSBUJPO:
BTTFSU(E == %VSBUJPO.JOJU);
TUBUJD PQ$BMM instead of the default constructor 54.1.6
B@><PN@ OC@ DIDOD<G Q<GP@ JA @Q@MT OTK@ HPNO =@ FIJRI <O >JHKDG@ ODH@, DO DN DHKJNND=G@ OJ
?@ADI@ OC@ ?@A<PGO >JINOMP>OJM @SKGD>DOGT.
)@O'N >JIND?@M OC@ AJGGJRDIB >JINOMP>OJM OC<O OMD@N OJ KMDIO NJH@ DIAJMH<ODJI @Q@MT ODH@ <I
J=E@>O JA OC<O OTK@ DN >JINOMP>O@?:
CA@EFDG5FAD 3@6 %F:7D (B75;3> FG@5F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
287
TUSVDU 5FTU
\
UIJT() // j DPNQJMBUJPO &3303
\
XSJUFMO("" 5FTU PCKFDU JT CFJOH DPOTUSVDUFE.");
^
^
1C@ >JHKDG@M JPOKPO:
&SSPS: DPOTUSVDUPS EFOFNF.%FOFNF.UIJT EFGBVMU DPOTUSVDUPS GPS
TUSVDUT POMZ BMMPXFE XJUI !EJTBCMF BOE OP CPEZ
Note: ,7 I;>> E77 ;@ >3F7D 5:3BF7DE F:3F ;F ;E BAEE;4>7 FA 678;@7 F:7 6783G>F 5A@EFDG5FAD 8AD
5>3EE7E.
AN < RJMF<MJPI?, < IJ-K<M<H@O@M TUBUJD PQ$BMM() ><I =@ PN@? AJM >JINOMP>ODIB J=E@>ON
RDOCJPO KMJQD?DIB <IT K<M<H@O@MN. +JO@ OC<O OCDN C<N IJ @AA@>O JI OC@ .JOJU Q<GP@ JA OC@
OTK@.
#JM OCDN OJ RJMF, TUBUJD PQ$BMM() HPNO >JINOMP>O <I? M@OPMI <I J=E@>O JA OC<O NOMP>O OTK@:
JNQPSU TUE.TUEJP;
TUSVDU 5FTU
\
TUBUJD 5FTU PQ$BMM()
\
XSJUFMO("" 5FTU PCKFDU JT CFJOH DPOTUSVDUFE.");
5FTU UFTU;
SFUVSO UFTU;
^
^
WPJE NBJO()
\
BVUP UFTU = 5FTU();
^
1C@ 5FTU() ><GG DI NBJO() @S@>PO@N TUBUJD PQ$BMM():
" 5FTU PCKFDU JT CFJOH DPOTUSVDUFE.
+JO@ OC<O DO DN IJO KJNND=G@ OJ OTK@ 5FTU() DIND?@ TUBUJD PQ$BMM(). 1C<O NTIO<S RJPG?
@S@>PO@ TUBUJD PQ$BMM() <N R@GG <I? ><PN@ <I DIADIDO@ M@>PMNDJI:
TUBUJD 5FTU PQ$BMM()
\
XSJUFMO("" 5FTU PCKFDU JT CFJOH DPOTUSVDUFE.");
SFUVSO 5FTU(); // j $BMMT 'TUBUJD PQ$BMM()' BHBJO
1C@ JPOKPO:
" 5FTU PCKFDU JT CFJOH DPOTUSVDUFE.
" 5FTU PCKFDU JT CFJOH DPOTUSVDUFE.
" 5FTU PCKFDU JT CFJOH DPOTUSVDUFE.
... l SFQFBUT UIF TBNF NFTTBHF
CA@EFDG5FAD 3@6 %F:7D (B75;3> FG@5F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
288
Calling other constructors 54.1.7
JINOMP>OJMN ><I ><GG JOC@M >JINOMP>OJMN OJ <QJD? >J?@ ?PKGD><ODJI. AGOCJPBC %VSBUJPO DN OJJ
NDHKG@ OJ ?@HJINOM<O@ CJR PN@APG OCDN A@<OPM@ DN, OC@ AJGGJRDIB NDIBG@-K<M<H@O@M >JINOMP>OJM
O<F@N <?Q<IO<B@ JA OC@ ORJ-K<M<H@O@M >JINOMP>OJM:
UIJT(JOU IPVS, JOU NJOVUF)
\
UIJT.NJOVUF = IPVS * 60 + NJOVUF;
^
UIJT(JOU NJOVUF)
\
UIJT(0, NJOVUF); // DBMMT UIF PUIFS DPOTUSVDUPS
^
1C@ >JINOMP>OJM OC<O JIGT O<F@N OC@ HDIPO@ Q<GP@ ><GGN OC@ JOC@M >JINOMP>OJM =T K<NNDIB 0 <N
OC@ Q<GP@ JA CJPM.
Warning: ):7D7 ;E 3 67E;9@ 8>3I ;@ F:7 Duration 5A@EFDG5FADE 34AH7 4753GE7 F:7 ;@F7@F;A@ ;E
@AF 5>73D I:7@ F:7 A4<75FE 3D7 5A@EFDG5F76 4K 3 E;@9>7 B3D3?7F7D:
// 10 IPVST PS 10 NJOVUFT
BVUP USBWFM%VSBUJPO = %VSBUJPO(10);
AGOCJPBC DO DN KJNND=G@ OJ ?@O@MHDI@ =T M@<?DIB OC@ ?J>PH@IO<ODJI JM OC@ >J?@ JA OC@ NOMP>O
OC<O OC@ K<M<H@O@M <>OP<GGT H@<IN "10 HDIPO@N," DO DN <I DI>JINDNO@I>T <N OC@ ADMNO K<M<H@O@M
JA OC@ ORJ-K<M<H@O@M >JINOMP>OJM DN :AGDE.
0P>C ?@NDBI HDNO<F@N <M@ ><PN@N JA =PBN <I? HPNO =@ <QJD?@?.
Immutability of constructor parameters 54.1.8
&I OC@ &HHPO<=DGDOT >C<KO@M R@ C<Q@ N@@I OC<O DO DN IJO @<NT OJ ?@>D?@ RC@OC@M K<M<H@O@MN JA
M@A@M@I>@ OTK@N NCJPG? =@ ?@ADI@? <N DPOTU JM JNNVUBCMF. AGOCJPBC OC@ N<H@ >JIND?@M<ODJIN
<KKGT AJM >JINOMP>OJM K<M<H@O@MN <N R@GG, JNNVUBCMF DN PNP<GGT < =@OO@M >CJD>@ AJM
>JINOMP>OJM K<M<H@O@MN.
1C@ M@<NJI DN, DO DN >JHHJI OJ <NNDBI OC@ K<M<H@O@MN OJ H@H=@MN OJ =@ PN@? <O < G<O@M ODH@.
4C@I < K<M<H@O@M DN IJO JNNVUBCMF, OC@M@ DN IJ BP<M<IO@@ OC<O OC@ JMDBDI<G Q<MD<=G@ RDGG IJO
>C<IB@ =T OC@ ODH@ OC@ H@H=@M B@ON PN@?.
)@O'N >JIND?@M < >JINOMP>OJM OC<O O<F@N < ADG@ I<H@ <N < K<M<H@O@M. 1C@ ADG@ I<H@ RDGG =@ PN@?
G<O@M JI RC@I RMDODIB NOP?@IO BM<?@N. A>>JM?DIB OJ OC@ BPD?@GDI@N DI OC@ &HHPO<=DGDOT
>C<KO@M, OJ =@ HJM@ PN@APG, G@O'N <NNPH@ OC<O OC@ >JINOMP>OJM K<M<H@O@M DN ?@ADI@? <N
DPOTU DIBS<>:
JNQPSU TUE.TUEJP;
TUSVDU 4UVEFOU
\
DPOTU DIBS<> GJMF/BNF;
JOU<> HSBEFT;
UIJT(DPOTU DIBS<> GJMF/BNF)
\
UIJT.GJMF/BNF = GJMF/BNF;
^
WPJE TBWF()
\
BVUP GJMF = 'JMF(GJMF/BNF.JEVQ, "X");
CA@EFDG5FAD 3@6 %F:7D (B75;3> FG@5F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
289
GJMF.XSJUFMO("5IF HSBEFT PG UIF TUVEFOU:");
GJMF.XSJUFMO(HSBEFT);
^
// ...
^
WPJE NBJO()
\
DIBS<> GJMF/BNF;
GJMF/BNF _= "TUVEFOU@HSBEFT";
BVUP TUVEFOU = 4UVEFOU(GJMF/BNF);
// ...
/* "TTVNF UIF GJMF/BNF WBSJBCMF JT NPEJGJFE MBUFS PO
* QFSIBQT VOJOUFOUJPOBMMZ (BMM PG JUT DIBSBDUFST BSF
* CFJOH TFU UP '"' IFSF): */
GJMF/BNF<> = '"';
// ...
/* 5IF HSBEFT XPVME CF XSJUUFO UP UIF XSPOH GJMF: */
TUVEFOU.TBWF();
^
1C@ KMJBM<H <=JQ@ N<Q@N OC@ BM<?@N JA OC@ NOP?@IO PI?@M < ADG@ I<H@ OC<O >JINDNON JA A
>C<M<>O@MN, IJO OJ "TUVEFOU@HSBEFT". #JM OC<O M@<NJI, NJH@ODH@N DO DN HJM@ NPDO<=G@ OJ ?@ADI@
>JINOMP>OJM K<M<H@O@MN <I? H@H=@MN JA M@A@M@I>@ OTK@N <N JNNVUBCMF. 4@ FIJR OC<O OCDN DN
@<NT AJM NOMDIBN =T PNDIB <GD<N@N GDF@ TUSJOH. 1C@ AJGGJRDIB >J?@ NCJRN OC@ K<MON JA OC@ NOMP>O
OC<O RJPG? I@@? OJ =@ HJ?DAD@?:
TUSVDU 4UVEFOU
\
TUSJOH GJMF/BNF;
// ...
UIJT(TUSJOH GJMF/BNF)
\
// ...
^
// ...
^
+JR OC@ PN@MN JA OC@ NOMP>O HPNO KMJQD?@ JNNVUBCMF NOMDIBN <I? <N < M@NPGO OC@ >JIAPNDJI
<=JPO OC@ I<H@ JA OC@ ADG@ RJPG? =@ KM@Q@IO@?.
Type conversions through single-parameter constructors 54.1.9
0DIBG@-K<M<H@O@M >JINOMP>OJMN ><I =@ OCJPBCO JA <N KMJQD?DIB < NJMO JA OTK@ >JIQ@MNDJI: 1C@T
KMJ?P>@ <I J=E@>O JA OC@ K<MOD>PG<M NOMP>O OTK@ NO<MODIB AMJH < >JINOMP>OJM K<M<H@O@M. #JM
@S<HKG@, OC@ AJGGJRDIB >JINOMP>OJM KMJ?P>@N < 4UVEFOU J=E@>O AMJH < TUSJOH:
TUSVDU 4UVEFOU
\
TUSJOH OBNF;
UIJT(TUSJOH OBNF)
\
UIJT.OBNF = OBNF;
^
^
CA@EFDG5FAD 3@6 %F:7D (B75;3> FG@5F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
290
UP() <I? DBTU J=N@MQ@ OCDN =@C<QDJM <N < 5A@H7DE;A@ <N R@GG. 1J N@@ @S<HKG@N JA OCDN, G@O'N
>JIND?@M OC@ AJGGJRDIB TBMVUF() API>ODJI. 0@I?DIB < TUSJOH K<M<H@O@M RC@I DO @SK@>ON <
4UVEFOU RJPG? I<OPM<GGT ><PN@ < >JHKDG<ODJI @MMJM:
WPJE TBMVUF(4UVEFOU TUVEFOU)
\
XSJUFMO(")FMMP ", TUVEFOU.OBNF);
^
// ...
TBMVUF("+BOF"); // j DPNQJMBUJPO &3303
,I OC@ JOC@M C<I?, <GG JA OC@ AJGGJRDIB GDI@N @INPM@ OC<O < 4UVEFOU J=E@>O DN >JINOMP>O@?
=@AJM@ ><GGDIB OC@ API>ODJI:
JNQPSU TUE.DPOW;
// ...
TBMVUF(4UVEFOU("+BOF"));
TBMVUF(UP!4UVEFOU("+FBO"));
TBMVUF(DBTU(4UVEFOU)"+JN");
UP <I? DBTU O<F@ <?Q<IO<B@ JA OC@ NDIBG@-K<M<H@O@M >JINOMP>OJM =T >JINOMP>ODIB < O@HKJM<MT
4UVEFOU J=E@>O <I? ><GGDIB TBMVUF() RDOC OC<O J=E@>O.
Destructor
54.2
1C@ ?@NOMP>OJM DI>GP?@N OC@ JK@M<ODJIN OC<O HPNO =@ @S@>PO@? RC@I OC@ GDA@ODH@ JA <I J=E@>O
@I?N.
1C@ >JHKDG@M-B@I@M<O@? <POJH<OD> ?@NOMP>OJM @S@>PO@N OC@ ?@NOMP>OJMN JA <GG JA OC@ H@H=@MN
DI JM?@M. #JM OC<O M@<NJI, <N DO DN RDOC OC@ >JINOMP>OJM, OC@M@ DN IJ I@@? OJ ?@ADI@ < ?@NOMP>OJM
AJM HJNO NOMP>ON.
%JR@Q@M, NJH@ODH@N NJH@ NK@>D<G JK@M<ODJIN H<T I@@? OJ =@ @S@>PO@? RC@I <I J=E@>O'N
GDA@ODH@ @I?N. #JM @S<HKG@, <I JK@M<ODIB NTNO@H M@NJPM>@ OC<O OC@ J=E@>O JRIN H<T I@@? OJ
=@ M@OPMI@? OJ OC@ NTNO@H; < H@H=@M API>ODJI JA <IJOC@M J=E@>O H<T I@@? OJ =@ ><GG@?; <
N@MQ@M MPIIDIB NJH@RC@M@ JI OC@ I@ORJMF H<T I@@? OJ =@ IJODAD@? OC<O < >JII@>ODJI OJ DO DN
<=JPO OJ =@ O@MHDI<O@?; @O>.
1C@ I<H@ JA OC@ ?@NOMP>OJM DN _UIJT <I? EPNO GDF@ >JINOMP>OJMN, DO C<N IJ M@OPMI OTK@.
Destructor is executed automatically 54.2.1
1C@ ?@NOMP>OJM DN @S@>PO@? <N NJJI <N OC@ GDA@ODH@ JA OC@ NOMP>O @I?N. AN TJP RJPG? M@H@H=@M
AMJH OC@ )DA@ODH@N <I? #PI?<H@IO<G ,K@M<ODJIN >C<KO@M, OC@ GDA@ODH@ JA <I J=E@>O @I?N RC@I
G@<QDIB OC@ N>JK@ OC<O DO DN ?@ADI@? DI.
1C@ AJGGJRDIB <M@ ODH@N RC@I OC@ GDA@ODH@ JA < NOMP>O @I?N:
t 4C@I G@<QDIB OC@ N>JK@ JA OC@ J=E@>O @DOC@M IJMH<GGT JM ?P@ OJ < OCMJRI @S>@KODJI:
JG (B$POEJUJPO) \
BVUP EVSBUJPO = %VSBUJPO(7);
// ...
^ // j 5IF EFTUSVDUPS JT FYFDVUFE GPS 'EVSBUJPO' BU UIJT QPJOU
t AIJITHJPN J=E@>ON <M@ ?@NOMJT@? <O OC@ @I? JA OC@ RCJG@ @SKM@NNDJI OC<O OC@T <M@
>JINOMP>O@? DI:
CA@EFDG5FAD 3@6 %F:7D (B75;3> FG@5F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
291
UJNF.JODSFNFOU(%VSBUJPO(5)); // j 5IF %VSBUJPO(5) PCKFDU
// HFUT EFTUSPZFE BU UIF FOE
// PG UIF XIPMF FYQSFTTJPO.
t AGG JA OC@ NOMP>O H@H=@MN JA < NOMP>O J=E@>O B@O ?@NOMJT@? RC@I OC@ JPO@M J=E@>O DN
?@NOMJT@?.
Destructor example 54.2.2
)@O'N ?@NDBI < OTK@ AJM B@I@M<ODIB NDHKG@ 5*) ?J>PH@ION. 5*) @G@H@ION <M@ ?@ADI@? =T
<IBG@ =M<>F@ON. 1C@T >JIO<DI ?<O< <I? JOC@M 5*) @G@H@ION. 5*) @G@H@ION ><I C<Q@
<OOMD=PO@N <N R@GG; R@ RDGG DBIJM@ OC@H C@M@.
,PM <DH RDGG =@ OJ @INPM@ OC<O <I @G@H@IO OC<O C<N =@@I AB7@76 =T < <OBNF> O<B RDGG <GR<TN
=@ 5>AE76 =T < H<O>CDIB </OBNF> O<B:
<DMBTT1> j PQFOJOH UIF PVUFS 9.- FMFNFOU
<HSBEF> j PQFOJOH UIF JOOFS 9.- FMFNFOU
57 j UIF EBUB
</HSBEF> j DMPTJOH UIF JOOFS FMFNFOU
</DMBTT1> j DMPTJOH UIF PVUFS FMFNFOU
A NOMP>O OC<O ><I KMJ?P>@ OC@ JPOKPO <=JQ@ ><I =@ ?@NDBI@? =T ORJ H@H=@MN OC<O NOJM@ OC@
O<B AJM OC@ 5*) @G@H@IO <I? OC@ DI?@IO<ODJI OJ PN@ RC@I KMDIODIB DO:
TUSVDU 9NM&MFNFOU
\
TUSJOH OBNF;
TUSJOH JOEFOUBUJPO;
^
&A OC@ M@NKJIND=DGDOD@N JA JK@IDIB <I? >GJNDIB OC@ 5*) @G@H@IO <M@ BDQ@I OJ OC@ >JINOMP>OJM
<I? OC@ ?@NOMP>OJM, M@NK@>ODQ@GT, OC@ ?@NDM@? JPOKPO ><I =@ KMJ?P>@? =T H<I<BDIB OC@
GDA@ODH@N JA 5HG"G@H@IO J=E@>ON. #JM @S<HKG@, OC@ >JINOMP>OJM ><I KMDIO <UBH> <I? OC@
?@NOMP>OJM ><I KMDIO </UBH>.
1C@ AJGGJRDIB ?@ADIDODJI JA OC@ >JINOMP>OJM KMJ?P>@N OC@ JK@IDIB O<B:
UIJT(JO TUSJOH OBNF, JO JOU MFWFM)
\
UIJT.OBNF = OBNF;
UIJT.JOEFOUBUJPO = JOEFOUBUJPO4USJOH(MFWFM);
XSJUFMO(JOEFOUBUJPO, '<', OBNF, '>');
^
JOEFOUBUJPO4USJOH() DN OC@ AJGGJRDIB API>ODJI:
JNQPSU TUE.BSSBZ;
// ...
TUSJOH JOEFOUBUJPO4USJOH(JO JOU MFWFM)
\
SFUVSO SFQMJDBUF(" ", MFWFM * 2);
^
1C@ API>ODJI ><GGN SFQMJDBUF() AMJH OC@ TUE.BSSBZ HJ?PG@, RCD>C H<F@N <I? M@OPMIN < I@R
NOMDIB H<?@ PK JA OC@ NK@>DAD@? Q<GP@ M@K@<O@? OC@ NK@>DAD@? IPH=@M JA ODH@N.
1C@ ?@NOMP>OJM ><I =@ ?@ADI@? NDHDG<M OJ OC@ >JINOMP>OJM OJ KMJ?P>@ OC@ >GJNDIB O<B:
CA@EFDG5FAD 3@6 %F:7D (B75;3> FG@5F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
292
_UIJT()
\
XSJUFMO(JOEFOUBUJPO, "</", OBNF, '>');
^
%@M@ DN < O@NO >J?@ OJ ?@HJINOM<O@ OC@ @AA@>ON JA OC@ <POJH<OD> >JINOMP>OJM <I? ?@NOMP>OJM
><GGN:
WPJE NBJO()
\
JNNVUBCMF DMBTTFT = 9NM&MFNFOU("DMBTTFT", 0);
GPSFBDI (DMBTT*E; 0 .. 2) \
JNNVUBCMF DMBTT5BH = "DMBTT" _ UP!TUSJOH(DMBTT*E);
JNNVUBCMF DMBTT&MFNFOU = 9NM&MFNFOU(DMBTT5BH, 1);
GPSFBDI (J; 0 .. 3) \
JNNVUBCMF HSBEF&MFNFOU = 9NM&MFNFOU("HSBEF", 2);
JNNVUBCMF SBOEPN(SBEF = VOJGPSN(50, 101);
XSJUFMO(JOEFOUBUJPO4USJOH(3), SBOEPN(SBEF);
^
^
^
+JO@ OC<O OC@ 9NM&MFNFOU J=E@>ON <M@ >M@<O@? DI OCM@@ N@K<M<O@ N>JK@N DI OC@ KMJBM<H <=JQ@.
1C@ JK@IDIB <I? >GJNDIB O<BN JA OC@ 5*) @G@H@ION DI OC@ JPOKPO <M@ KMJ?P>@? NJG@GT =T OC@
>JINOMP>OJM <I? OC@ ?@NOMP>OJM JA 9NM&MFNFOU.
& C<Q@ DI?D><O@? OC@ H<O>CDIB JK@IDIB <I? >GJNDIB O<BN JA OC@ JPO@M, OC@ HD??G@, <I? OC@
DII@M N>JK@N =T ?DAA@M@IO >JGJMN:
<DMBTTFT>
<DMBTT0>
<HSBEF>
72
</HSBEF>
<HSBEF>
97
</HSBEF>
<HSBEF>
90
</HSBEF>
</DMBTT0>
<DMBTT1>
<HSBEF>
77
</HSBEF>
<HSBEF>
87
</HSBEF>
<HSBEF>
56
</HSBEF>
</DMBTT1>
</DMBTTFT>
CA@EFDG5FAD 3@6 %F:7D (B75;3> FG@5F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
293
1C@ <DMBTTFT> @G@H@IO DN KMJ?P>@? =T OC@ DMBTTFT&MFNFOU Q<MD<=G@. B@><PN@ OC<O Q<MD<=G@
DN >JINOMP>O@? ADMNO DI NBJO(), OC@ JPOKPO >JIO<DIN OC@ JPOKPO JA DON >JINOMP>ODJI ADMNO. 0DI>@ DO
DN <GNJ OC@ Q<MD<=G@ OC<O DN ?@NOMJT@? G<NO, PKJI G@<QDIB NBJO(), OC@ JPOKPO >JIO<DIN OC@
JPOKPO JA OC@ ?@NOMP>OJM ><GG AJM DON ?@NOMP>ODJI G<NO.
Postblit
54.3
CABK;@9 DN >JINOMP>ODIB < I@R J=E@>O AMJH <I @SDNODIB JI@. JKTDIB DIQJGQ@N ORJ NO@KN:
1. JKTDIB OC@ H@H=@MN JA OC@ @SDNODIB J=E@>O OJ OC@ I@R J=E@>O. 1CDN NO@K DN ><GG@? 4>;F,
NCJMO AJM 4>A5= FD3@E87D.
2. *<FDIB APMOC@M <?EPNOH@ION OJ OC@ I@R J=E@>O. 1CDN NO@K DN ><GG@? BAEF4>;F.
1C@ ADMNO NO@K DN C<I?G@? <POJH<OD><GGT =T OC@ >JHKDG@M: &O >JKD@N OC@ H@H=@MN JA OC@ @SDNODIB
J=E@>O OJ OC@ H@H=@MN JA OC@ I@R J=E@>O:
BVUP SFUVSO5SJQ%VSBUJPO = USJQ%VSBUJPO; // DPQZJOH
!J IJO >JIAPN@ >JKTDIB RDOC 3EE;9@?7@F. 1C@ BVUP F@TRJM? <=JQ@ DN <I DI?D><ODJI OC<O < I@R
J=E@>O DN =@DIB ?@ADI@?. 1C@ <>OP<G OTK@ I<H@ >JPG? C<Q@ =@@I NK@GG@? JPO DINO@<? JA BVUP.
#JM <I JK@M<ODJI OJ =@ <NNDBIH@IO, OC@ J=E@>O JI OC@ G@AO-C<I? ND?@ HPNO =@ <I @SDNODIB
J=E@>O. #JM @S<HKG@, <NNPHDIB OC<O SFUVSO5SJQ%VSBUJPO C<N <GM@<?T =@@I ?@ADI@?:
SFUVSO5SJQ%VSBUJPO = USJQ%VSBUJPO; // BTTJHONFOU (TFF CFMPX)
0JH@ODH@N DO DN I@>@NN<MT OJ H<F@ <?EPNOH@ION OJ OC@ H@H=@MN JA OC@ I@R J=E@>O <AO@M OC@
<POJH<OD> =GDO. 1C@N@ JK@M<ODJIN <M@ ?@ADI@? DI OC@ KJNO=GDO API>ODJI JA OC@ NOMP>O.
0DI>@ DO DN <=JPO J=E@>O >JINOMP>ODJI, OC@ I<H@ JA OC@ KJNO=GDO DN UIJT <N R@GG. 1J N@K<M<O@ DO
AMJH OC@ JOC@M >JINOMP>OJMN, DON K<M<H@O@M GDNO >JIO<DIN OC@ F@TRJM? UIJT:
UIJT(UIJT)
\
// ...
^
4@ C<Q@ ?@ADI@? < 4UVEFOU OTK@ DI OC@ 0OMP>ON >C<KO@M, RCD>C C<? < KMJ=G@H <=JPO >JKTDIB
J=E@>ON JA OC<O OTK@:
TUSVDU 4UVEFOU
\
JOU OVNCFS;
JOU<> HSBEFT;
^
B@DIB < NGD>@, OC@ HSBEFT H@H=@M JA OC<O TUSVDU DN < M@A@M@I>@ OTK@. 1C@ >JIN@LP@I>@ JA
>JKTDIB < 4UVEFOU J=E@>O DN OC<O OC@ HSBEFT H@H=@MN JA =JOC OC@ JMDBDI<G <I? OC@ >JKT
KMJQD?@ <>>@NN OJ OC@ N<H@ <>OP<G <MM<T @G@H@ION JA OTK@ JOU. AN < M@NPGO, OC@ @AA@>O JA
HJ?DATDIB < BM<?@ OCMJPBC JI@ JA OC@N@ J=E@>ON DN N@@I OCMJPBC OC@ JOC@M J=E@>O <N R@GG:
BVUP TUVEFOU1 = 4UVEFOU(1, < 70, 90, 85 >);
BVUP TUVEFOU2 = TUVEFOU1; // DPQZJOH
TUVEFOU2.OVNCFS = 2;
TUVEFOU1.HSBEFT<0> += 5; // UIJT DIBOHFT UIF HSBEF PG UIF
CA@EFDG5FAD 3@6 %F:7D (B75;3> FG@5F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
294
// TFDPOE TUVEFOU BT XFMM:
BTTFSU(TUVEFOU2.HSBEFT<0> == 75);
1J <QJD? NP>C < >JIAPNDJI, OC@ @G@H@ION JA OC@ HSBEFT H@H=@M JA OC@ N@>JI? J=E@>O HPNO =@
N@K<M<O@ <I? =@GJIB JIGT OJ OC<O J=E@>O. 0P>C 36<GEF?7@FE <M@ ?JI@ DI OC@ KJNO=GDO:
TUSVDU 4UVEFOU
\
JOU OVNCFS;
JOU<> HSBEFT;
UIJT(UIJT)
\
HSBEFT = HSBEFT.EVQ;
^
^
/@H@H=@M OC<O <GG JA OC@ H@H=@MN C<Q@ <GM@<?T =@@I >JKD@? <POJH<OD><GGT =@AJM@
UIJT(UIJT) NO<MO@? @S@>PODIB. 1C@ NDIBG@ GDI@ DI OC@ KJNO=GDO <=JQ@ H<F@N < >JKT JA OC@
7>7?7@FE JA OC@ JMDBDI<G <MM<T <I? <NNDBIN < NGD>@ JA DO =<>F OJ HSBEFT. AN < M@NPGO, OC@ I@R
J=E@>O B@ON DON JRI >JKT JA OC@ BM<?@N.
*<FDIB HJ?DAD><ODJIN OCMJPBC OC@ ADMNO J=E@>O ?J@N IJO <AA@>O OC@ N@>JI? J=E@>O <ITHJM@:
TUVEFOU1.HSBEFT<0> += 5;
BTTFSU(TUVEFOU2.HSBEFT<0> == 70);
Assignment operator
54.4
ANNDBH@IO DN BDQDIB < I@R Q<GP@ OJ <I @SDNODIB J=E@>O:
SFUVSO5SJQ%VSBUJPO = USJQ%VSBUJPO; // BTTJHONFOU
ANNDBIH@IO DN OC@ HJNO DIQJGQ@? JK@M<ODJI <HJIB OC@ NK@>D<G API>ODJIN =@><PN@ DO DN <
>JH=DI<ODJI JA ORJ JK@M<ODJIN OC<O R@ C<Q@ N@@I <=JQ@:
t !@NOMJTDIB OC@ G@AO-C<I? ND?@ J=E@>O
t JINOMP>ODIB OC@ G@AO-C<I? ND?@ J=E@>O AMJH OC@ MDBCO-C<I? ND?@ J=E@>O
%JR@Q@M, <KKGTDIB OC@ ORJ NO@KN <=JQ@ DI OC<O JM?@M DN MDNFT =@><PN@ OC@ JMDBDI<G J=E@>O
RJPG? =@ ?@NOMJT@? =@AJM@ @INPMDIB OC<O OC@ >JKTDIB RJPG? NP>>@@?. AI @S>@KODJI OC<O DN
OCMJRI ?PMDIB OC@ >JKTDIB RJPG? G@<Q@ OC@ G@AO-C<I? ND?@ J=E@>O DI <I DI>JINDNO@IO (APGGT-
?@NOMJT@? JM C<GA-?@NOMJT@?) NO<O@.
#JM OC<O M@<NJI, OC@ >JHKDG@M-B@I@M<O@? <NNDBIH@IO JK@M<OJM HPNO <>O N<A@GT =T <KKGTDIB OC@
AJGGJRDIB NO@KN:
1. JKT OC@ G@AO-C<I? ND?@ J=E@>O OJ < O@HKJM<MT J=E@>O
2. JKT OC@ MDBCO-C<I? ND?@ J=E@>O OJ OC@ G@AO-C<I? ND?@ J=E@>O
3. !@NOMJT OC@ O@HKJM<MT J=E@>O
AGOCJPBC OC@ >JHKDG@M-B@I@M<O@? <NNDBIH@IO JK@M<OJM DN NPDO<=G@ DI HJNO ><N@N, DO ><I =@
?@ADI@? =T OC@ KMJBM<HH@M. 4C@I TJP ?J OC<O, >JIND?@M KJO@IOD<G @S>@KODJIN <I? RMDO@ OC@
<NNDBIH@IO JK@M<OJM DI < R<T OC<O RJMFN @Q@I <O OC@ KM@N@I>@ JA OCMJRI @S>@KODJIN.
1C@ NTIO<S JA OC@ <NNDBIH@IO JK@M<OJM DN OC@ AJGGJRDIB:
t 1C@ I<H@ JA OC@ API>ODJI DN PQ"TTJHO.
CA@EFDG5FAD 3@6 %F:7D (B75;3> FG@5F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
295
t 1C@ OTK@ JA OC@ K<M<H@O@M DN OC@ N<H@ <N OC@ TUSVDU OTK@. 1CDN K<M<H@O@M DN JAO@I I<H@?
<N SIT, NCJMO AJM D;9:F-:3@6 E;67.
t 1C@ M@OPMI OTK@ DN OC@ N<H@ <N OC@ TUSVDU OTK@.
t 1C@ API>ODJI DN @SDO@? =T SFUVSO UIJT.
AN <I @S<HKG@, G@O'N >JIND?@M < NDHKG@ %VSBUJPO NOMP>O RC@M@ OC@ <NNDBIH@IO JK@M<OJM KMDION
< H@NN<B@:
TUSVDU %VSBUJPO
\
JOU NJOVUF;
%VSBUJPO PQ"TTJHO(%VSBUJPO SIT)
\
XSJUFGMO("NJOVUF JT CFJOH DIBOHFE GSPN %T UP %T",
UIJT.NJOVUF, SIT.NJOVUF);
UIJT.NJOVUF = SIT.NJOVUF;
SFUVSO UIJT;
^
^
// ...
BVUP EVSBUJPO = %VSBUJPO(100);
EVSBUJPO = %VSBUJPO(200); // BTTJHONFOU
1C@ JPOKPO:
NJOVUF JT CFJOH DIBOHFE GSPN 100 UP 200
Assigning from other types 54.4.1
0JH@ODH@N DO DN >JIQ@ID@IO OJ <NNDBI Q<GP@N JA OTK@N OC<O <M@ ?DAA@M@IO AMJH OC@ OTK@ JA OC@
TUSVDU. #JM @S<HKG@, DINO@<? JA M@LPDMDIB < %VSBUJPO J=E@>O JI OC@ MDBCO-C<I? ND?@, DO H<T
=@ PN@APG OJ <NNDBI AMJH <I DIO@B@M:
EVSBUJPO = 300;
1CDN DN KJNND=G@ =T ?@ADIDIB <IJOC@M <NNDBIH@IO JK@M<OJM OC<O O<F@N <I JOU K<M<H@O@M:
TUSVDU %VSBUJPO
\
JOU NJOVUF;
%VSBUJPO PQ"TTJHO(%VSBUJPO SIT)
\
XSJUFGMO("NJOVUF JT CFJOH DIBOHFE GSPN %T UP %T",
UIJT.NJOVUF, SIT.NJOVUF);
UIJT.NJOVUF = SIT.NJOVUF;
SFUVSO UIJT;
^
%VSBUJPO PQ"TTJHO(JOU NJOVUF)
\
XSJUFGMO("NJOVUF JT CFJOH SFQMBDFE CZ BO JOU");
UIJT.NJOVUF = NJOVUF;
SFUVSO UIJT;
^
^
// ...
CA@EFDG5FAD 3@6 %F:7D (B75;3> FG@5F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
296
EVSBUJPO = %VSBUJPO(200);
EVSBUJPO = 300;
1C@ JPOKPO:
NJOVUF JT CFJOH DIBOHFE GSPN 100 UP 200
NJOVUF JT CFJOH SFQMBDFE CZ BO JOU
Note: AGOCJPBC >JIQ@ID@IO, <NNDBIDIB ?DAA@M@IO OTK@N OJ @<>C JOC@M H<T ><PN@ >JIAPNDJIN <I?
@MMJMN.
Summary
54.5
t JINOMP>OJM (UIJT) DN AJM KM@K<MDIB J=E@>ON AJM PN@. 1C@ >JHKDG@M-B@I@M<O@? ?@A<PGO
>JINOMP>OJM DN NPAAD>D@IO DI HJNO ><N@N.
t 1C@ =@C<QDJM JA OC@ ?@A<PGO >JINOMP>OJM H<T IJO =@ >C<IB@? DI NOMP>ON; TUBUJD PQ$BMM
><I =@ PN@? DINO@<?.
t 0DIBG@-K<M<H@O@M >JINOMP>OJMN ><I =@ PN@? ?PMDIB OTK@ >JIQ@MNDJIN =T UP <I? DBTU.
t !@NOMP>OJM (_UIJT) DN AJM OC@ JK@M<ODJIN OC<O HPNO =@ @S@>PO@? RC@I OC@ GDA@ODH@N JA
J=E@>ON @I?.
t -JNO=GDO (UIJT(UIJT)) DN AJM <?EPNOH@ION OJ OC@ J=E@>O <AO@M OC@ <POJH<OD> H@H=@M >JKD@N.
t ANNDBH@IO JK@M<OJM (PQ"TTJHO) DN AJM >C<IBDIB Q<GP@N JA @SDNODIB J=E@>ON.
CA@EFDG5FAD 3@6 %F:7D (B75;3> FG@5F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
297
Operator Overloading 55
1C@ OJKD>N >JQ@M@? DI OCDN >C<KO@M <KKGT HJNOGT AJM >G<NN@N <N R@GG. 1C@ =DBB@NO ?DAA@M@I>@ DN
OC<O OC@ =@C<QDJM JA <NNDBIH@IO JK@M<ODJI PQ"TTJHO() ><IIJO =@ JQ@MGJ<?@? AJM >G<NN@N.
,K@M<OJM JQ@MGJ<?DIB @I<=G@N ?@ADIDIB CJR PN@M-?@ADI@? OTK@N =@C<Q@ RC@I PN@? RDOC
JK@M<OJMN. &I OCDN >JIO@SO, OC@ O@MH AH7D>A36 H@<IN KMJQD?DIB OC@ ?@ADIDODJI JA <I JK@M<OJM
AJM < NK@>DAD> OTK@.
4@ C<Q@ N@@I CJR OJ ?@ADI@ NOMP>ON <I? OC@DM H@H=@M API>ODJIN DI KM@QDJPN >C<KO@MN. AN <I
@S<HKG@, R@ C<Q@ ?@ADI@? OC@ JODSFNFOU() H@H=@M API>ODJI OJ =@ <=G@ OJ <?? %VSBUJPO
J=E@>ON OJ 5JNF0G%BZ J=E@>ON. %@M@ <M@ OC@ ORJ NOMP>ON AMJH KM@QDJPN >C<KO@MN, RDOC JIGT OC@
K<MON OC<O <M@ M@G@Q<IO OJ OCDN >C<KO@M:
TUSVDU %VSBUJPO
\
JOU NJOVUF;
^
TUSVDU 5JNF0G%BZ
\
JOU IPVS;
JOU NJOVUF;
WPJE JODSFNFOU(JO %VSBUJPO EVSBUJPO)
\
NJOVUF += EVSBUJPO.NJOVUF;
IPVS += NJOVUF / 60;
NJOVUF %= 60;
IPVS %= 24;
^
^
WPJE NBJO()
\
BVUP MVODI5JNF = 5JNF0G%BZ(12, 0);
MVODI5JNF.JODSFNFOU(%VSBUJPO(10));
^
A =@I@ADO JA H@H=@M API>ODJIN DN =@DIB <=G@ OJ ?@ADI@ JK@M<ODJIN JA < OTK@ <GJIBND?@ OC@
H@H=@M Q<MD<=G@N JA OC<O OTK@.
!@NKDO@ OC@DM <?Q<IO<B@N, H@H=@M API>ODJIN ><I =@ N@@I <N =@DIB GDHDO@? >JHK<M@? OJ
JK@M<ODJIN JI API?<H@IO<G OTK@N. AAO@M <GG, API?<H@IO<G OTK@N ><I M@<?DGT =@ PN@? RDOC
JK@M<OJMN:
JOU XFJHIU = 50;
XFJHIU += 10; // CZ BO PQFSBUPS
A>>JM?DIB OJ RC<O R@ C<Q@ N@@I NJ A<M, NDHDG<M JK@M<ODJIN ><I JIGT =@ <>CD@Q@? =T H@H=@M
API>ODJIN AJM PN@M-?@ADI@? OTK@N:
BVUP MVODI5JNF = 5JNF0G%BZ(12, 0);
MVODI5JNF.JODSFNFOU(%VSBUJPO(10)); // CZ B NFNCFS GVODUJPO
,K@M<OJM JQ@MGJ<?DIB @I<=G@N PNDIB NOMP>ON <I? >G<NN@N RDOC JK@M<OJMN <N R@GG. #JM @S<HKG@,
<NNPHDIB OC<O OC@ += JK@M<OJM DN ?@ADI@? AJM 5JNF0G%BZ, OC@ JK@M<ODJI <=JQ@ ><I =@ RMDOO@I
DI @S<>OGT OC@ N<H@ R<T <N RDOC API?<H@IO<G OTK@N:
MVODI5JNF += %VSBUJPO(10); // CZ BO PQFSBUPS FWFO GPS UIF TUSVDU
%B7D3FAD %H7D>A36;@9
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
298
B@AJM@ B@OODIB OJ OC@ ?@O<DGN JA JK@M<OJM JQ@MGJ<?DIB, G@O'N ADMNO N@@ CJR OC@ GDI@ <=JQ@ RJPG?
=@ @I<=G@? AJM 5JNF0G%BZ. 4C<O DN I@@?@? DN OJ M@?@ADI@ OC@ JODSFNFOU() H@H=@M API>ODJI
PI?@M OC@ NK@>D<G I<H@ PQ0Q"TTJHO(TUSJOH PQ) <I? <GNJ OJ NK@>DAT OC<O OCDN ?@ADIDODJI DN AJM
OC@ + >C<M<>O@M. AN DO RDGG =@ @SKG<DI@? =@GJR, OCDN ?@ADIDODJI <>OP<GGT >JMM@NKJI?N OJ OC@ +=
JK@M<OJM.
1C@ ?@ADIDODJI JA OCDN H@H=@M API>ODJI ?J@N IJO GJJF GDF@ OC@ JI@N OC<O R@ C<Q@ N@@I NJ A<M.
1C<O DN =@><PN@ PQ0Q"TTJHO DN <>OP<GGT < 8G@5F;A@ F7?B>3F7. 0DI>@ R@ RDGG N@@ O@HKG<O@N DI
HP>C G<O@M >C<KO@MN, & RDGG C<Q@ OJ <NF TJP OJ <>>@KO OC@ JK@M<OJM JQ@MGJ<?DIB NTIO<S <N-DN AJM
IJR:
TUSVDU 5JNF0G%BZ
\
// ...
SFG 5JNF0G%BZ PQ0Q"TTJHO(TUSJOH PQ)(JO %VSBUJPO EVSBUJPO) // (1)
JG (PQ == "+") // (2)
\
NJOVUF += EVSBUJPO.NJOVUF;
IPVS += NJOVUF / 60;
NJOVUF %= 60;
IPVS %= 24;
SFUVSO UIJT;
^
^
1C@ O@HKG<O@ ?@ADIDODJI >JINDNON JA ORJ K<MON:
1. PQ0Q"TTJHO(TUSJOH PQ): 1CDN K<MO HPNO =@ RMDOO@I <N-DN <I? NCJPG? =@ <>>@KO@? <N OC@
@3?7 JA OC@ API>ODJI. 4@ RDGG N@@ =@GJR OC<O OC@M@ <M@ JOC@M H@H=@M API>ODJIN DI <??DODJI
OJ PQ0Q"TTJHO.
2. JG (PQ == "+"): PQ0Q"TTJHO DN PN@? AJM HJM@ OC<I JI@ JK@M<OJM JQ@MGJ<?. "+" NK@>DAD@N
OC<O OCDN DN OC@ JK@M<OJM JQ@MGJ<? OC<O >JMM@NKJI?N OJ OC@ + >C<M<>O@M. 1CDN NTIO<S DN <
F7?B>3F7 5A@EFD3;@F, RCD>C RDGG <GNJ =@ >JQ@M@? DI G<O@M >C<KO@MN.
AGNJ IJO@ OC<O OCDN ODH@ OC@ M@OPMI OTK@ DN ?DAA@M@IO AMJH OC@ M@OPMI OTK@ JA OC@ JODSFNFOU()
H@H=@M API>ODJI: &O DN IJO WPJE <ITHJM@. 4@ RDGG ?DN>PNN OC@ M@OPMI OTK@N JA JK@M<OJMN G<O@M
=@GJR.
B@CDI? OC@ N>@I@N, OC@ >JHKDG@M M@KG<>@N OC@ PN@N JA OC@ += JK@M<OJM RDOC ><GGN OJ OC@
PQ0Q"TTJHO!"+" H@H=@M API>ODJI:
MVODI5JNF += %VSBUJPO(10);
// 5IF GPMMPXJOH MJOF JT UIF FRVJWBMFOU PG UIF QSFWJPVT POF
MVODI5JNF.PQ0Q"TTJHO!"+"(%VSBUJPO(10));
1C@ !"+" K<MO OC<O DN <AO@M PQ0Q"TTJHO NK@>DAD@N OC<O OCDN ><GG DN AJM OC@ ?@ADIDODJI JA OC@
JK@M<OJM AJM OC@ + >C<M<>O@M. 4@ RDGG >JQ@M OCDN O@HKG<O@ NTIO<S DI G<O@M >C<KO@MN <N R@GG.
+JO@ OC<O OC@ JK@M<OJM ?@ADIDODJI OC<O >JMM@NKJI?N OJ += DN ?@ADI@? =T "+", IJO =T "+=". 1C@
"TTJHO DI OC@ I<H@ JA PQ0Q"TTJHO() <GM@<?T DHKGD@N OC<O OCDN I<H@ DN AJM <I <NNDBIH@IO
JK@M<OJM.
Do not change conventional behaviors
55.1
B@DIB <=G@ OJ ?@ADI@ OC@ =@C<QDJMN JA JK@M<OJMN =MDIBN < M@NKJIND=DGDOT: 1C@ KMJBM<HH@M HPNO
J=N@MQ@ @SK@>O<ODJIN. AN <I @SOM@H@ @S<HKG@, OC@ KM@QDJPN JK@M<OJM >JPG? C<Q@ =@@I ?@ADI@?
%B7D3FAD %H7D>A36;@9
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
299
OJ ?@>M@H@IO OC@ ODH@ Q<GP@ DINO@<? JA DI>M@H@IODIB DO. %JR@Q@M, K@JKG@ RCJ M@<? OC@ >J?@
RJPG? NODGG @SK@>O OC@ Q<GP@ OJ =@ DI>M@H@IO@? =T OC@ += JK@M<OJM.
1J NJH@ @SO@IO, OC@ M@OPMI OTK@N JA JK@M<OJMN ><I <GNJ =@ >CJN@I AM@@GT. 0ODGG, B@I@M<G
@SK@>O<ODJIN HPNO =@ J=N@MQ@? AJM OC@ M@OPMI OTK@N <N R@GG.
(@@K DI HDI? OC<O JK@M<OJMN OC<O =@C<Q@ PII<OPM<GGT RJPG? ><PN@ >JIAPNDJIN <I? =PBN.
Overloadable unary operators
55.2
AI JK@M<OJM OC<O O<F@N < NDIBG@ JK@M<I? DN ><GG@? < PI<MT JK@M<OJM:
++XFJHIU;
++ DN < PI<MT JK@M<OJM =@><PN@ DO RJMFN JI < NDIBG@ Q<MD<=G@.
2I<MT JK@M<OJMN <M@ ?@ADI@? =T H@H=@M API>ODJIN I<H@? PQ6OBSZ. PQ6OBSZ ?J@N IJO O<F@
<IT K<M<H@O@MN =@><PN@ DO PN@N JIGT OC@ J=E@>O OC<O OC@ JK@M<OJM DN =@DIB @S@>PO@? JI.
1C@ JQ@MGJ<?<=G@ PI<MT JK@M<OJMN <I? OC@ >JMM@NKJI?DIB JK@M<OJM NOMDIBN <M@ OC@ AJGGJRDIB:
0QFSBUPS %FTDSJQUJPO 0QFSBUPS 4USJOH
-PCKFDU OFHBUJWF PG (OVNFSJD DPNQMFNFOU PG) "-"
+PCKFDU UIF TBNF WBMVF BT (PS, B DPQZ PG) "+"
_PCKFDU CJUXJTF OFHBUJPO "_"
*PCKFDU BDDFTT UP XIBU JU QPJOUT UP "*"
++PCKFDU JODSFNFOU "++"
--PCKFDU EFDSFNFOU "--"
#JM @S<HKG@, OC@ ++ JK@M<OJM AJM %VSBUJPO ><I =@ ?@ADI@? GDF@ OCDN:
TUSVDU %VSBUJPO
\
JOU NJOVUF;
SFG %VSBUJPO PQ6OBSZ(TUSJOH PQ)()
JG (PQ == "++")
\
++NJOVUF;
SFUVSO UIJT;
^
^
+JO@ OC<O OC@ M@OPMI OTK@ JA OC@ JK@M<OJM DN H<MF@? <N SFG C@M@ <N R@GG. 1CDN RDGG =@
@SKG<DI@? G<O@M =@GJR.
%VSBUJPO J=E@>ON ><I IJR =@ DI>M@H@IO@? =T ++:
BVUP EVSBUJPO = %VSBUJPO(20);
++EVSBUJPO;
1C@ KJNO-DI>M@H@IO <I? KJNO-?@>M@H@IO JK@M<OJMN ><IIJO =@ JQ@MGJ<?@?. 1C@ PCKFDU++ <I?
PCKFDU-- PN@N <M@ C<I?G@? =T OC@ >JHKDG@M <POJH<OD><GGT =T N<QDIB OC@ KM@QDJPN Q<GP@ JA OC@
J=E@>O. #JM @S<HKG@, OC@ >JHKDG@M <KKGD@N OC@ @LPDQ<G@IO JA OC@ AJGGJRDIB >J?@ AJM KJNO-
DI>M@H@IO:
/* 5IF QSFWJPVT WBMVF JT DPQJFE CZ UIF DPNQJMFS
* BVUPNBUJDBMMZ: */
%B7D3FAD %H7D>A36;@9
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
300
%VSBUJPO @@QSFWJPVT7BMVF@@ = EVSBUJPO;
/* 5IF ++ PQFSBUPS JT DBMMFE: */
++EVSBUJPO;
/* 5IFO @@QSFWJPVT7BMVF@@ JT VTFE BT UIF WBMVF PG UIF
* QPTU-JODSFNFOU PQFSBUJPO. */
Overloadable binary operators
55.3
AI JK@M<OJM OC<O O<F@N ORJ JK@M<I?N DN ><GG@? < =DI<MT JK@M<OJM:
UPUBM8FJHIU = CPY8FJHIU + DIPDPMBUF8FJHIU;
1C@ GDI@ <=JQ@ C<N ORJ N@K<M<O@ =DI<MT JK@M<OJMN: OC@ + JK@M<OJM, RCD>C <??N OC@ Q<GP@N JA
OC@ ORJ JK@M<I?N OC<O <M@ JI DON ORJ ND?@N, <I? OC@ = JK@M<OJM OC<O <NNDBIN OC@ Q<GP@ JA DON
MDBCO-C<I? JK@M<I? OJ DON G@AO-C<I? JK@M<I?.
1C@ MDBCOHJNO >JGPHI =@GJR ?@N>MD=@N OC@ ><O@BJMT JA @<>C JK@M<OJM. 1C@ JI@N H<MF@? <N
"=" <NNDBI OJ OC@ G@AO-C<I? ND?@ J=E@>O.
%B7D3FAD %H7D>A36;@9
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
301
0QFSBUPS %FTDSJQUJPO 'VODUJPO OBNF
'VODUJPO OBNF
GPS SJHIU-IBOE TJEF $BUFHPSZ
+ BEE PQ#JOBSZ PQ#JOBSZ3JHIU BSJUINFUJD
- TVCUSBDU PQ#JOBSZ PQ#JOBSZ3JHIU BSJUINFUJD
* NVMUJQMZ PQ#JOBSZ PQ#JOBSZ3JHIU BSJUINFUJD
/ EJWJEF PQ#JOBSZ PQ#JOBSZ3JHIU BSJUINFUJD
% SFNBJOEFS PG PQ#JOBSZ PQ#JOBSZ3JHIU BSJUINFUJD
?? UP UIF QPXFS PG PQ#JOBSZ PQ#JOBSZ3JHIU BSJUINFUJD
& CJUXJTF and PQ#JOBSZ PQ#JOBSZ3JHIU CJUXJTF
] CJUXJTF or PQ#JOBSZ PQ#JOBSZ3JHIU CJUXJTF
? CJUXJTF xor PQ#JOBSZ PQ#JOBSZ3JHIU CJUXJTF
<< MFGU-TIJGU PQ#JOBSZ PQ#JOBSZ3JHIU CJUXJTF
>> SJHIU-TIJGU PQ#JOBSZ PQ#JOBSZ3JHIU CJUXJTF
>>> MPHJDBM SJHIU-TIJGU PQ#JOBSZ PQ#JOBSZ3JHIU CJUXJTF
_ DPODBUFOBUF PQ#JOBSZ PQ#JOBSZ3JHIU
JO XIFUIFS DPOUBJOFE JO PQ#JOBSZ PQ#JOBSZ3JHIU
== XIFUIFS FRVBM UP PQ&RVBMT - MPHJDBM
!= XIFUIFS OPU FRVBM UP PQ&RVBMT - MPHJDBM
< XIFUIFS CFGPSF PQ$NQ - TPSUJOH
<= XIFUIFS OPU BGUFS PQ$NQ - TPSUJOH
> XIFUIFS BGUFS PQ$NQ - TPSUJOH
>= XIFUIFS OPU CFGPSF PQ$NQ - TPSUJOH
= BTTJHO PQ"TTJHO - =
+= JODSFNFOU PQ0Q"TTJHO - =
-= EFDSFNFOU PQ0Q"TTJHO - =
*= NVMUJQMZ BOE BTTJHO PQ0Q"TTJHO - =
/= EJWJEF BOE BTTJHO PQ0Q"TTJHO - =
%= BTTJHO UIF SFNBJOEFS PG PQ0Q"TTJHO - =
??= BTTJHO UIF QPXFS PG PQ0Q"TTJHO - =
&= BTTJHO UIF SFTVMU PG & PQ0Q"TTJHO - =
]= BTTJHO UIF SFTVMU PG ] PQ0Q"TTJHO - =
?= BTTJHO UIF SFTVMU PG ? PQ0Q"TTJHO - =
<<= BTTJHO UIF SFTVMU PG << PQ0Q"TTJHO - =
>>= BTTJHO UIF SFTVMU PG >> PQ0Q"TTJHO - =
>>>= BTTJHO UIF SFTVMU PG >>> PQ0Q"TTJHO - =
_= BQQFOE PQ0Q"TTJHO - =
PQ#JOBSZ3JHIU DN AJM RC@I OC@ J=E@>O ><I <KK@<M JI OC@ MDBCO-C<I? ND?@ JA OC@ JK@M<OJM. )@O'N
<NNPH@ < =DI<MT JK@M<OJM OC<O R@ NC<GG ><GG AB <KK@<MN DI OC@ KMJBM<H:
Y op Z
&I JM?@M OJ ?@O@MHDI@ RC<O H@H=@M API>ODJI OJ ><GG, OC@ >JHKDG@M >JIND?@MN OC@ AJGGJRDIB ORJ
JKODJIN:
Y.PQ#JOBSZ!"PQ"(Z); // UIF EFGJOJUJPO GPS Y CFJOH PO UIF MFGU
Z.PQ#JOBSZ3JHIU!"PQ"(Y); // UIF EFGJOJUJPO GPS Z CFJOH PO UIF SJHIU
1C@ >JHKDG@M KD>FN OC@ JKODJI OC<O DN < =@OO@M H<O>C OC<I OC@ JOC@M.
%B7D3FAD %H7D>A36;@9
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
302
&I HJNO ><N@N DO DN IJO I@>@NN<MT OJ ?@ADI@ PQ#JOBSZ3JHIU, @S>@KO AJM OC@ JO JK@M<OJM: &O
PNP<GGT H<F@N HJM@ N@IN@ OJ ?@ADI@ PQ#JOBSZ3JHIU AJM JO.
1C@ K<M<H@O@M I<H@ SIT OC<O <KK@<MN DI OC@ AJGGJRDIB ?@ADIDODJIN DN NCJMO AJM D;9:F-:3@6 E;67.
&O ?@IJO@N OC@ JK@M<I? OC<O <KK@<MN JI OC@ MDBCO-C<I? ND?@ JA OC@ JK@M<OJM:
Y op Z
#JM OC@ @SKM@NNDJI <=JQ@, OC@ SIT K<M<H@O@M RJPG? M@KM@N@IO OC@ Q<MD<=G@ Z.
Other operators that can be overloaded
55.4
&I <??DODJI OJ OC@ PI<MT <I? =DI<MT JK@M<OJMN <=JQ@, OC@ AJGGJRDIB JK@M<OJMN ><I <GNJ =@
JQ@MGJ<?@?:
%FTDSJQUJPO 'VODUJPO /BNF 4BNQMF 6TBHF
GVODUJPO DBMM PQ$BMM PCKFDU(42)
FMFNFOU BDDFTT PQ*OEFY DPMMFDUJPO<J>
BTTJHONFOU UP FMFNFOU PQ*OEFY"TTJHO DPMMFDUJPO<J> = 7
VOBSZ PQFSBUJPO PO FMFNFOU PQ*OEFY6OBSZ ++DPMMFDUJPO<J>
PQFSBUJPO XJUI BTTJHONFOU PO FMFNFOU PQ*OEFY0Q"TTJHO DPMMFDUJPO<J> *= 2
TMJDF UP BMM FMFNFOUT PQ4MJDF DPMMFDUJPO<>
TMJDF UP TPNF FMFNFOUT PQ4MJDF DPMMFDUJPO<J, K>
VOBSZ PQFSBUJPO PO BMM FMFNFOUT PQ4MJDF6OBSZ ++DPMMFDUJPO<>
VOBSZ PQFSBUJPO PO TPNF FMFNFOUT PQ4MJDF6OBSZ ++DPMMFDUJPO<J, K>
BTTJHONFOU UP BMM FMFNFOUT PQ4MJDF"TTJHO DPMMFDUJPO<> = 42
BTTJHONFOU UP TPNF FMFNFOUT PQ4MJDF"TTJHO DPMMFDUJPO<J, K> = 7
PQFSBUJPO XJUI BTTJHONFOU PO BMM FMFNFOUT PQ4MJDF0Q"TTJHO DPMMFDUJPO<> *= 2
PQFSBUJPO XJUI BTTJHONFOU PO TPNF FMFNFOUT PQ4MJDF0Q"TTJHO DPMMFDUJPO<J, K> *= 2
EJTQBUDI GPS OPO-FYJTUFOU GVODUJPO PQ%JTQBUDI PCKFDU.OPO&YJTUFOU()
1C@N@ JK@M<OJMN RDGG =@ @SKG<DI@? =@GJR PI?@M OC@DM JRI N@>ODJIN.
Return types of operators
55.5
4C@I JQ@MGJ<?DIB <I JK@M<OJM, DO DN <?QDN<=G@ OJ J=N@MQ@ OC@ M@OPMI OTK@ JA OC@ N<H@ JK@M<OJM
JI API?<H@IO<G OTK@N. 1CDN RJPG? C@GK RDOC H<FDIB N@IN@ JA >J?@ <I? M@?P>DIB >JIAPNDJIN.
+JI@ JA OC@ JK@M<OJMN JI API?<H@IO<G OTK@N M@OPMI WPJE. 1CDN A<>O NCJPG? =@ J=QDJPN AJM
NJH@ JK@M<OJMN. #JM @S<HKG@, OC@ M@NPGO JA <??DIB ORJ JOU Q<GP@N <N B + C DN JOU:
JOU B = 1;
JOU C = 2;
JOU D = B + C; // D HFUT JOJUJBMJ[FE CZ UIF SFUVSO WBMVF
// PG UIF + PQFSBUPS
1C@ M@OPMI Q<GP@N JA NJH@ JOC@M JK@M<OJMN H<T IJO =@ NJ J=QDJPN. #JM @S<HKG@, @Q@I
JK@M<OJMN GDF@ ++J C<Q@ Q<GP@N:
JOU J = 1;
XSJUFMO(++J); // QSJOUT 2
%B7D3FAD %H7D>A36;@9
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
303
1C@ ++ JK@M<OJM IJO JIGT DI>M@H@ION J, DO <GNJ KMJ?P>@N OC@ I@R Q<GP@ JA J. #PMOC@M, OC@
Q<GP@ OC<O DN KMJ?P>@? =T ++ DN IJO EPNO OC@ I@R Q<GP@ JA J, M<OC@M F:7 H3D;34>7 i ;FE7>8. 4@
><I N@@ OCDN A<>O =T KMDIODIB OC@ <??M@NN JA OC@ M@NPGO JA OC<O @SKM@NNDJI:
JOU J = 1;
XSJUFMO("5IF BEESFTT PG J : ", &J);
XSJUFMO("5IF BEESFTT PG UIF SFTVMU PG ++J: ", &(++J));
1C@ JPOKPO >JIO<DIN D?@IOD><G <??M@NN@N:
5IF BEESFTT PG J : 7'''39#'&&78
5IF BEESFTT PG UIF SFTVMU PG ++J: 7'''39#'&&78
& M@>JHH@I? OC<O TJP J=N@MQ@ OC@ AJGGJRDIB BPD?@GDI@N RC@I JQ@MGJ<?DIB JK@M<OJMN AJM TJPM
JRI OTK@N:
t Operators that modify the object
4DOC OC@ @S>@KODJI JA PQ"TTJHO, DO DN M@>JHH@I?@? OC<O OC@ JK@M<OJMN OC<O HJ?DAT OC@
J=E@>O M@OPMI OC@ J=E@>O DON@GA. 1CDN BPD?@GDI@ C<N =@@I J=N@MQ@? <=JQ@ RDOC OC@
5JNF0G%BZ.PQ0Q"TTJHO!"+" <I? %VSBUJPO.PQ6OBSZ!"++".
1C@ AJGGJRDIB ORJ NO@KN <>CD@Q@ M@OPMIDIB OC@ J=E@>O DON@GA:
1. 1C@ M@OPMI OTK@ DN OC@ OTK@ JA OC@ NOMP>O, H<MF@? =T OC@ SFG F@TRJM? OJ H@<I
D787D7@57.
2. 1C@ API>ODJI DN @SDO@? =T SFUVSO UIJT OJ H@<I D7FGD@ F:;E A4<75F.
1C@ JK@M<OJMN OC<O HJ?DAT OC@ J=E@>O <M@ PQ6OBSZ!"++", PQ6OBSZ!"--", <I? <GG JA OC@
PQ0Q"TTJHO JQ@MGJ<?N.
t Logical operators
PQ&RVBMT OC<O M@KM@N@ION =JOC == <I? != HPNO M@OPMI CPPM. AGOCJPBC OC@ JO
JK@M<OJM IJMH<GGT M@OPMIN F:7 5A@F3;@76 A4<75F, DO ><I NDHKGT M@OPMI CPPM <N R@GG.
t Sort operators
PQ$NQ OC<O M@KM@N@ION <, <=, >, <I? >= HPNO M@OPMI JOU.
t Operators that make a new object
0JH@ JK@M<OJMN HPNO H<F@ <I? M@OPMI < I@R J=E@>O:
w 2I<MT JK@M<OJMN -, +, <I? _; <I? OC@ =DI<MT JK@M<OJM _.
w AMDOCH@OD> JK@M<OJMN +, -, *, /, %, <I? ??.
w BDORDN@ JK@M<OJMN &, ], ?, <<, >>, <I? >>>.
w AN C<N =@@I N@@I DI OC@ KM@QDJPN >C<KO@M, PQ"TTJHO M@OPMIN < >JKT JA OCDN J=E@>O
=T SFUVSO UIJT.
Note: AE 3@ ABF;?;L3F;A@, EA?7F;?7E ;F ?3=7E ?AD7 E7@E7 8AD opAssign FA
D7FGD@ const ref 8AD >3D97 EFDG5FE. ! I;>> @AF 3BB>K F:;E ABF;?;L3F;A@ ;@ F:;E
4AA=.
AN <I @S<HKG@ JA <I JK@M<OJM OC<O H<F@N < I@R J=E@>O, G@O'N ?@ADI@ OC@ PQ#JOBSZ!"+"
JQ@MGJ<? AJM %VSBUJPO. 1CDN JK@M<OJM NCJPG? <?? ORJ %VSBUJPO J=E@>ON OJ H<F@ <I?
M@OPMI < I@R JI@:
TUSVDU %VSBUJPO
\
JOU NJOVUF;
%VSBUJPO PQ#JOBSZ(TUSJOH PQ)(JO %VSBUJPO SIT) DPOTU
%B7D3FAD %H7D>A36;@9
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
304
JG (PQ == "+")
\
SFUVSO %VSBUJPO(NJOVUF + SIT.NJOVUF); // OFX PCKFDU
^
^
1C<O ?@ADIDODJI @I<=G@N <??DIB %VSBUJPO J=E@>ON =T OC@ + JK@M<OJM:
BVUP USBWFM%VSBUJPO = %VSBUJPO(10);
BVUP SFUVSO%VSBUJPO = %VSBUJPO(11);
%VSBUJPO UPUBM%VSBUJPO;
// ...
UPUBM%VSBUJPO = USBWFM%VSBUJPO + SFUVSO%VSBUJPO;
1C@ >JHKDG@M M@KG<>@N OC<O @SKM@NNDJI RDOC OC@ AJGGJRDIB H@H=@M API>ODJI ><GG JI OC@
USBWFM%VSBUJPO J=E@>O:
// UIF FRVJWBMFOU PG UIF FYQSFTTJPO BCPWF
UPUBM%VSBUJPO = USBWFM%VSBUJPO.PQ#JOBSZ!"+"(SFUVSO%VSBUJPO);
t Unconstrained operators
1C@ M@OPMI OTK@N JA NJH@ JA OC@ JK@M<OJMN ?@K@I? @IODM@GT JI OC@ ?@NDBI JA OC@ PN@M-
?@ADI@? OTK@: 1C@ PI<MT JK@M<OJM *, PQ$BMM, PQ$BTU, PQ%JTQBUDI, PQ*OEFY <I? JOC@M
DI?@SDIB JK@M<OJMN, <I? PQ4MJDF <I? JOC@M NGD>DIB JK@M<OJMN.
PQ&RVBMT() for equality comparisons
55.6
1CDN H@H=@M API>ODJI ?@ADI@N OC@ =@C<QDJMN JA OC@ == <I? OC@ != JK@M<OJMN.
1C@ M@OPMI OTK@ JA PQ&RVBMT DN CPPM.
A>>JM?DIB OJ G<IBP<B@ MPG@N, OC@ K<M<H@O@M JA PQ&RVBMT AJM NOMP>ON HPNO =@ ?@ADI@? <N DPOTU
SFG.
AN <I DHKJMO<IO MPG@, PQ&RVBMT <I? PQ$NQ HPNO RJMF >JINDNO@IOGT. #JM ORJ J=E@>ON OC<O
PQ&RVBMT M@OPMIN USVF, PQ$NQ HPNO M@OPMI U@MJ.
,I>@ PQ&RVBMT() DN ?@ADI@? AJM @LP<GDOT, OC@ >JHKDG@M PN@N DON JKKJNDO@ AJM DI@LP<GDOT:
Y == Z;
Y.PQ&RVBMT(Z); // UIF FRVJWBMFOU PG UIF QSFWJPVT FYQSFTTJPO
Y != Z;
!(Y.PQ&RVBMT(Z)); // UIF FRVJWBMFOU PG UIF QSFWJPVT FYQSFTTJPO
+JMH<GGT, DO DN IJO I@>@NN<MT OJ ?@ADI@ PQ&RVBMT() AJM NOMP>ON. 1C@ >JHKDG@M B@I@M<O@N DO AJM
NOMP>ON <POJH<OD><GGT. 1C@ <POJH<OD><GGT-B@I@M<O@? PQ&RVBMT >JHK<M@N <GG JA OC@ H@H=@MN
DI?DQD?P<GGT.
0JH@ODH@N OC@ @LP<GDOT JA ORJ J=E@>ON HPNO =@ ?@ADI@? ?DAA@M@IOGT AMJH OCDN <POJH<OD>
=@C<QDJM. #JM @S<HKG@, NJH@ JA OC@ H@H=@MN H<T IJO =@ NDBIDAD><IO DI OCDN >JHK<MDNJI, JM OC@
@LP<GDOT H<T ?@K@I? JI < HJM@ >JHKG@S GJBD>.
'PNO <N <I @S<HKG@, G@O'N ?@ADI@ PQ&RVBMT() DI < R<T OC<O ?DNM@B<M?N OC@ HDIPO@ DIAJMH<ODJI
<GOJB@OC@M:
TUSVDU 5JNF0G%BZ
\
JOU IPVS;
JOU NJOVUF;
%B7D3FAD %H7D>A36;@9
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
305
CPPM PQ&RVBMT(DPOTU SFG 5JNF0G%BZ SIT) DPOTU
\
SFUVSO IPVS == SIT.IPVS;
^
^
// ...
BTTFSU(5JNF0G%BZ(20, 10) == 5JNF0G%BZ(20, 59));
0DI>@ OC@ @LP<GDOT >JHK<MDNJI >JIND?@MN OC@ Q<GP@N JA JIGT OC@ IPVS H@H=@MN, 20:10 <I?
20:59 @I? PK =@DIB @LP<G. (1CDN DN EPNO <I @S<HKG@; DO NCJPG? =@ >G@<M OC<O NP>C <I @LP<GDOT
>JHK<MDNJI RJPG? ><PN@ >JIAPNDJIN.)
PQ$NQ() for sorting
55.7
0JMO JK@M<OJMN ?@O@MHDI@ OC@ NJMO JM?@MN JA J=E@>ON. AGG JA OC@ JM?@MDIB JK@M<OJMN <, <=, >,
<I? >= <M@ >JQ@M@? =T OC@ PQ$NQ() H@H=@M API>ODJI.
A>>JM?DIB OJ G<IBP<B@ MPG@N, OC@ K<M<H@O@M JA PQ$NQ AJM NOMP>ON HPNO =@ ?@ADI@? <N DPOTU
SFG.
AN <I DHKJMO<IO MPG@, PQ&RVBMT <I? PQ$NQ HPNO RJMF >JINDNO@IOGT. #JM ORJ J=E@>ON OC<O
PQ&RVBMT M@OPMIN USVF, PQ$NQ HPNO M@OPMI U@MJ.
)@O'N <NNPH@ OC<O JI@ JA OC@N@ AJPM JK@M<OJMN DN PN@? <N DI OC@ AJGGJRDIB >J?@:
JG (Y op Z) \ // j op JT POF PG <, <=, >, PS >=
1C@ >JHKDG@M >JIQ@MON OC<O @SKM@NNDJI OJ OC@ AJGGJRDIB GJBD><G @SKM@NNDJI <I? PN@N OC@ M@NPGO
JA OC@ I@R GJBD><G @SKM@NNDJI:
JG (Y.PQ$NQ(Z) op 0) \
)@O'N >JIND?@M OC@ <= JK@M<OJM:
JG (Y <= Z) \
1C@ >JHKDG@M B@I@M<O@N OC@ AJGGJRDIB >J?@ =@CDI? OC@ N>@I@N:
JG (Y.PQ$NQ(Z) <= 0) \
#JM OC@ PN@M-?@ADI@? PQ$NQ() OJ RJMF >JMM@>OGT, OCDN H@H=@M API>ODJI HPNO M@OPMI < M@NPGO
<>>JM?DIB OJ OC@ AJGGJRDIB MPG@N:
t A @793F;H7 H3>G7 DA OC@ G@AO-C<I? J=E@>O DN >JIND?@M@? OJ =@ =@AJM@ OC@ MDBCO-C<I? J=E@>O
t A BAE;F;H7 H3>G7 DA OC@ G@AO-C<I? J=E@>O DN >JIND?@M@? OJ =@ <AO@M OC@ MDBCO-C<I? J=E@>O
t /7DA DA OC@ J=E@>ON <M@ >JIND?@M@? OJ C<Q@ OC@ N<H@ NJMO JM?@M
1J =@ <=G@ OJ NPKKJMO OCJN@ Q<GP@N, OC@ M@OPMI OTK@ JA PQ$NQ() HPNO =@ JOU, IJO CPPM.
1C@ AJGGJRDIB DN < R<T JA JM?@MDIB 5JNF0G%BZ J=E@>ON =T ADMNO >JHK<MDIB OC@ Q<GP@N JA OC@
IPVS H@H=@MN, <I? OC@I >JHK<MDIB OC@ Q<GP@N JA OC@ NJOVUF H@H=@MN (JIGT DA OC@ IPVS
H@H=@MN <M@ @LP<G):
JOU PQ$NQ(DPOTU SFG 5JNF0G%BZ SIT) DPOTU
\
SFUVSO (IPVS == SIT.IPVS
NJOVUF - SIT.NJOVUF
%B7D3FAD %H7D>A36;@9
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
306
: IPVS - SIT.IPVS);
^
1C<O ?@ADIDODJI M@OPMIN OC@ ?DAA@M@I>@ =@OR@@I OC@ NJOVUF Q<GP@N RC@I OC@ IPVS H@H=@MN
<M@ OC@ N<H@, <I? OC@ ?DAA@M@I>@ =@OR@@I OC@ IPVS H@H=@MN JOC@MRDN@. 1C@ M@OPMI Q<GP@
RJPG? =@ < @793F;H7 H3>G7 RC@I OC@ >78F-:3@6 J=E@>O >JH@N =@AJM@ DI >CMJIJGJBD><G JM?@M, <
BAE;F;H7 H3>G7 DA OC@ D;9:F-:3@6 J=E@>O DN =@AJM@, <I? L7DA RC@I OC@T M@KM@N@IO @S<>OGT OC@
N<H@ ODH@ JA ?<T.
,I>@ PQ$NQ() DN ?@ADI@?, OC@ OTK@ ><I =@ PN@? DI <GBJMDOCHN OC<O >JHK<M@ J=E@>ON JA OC<O
OTK@. 1C@ .TPSU KMJK@MOT JA <MM<TN DN NP>C <I <GBJMDOCH. 1C@ AJGGJRDIB KMJBM<H >JINOMP>ON
10 J=E@>ON =T M<I?JH Q<GP@N <I? NJMON OC@H =T .TPSU. AN .TPSU RJMFN JI OC@ @G@H@ION, DO DN
OC@ PQ$NQ() JK@M<OJM OC<O B@ON ><GG@? =@CDI? OC@ N>@I@N OJ ?@O@MHDI@ OC@ NJMO JM?@MN JA OC@
@G@H@ION:
JNQPSU TUE.SBOEPN;
JNQPSU TUE.TUEJP;
JNQPSU TUE.TUSJOH;
TUSVDU 5JNF0G%BZ
\
JOU IPVS;
JOU NJOVUF;
JOU PQ$NQ(DPOTU SFG 5JNF0G%BZ SIT) DPOTU
\
SFUVSO (IPVS == SIT.IPVS
NJOVUF - SIT.NJOVUF
: IPVS - SIT.IPVS);
^
TUSJOH UP4USJOH() DPOTU
\
SFUVSO GPSNBU("%02T:%02T", IPVS, NJOVUF);
^
^
WPJE NBJO()
\
5JNF0G%BZ<> UJNFT;
GPSFBDI (J; 0 .. 10) \
UJNFT _= 5JNF0G%BZ(VOJGPSN(0, 24), VOJGPSN(0, 60));
^
UJNFT.TPSU;
XSJUFMO(UJNFT);
^
AN @SK@>O@?, OC@ @G@H@ION <M@ NJMO@? AMJH OC@ @<MGD@NO ODH@ OJ OC@ G<O@NO ODH@:
<03:40, 04:10, 09:06, 10:03, 10:09, 11:04, 13:42, 16:40, 18:03, 21:08>
PQ$BMM() to call objects as functions
55.8
1C@ K<M@IOC@N@N <MJPI? OC@ K<M<H@O@M GDNO RC@I ><GGDIB API>ODJIN <M@ JK@M<OJMN <N R@GG. 4@
C<Q@ <GM@<?T N@@I CJR TUBUJD PQ$BMM() H<F@N DO KJNND=G@ OJ PN@ OC@ I<H@ JA OC@ FKB7 <N <
API>ODJI. TUBUJD PQ$BMM() <GGJRN >M@<ODIB J=E@>ON RDOC ?@A<PGO Q<GP@N <O MPI ODH@.
+JI-NO<OD> PQ$BMM() JI OC@ JOC@M C<I? <GGJRN PNDIB OC@ A4<75FE JA PN@M-?@ADI@? OTK@N <N
API>ODJIN:
%B7D3FAD %H7D>A36;@9
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
307
'PP GPP;
GPP();
1C@ J=E@>O GPP <=JQ@ DN =@DIB ><GG@? GDF@ < API>ODJI.
AN <I @S<HKG@, G@O'N >JIND?@M < TUSVDU OC<O M@KM@N@ION < GDI@<M @LP<ODJI. 1CDN TUSVDU RDGG =@
PN@? AJM ><G>PG<ODIB OC@ K Q<GP@N JA OC@ AJGGJRDIB GDI@<M @LP<ODJI AJM NK@>DAD> J Q<GP@N:
y = ax + b
1C@ AJGGJRDIB PQ$BMM() NDHKGT ><G>PG<O@N <I? M@OPMIN OC@ Q<GP@ JA K <>>JM?DIB OJ OC<O
@LP<ODJI:
TUSVDU -JOFBS&RVBUJPO
\
EPVCMF B;
EPVCMF C;
EPVCMF PQ$BMM(EPVCMF Y) DPOTU
\
SFUVSO B * Y + C;
^
^
4DOC OC<O ?@ADIDODJI, @<>C J=E@>O JA -JOFBS&RVBUJPO M@KM@N@ION < GDI@<M @LP<ODJI AJM NK@>DAD>
3 <I? 4 Q<GP@N. 0P>C <I J=E@>O ><I =@ PN@? <N < API>ODJI OC<O ><G>PG<O@N OC@ K Q<GP@N:
-JOFBS&RVBUJPO FRVBUJPO = \ 1.2, 3.4 ^;
EPVCMF Z = FRVBUJPO(5.6); // UIF PCKFDU JT CFJOH VTFE MJLF B GVODUJPO
Note: D78;@;@9 opCall() 8AD 3 struct 6;E34>7E F:7 5A?B;>7D-97@7D3F76 3GFA?3F;5
5A@EFDG5FAD. ):3F ;E I:K F:7 { } EK@F3J ;E GE76 34AH7 ;@EF736 A8 F:7 D75A??7@676
LinearEquation(1.2, 3.4). ,:7@ F:7 >3FF7D EK@F3J ;E 67E;D76, 3 static opCall() F:3F
F3=7E FIA double B3D3?7F7DE ?GEF 3>EA 47 678;@76.
FRVBUJPO <=JQ@ M@KM@N@ION OC@ K = 1.2J + 3.4 GDI@<M @LP<ODJI. 2NDIB OC<O J=E@>O <N < API>ODJI
@S@>PO@N OC@ PQ$BMM() H@H=@M API>ODJI.
1CDN A@<OPM@ ><I =@ PN@APG OJ ?@ADI@ <I? NOJM@ OC@ 3 <I? 4 Q<GP@N DI <I J=E@>O JI>@ <I? OJ PN@
OC<O J=E@>O HPGODKG@ ODH@N G<O@M JI. 1C@ AJGGJRDIB >J?@ PN@N NP>C <I J=E@>O DI < GJJK:
-JOFBS&RVBUJPO FRVBUJPO = \ 0.01, 0.4 ^;
GPS (EPVCMF Y = 0.0; Y <= 1.0; Y += 0.125) \
XSJUFGMO("%G: %G", Y, FRVBUJPO(Y));
^
1C<O J=E@>O M@KM@N@ION OC@ K = 0.01J + 0.4 @LP<ODJI. &O DN =@DIB PN@? AJM ><G>PG<ODIB OC@
M@NPGON AJM J Q<GP@N DI OC@ M<IB@ AMJH 0.0 OJ 1.0.
Indexing operators
55.9
PQ*OEFY(), PQ*OEFY"TTJHO(), PQ*OEFY6OBSZ(), <I? PQ*OEFY0Q"TTJHO() H<F@ DO KJNND=G@ OJ
PN@ DI?@SDIB JK@M<OJMN AJM PN@M-?@ADI@? OTK@N NDHDG<M OJ <MM<TN <N DI PCKFDU<JOEFY>.
!DAA@M@IO AMJH <MM<TN, OC@M@ ><I =@ HJM@ OC<I JI@ DI?@S DI NLP<M@ =M<>F@ON. 1C@ @S<>O
=@C<QDJM JA OC@N@ JK@M<OJMN ?@K@I? JI OC@ PN@M-?@ADI@? OTK@. 4@ RDGG N@@ < N<HKG@ KMJBM<H
OC<O DI>GP?@N OC@N@ JK@M<OJMN =@GJR.
%B7D3FAD %H7D>A36;@9
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
308
PQ*OEFY DN AJM @G@H@IO <>>@NN. 1C@ DI?@S@N RDOCDI =M<>F@ON =@>JH@ OC@ K<M<H@O@MN JA OC@
JK@M<OJM API>ODJI:
HSBEF = HSBEFT<3, 1>; // BDDFTT UIF FMFNFOU BU 3,1
HSBEF = HSBEFT.PQ*OEFY(3, 1); // UIF FRVJWBMFOU PG UIF BCPWF
PQ*OEFY6OBSZ DN NDHDG<M OJ PQ6OBSZ. &ON ?DAA@M@I>@ DN OC<O OC@ JK@M<ODJI DN <KKGD@? OJ OC@
7>7?7@F OC<O >JMM@NKJI?N OJ OC@ NK@>DAD@? DI?@S(@N):
++HSBEFT<4, 0>; // JODSFNFOU UIF FMFNFOU BU 4,0
HSBEFT.PQ*OEFY6OBSZ!"++"(4, 0); // UIF FRVJWBMFOU PG UIF BCPWF
PQ*OEFY"TTJHO DN AJM <NNDBIH@IO. &ON ADMNO K<M<H@O@M DN OC@ Q<GP@ OC<O DN OJ =@ <NNDBI@?, <I?
OC@ M@NO JA OC@ K<M<H@O@MN <M@ OC@ DI?@S(@N):
HSBEFT<1, 1> = 95; // BTTJHO 95 UP FMFNFOU 1,1
HSBEFT.PQ*OEFY"TTJHO(95, 1, 1); // UIF FRVJWBMFOU PG UIF BCPWF
PQ*OEFY0Q"TTJHO DN NDHDG<M OJ PQ0Q"TTJHO. &ON ?DAA@M@I>@ DN OC<O OC@ M@NPGO JA OC@ JK@M<ODJI DN
<NNDBI@? =<>F OJ OC@ NK@>DAD@? @G@H@IO:
HSBEFT<2, 1> += 42; // BEE UP UIF FMFNFOU BU 2,1
HSBEFT.PQ*OEFY0Q"TTJHO!"+"(42, 2, 1);
// UIF FRVJWBMFOU PG UIF BCPWF
Indexing operators example 55.9.1
1C@ AJGGJRDIB NOMP>O DI>GP?@N @S<HKG@N JA @<>C JA OC@N@ JK@M<OJMN. &I OCDN ?@NDBI, OC@ ADMNO
DI?@S NK@>DAD@N OC@ NOP?@IO <I? OC@ N@>JI? DI?@S NK@>DAD@N OC@ BM<?@ JA OC<O NOP?@IO. #JM
@S<HKG@, <1, 2> NK@>DAD@N OC@ BM<?@ D? 2 JA NOP?@IO D? 1.
JNQPSU TUE.TUEJP;
TUSVDU 4UVEFOU(SBEFT
\
// 5XP HSBEFT GPS GJWF TUVEFOUT
JOU<2><5> HSBEFT;
// 3FUVSOT UIF TQFDJGJFE HSBEF
JOU PQ*OEFY(TJ[F@U TUVEFOU*E, TJ[F@U HSBEF*E) DPOTU
\
SFUVSO HSBEFT<TUVEFOU*E><HSBEF*E>;
^
// *ODSFNFOUT UIF TQFDJGJFE HSBEF
SFG JOU PQ*OEFY6OBSZ(TUSJOH PQ)(TJ[F@U TUVEFOU*E,
TJ[F@U HSBEF*E)
JG (PQ == "++")
\
SFUVSO ++HSBEFT<TUVEFOU*E><HSBEF*E>;
^
// "TTJHOT UP UIF TQFDJGJFE HSBEF PG UIF TQFDJGJFE TUVEFOU
JOU PQ*OEFY"TTJHO(JOU HSBEF,
TJ[F@U TUVEFOU*E,
TJ[F@U HSBEF*E)
\
SFUVSO HSBEFT<TUVEFOU*E><HSBEF*E> = HSBEF;
^
// "EET UP UIF TQFDJGJFE HSBEF
SFG JOU PQ*OEFY0Q"TTJHO(TUSJOH PQ)(JOU BNPVOU,
TJ[F@U TUVEFOU*E,
%B7D3FAD %H7D>A36;@9
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
309
TJ[F@U HSBEF*E)
JG (PQ == "+")
\
SFUVSO HSBEFT<TUVEFOU*E><HSBEF*E> += BNPVOU;
^
^
WPJE NBJO()
\
4UVEFOU(SBEFT HSBEFT;
XSJUFMO("(SBEF GPS JOEFY 3,1: ",
HSBEFT<3, 1>); // BDDFTT
++HSBEFT<4, 0>; // JODSFNFOU
HSBEFT<1, 1> = 95; // BTTJHONFOU
HSBEFT<2, 1> += 42; // BEE-BTTJHONFOU
XSJUFMO(HSBEFT);
^
1C@ JPOKPO:
(SBEF GPS JOEFY 3,1: 0
4UVEFOU(SBEFT(<<0, 0>, <0, 95>, <0, 42>, <0, 0>, <1, 0>>)
+JO@ OC<O OC@ M@OPMI OTK@N JA PQ*OEFY6OBSZ <I? PQ*OEFY0Q"TTJHO <M@ H<MF@? <N SFG
<>>JM?DIB OJ OC@ M@OPMI OTK@ BPD?@GDI@N <=JQ@. A??DODJI<GGT, OC@ JK@M<OJMN ?J IJO ?J <ITOCDIB
NK@>D<G AJM OC@ M@OPMI Q<GP@N; OC@T NDHKGT M@OPMI OC@ M@NPGON JA OC@ ++ <I? += JK@M<OJMN OC<O
OC@T PN@ DIO@MI<GGT.
Slicing operators
55.10
PQ4MJDF, PQ4MJDF6OBSZ, PQ4MJDF"TTJHO, <I? PQ4MJDF0Q"TTJHO <M@ NDHDG<M OJ OC@ DI?@SDIB
JK@M<OJMN. 1C@DM ?DAA@M@I>@ DN OC<O OC@T <GGJR E>;5;@9 OC@ J=E@>ON JA PN@M-?@ADI@? OTK@N.
AGG JA OC@N@ JK@M<OJMN C<Q@ ORJ ?DNODI>O PN@N: 1C@ PN@ RC@M@ OC@ NLP<M@ =M<>F@ON <M@ @HKOT
<I? OC@ PN@ RC@M@ OC@ NLP<M@ =M<>F@ON >JIO<DI < IPH=@M M<IB@. 0DHDG<M OJ NGD>@N, OC@N@
NCJPG? =@ ?@ADI@? OJ H@<I 3>> A8 F:7 7>7?7@FE <I? EA?7 A8 F:7 7>7?7@FE, M@NK@>ODQ@GT.
0GD>DIB JK@M<OJMN <M@ OC@ HJNO >JHKG@S JK@M<OJMN =@><PN@ OC@T DIQJGQ@ OC@ ORJ ?DNODI>O
>JI>@KON 5A@F3;@7D <I? D3@97. 4@ RDGG N@@ OC@N@ >JI>@KON DI HJM@ ?@O<DG DI G<O@M >C<KO@MN.
1C@N@ JK@M<OJMN RDGG H<F@ HJM@ N@IN@ JIGT <AO@M PI?@MNO<I?DIB M<IB@N.
#JM IJR, & RDGG KM@N@IO <I @S<HKG@ OC<O >JINDNON JIGT JA NOP= OTK@N <I? NOP= API>ODJIN. 0DHDG<M
OJ @<MGD@M @S<HKG@N, OCDN @S<HKG@ PN@N JIGT OC@ "++" <I? "+" >C<M<>O@MN. +JMH<GGT, H<IT
JOC@M JK@M<OJM >C<M<>O@MN HPNO <GNJ =@ ?@ADI@?.
/* 5IF UZQF PG UIF FMFNFOUT DPOUBJOFE JO UIF DPOUBJOFS. */
TUSVDU &MFNFOU
\
// ...
^
/* 4JNJMBS UP TMJDFT, SFQSFTFOUT UIF DPODFQU PG "FMFNFOU
* SBOHF". */
TUSVDU 3BOHF
\
// ...
^
/* 4JNJMBS UP BSSBZT BOE BTTPDJBUJWF BSSBZT, CSJOHT FMFNFOUT
* UPHFUIFS. */
%B7D3FAD %H7D>A36;@9
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
310
TUSVDU $POUBJOFS
\
// 'PS UIF PCKFDU<> TZOUBY
3BOHF PQ4MJDF()
\
3BOHF BMM&MFNFOUT;
// ... NVTU QSPWJEF BDDFTT UP BMM FMFNFOUT ...
SFUVSO BMM&MFNFOUT;
^
// 'PS UIF PCKFDU<J .. K> TZOUBY
3BOHF PQ4MJDF(TJ[F@U J, TJ[F@U K)
\
3BOHF TQFDJGJFE&MFNFOUT;
// ... NVTU QSPWJEF BDDFTT UP UIF TQFDJGJFE FMFNFOUT ...
SFUVSO TQFDJGJFE&MFNFOUT;
^
// 'PS UIF ++PCKFDU<> TZOUBY
3BOHF PQ4MJDF6OBSZ(TUSJOH PQ)()
JG (PQ == "++")
\
3BOHF BMM&MFNFOUT;
// ... NVTU JODSFNFOU UIF WBMVFT PG BMM FMFNFOUT ...
SFUVSO BMM&MFNFOUT;
^
// 'PS UIF ++PCKFDU<J .. K> TZOUBY
3BOHF PQ4MJDF6OBSZ(TUSJOH PQ)(TJ[F@U J, TJ[F@U K)
JG (PQ == "++")
\
3BOHF TQFDJGJFE&MFNFOUT;
// ... NVTU JODSFNFOU UIF WBMVFT PG UIF TQFDJGJFE FMFNFOUT ...
SFUVSO TQFDJGJFE&MFNFOUT;
^
// 'PS UIF (PCKFDU<> = WBMVF) TZOUBY
3BOHF PQ4MJDF"TTJHO(&MFNFOU WBMVF)
\
3BOHF BMM&MFNFOUT;
// ... NVTU BTTJHO UP BMM FMFNFOUT ...
SFUVSO BMM&MFNFOUT;
^
// 'PS UIF (PCKFDU<J .. K> = WBMVF) TZOUBY
3BOHF PQ4MJDF"TTJHO(&MFNFOU WBMVF, TJ[F@U J, TJ[F@U K)
\
3BOHF TQFDJGJFE&MFNFOUT;
// ... NVTU BTTJHO UP UIF TQFDJGJFE FMFNFOUT ...
SFUVSO TQFDJGJFE&MFNFOUT;
^
// 'PS UIF (PCKFDU<> += WBMVF) TZOUBY
3BOHF PQ4MJDF0Q"TTJHO(TUSJOH PQ)(&MFNFOU WBMVF)
JG (PQ == "+")
\
3BOHF BMM&MFNFOUT;
// ... NVTU BEE UP BMM FMFNFOUT ...
SFUVSO BMM&MFNFOUT;
^
// 'PS UIF (PCKFDU<J .. K> += WBMVF) TZOUBY
3BOHF PQ4MJDF0Q"TTJHO(TUSJOH PQ)(&MFNFOU WBMVF,
TJ[F@U J, TJ[F@U K)
JG (PQ == "+")
\
3BOHF TQFDJGJFE&MFNFOUT;
// ... NVTU BEE UP UIF TQFDJGJFE FMFNFOUT ...
SFUVSO TQFDJGJFE&MFNFOUT;
^
%B7D3FAD %H7D>A36;@9
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
311
// ... PUIFS PQFSBUPS PWFSMPBET BT OFFEFE ...
^
WPJE NBJO()
\
$POUBJOFS D;
3BOHF S;
&MFNFOU F;
/* 5IF GPMMPXJOH MJOFT BSF FYBNQMFT PG XIBU UIF QSFWJPVT
* PQFSBUPS PWFSMPBET NBLF QPTTJCMF. 5IF FRVJWBMFOUT UIBU
* UIF DPNQJMFS VTFT CFIJOE UIF TDFOFT BSF TIPXO BT DPEF
* DPNNFOUT. */
S = D<>; // D.PQ4MJDF();
S = D<1 .. 5>; // D.PQ4MJDF(1, 5);
++D<>; // D.PQ4MJDF6OBSZ!"++"();
++D<2 .. 9>; // D.PQ4MJDF6OBSZ!"++"(2, 9);
D<> = F; // D.PQ4MJDF"TTJHO(F);
D<4 .. 6> = F; // D.PQ4MJDF"TTJHO(F, 4, 6);
D<> += F; // D.PQ4MJDF0Q"TTJHO!"+"(F);
D<5 .. 8> += F; // D.PQ4MJDF0Q"TTJHO!"+"(F, 5, 8);
^
PQ$BTU for type conversions
55.11
PQ$BTU ?@ADI@N OC@ @SKGD>DO OTK@ >JIQ@MNDJIN. &O ><I =@ JQ@MGJ<?@? N@K<M<O@GT AJM @<>C O<MB@O
OTK@. AN TJP RJPG? M@H@H=@M AMJH OC@ @<MGD@M >C<KO@MN, @SKGD>DO OTK@ >JIQ@MNDJIN <M@
K@MAJMH@? =T OC@ UP API>ODJI <I? OC@ DBTU JK@M<OJM.
PQ$BTU DN < O@HKG<O@ <N R@GG, =PO DO C<N < ?DAA@M@IO AJMH<O: 1C@ O<MB@O OTK@ DN NK@>DAD@? =T OC@
(5 : UBSHFU@UZQF) NTIO<S:
target_type PQ$BTU(5 : target_type)()
\
// ...
^
1CDN NTIO<S RDGG =@>JH@ >G@<M G<O@M <AO@M OC@ O@HKG<O@N >C<KO@M <N R@GG.
)@O'N >C<IB@ OC@ ?@ADIDODJI JA %VSBUJPO NJ OC<O DO IJR C<N ORJ H@H=@MN: CJPMN <I? HDIPO@N.
1C@ JK@M<OJM OC<O >JIQ@MON J=E@>ON JA OCDN OTK@ OJ EPVCMF ><I =@ ?@ADI@? <N DI OC@ AJGGJRDIB
>J?@:
JNQPSU TUE.TUEJP;
JNQPSU TUE.DPOW;
TUSVDU %VSBUJPO
\
JOU IPVS;
JOU NJOVUF;
EPVCMF PQ$BTU(5 : EPVCMF)() DPOTU
\
SFUVSO IPVS + (UP!EPVCMF(NJOVUF) / 60);
^
^
WPJE NBJO()
\
BVUP EVSBUJPO = %VSBUJPO(2, 30);
EPVCMF E = UP!EPVCMF(EVSBUJPO); // DBO CF DBTU(EPVCMF)EVSBUJPO BT XFMM
%B7D3FAD %H7D>A36;@9
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
312
XSJUFMO(E);
^
1C@ >JHKDG@M M@KG<>@N OC@ OTK@ >JIQ@MNDJI ><GG <=JQ@ RDOC OC@ AJGGJRDIB JI@:
EPVCMF E = EVSBUJPO.PQ$BTU!EPVCMF();
1C@ EPVCMF >JIQ@MNDJI API>ODJI <=JQ@ KMJ?P>@N 2.5 AJM ORJ CJPMN <I? OCDMOT HDIPO@N:
2.5
Catch-all operator PQ%JTQBUDI
55.12
PQ%JTQBUDI B@ON ><GG@? RC@I@Q@M < ?;EE;@9 H@H=@M JA <I J=E@>O DN <>>@NN@?. AGG <OO@HKON OJ
<>>@NN IJI-@SDNO@IO H@H=@MN <M@ ?DNK<O>C@? OJ OCDN API>ODJI.
1C@ I<H@ JA OC@ HDNNDIB H@H=@M =@>JH@N OC@ O@HKG<O@ K<M<H@O@M Q<GP@ JA PQ%JTQBUDI.
1C@ AJGGJRDIB >J?@ ?@HJINOM<O@N < NDHKG@ ?@ADIDODJI:
JNQPSU TUE.TUEJP;
TUSVDU 'PP
\
WPJE PQ%JTQBUDI(TUSJOH OBNF, 5)(5 QBSBNFUFS)
\
XSJUFGMO("'PP.PQ%JTQBUDI - OBNF: %T, WBMVF: %T",
OBNF, QBSBNFUFS);
^
^
WPJE NBJO()
\
'PP GPP;
GPP.B/PO&YJTUFOU'VODUJPO(42);
GPP.BOPUIFS/PO&YJTUFOU'VODUJPO(100);
^
1C@M@ <M@ IJ >JHKDG@M @MMJMN AJM OC@ ><GGN OJ IJI-@SDNO@IO H@H=@MN. &INO@<?, <GG JA OCJN@ ><GGN
<M@ ?DNK<O>C@? OJ PQ%JTQBUDI. 1C@ ADMNO O@HKG<O@ K<M<H@O@M DN OC@ I<H@ JA OC@ H@H=@M. 1C@
K<M<H@O@M Q<GP@N OC<O <M@ PN@? RC@I ><GGDIB OC@ API>ODJI <KK@<M <N OC@ K<M<H@O@MN JA
PQ%JTQBUDI:
'PP.PQ%JTQBUDI - OBNF: B/PO&YJTUFOU'VODUJPO, WBMVF: 42
'PP.PQ%JTQBUDI - OBNF: BOPUIFS/PO&YJTUFOU'VODUJPO, WBMVF: 100
1C@ OBNF O@HKG<O@ K<M<H@O@M ><I =@ PN@? DIND?@ OC@ API>ODJI OJ H<F@ ?@>DNDJIN JI CJR OC@
><GG OJ OC<O NK@>DAD> IJI-@SDNO@IO API>ODJI NCJPG? =@ C<I?G@?:
TXJUDI (OBNF) \
// ...
^
Inclusion query by PQ#JOBSZ3JHIU!"JO"
55.13
1CDN JK@M<OJM <GGJRN ?@ADIDIB OC@ =@C<QDJM JA OC@ JO JK@M<OJM AJM PN@M-?@ADI@? OTK@N. JO DN
>JHHJIGT PN@? RDOC <NNJ>D<ODQ@ <MM<TN OJ ?@O@MHDI@ RC@OC@M < Q<GP@ AJM < NK@>DAD> F@T @SDNON
DI OC@ <MM<T.
%B7D3FAD %H7D>A36;@9
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
313
!DAA@M@IO AMJH JOC@M JK@M<OJMN, OCDN JK@M<OJM DN IJMH<GGT JQ@MGJ<?@? AJM OC@ ><N@ RC@M@ OC@
J=E@>O <KK@<MN JI OC@ MDBCO-C<I? ND?@:
JG (UJNF JO MVODI#SFBL) \
1C@ >JHKDG@M RJPG? PN@ PQ#JOBSZ3JHIU =@CDI? OC@ N>@I@N:
// UIF FRVJWBMFOU PG UIF BCPWF:
JG (MVODI#SFBL.PQ#JOBSZ3JHIU!"JO"(UJNF)) \
Example of the JO operator 55.13.1
1C@ AJGGJRDIB KMJBM<H ?@ADI@N < 5JNF4QBO OTK@ DI <??DODJI OJ %VSBUJPO <I? 5JNF0G%BZ. 1C@
JO JK@M<OJM OC<O DN ?@ADI@? AJM 5JNF4QBO ?@O@MHDI@N RC@OC@M < HJH@IO DI ODH@ DN RDOCDI OC<O
ODH@ NK<I.
1J F@@K OC@ >J?@ NCJMO, OC@ AJGGJRDIB KMJBM<H ?@ADI@N JIGT OC@ I@>@NN<MT H@H=@M API>ODJIN.
+JO@ CJR OC@ 5JNF0G%BZ J=E@>O DN PN@? N@<HG@NNGT DI OC@ GPS GJJK. 1C<O GJJK DN <
?@HJINOM<ODJI JA CJR PN@APG JK@M<OJM JQ@MGJ<?DIB ><I =@.
JNQPSU TUE.TUEJP;
JNQPSU TUE.TUSJOH;
TUSVDU %VSBUJPO
\
JOU NJOVUF;
^
TUSVDU 5JNF0G%BZ
\
JOU IPVS;
JOU NJOVUF;
SFG 5JNF0G%BZ PQ0Q"TTJHO(TUSJOH PQ)(JO %VSBUJPO EVSBUJPO)
JG (PQ == "+")
\
NJOVUF += EVSBUJPO.NJOVUF;
IPVS += NJOVUF / 60;
NJOVUF %= 60;
IPVS %= 24;
SFUVSO UIJT;
^
JOU PQ$NQ(DPOTU SFG 5JNF0G%BZ SIT) DPOTU
\
SFUVSO (IPVS == SIT.IPVS
NJOVUF - SIT.NJOVUF
: IPVS - SIT.IPVS);
^
TUSJOH UP4USJOH() DPOTU
\
SFUVSO GPSNBU("%02T:%02T", IPVS, NJOVUF);
^
^
TUSVDU 5JNF4QBO
\
5JNF0G%BZ CFHJO;
5JNF0G%BZ FOE; // FOE JT DPOTJEFSFE UP CF PVUTJEF PG UIF TQBO
CPPM PQ#JOBSZ3JHIU(TUSJOH PQ)(5JNF0G%BZ UJNF) DPOTU
JG (PQ == "JO")
%B7D3FAD %H7D>A36;@9
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
314
\
SFUVSO (UJNF >= CFHJO) && (UJNF < FOE);
^
^
WPJE NBJO()
\
BVUP MVODI#SFBL = 5JNF4QBO(5JNF0G%BZ(12, 00),
5JNF0G%BZ(13, 00));
GPS (BVUP UJNF = 5JNF0G%BZ(11, 30);
UJNF < 5JNF0G%BZ(13, 30);
UJNF += %VSBUJPO(15)) \
JG (UJNF JO MVODI#SFBL) \
XSJUFMO(UJNF, " JT EVSJOH UIF MVODI CSFBL");
^ FMTF \
XSJUFMO(UJNF, " JT PVUTJEF PG UIF MVODI CSFBL");
^
^
^
1C@ JPOKPO:
11:30 JT PVUTJEF PG UIF MVODI CSFBL
11:45 JT PVUTJEF PG UIF MVODI CSFBL
12:00 JT EVSJOH UIF MVODI CSFBL
12:15 JT EVSJOH UIF MVODI CSFBL
12:30 JT EVSJOH UIF MVODI CSFBL
12:45 JT EVSJOH UIF MVODI CSFBL
13:00 JT PVUTJEF PG UIF MVODI CSFBL
13:15 JT PVUTJEF PG UIF MVODI CSFBL
Defining more than one operator at the same time
55.14
1J F@@K OC@ >J?@ N<HKG@N NCJMO, R@ C<Q@ PN@? JIGT OC@ ++, +, <I? += JK@M<OJMN <=JQ@. &O DN
>JI>@DQ<=G@ OC<O RC@I JI@ JK@M<OJM DN JQ@MGJ<?@? AJM < OTK@, H<IT JOC@MN RJPG? <GNJ I@@? OJ
=@ JQ@MGJ<?@?. #JM @S<HKG@, OC@ -- <I? -= JK@M<OJMN <M@ <GNJ ?@ADI@? AJM OC@ AJGGJRDIB
%VSBUJPO:
TUSVDU %VSBUJPO
\
JOU NJOVUF;
SFG %VSBUJPO PQ6OBSZ(TUSJOH PQ)()
JG (PQ == "++")
\
++NJOVUF;
SFUVSO UIJT;
^
SFG %VSBUJPO PQ6OBSZ(TUSJOH PQ)()
JG (PQ == "--")
\
--NJOVUF;
SFUVSO UIJT;
^
SFG %VSBUJPO PQ0Q"TTJHO(TUSJOH PQ)(JO JOU BNPVOU)
JG (PQ == "+")
\
NJOVUF += BNPVOU;
%B7D3FAD %H7D>A36;@9
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
315
SFUVSO UIJT;
^
SFG %VSBUJPO PQ0Q"TTJHO(TUSJOH PQ)(JO JOU BNPVOU)
JG (PQ == "-")
\
NJOVUF -= BNPVOU;
SFUVSO UIJT;
^
^
VOJUUFTU
\
BVUP EVSBUJPO = %VSBUJPO(10);
++EVSBUJPO;
BTTFSU(EVSBUJPO.NJOVUF == 11);
--EVSBUJPO;
BTTFSU(EVSBUJPO.NJOVUF == 10);
EVSBUJPO += 5;
BTTFSU(EVSBUJPO.NJOVUF == 15);
EVSBUJPO -= 3;
BTTFSU(EVSBUJPO.NJOVUF == 12);
^
WPJE NBJO()
\^
1C@ JK@M<OJM JQ@MGJ<?N <=JQ@ C<Q@ >J?@ ?PKGD><ODJIN. 1C@ JIGT ?DAA@M@I>@N =@OR@@I OC@
NDHDG<M API>ODJIN <M@ CDBCGDBCO@? =T T@GGJR. 0P>C >J?@ ?PKGD><ODJIN ><I =@ M@?P>@? <I?
NJH@ODH@N <QJD?@? <GOJB@OC@M =T EFD;@9 ?;J;@E. 4@ RDGG N@@ OC@ NJYJO F@TRJM? DI < G<O@M
>C<KO@M <N R@GG. & RJPG? GDF@ OJ NCJR =MD@AGT CJR OCDN F@TRJM? C@GKN RDOC JK@M<OJM
JQ@MGJ<?DIB.
NJYJO DIN@MON OC@ NK@>DAD@? NOMDIB <N NJPM>@ >J?@ MDBCO RC@M@ OC@ NJYJO NO<O@H@IO <KK@<MN DI
>J?@. 1C@ AJGGJRDIB NOMP>O DN OC@ @LPDQ<G@IO JA OC@ JI@ <=JQ@:
TUSVDU %VSBUJPO
\
JOU NJOVUF;
SFG %VSBUJPO PQ6OBSZ(TUSJOH PQ)()
JG ((PQ == "++") ]] (PQ == "--"))
\
NJYJO (PQ _ "NJOVUF;");
SFUVSO UIJT;
^
SFG %VSBUJPO PQ0Q"TTJHO(TUSJOH PQ)(JO JOU BNPVOU)
JG ((PQ == "+") ]] (PQ == "-"))
\
NJYJO ("NJOVUF " _ PQ _ "= BNPVOU;");
SFUVSO UIJT;
^
^
&A OC@ %VSBUJPO J=E@>ON <GNJ I@@? OJ =@ HPGODKGD@? <I? ?DQD?@? =T <I <HJPIO, <GG OC<O DN
I@@?@? DN OJ <?? ORJ HJM@ >JI?DODJIN OJ OC@ O@HKG<O@ >JINOM<DIO:
TUSVDU %VSBUJPO
\
// ...
%B7D3FAD %H7D>A36;@9
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
316
SFG %VSBUJPO PQ0Q"TTJHO(TUSJOH PQ)(JO JOU BNPVOU)
JG ((PQ == "+") ]] (PQ == "-") ]]
(PQ == "*") ]] (PQ == "/"))
\
NJYJO ("NJOVUF " _ PQ _ "= BNPVOU;");
SFUVSO UIJT;
^
^
VOJUUFTU
\
BVUP EVSBUJPO = %VSBUJPO(12);
EVSBUJPO *= 4;
BTTFSU(EVSBUJPO.NJOVUF == 48);
EVSBUJPO /= 2;
BTTFSU(EVSBUJPO.NJOVUF == 24);
^
Exercise
55.15
t !@ADI@ < AM<>ODJI OTK@ OC<O CJG?N DON IPH@M<OJM <I? ?@IJHDI<OJM <N H@H=@MN JA OTK@ MPOH.
0P>C < OTK@ H<T =@ PN@APG, =@><PN@ DO ?J@N IJO GJN@ Q<GP@ GDF@ GMPBU, EPVCMF, <I? SFBM ?J
?P@ OJ OC@DM KM@>DNDJIN. #JM @S<HKG@, <GOCJPBC OC@ M@NPGO JA HPGODKGTDIB < EPVCMF Q<GP@ JA
1.0/3 =T 3 DN @AF 1.0, HPGODKGTDIB < 'SBDUJPO J=E@>O OC<O M@KM@N@ION OC@ AM<>ODJI 13 =T 3
RJPG? =@ @S<>OGT 1:
TUSVDU 'SBDUJPO
\
MPOH OVN; // OVNFSBUPS
MPOH EFO; // EFOPNJOBUPS
/* "T B DPOWFOJFODF, UIF DPOTUSVDUPS VTFT UIF EFGBVMU
* WBMVF PG 1 GPS UIF EFOPNJOBUPS. */
UIJT(MPOH OVN, MPOH EFO = 1)
\
FOGPSDF(EFO != 0, "5IF EFOPNJOBUPS DBOOPU CF [FSP");
UIJT.OVN = OVN;
UIJT.EFO = EFO;
/* &OTVSJOH UIBU UIF EFOPNJOBUPS JT BMXBZT QPTJUJWF
* XJMM TJNQMJGZ UIF EFGJOJUJPOT PG TPNF PG UIF
* PQFSBUPS GVODUJPOT. */
JG (UIJT.EFO < 0) \
UIJT.OVN = -UIJT.OVN;
UIJT.EFO = -UIJT.EFO;
^
^
/* ... ZPV EFGJOF UIF PQFSBUPS PWFSMPBET ... */
^
!@ADI@ JK@M<OJMN <N I@@?@? AJM OCDN OTK@ OJ H<F@ DO < >JIQ@ID@IO OTK@ <N >GJN@ OJ
API?<H@IO<G OTK@N <N KJNND=G@. "INPM@ OC<O OC@ ?@ADIDODJI JA OC@ OTK@ K<NN@N <GG JA OC@
AJGGJRDIB PIDO O@NON. 1C@ PIDO O@NON @INPM@ OC@ AJGGJRDIB =@C<QDJMN:
w AI @S>@KODJI HPNO =@ OCMJRI RC@I >JINOMP>ODIB <I J=E@>O RDOC U@MJ ?@IJHDI<OJM.
(1CDN DN <GM@<?T O<F@I ><M@ JA =T OC@ FOGPSDF @SKM@NNDJI <=JQ@.)
w -MJ?P>DIB OC@ I@B<ODQ@ JA OC@ Q<GP@: #JM @S<HKG@, OC@ I@B<ODQ@ JA 13 NCJPG? =@
-13 <I? I@B<ODQ@ JA -25 NCJPG? =@ 25.
w &I>M@H@IODIB <I? ?@>M@H@IODIB OC@ Q<GP@ =T ++ <I? --.
%B7D3FAD %H7D>A36;@9
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
317
w 0PKKJMO AJM AJPM <MDOCH@OD> JK@M<ODJIN: BJOC HJ?DATDIB OC@ Q<GP@ JA <I J=E@>O =T
+=, -=, *=, <I? /=; <I? KMJ?P>DIB OC@ M@NPGO JA PNDIB ORJ J=E@>ON RDOC OC@ +, -, *,
<I? / JK@M<OJMN. (0DHDG<M OJ OC@ >JINOMP>OJM, ?DQD?DIB =T U@MJ NCJPG? =@
KM@Q@IO@?.)
AN < M@HDI?@M, C@M@ <M@ OC@ AJMHPG<N JA <MDOCH@OD> JK@M<ODJIN OC<O DIQJGQ@ ORJ
AM<>ODJIN <= <I? >?:
v A??DODJI: <= + >? = (<*? + >*=)(=*?)
v 0P=OM<>ODJI: <= - >? = (<*? - >*=)(=*?)
v *PGODKGD><ODJI: <= * >? = (<*>)(=*?)
v !DQDNDJI: (<=) / (>?) = (<*?)(=*>)
w 1C@ <>OP<G (<I? I@>@NN<MDGT GJNNAPG) Q<GP@ JA OC@ J=E@>O ><I =@ >JIQ@MO@? OJ
EPVCMF.
w 0JMO JM?@M <I? @LP<GDOT >JHK<MDNJIN <M@ K@MAJMH@? =T OC@ <>OP<G Q<GP@N JA OC@
AM<>ODJIN, IJO =T OC@ Q<GP@N JA OC@ IPH@M<OJMN <I? ?@IJHDI<OJMN. #JM @S<HKG@, OC@
AM<>ODJIN 13 <I? 2060 HPNO =@ >JIND?@M@? OJ =@ @LP<G.
VOJUUFTU
\
/* .VTU UISPX XIFO EFOPNJOBUPS JT [FSP. */
BTTFSU5ISPXO('SBDUJPO(42, 0));
/* -FU'T TUBSU XJUI 13. */
BVUP B = 'SBDUJPO(1, 3);
/* -13 */
BTTFSU(-B == 'SBDUJPO(-1, 3));
/* 13 + 1 == 43 */
++B;
BTTFSU(B == 'SBDUJPO(4, 3));
/* 43 - 1 == 13 */
--B;
BTTFSU(B == 'SBDUJPO(1, 3));
/* 13 + 23 == 33 */
B += 'SBDUJPO(2, 3);
BTTFSU(B == 'SBDUJPO(1));
/* 33 - 23 == 13 */
B -= 'SBDUJPO(2, 3);
BTTFSU(B == 'SBDUJPO(1, 3));
/* 13 * 8 == 83 */
B *= 'SBDUJPO(8);
BTTFSU(B == 'SBDUJPO(8, 3));
/* 83 / 169 == 32 */
B /= 'SBDUJPO(16, 9);
BTTFSU(B == 'SBDUJPO(3, 2));
/* .VTU QSPEVDF UIF FRVJWBMFOU WBMVF JO UZQF 'EPVCMF'.
*
* /PUF UIBU BMUIPVHI EPVCMF DBOOPU SFQSFTFOU FWFSZ WBMVF
* QSFDJTFMZ, 1.5 JT BO FYDFQUJPO. 5IBU JT XIZ UIJT UFTU
* JT CFJOH BQQMJFE BU UIJT QPJOU. */
BTTFSU(UP!EPVCMF(B) == 1.5);
/* 1.5 + 2.5 == 4 */
BTTFSU(B + 'SBDUJPO(5, 2) == 'SBDUJPO(4, 1));
/* 1.5 - 0.75 == 0.75 */
BTTFSU(B - 'SBDUJPO(3, 4) == 'SBDUJPO(3, 4));
%B7D3FAD %H7D>A36;@9
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
318
/* 1.5 * 10 == 15 */
BTTFSU(B * 'SBDUJPO(10) == 'SBDUJPO(15, 1));
/* 1.5 / 4 == 38 */
BTTFSU(B / 'SBDUJPO(4) == 'SBDUJPO(3, 8));
/* .VTU UISPX XIFO EJWJEJOH CZ [FSP. */
BTTFSU5ISPXO('SBDUJPO(42, 1) / 'SBDUJPO(0));
/* 5IF POF XJUI MPXFS OVNFSBUPS JT CFGPSF. */
BTTFSU('SBDUJPO(3, 5) < 'SBDUJPO(4, 5));
/* 5IF POF XJUI MBSHFS EFOPNJOBUPS JT CFGPSF. */
BTTFSU('SBDUJPO(3, 9) < 'SBDUJPO(3, 8));
BTTFSU('SBDUJPO(1, 1@000) > 'SBDUJPO(1, 10@000));
/* 5IF POF XJUI MPXFS WBMVF JT CFGPSF. */
BTTFSU('SBDUJPO(10, 100) < 'SBDUJPO(1, 2));
/* 5IF POF XJUI OFHBUJWF WBMVF JT CFGPSF. */
BTTFSU('SBDUJPO(-1, 2) < 'SBDUJPO(0));
BTTFSU('SBDUJPO(1, -2) < 'SBDUJPO(0));
/* 5IF POFT XJUI FRVBM WBMVFT NVTU CF CPUI <= BOE >=. */
BTTFSU('SBDUJPO(-1, -2) <= 'SBDUJPO(1, 2));
BTTFSU('SBDUJPO(1, 2) <= 'SBDUJPO(-1, -2));
BTTFSU('SBDUJPO(3, 7) <= 'SBDUJPO(9, 21));
BTTFSU('SBDUJPO(3, 7) >= 'SBDUJPO(9, 21));
/* 5IF POFT XJUI FRVBM WBMVFT NVTU CF FRVBM. */
BTTFSU('SBDUJPO(1, 3) == 'SBDUJPO(20, 60));
/* 5IF POFT XJUI FRVBM WBMVFT XJUI TJHO NVTU CF FRVBM. */
BTTFSU('SBDUJPO(-1, 2) == 'SBDUJPO(1, -2));
BTTFSU('SBDUJPO(1, 2) == 'SBDUJPO(-1, -2));
^
TUE.FYDFQUJPO.BTTFSU5ISPXO OC<O <KK@<MN DI OC@ O@NON <=JQ@ DN AJM @INPMDIB OC<O <I
@SKM@NNDJI ?J@N DI?@@? OCMJR <I @S>@KODJI. &O RJMFN <N OC@ @LPDQ<G@IO JA OC@
AJGGJRDIB >J?@:
BTTFSU5ISPXO('SBDUJPO(42, 1) / 'SBDUJPO(0));
// ...
/* 5IF FRVJWBMFOU PG UIF MJOF BCPWF */
\
BVUP JT5ISPXO = GBMTF;
USZ \
'SBDUJPO(42, 1) / 'SBDUJPO(0);
^ DBUDI (&YDFQUJPO FYD) \
JT5ISPXO = USVF;
^
BTTFSU(JT5ISPXO);
^
... F:7 EA>GF;A@
%B7D3FAD %H7D>A36;@9
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
319
Classes 56
0DHDG<M OJ NOMP>ON, DMBTT DN < A@<OPM@ AJM ?@ADIDIB I@R OTK@N. !DAA@M@IO AMJH NOMP>ON, >G<NN@N
KMJQD?@ OC@ A4<75F AD;7@F76 BDA9D3??;@9 (,,-) K<M<?DBH DI !. 1C@ H<EJM <NK@>ON JA ,,-
<M@ OC@ AJGGJRDIB:
t Encapsulation: JIOMJGGDIB <>>@NN OJ H@H=@MN (E@53BEG>3F;A@ ;E 3H3;>34>7 8AD EFDG5FE 3E
I7>> 4GF ;F :3E @AF 477@ ?7@F;A@76 G@F;> F:;E 5:3BF7D.)
t Inheritance: A>LPDMDIB H@H=@MN JA <IJOC@M OTK@
t Polymorphism: B@DIB <=G@ OJ PN@ < HJM@ NK@>D<G OTK@ DI KG<>@ JA < HJM@ B@I@M<G OTK@
"I><KNPG<ODJI DN <>CD@Q@? =T BDAF75F;A@ 3FFD;4GF7E, RCD>C R@ RDGG N@@ DI < G<O@M >C<KO@M.
&IC@MDO<I>@ DN AJM <>LPDMDIB ;?B>7?7@F3F;A@E JA JOC@M OTK@N. -JGTHJMKCDNH DN AJM <=NOM<>ODIB
K<MON JA KMJBM<HN AMJH @<>C JOC@M <I? DN <>CD@Q@? =T >G<NN ;@F7D8357E.
1CDN >C<KO@M RDGG DIOMJ?P>@ >G<NN@N <O < CDBC G@Q@G, PI?@MGDIDIB OC@ A<>O OC<O OC@T <M@
M@A@M@I>@ OTK@N. G<NN@N RDGG =@ @SKG<DI@? DI HJM@ ?@O<DG DI G<O@M >C<KO@MN.
Comparing with structs
56.1
&I B@I@M<G, >G<NN@N <M@ Q@MT NDHDG<M OJ NOMP>ON. *JNO JA OC@ A@<OPM@N OC<O R@ C<Q@ N@@I AJM
NOMP>ON DI OC@ AJGGJRDIB >C<KO@MN <KKGT OJ >G<NN@N <N R@GG:
t 0OMP>ON
t *@H=@M #PI>ODJIN
t DPOTU SFG -<M<H@O@MN <I? DPOTU *@H=@M #PI>ODJIN
t JINOMP>OJM <I? ,OC@M 0K@>D<G #PI>ODJIN
t ,K@M<OJM ,Q@MGJ<?DIB
%JR@Q@M, OC@M@ <M@ DHKJMO<IO ?DAA@M@I>@N =@OR@@I >G<NN@N <I? NOMP>ON.
Classes are reference types 56.1.1
1C@ =DBB@NO ?DAA@M@I>@ AMJH NOMP>ON DN OC<O NOMP>ON <M@ H3>G7 FKB7E <I? >G<NN@N <M@ D787D7@57
FKB7E. 1C@ JOC@M ?DAA@M@I>@N JPOGDI@? =@GJR <M@ HJNOGT ?P@ OJ OCDN A<>O.
Class objects may be OVMM 56.1.2
AN DO C<N =@@I H@IODJI@? =MD@AGT DI 1C@ OVMM 3<GP@ <I? OC@ JT ,K@M<OJM >C<KO@M, >G<NN
Q<MD<=G@N ><I =@ OVMM. &I JOC@M RJM?N, >G<NN Q<MD<=G@N H<T IJO =@ KMJQD?DIB <>>@NN OJ <IT
J=E@>O. G<NN Q<MD<=G@N ?J IJO C<Q@ Q<GP@N OC@HN@GQ@N; OC@ <>OP<G >G<NN J=E@>ON HPNO =@
>JINOMP>O@? =T OC@ OFX F@TRJM?.
AN TJP RJPG? <GNJ M@H@H=@M, >JHK<MDIB < M@A@M@I>@ OJ OVMM =T OC@ == JM OC@ != JK@M<OJM DN
<I @MMJM. &INO@<?, OC@ >JHK<MDNJI HPNO =@ ?JI@ =T OC@ JT JM OC@ !JT JK@M<OJM, <>>JM?DIBGT:
.Z$MBTT SFGFSFODFT"O0CKFDU = OFX .Z$MBTT;
BTTFSU(SFGFSFODFT"O0CKFDU !JT OVMM);
.Z$MBTT WBSJBCMF; // EPFT OPU SFGFSFODF BO PCKFDU
BTTFSU(WBSJBCMF JT OVMM);
1C@ M@<NJI DN OC<O, OC@ == JK@M<OJM H<T I@@? OJ >JINPGO OC@ Q<GP@N JA OC@ H@H=@MN JA OC@
J=E@>ON <I? OC<O <OO@HKODIB OJ <>>@NN OC@ H@H=@MN OCMJPBC < KJO@IOD<GGT OVMM Q<MD<=G@ RJPG?
><PN@ < H@HJMT <>>@NN @MMJM. #JM OC<O M@<NJI, >G<NN Q<MD<=G@N HPNO <GR<TN =@ >JHK<M@? =T
OC@ JT <I? !JT JK@M<OJMN.
C>3EE7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
320
Class variables versus class objects 56.1.3
G<NN Q<MD<=G@ <I? >G<NN J=E@>O <M@ N@K<M<O@ >JI>@KON.
G<NN J=E@>ON <M@ >JINOMP>O@? =T OC@ OFX F@TRJM?; OC@T ?J IJO C<Q@ I<H@N. 1C@ <>OP<G
>JI>@KO OC<O < >G<NN OTK@ M@KM@N@ION DI < KMJBM<H DN KMJQD?@? =T < >G<NN J=E@>O. #JM @S<HKG@,
<NNPHDIB OC<O < 4UVEFOU >G<NN M@KM@N@ION NOP?@ION =T OC@DM I<H@N <I? BM<?@N, NP>C
DIAJMH<ODJI RJPG? =@ NOJM@? =T OC@ H@H=@MN JA 4UVEFOU A4<75FE. -<MOGT =@><PN@ OC@T <M@
<IJITHJPN, DO DN IJO KJNND=G@ OJ <>>@NN >G<NN J=E@>ON ?DM@>OGT.
A >G<NN Q<MD<=G@ JI OC@ JOC@M C<I? DN < G<IBP<B@ A@<OPM@ AJM <>>@NNDIB >G<NN J=E@>ON. AGOCJPBC
DO H<T N@@H NTIO<>OD><GGT OC<O JK@M<ODJIN <M@ =@DIB K@MAJMH@? JI < >G<NN H3D;34>7, OC@
JK@M<ODJIN <M@ <>OP<GGT ?DNK<O>C@? OJ < >G<NN A4<75F.
)@O'N >JIND?@M OC@ AJGGJRDIB >J?@ OC<O R@ C<Q@ N@@I KM@QDJPNGT DI OC@ 3<GP@ 1TK@N <I?
/@A@M@I>@ 1TK@N >C<KO@M:
BVUP WBSJBCMF1 = OFX .Z$MBTT;
BVUP WBSJBCMF2 = WBSJBCMF1;
1C@ OFX F@TRJM? >JINOMP>ON <I <IJITHJPN >G<NN J=E@>O. WBSJBCMF1 <I? WBSJBCMF2 <=JQ@
H@M@GT KMJQD?@ <>>@NN OJ OC<O <IJITHJPN J=E@>O:
(BOPOZNPVT .Z$MBTT PCKFDU) WBSJBCMF1 WBSJBCMF2
---+-------------------+--- ---+---+--- ---+---+---
] ... ] ] P ] ] P ]
---+-------------------+--- ---+-]-+--- ---+-]-+---
q ] ]
] ] ]
+--------------------+------------+
Copying 56.1.4
JKTDIB <AA@>ON JIGT OC@ Q<MD<=G@N, IJO OC@ J=E@>O.
B@><PN@ >G<NN@N <M@ M@A@M@I>@ OTK@N, ?@ADIDIB < I@R >G<NN Q<MD<=G@ <N < >JKT JA <IJOC@M
H<F@N ORJ Q<MD<=G@N OC<O KMJQD?@ <>>@NN OJ OC@ N<H@ J=E@>O. 1C@ <>OP<G J=E@>O DN IJO >JKD@?.
0DI>@ IJ J=E@>O B@ON >JKD@?, OC@ KJNO=GDO API>ODJI UIJT(UIJT) DN IJO <Q<DG<=G@ AJM >G<NN@N.
BVUP WBSJBCMF2 = WBSJBCMF1;
&I OC@ >J?@ <=JQ@, WBSJBCMF2 DN =@DIB DIDOD<GDU@? =T WBSJBCMF1. 1C@ ORJ Q<MD<=G@N NO<MO
KMJQD?DIB <>>@NN OJ OC@ N<H@ J=E@>O.
4C@I OC@ <>OP<G J=E@>O I@@?N OJ =@ >JKD@?, OC@ >G<NN HPNO C<Q@ < H@H=@M API>ODJI AJM OC<O
KPMKJN@. 1J =@ >JHK<OD=G@ RDOC <MM<TN, OCDN API>ODJI H<T =@ I<H@? EVQ(). 1CDN API>ODJI HPNO
>M@<O@ <I? M@OPMI < I@R >G<NN J=E@>O. )@O'N N@@ OCDN JI < >G<NN OC<O C<N Q<MDJPN OTK@N JA
H@H=@MN:
DMBTT 'PP
\
4 P; // BTTVNF 4 JT B TUSVDU UZQF
DIBS<> T;
JOU J;
// ...
UIJT(4 P, DPOTU DIBS<> T, JOU J)
\
UIJT.P = P;
C>3EE7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
321
UIJT.T = T.EVQ;
UIJT.J = J;
^
'PP EVQ() DPOTU
\
SFUVSO OFX 'PP(P, T, J);
^
^
1C@ EVQ() H@H=@M API>ODJI H<F@N < I@R J=E@>O =T O<FDIB <?Q<IO<B@ JA OC@ >JINOMP>OJM JA
'PP <I? M@OPMIN OC@ I@R J=E@>O. +JO@ OC<O OC@ >JINOMP>OJM >JKD@N OC@ T H@H=@M @SKGD>DOGT =T
OC@ .EVQ KMJK@MOT JA <MM<TN. B@DIB Q<GP@ OTK@N, P <I? J <M@ >JKD@? <POJH<OD><GGT.
1C@ AJGGJRDIB >J?@ H<F@N PN@ JA EVQ() OJ >M@<O@ < I@R J=E@>O:
BVUP WBS1 = OFX 'PP(4(1.5), "IFMMP", 42);
BVUP WBS2 = WBS1.EVQ();
AN < M@NPGO, OC@ J=E@>ON OC<O <M@ <NNJ>D<O@? RDOC WBS1 <I? WBS2 <M@ ?DAA@M@IO.
0DHDG<MGT, <I JNNVUBCMF >JKT JA <I J=E@>O ><I =@ KMJQD?@? =T < H@H=@M API>ODJI
<KKMJKMD<O@GT I<H@? JEVQ():
DMBTT 'PP
\
// ...
JNNVUBCMF('PP) JEVQ() DPOTU
\
SFUVSO OFX JNNVUBCMF('PP)(P, T, J);
^
^
// ...
JNNVUBCMF('PP) JNN = WBS1.JEVQ();
Assignment 56.1.5
'PNO GDF@ >JKTDIB, <NNDBIH@IO <AA@>ON JIGT OC@ Q<MD<=G@N.
ANNDBIDIB OJ < >G<NN Q<MD<=G@ ?DN<NNJ>D<O@N OC<O Q<MD<=G@ AMJH DON >PMM@IO J=E@>O <I? <NNJ>D<O@N
DO RDOC < I@R J=E@>O.
&A OC@M@ DN IJ JOC@M >G<NN Q<MD<=G@ OC<O NODGG KMJQD?@N <>>@NN OJ OC@ J=E@>O OC<O C<N =@@I
?DN<NNJ>D<O@? AMJH, OC@I OC<O J=E@>O DN BJDIB OJ =@ ?@NOMJT@? NJH@ ODH@ DI OC@ APOPM@ =T OC@
B<M=<B@ >JGG@>OJM.
BVUP WBSJBCMF1 = OFX .Z$MBTT();
BVUP WBSJBCMF2 = OFX .Z$MBTT();
WBSJBCMF1 = WBSJBCMF2;
1C@ <NNDBIH@IO <=JQ@ H<F@N WBSJBCMF1 G@<Q@ DON J=E@>O <I? NO<MO KMJQD?DIB <>>@NN OJ
WBSJBCMF2'N J=E@>O. 0DI>@ OC@M@ DN IJ JOC@M Q<MD<=G@ AJM WBSJBCMF1'N JMDBDI<G J=E@>O, OC<O
J=E@>O RDGG =@ ?@NOMJT@? =T OC@ B<M=<B@ >JGG@>OJM.
1C@ =@C<QDJM JA <NNDBIH@IO ><IIJO =@ >C<IB@? AJM >G<NN@N. &I JOC@M RJM?N, PQ"TTJHO ><IIJO
=@ JQ@MGJ<?@? AJM OC@H.
C>3EE7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
322
Definition 56.1.6
G<NN@N <M@ ?@ADI@? =T OC@ DMBTT F@TRJM? DINO@<? JA OC@ TUSVDU F@TRJM?:
DMBTT $IFTT1JFDF
\
// ...
^
Construction 56.1.7
AN RDOC NOMP>ON, OC@ I<H@ JA OC@ >JINOMP>OJM DN UIJT. 2IGDF@ NOMP>ON, >G<NN J=E@>ON ><IIJO =@
>JINOMP>O@? =T OC@ \ ^ NTIO<S.
DMBTT $IFTT1JFDF
\
EDIBS TIBQF;
UIJT(EDIBS TIBQF)
\
UIJT.TIBQF = TIBQF;
^
^
2IGDF@ NOMP>ON, OC@M@ DN IJ <POJH<OD> J=E@>O >JINOMP>ODJI RC@M@ OC@ >JINOMP>OJM K<M<H@O@MN
<M@ <NNDBI@? OJ H@H=@MN N@LP@IOD<GGT:
DMBTT $IFTT1JFDF
\
EDIBS TIBQF;
TJ[F@U WBMVF;
^
WPJE NBJO()
\
BVUP LJOH = OFX $IFTT1JFDF('u', 100); // j DPNQJMBUJPO &3303
^
&SSPS: OP DPOTUSVDUPS GPS $IFTT1JFDF
#JM OC<O NTIO<S OJ RJMF, < >JINOMP>OJM HPNO =@ ?@ADI@? @SKGD>DOGT =T OC@ KMJBM<HH@M.
Destruction 56.1.8
AN RDOC NOMP>ON, OC@ I<H@ JA OC@ ?@NOMP>OJM DN _UIJT:
_UIJT()
\
// ...
^
Member access 56.1.9
0<H@ <N NOMP>ON, OC@ H@H=@MN <M@ <>>@NN@? =T OC@ 6AF JK@M<OJM:
BVUP LJOH = OFX $IFTT1JFDF('u');
XSJUFMO(LJOH.TIBQF);
C>3EE7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
323
AGOCJPBC OC@ NTIO<S H<F@N DO GJJF <N DA < H@H=@M JA OC@ H3D;34>7 DN =@DIB <>>@NN@?, DO DN
<>OP<GGT OC@ H@H=@M JA OC@ A4<75F. G<NN Q<MD<=G@N ?J IJO C<Q@ H@H=@MN, OC@ >G<NN J=E@>ON ?J.
1C@ LJOH Q<MD<=G@ ?J@N IJO C<Q@ < TIBQF H@H=@M, OC@ <IJITHJPN J=E@>O ?J@N.
Note: !F ;E GEG3>>K @AF BDAB7D FA 3557EE ?7?47DE 6;D75F>K 3E ;@ F:7 5A67 34AH7. ,:7@ F:3F
7J35F EK@F3J ;E 67E;D76, BDAB7DF;7E E:AG>6 47 BD787DD76, I:;5: I;>> 47 7JB>3;@76 ;@ 3 >3F7D
5:3BF7D.
Operator overloading 56.1.10
,OC@M OC<I OC@ A<>O OC<O PQ"TTJHO ><IIJO =@ JQ@MGJ<?@? AJM >G<NN@N, JK@M<OJM JQ@MGJ<?DIB DN
OC@ N<H@ <N NOMP>ON. #JM >G<NN@N, OC@ H@<IDIB JA PQ"TTJHO DN <GR<TN 3EEA5;3F;@9 3 5>3EE
H3D;34>7 I;F: 3 5>3EE A4<75F.
Member functions 56.1.11
*@H=@M API>ODJIN <M@ B@I@M<GGT OC@ N<H@ <N NOMP>ON.
A ?DAA@M@I>@ DN OC<O NJH@ H@H=@M API>ODJIN <M@ <POJH<OD><GGT DIC@MDO@? AMJH OC@ 0CKFDU
>G<NN. 4@ RDGG N@@ DI OC@ I@SO >C<KO@M CJR OC@ ?@ADIDODJI JA UP4USJOH DN >C<IB@? =T OC@
PWFSSJEF F@TRJM?.
The JT and !JT operators 56.1.12
1C@N@ JK@M<OJMN JK@M<O@ JI >G<NN Q<MD<=G@N.
JT NK@>DAD@N RC@OC@M ORJ >G<NN Q<MD<=G@N KMJQD?@ <>>@NN OJ OC@ N<H@ >G<NN J=E@>O. &O M@OPMIN
USVF DA OC@ J=E@>O DN OC@ N<H@ <I? GBMTF JOC@MRDN@. !JT DN OC@ JKKJNDO@ JA JT.
BVUP NZ,JOH = OFX $IFTT1JFDF('u');
BVUP ZPVS,JOH = OFX $IFTT1JFDF('u');
BTTFSU(NZ,JOH !JT ZPVS,JOH);
0DI>@ OC@ J=E@>ON JA NZ,JOH <I? ZPVS,JOH Q<MD<=G@N <M@ ?DAA@M@IO, OC@ !JT JK@M<OJM M@OPMIN
USVF. "Q@I OCJPBC OC@ ORJ J=E@>ON <M@ >JINOMP>O@? =T OC@ N<H@ >C<M<>O@M 's', OC@T <M@ NODGG
ORJ N@K<M<O@ J=E@>ON.
4C@I OC@ Q<MD<=G@N KMJQD?@ <>>@NN OJ OC@ N<H@ J=E@>O, JT M@OPMIN USVF:
BVUP NZ,JOH2 = NZ,JOH;
BTTFSU(NZ,JOH2 JT NZ,JOH);
BJOC JA OC@ Q<MD<=G@N <=JQ@ KMJQD?@ <>>@NN OJ OC@ N<H@ J=E@>O.
Summary
56.2
t G<NN@N <I? NOMP>ON NC<M@ >JHHJI A@<OPM@N =PO C<Q@ =DB ?DAA@M@I>@N.
t G<NN@N <M@ M@A@M@I>@ OTK@N. 1C@ OFX F@TRJM? >JINOMP>ON <I <IJITHJPN 5>3EE A4<75F <I?
M@OPMIN < 5>3EE H3D;34>7.
t G<NN Q<MD<=G@N OC<O <M@ IJO <NNJ>D<O@? RDOC <IT J=E@>O <M@ OVMM. C@>FDIB <B<DINO OVMM
HPNO =@ ?JI@ =T JT JM !JT, IJO =T == JM !=.
t 1C@ <>O JA >JKTDIB <NNJ>D<O@N <I <??DODJI<G Q<MD<=G@ RDOC <I J=E@>O. &I JM?@M OJ >JKT >G<NN
J=E@>ON, OC@ OTK@ HPNO C<Q@ < NK@>D<G API>ODJI GDF@GT I<H@? EVQ().
t ANNDBIH@IO <NNJ>D<O@N < Q<MD<=G@ RDOC <I J=E@>O. 1CDN =@C<QDJM ><IIJO =@ >C<IB@?.
C>3EE7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
324
Inheritance 57
&IC@MDO<I>@ DN ?@ADIDIB < HJM@ NK@>D<G OTK@ =<N@? JI <I @SDNODIB HJM@ B@I@M<G OTK@. 1C@
NK@>D<G OTK@ <>LPDM@N OC@ H@H=@MN JA OC@ B@I@M<G OTK@ <I? <N < M@NPGO, ><I O<F@ KG<>@ JA OC@
B@I@M<G OTK@.
&IC@MDO<I>@ DN <Q<DG<=G@ AJM >G<NN@N, IJO NOMP>ON. 1C@ >G<NN OC<O DIC@MDON <IJOC@M >G<NN DN ><GG@?
OC@ EG45>3EE, <I? OC@ >G<NN OC<O B@ON DIC@MDO@? DN ><GG@? OC@ EGB7D5>3EE.
1C@M@ <M@ ORJ OTK@N JA DIC@MDO<I>@ DI !. 4@ RDGG >JQ@M ;?B>7?7@F3F;A@ ;@:7D;F3@57 DI OCDN
>C<KO@M <I? G@<Q@ ;@F7D8357 ;@:7D;F3@57 OJ < G<O@M >C<KO@M.
4C@I ?@ADIDIB < NP=>G<NN, OC@ NPK@M>G<NN DN NK@>DAD@? <AO@M < >JGJI >C<M<>O@M:
DMBTT SubClass : SuperClass
\
// ...
^
1J N@@ <I @S<HKG@ JA OCDN, G@O'N <NNPH@ OC<O OC@M@ DN <GM@<?T OC@ AJGGJRDIB >G<NN OC<O
M@KM@N@ION < >GJ>F:
DMBTT $MPDL
\
JOU IPVS;
JOU NJOVUF;
JOU TFDPOE;
WPJE BEKVTU(JOU IPVS, JOU NJOVUF, JOU TFDPOE = 0)
\
UIJT.IPVS = IPVS;
UIJT.NJOVUF = NJOVUF;
UIJT.TFDPOE = TFDPOE;
^
^
AKK<M@IOGT, OC@ H@H=@MN JA OC<O >G<NN ?J IJO I@@? NK@>D<G Q<GP@N ?PMDIB >JINOMP>ODJI; NJ
OC@M@ DN IJ >JINOMP>OJM. &INO@<?, OC@ H@H=@MN <M@ N@O =T OC@ BEKVTU() H@H=@M API>ODJI:
BVUP EFTL$MPDL = OFX $MPDL;
EFTL$MPDL.BEKVTU(20, 30);
XSJUFGMO(
"%02T:%02T:%02T",
EFTL$MPDL.IPVS, EFTL$MPDL.NJOVUF, EFTL$MPDL.TFDPOE);
Note: !F IAG>6 47 ?AD7 GE78G> FA BDA6G57 F:7 F;?7 EFD;@9 4K 3 toString() 8G@5F;A@. !F I;>> 47
36676 >3F7D I:7@ 7JB>3;@;@9 F:7 override =7KIAD6 47>AI.
1C@ JPOKPO:
20:30:00
4DOC JIGT OC<O HP>C API>ODJI<GDOT, $MPDL >JPG? =@ < NOMP>O <N R@GG, <I? ?@K@I?DIB JI OC@
I@@?N JA OC@ KMJBM<H, OC<O >JPG? =@ NPAAD>D@IO.
%JR@Q@M, =@DIB < >G<NN H<F@N DO KJNND=G@ OJ DIC@MDO AMJH $MPDL.
1J N@@ <I @S<HKG@ JA DIC@MDO<I>@, G@O'N >JIND?@M <I "MBSN$MPDL OC<O IJO JIGT DI>GP?@N <GG JA
OC@ API>ODJI<GDOT JA $MPDL, =PO <GNJ KMJQD?@N < R<T JA N@OODIB OC@ <G<MH. )@O'N ADMNO ?@ADI@ OCDN
OTK@ RDOCJPO M@B<M? OJ $MPDL. &A R@ ?D? OC<O, R@ RJPG? C<Q@ OJ DI>GP?@ OC@ N<H@ OCM@@
!@:7D;F3@57
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
325
H@H=@MN JA $MPDL <I? OC@ N<H@ BEKVTU() API>ODJI OC<O <?EPNO@? OC@H. "MBSN$MPDL RJPG?
<GNJ C<Q@ JOC@M H@H=@MN AJM DON <??DODJI<G API>ODJI<GDOT:
DMBTT "MBSN$MPDL
\
JOU IPVS;
JOU NJOVUF;
JOU TFDPOE;
JOU BMBSN)PVS;
JOU BMBSN.JOVUF;
WPJE BEKVTU(JOU IPVS, JOU NJOVUF, JOU TFDPOE = 0)
\
UIJT.IPVS = IPVS;
UIJT.NJOVUF = NJOVUF;
UIJT.TFDPOE = TFDPOE;
^
WPJE BEKVTU"MBSN(JOU IPVS, JOU NJOVUF)
\
BMBSN)PVS = IPVS;
BMBSN.JOVUF = NJOVUF;
^
^
1C@ H@H=@MN OC<O <KK@<M @S<>OGT DI $MPDL <M@ CDBCGDBCO@?. AN ><I =@ N@@I, ?@ADIDIB $MPDL
<I? "MBSN$MPDL N@K<M<O@GT M@NPGON DI >J?@ ?PKGD><ODJI.
&IC@MDO<I>@ DN C@GKAPG DI NP>C ><N@N. &IC@MDODIB "MBSN$MPDL AMJH $MPDL NDHKGDAD@N OC@ I@R
>G<NN <I? M@?P>@N >J?@ ?PKGD><ODJI:
DMBTT "MBSN$MPDL : $MPDL
\
JOU BMBSN)PVS;
JOU BMBSN.JOVUF;
WPJE BEKVTU"MBSN(JOU IPVS, JOU NJOVUF)
\
BMBSN)PVS = IPVS;
BMBSN.JOVUF = NJOVUF;
^
^
1C@ I@R ?@ADIDODJI JA "MBSN$MPDL DN OC@ @LPDQ<G@IO JA OC@ KM@QDJPN JI@. 1C@ CDBCGDBCO@? K<MO
JA OC@ I@R ?@ADIDODJI >JMM@NKJI?N OJ OC@ CDBCGDBCO@? K<MON JA OC@ JG? ?@ADIDODJI.
B@><PN@ "MBSN$MPDL DIC@MDON OC@ H@H=@MN JA $MPDL, DO ><I =@ PN@? EPNO GDF@ < $MPDL:
BVUP CFE4JEF$MPDL = OFX "MBSN$MPDL;
CFE4JEF$MPDL.BEKVTU(20, 30);
CFE4JEF$MPDL.BEKVTU"MBSN(7, 0);
1C@ H@H=@MN OC<O <M@ DIC@MDO@? AMJH OC@ NPK@M>G<NN <M@ <>>@NN@? <N DA OC@T <M@ OC@ H@H=@MN
JA OC@ NP=>G<NN:
XSJUFGMO("%02T:%02T:%02T |%02T:%02T",
CFE4JEF$MPDL.IPVS,
CFE4JEF$MPDL.NJOVUF,
CFE4JEF$MPDL.TFDPOE,
CFE4JEF$MPDL.BMBSN)PVS,
CFE4JEF$MPDL.BMBSN.JOVUF);
1C@ JPOKPO:
!@:7D;F3@57
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
326
20:30:00 z07:00
Note: A@ AlarmClock.toString 8G@5F;A@ IAG>6 47 ?AD7 GE78G> ;@ F:;E 53E7. !F I;>> 47 678;@76
>3F7D 47>AI.
1C@ DIC@MDO<I>@ PN@? DI OCDN @S<HKG@ DN ;?B>7?7@F3F;A@ ;@:7D;F3@57.
&A R@ DH<BDI@ OC@ H@HJMT <N < MD==JI BJDIB AMJH OJK OJ =JOOJH, OC@ KG<>@H@IO JA OC@
H@H=@MN JA "MBSN$MPDL DI H@HJMT ><I =@ KD>OPM@? <N DI OC@ AJGGJRDIB DGGPNOM<ODJI:
] . ]
] . ]
UIF BEESFTT PG UIF PCKFDU l +-------------+
] IPVS ]
] NJOVUF ]
] TFDPOE ]
] BMBSN)PVS ]
] BMBSN.JOVUF ]
+-------------+
] . ]
] . ]
1C@ DGGPNOM<ODJI <=JQ@ DN EPNO OJ BDQ@ <I D?@< JI CJR OC@ H@H=@MN JA OC@ NPK@M>G<NN <I? OC@
NP=>G<NN H<T =@ >JH=DI@? OJB@OC@M. 1C@ <>OP<G G<TJPO JA OC@ H@H=@MN RJPG? ?@K@I? JI
?@>DNDJIN OC<O <M@ H<?@ =T OC@ >JHKDG@M ?PMDIB >JHKDG<ODJI.
Warning: Inherit only if "is a"
57.1
4@ C<Q@ N@@I OC<O DHKG@H@IO<ODJI DIC@MDO<I>@ DN <=JPO <>LPDMDIB H@H=@MN. JIND?@M OCDN
FDI? JA DIC@MDO<I>@ JIGT DA OC@ NP=OTK@ ><I =@ OCJPBCO JA =@DIB < FDI? JA OC@ NPK@MOTK@ <N DI
OC@ KCM<N@ "<G<MH >GJ>F ;E 3 >GJ>F."
"&N <" DN IJO OC@ JIGT M@G<ODJINCDK =@OR@@I OTK@N; < HJM@ >JHHJI M@G<ODJINCDK DN OC@ "C<N <"
M@G<ODJINCDK. #JM @S<HKG@, G@O'N <NNPH@ OC<O R@ R<IO OJ <?? OC@ >JI>@KO JA < #BUUFSZ OJ OC@
$MPDL >G<NN. &O RJPG? IJO =@ <KKMJKMD<O@ OJ <?? #BUUFSZ OJ $MPDL =T DIC@MDO<I>@ =@><PN@ OC@
NO<O@H@IO ">GJ>F DN < =<OO@MT" DN IJO OMP@:
DMBTT $MPDL : #BUUFSZ // j 8SPOH EFTJHO
\
// ...
^
A >GJ>F DN IJO < =<OO@MT; DO :3E 3 =<OO@MT. 4C@I OC@M@ DN NP>C < M@G<ODJINCDK JA >JIO<DIH@IO,
OC@ OTK@ OC<O DN >JIO<DI@? HPNO =@ ?@ADI@? <N < H@H=@M JA OC@ OTK@ OC<O >JIO<DIN DO:
DMBTT $MPDL
\
#BUUFSZ CBUUFSZ; // j $PSSFDU EFTJHO
// ...
^
Interitance from at most one class
57.2
G<NN DIC@MDO<I>@ DN GDHDO@? =T < NDIBG@ >G<NN.
#JM @S<HKG@, <NNPHDIB OC<O OC@M@ DN <GNJ < 4PVOE&NJUUFS >G<NN, <I? @Q@I OCJPBC "<G<MH
>GJ>F DN < NJPI? @HDOODIB J=E@>O" DN <GNJ OMP@, DO DN IJO KJNND=G@ OJ DIC@MDO "MBSN$MPDL =JOC
AMJH $MPDL <I? 4PVOE&NJUUFS:
!@:7D;F3@57
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
327
DMBTT 4PVOE&NJUUFS
\
// ...
^
DMBTT "MBSN$MPDL : $MPDL, 4PVOE&NJUUFS // j DPNQJMBUJPO &3303
\
// ...
^
,I OC@ JOC@M C<I?, OC@M@ DN IJ GDHDO OJ OC@ IPH=@M JA ;@F7D8357E OC<O < >G<NN ><I DIC@MDO AMJH.
4@ RDGG N@@ OC@ JOUFSGBDF F@TRJM? DI < G<O@M >C<KO@M.
A??DODJI<GGT, OC@M@ DN IJ GDHDO OJ CJR ?@@K OC@ DIC@MDO<I>@ CD@M<M>CT ><I BJ:
DMBTT .VTJDBM*OTUSVNFOU
\
// ...
^
DMBTT 4USJOH*OTUSVNFOU : .VTJDBM*OTUSVNFOU
\
// ...
^
DMBTT 7JPMJO : 4USJOH*OTUSVNFOU
\
// ...
^
1C@ DIC@MDO<I>@ CD@M<M>CT <=JQ@ ?@ADI@N < M@G<ODJINCDK AMJH OC@ HJM@ B@I@M<G OJ OC@ HJM@
NK@>DAD>: HPND><G DINOMPH@IO, NOMDIB DINOMPH@IO, <I? QDJGDI.
Hierarchy charts
57.3
1TK@N OC<O <M@ M@G<O@? =T OC@ "DN <" M@G<ODJINCDK AJMH < 5>3EE :;7D3D5:K.
A>>JM?DIB OJ ,,- >JIQ@IODJIN, >G<NN CD@M<M>CD@N <M@ M@KM@N@IO@? =T NPK@M>G<NN@N =@DIB JI
OC@ OJK <I? OC@ NP=>G<NN@N =@DIB <O OC@ =JOOJH. 1C@ DIC@MDO<I>@ M@G<ODJINCDKN <M@ DI?D><O@?
=T <MMJRN KJDIODIB AMJH OC@ NP=>G<NN@N OJ OC@ NPK@M>G<NN@N.
#JM @S<HKG@, OC@ AJGGJRDIB ><I =@ < CD@M<M>CT JA HPND><G DINOMPH@ION:
.VTJDBM*OTUSVNFOU
o n
4USJOH*OTUSVNFOU 8JOE*OTUSVNFOU
o n o n
7JPMJO (VJUBS 'MVUF 3FDPSEFS
Accessing superclass members
57.4
1C@ TVQFS F@TRJM? <GGJRN M@A@MMDIB OJ H@H=@MN OC<O <M@ DIC@MDO@? AMJH OC@ NPK@M>G<NN.
DMBTT "MBSN$MPDL : $MPDL
\
// ...
WPJE GPP()
\
TVQFS.NJOVUF = 10; // 5IF JOIFSJUFE 'NJOVUF' NFNCFS
NJOVUF = 10; // 4BNF UIJOH JG UIFSF JT OP BNCJHVJUZ
!@:7D;F3@57
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
328
^
^
1C@ TVQFS F@TRJM? DN IJO <GR<TN I@>@NN<MT; NJOVUF <GJI@ C<N OC@ N<H@ H@<IDIB DI OC@ >J?@
<=JQ@. 1C@ TVQFS F@TRJM? DN I@@?@? RC@I =JOC OC@ NPK@M>G<NN <I? OC@ NP=>G<NN C<Q@
H@H=@MN PI?@M OC@ N<H@ I<H@N. 4@ RDGG N@@ OCDN =@GJR RC@I R@ RDGG I@@? OJ RMDO@
TVQFS.SFTFU() <I? TVQFS.UP4USJOH().
Constructing superclass members
57.5
1C@ JOC@M PN@ JA OC@ TVQFS F@TRJM? DN OJ ><GG OC@ >JINOMP>OJM JA OC@ NPK@M>G<NN. 1CDN DN NDHDG<M
OJ ><GGDIB OC@ >JINOMP>OJMN JA OC@ >PMM@IO >G<NN: UIJT RC@I ><GGDIB >JINOMP>OJMN JA OCDN >G<NN
<I? TVQFS RC@I ><GGDIB >JINOMP>OJMN JA OC@ NPK@M>G<NN.
&O DN IJO M@LPDM@? OJ ><GG OC@ NPK@M>G<NN >JINOMP>OJM @SKGD>DOGT; RC@I OC@ NPK@M>G<NN C<N <
?@A<PGO >JINOMP>OJM, OC@ DIC@MDO@? H@H=@MN JA OC@ NPK@M>G<NN <M@ <POJH<OD><GGT ?@A<PGO-
>JINOMP>O@?.
4@ C<Q@ IJO ?@ADI@? >JINOMP>OJMN AJM OC@ $MPDL <I? "MBSN$MPDL >G<NN@N T@O. #JM OC<O M@<NJI,
OC@ H@H=@MN JA =JOC JA OCJN@ >G<NN@N <M@ DIDOD<GDU@? =T OC@ .JOJU Q<GP@N JA OC@DM M@NK@>ODQ@
OTK@N, RCD>C DN 0 AJM JOU.
)@O'N <NNPH@ OC<O $MPDL C<N OC@ AJGGJRDIB >JINOMP>OJM:
DMBTT $MPDL
\
UIJT(JOU IPVS, JOU NJOVUF, JOU TFDPOE)
\
UIJT.IPVS = IPVS;
UIJT.NJOVUF = NJOVUF;
UIJT.TFDPOE = TFDPOE;
^
// ...
^
1C<O >JINOMP>OJM HPNO =@ PN@? RC@I >JINOMP>ODIB $MPDL J=E@>ON:
BVUP DMPDL = OFX $MPDL(17, 15, 0);
+<OPM<GGT, OC@ KMJBM<HH@MN RCJ PN@ OC@ $MPDL OTK@ ?DM@>OGT RJPG? C<Q@ OJ PN@ OC<O NTIO<S.
%JR@Q@M, RC@I >JINOMP>ODIB <I "MBSN$MPDL J=E@>O, OC@T ><IIJO >JINOMP>O DON $MPDL K<MO
N@K<M<O@GT. B@ND?@N, OC@ PN@MN JA "MBSN$MPDL I@@? IJO @Q@I FIJR OC<O DO DIC@MDON AMJH $MPDL.
A PN@M JA "MBSN$MPDL NCJPG? NDHKGT >JINOMP>O <I "MBSN$MPDL J=E@>O <I? PN@ DO DI OC@
KMJBM<H RDOCJPO I@@?DIB OJ K<T <OO@IODJI OJ DON $MPDL C@MDO<B@:
BVUP CFE4JEF$MPDL = OFX "MBSN$MPDL(/* ... */);
// ... VTF BT BO "MBSN$MPDL ...
#JM OC<O M@<NJI, >JINOMP>ODIB OC@ NPK@M>G<NN K<MO DN OC@ M@NKJIND=DGDOT JA OC@ NP=>G<NN. 1C@
NP=>G<NN ><GGN OC@ >JINOMP>OJM JA OC@ NPK@M>G<NN =T OC@ TVQFS() NTIO<S:
DMBTT "MBSN$MPDL : $MPDL
\
UIJT(JOU IPVS, JOU NJOVUF, JOU TFDPOE, // GPS $MPDL'T NFNCFST
JOU BMBSN)PVS, JOU BMBSN.JOVUF) // GPS "MBSN$MPDL'T NFNCFST
\
TVQFS(IPVS, NJOVUF, TFDPOE);
!@:7D;F3@57
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
329
UIJT.BMBSN)PVS = BMBSN)PVS;
UIJT.BMBSN.JOVUF = BMBSN.JOVUF;
^
// ...
^
1C@ >JINOMP>OJM JA "MBSN$MPDL O<F@N <MBPH@ION AJM =JOC DON JRI H@H=@MN <I? OC@ H@H=@MN
JA DON NPK@M>G<NN. &O OC@I PN@N NJH@ JA OC<O DIAJMH<ODJI OJ >JINOMP>O DON NPK@M>G<NN K<MO.
&A OC@ NPK@M>G<NN <GM@<?T C<N < ?@A<PGO >JINOMP>OJM, DO DN IJO I@>@NN<MT OJ ><GG TVQFS()
@SKGD>DOGT.
Overriding the definitions of member functions
57.6
,I@ JA OC@ =@I@ADON JA DIC@MDO<I>@ DN =@DIB <=G@ OJ M@?@ADI@ OC@ H@H=@M API>ODJIN JA OC@
NPK@M>G<NN DI OC@ NP=>G<NN. 1CDN DN ><GG@? AH7DD;6;@9: 1C@ @SDNODIB ?@ADIDODJI JA OC@ H@H=@M
API>ODJI JA OC@ NPK@M>G<NN DN JQ@MMD??@I =T OC@ NP=>G<NN =T OC@ PWFSSJEF F@TRJM?.
)@O'N <NNPH@ OC<O $MPDL C<N < H@H=@M API>ODJI OC<O DN PN@? AJM M@N@OODIB DON H@H=@MN <GG OJ
U@MJ:
DMBTT $MPDL
\
WPJE SFTFU()
\
IPVS = 0;
NJOVUF = 0;
TFDPOE = 0;
^
// ...
^
1C<O API>ODJI DN DIC@MDO@? =T "MBSN$MPDL <I? ><I =@ ><GG@? JI <I "MBSN$MPDL J=E@>O:
BVUP CFE4JEF$MPDL = OFX "MBSN$MPDL(20, 30, 0, 7, 0);
// ...
CFE4JEF$MPDL.SFTFU();
%JR@Q@M, ?@>D?@?GT DBIJM<IO JA OC@ H@H=@MN JA "MBSN$MPDL, $MPDL.SFTFU ><I JIGT M@N@O DON
JRI H@H=@MN. #JM OC<O M@<NJI, OJ M@N@O OC@ H@H=@MN JA OC@ NP=>G<NN <N R@GG, SFTFU() HPNO
=@ JQ@MMD??@I:
DMBTT "MBSN$MPDL : $MPDL
\
PWFSSJEF WPJE SFTFU()
\
TVQFS.SFTFU();
BMBSN)PVS = 0;
BMBSN.JOVUF = 0;
^
// ...
^
1C@ NP=>G<NN M@N@ON JIGT DON JRI H@H=@MN <I? ?DNK<O>C@N OC@ M@NO JA OC@ O<NF OJ $MPDL =T OC@
TVQFS.SFTFU() ><GG. +JO@ OC<O RMDODIB EPNO SFTFU() RJPG? IJO RJMF <N DO RJPG? H@<I OC@
SFTFU() API>ODJI JA "MBSN$MPDL DON@GA. <GGDIB SFTFU() AMJH RDOCDI DON@GA RJPG? ><PN@ <I
DIADIDO@ M@>PMNDJI.
!@:7D;F3@57
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
330
1C@ M@<NJI OC<O & C<Q@ ?@G<T@? OC@ ?@ADIDODJI JA UP4USJOH() PIODG OCDN KJDIO DN OC<O DO HPNO =@
?@ADI@? =T OC@ PWFSSJEF F@TRJM? AJM >G<NN@N. AN R@ RDGG N@@ DI OC@ I@SO >C<KO@M, @Q@MT >G<NN
DN <POJH<OD><GGT DIC@MDO@? AMJH < NPK@M>G<NN ><GG@? 0CKFDU <I? 0CKFDU <GM@<?T ?@ADI@N <
UP4USJOH() H@H=@M API>ODJI.
#JM OC<O M@<NJI, OC@ UP4USJOH() H@H=@M API>ODJI AJM >G<NN@N HPNO =@ ?@ADI@? =T OC@
PWFSSJEF F@TRJM?:
DMBTT $MPDL
\
PWFSSJEF TUSJOH UP4USJOH() DPOTU
\
SFUVSO GPSNBU("%02T:%02T:%02T", IPVS, NJOVUF, TFDPOE);
^
// ...
^
DMBTT "MBSN$MPDL : $MPDL
\
PWFSSJEF TUSJOH UP4USJOH() DPOTU
\
SFUVSO GPSNBU("%T |%02T:%02T", TVQFS.UP4USJOH(),
BMBSN)PVS, BMBSN.JOVUF);
^
// ...
^
+JO@ OC<O "MBSN$MPDL DN <B<DI ?DNK<O>CDIB NJH@ JA OC@ O<NF OJ $MPDL =T OC@
TVQFS.UP4USJOH() ><GG.
1CJN@ ORJ JQ@MMD?@N JA UP4USJOH() <GGJR PNDIB "MBSN$MPDL J=E@>ON <N NOMDIBN:
WPJE NBJO()
\
BVUP EFTL$MPDL = OFX "MBSN$MPDL(10, 15, 0, 6, 45);
XSJUFMO(EFTL$MPDL);
^
1C@ JPOKPO:
10:15:00 z06:45
Using the subclass in place of the superclass
57.7
0DI>@ OC@ NPK@M>G<NN DN HJM@ 97@7D3> <I? OC@ NP=>G<NN DN HJM@ EB75;3>, J=E@>ON JA < NP=>G<NN
><I =@ PN@? DI KG<>@N RC@M@ <I J=E@>O JA NPK@M>G<NN DN M@LPDM@?. 1CDN DN ><GG@? BA>K?ADB:;E?.
1C@ >JI>@KON JA B@I@M<G <I? NK@>D<G OTK@N ><I =@ N@@I DI NO<O@H@ION GDF@ "OCDN OTK@ DN JA OC<O
OTK@": "<G<MH >GJ>F DN < >GJ>F", "NOP?@IO DN < K@MNJI", "><O DN <I <IDH<G", @O>. A>>JM?DIBGT, <I
<G<MH >GJ>F ><I =@ PN@? RC@M@ < >GJ>F DN I@@?@?, < NOP?@IO ><I =@ PN@? RC@M@ < K@MNJI DN
I@@?@?, <I? < ><O ><I =@ PN@? RC@M@ <I <IDH<G DN I@@?@?.
4C@I < NP=>G<NN J=E@>O DN =@DIB PN@? <N < NPK@M>G<NN J=E@>O, DO ?J@N IJO GJN@ DON JRI NK@>D<G
OTK@. 1CDN DN NDHDG<M OJ DON @S<HKG@N DI M@<G GDA@: 2NDIB <I <G<MH >GJ>F NDHKGT <N < >GJ>F ?J@N
IJO >C<IB@ OC@ A<>O OC<O DO DN <I <G<MH >GJ>F; DO RJPG? NODGG =@C<Q@ GDF@ <I <G<MH >GJ>F.
)@O'N <NNPH@ OC<O < API>ODJI O<F@N < $MPDL J=E@>O <N K<M<H@O@M, RCD>C DO M@N@ON <O NJH@ KJDIO
?PMDIB DON @S@>PODJI:
!@:7D;F3@57
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
331
WPJE VTF($MPDL DMPDL)
\
// ...
DMPDL.SFTFU();
// ...
^
-JGTHJMKCDNH H<F@N DO KJNND=G@ OJ N@I? <I "MBSN$MPDL OJ NP>C < API>ODJI:
BVUP EFTL$MPDL = OFX "MBSN$MPDL(10, 15, 0, 6, 45);
XSJUFMO("#FGPSF: ", EFTL$MPDL);
VTF(EFTL$MPDL);
XSJUFMO(""GUFS : ", EFTL$MPDL);
1CDN DN DI <>>JM?<I>@ RDOC OC@ M@G<ODJINCDK "<G<MH >GJ>F DN < >GJ>F." AN < M@NPGO, OC@ H@H=@MN
JA OC@ EFTL$MPDL J=E@>O B@ON M@N@O:
#FGPSF: 10:15:00 z06:45
"GUFS : 00:00:00 z00:00
1C@ DHKJMO<IO J=N@MQ<ODJI C@M@ DN OC<O IJO JIGT OC@ H@H=@MN JA $MPDL =PO <GNJ OC@ H@H=@MN
JA "MBSN$MPDL C<Q@ =@@I M@N@O.
AGOCJPBC VTF() ><GGN SFTFU() JI < $MPDL J=E@>O, NDI>@ OC@ <>OP<G J=E@>O DN <I "MBSN$MPDL,
OC@ API>ODJI OC<O B@ON ><GG@? DN "MBSN$MPDL.SFTFU. A>>JM?DIB OJ DON ?@ADIDODJI <=JQ@,
"MBSN$MPDL.SFTFU M@N@ON OC@ H@H=@MN JA =JOC $MPDL <I? "MBSN$MPDL.
&I JOC@M RJM?N, <GOCJPBC VTF() PN@N OC@ J=E@>O <N < $MPDL, OC@ <>OP<G J=E@>O H<T =@ <I
DIC@MDO@? OTK@ OC<O =@C<Q@N DI DON JRI NK@>D<G R<T.
)@O'N <?? <IJOC@M >G<NN OJ OC@ $MPDL CD@M<M>CT. 1C@ SFTFU() API>ODJI JA OCDN OTK@ N@ON DON
H@H=@MN OJ M<I?JH Q<GP@N:
JNQPSU TUE.SBOEPN;
DMBTT #SPLFO$MPDL : $MPDL
\
UIJT()
\
TVQFS(0, 0, 0);
^
PWFSSJEF WPJE SFTFU()
\
IPVS = VOJGPSN(0, 24);
NJOVUF = VOJGPSN(0, 60);
TFDPOE = VOJGPSN(0, 60);
^
^
4C@I <I J=E@>O JA #SPLFO$MPDL DN N@IO OJ VTF(), OC@I OC@ NK@>D<G SFTFU() API>ODJI JA
#SPLFO$MPDL RJPG? =@ ><GG@?. AB<DI, <GOCJPBC DO DN K<NN@? <N < $MPDL, OC@ <>OP<G J=E@>O DN
NODGG < #SPLFO$MPDL:
BVUP TIFMG$MPDL = OFX #SPLFO$MPDL;
VTF(TIFMG$MPDL);
XSJUFMO(TIFMG$MPDL);
1C@ JPOKPO NCJRN M<I?JH ODH@ Q<GP@N <N < M@NPGO JA M@N@OODIB < #SPLFO$MPDL:
22:46:37
!@:7D;F3@57
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
332
Inheritance is transitive
57.8
-JGTHJMKCDNH DN IJO GDHDO@? OJ ORJ >G<NN@N. 0P=>G<NN@N JA NP=>G<NN@N ><I <GNJ =@ PN@? DI
KG<>@ JA <IT NPK@M>G<NN DI OC@ CD@M<M>CT.
)@O'N >JIND?@M OC@ .VTJDBM*OTUSVNFOU CD@M<M>CT:
DMBTT .VTJDBM*OTUSVNFOU
\
// ...
^
DMBTT 4USJOH*OTUSVNFOU : .VTJDBM*OTUSVNFOU
\
// ...
^
DMBTT 7JPMJO : 4USJOH*OTUSVNFOU
\
// ...
^
1C@ DIC@MDO<I>@N <=JQ@ =PDG? OC@ AJGGJRDIB M@G<ODJINCDKN: "NOMDIB DINOMPH@IO DN < HPND><G
DINOMPH@IO" <I? "QDJGDI DN < NOMDIB DINOMPH@IO." 1C@M@AJM@, DO DN <GNJ OMP@ OC<O "QDJGDI DN <
HPND><G DINOMPH@IO." JIN@LP@IOGT, < 7JPMJO J=E@>O ><I =@ PN@? DI KG<>@ JA <
.VTJDBM*OTUSVNFOU.
ANNPHDIB OC<O <GG JA OC@ NPKKJMODIB >J?@ =@GJR C<Q@ <GNJ =@@I ?@ADI@?:
WPJE QMBZ*O5VOF(.VTJDBM*OTUSVNFOU JOTUSVNFOU,
.VTJDBM1JFDF QJFDF)
\
JOTUSVNFOU.UVOF();
JOTUSVNFOU.QMBZ(QJFDF);
^
// ...
BVUP NZ7JPMJO = OFX 7JPMJO;
QMBZ*O5VOF(NZ7JPMJO, JNQSPWJTBUJPO);
AGOCJPBC QMBZ*O5VOF() @SK@>ON < .VTJDBM*OTUSVNFOU, DO DN =@DIB ><GG@? RDOC < 7JPMJO ?P@
OJ OC@ M@G<ODJINCDK "QDJGDI DN < HPND><G DINOMPH@IO."
&IC@MDO<I>@ ><I =@ <N ?@@K <N I@@?@?.
Abstract member functions and abstract classes
57.9
0JH@ODH@N OC@M@ <M@ H@H=@M API>ODJIN OC<O <M@ I<OPM<G OJ <KK@<M JI < >G<NN DIO@MA<>@ @Q@I
OCJPBC OC<O >G<NN ><IIJO KMJQD?@ DON ?@ADIDODJI. 4C@I OC@M@ DN IJ 5A@5D7F7 ?@ADIDODJI JA <
H@H=@M API>ODJI, OC<O API>ODJI DN <I 34EFD35F H@H=@M API>ODJI. A >G<NN OC<O C<N <O G@<NO JI@
<=NOM<>O H@H=@M API>ODJI DN <I <=NOM<>O >G<NN.
#JM @S<HKG@, OC@ $IFTT1JFDF NPK@M>G<NN DI < CD@M<M>CT H<T C<Q@ <I JT7BMJE() H@H=@M
API>ODJI OC<O ?@O@MHDI@N RC@OC@M < BDQ@I HJQ@ DN Q<GD? AJM OC<O >C@NN KD@>@. 0DI>@ Q<GD?DOT JA
< HJQ@ ?@K@I?N JI OC@ <>OP<G OTK@ JA OC@ >C@NN KD@>@, OC@ $IFTT1JFDF B@I@M<G >G<NN ><IIJO
H<F@ OCDN ?@>DNDJI DON@GA. 1C@ Q<GD? HJQ@N ><I JIGT =@ FIJRI =T OC@ NP=>G<NN@N GDF@ 1BXO,
,JOH, @O>.
1C@ BCTUSBDU F@TRJM? NK@>DAD@N OC<O OC@ ?@ADIDODJI JA OC@ H@H=@M API>ODJI DN IJO KMJQD?@? =T
OCDN >G<NN <I? ?GEF 47 KMJQD?@? =T < NP=>G<NN:
!@:7D;F3@57
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
333
DMBTT $IFTT1JFDF
\
BCTUSBDU CPPM JT7BMJE(JO 4RVBSF GSPN, JO 4RVBSF UP);
^
1C@ JT7BMJE() API>ODJI ?J@N IJO C<Q@ < ?@ADIDODJI; DO DN < ?@>G<M<ODJI.
&O DN IJO KJNND=G@ OJ >JINOMP>O J=E@>ON JA <=NOM<>O >G<NN@N:
BVUP QJFDF = OFX $IFTT1JFDF; // j DPNQJMBUJPO &3303
,=E@>ON JA <I <=NOM<>O >G<NN ><IIJO =@ PN@? =@><PN@ JA OC@ HDNNDIB API>ODJI ?@ADIDODJIN. 0P>C
< >G<NN RJPG? IJO FIJR CJR OJ M@NKJI? OJ < ><GG GDF@
QJFDF.JT7BMJE(UIJT4RVBSF, UIBU4RVBSF).
,I OC@ JOC@M C<I?, DO DN KJNND=G@ OJ >JINOMP>O J=E@>ON JA NP=>G<NN@N <N GJIB <N OC@M@ <M@ IJ
API>ODJI ?@ADIDODJIN OC<O <M@ NODGG G@AO PI?@ADI@? (D.@. OC<O <M@ NODGG <=NOM<>O):
DMBTT 1BXO : $IFTT1JFDF
\
PWFSSJEF CPPM JT7BMJE(JO 4RVBSF GSPN, JO 4RVBSF UP)
\
// ... UIF JNQMFNFOUBUJPO PG JT7BMJE GPS QBXO ...
SFUVSO EFDJTJPO;
^
^
B@><PN@ DO KMJQD?@N OC@ ?@ADIDODJI AJM OC@ <=NOM<>O API>ODJI, DO DN KJNND=G@ OJ >JINOMP>O J=E@>ON
JA 1BXO:
BVUP QJFDF = OFX 1BXO; // DPNQJMFT
Example
57.10
)@O'N >JIND?@M < >G<NN CD@M<M>CT OC<O M@KM@N@ION M<DGR<T Q@CD>G@N:
3BJMXBZ7FIJDMF
/ ] =
-PDPNPUJWF 5SBJO 3BJMXBZ$BS \ MPBE(), VOMPBE() ^
/ =
1BTTFOHFS$BS 'SFJHIU$BS
1C@ API>ODJIN OC<O OC@ 3BJMXBZ$BS RDGG ?@>G<M@ <N BCTUSBDU <M@ DI?D><O@? =T M@? LP@NODJI
H<MFN.
0DI>@ HT BJ<G DN JIGT OJ KM@N@IO < >G<NN CD@M<M>CT <I? KJDIO JPO NJH@ JA DON ?@NDBI ?@>DNDJIN, &
RDGG IJO APGGT DHKG@H@IO OC@N@ >G<NN@N. &INO@<? JA ?JDIB <>OP<G RJMF, OC@T RDGG NDHKGT KMDIO
H@NN<B@N.
1C@ HJNO B@I@M<G >G<NN JA OC@ CD@M<M>CT <=JQ@ DN 3BJMXBZ7FIJDMF. &I OCDN KMJBM<H, DO RDGG
JIGT FIJR CJR OJ HJQ@ DON@GA:
DMBTT 3BJMXBZ7FIJDMF
\
WPJE BEWBODF(JO TJ[F@U LJMPNFUFST)
\
XSJUFGMO("5IF WFIJDMF JT BEWBODJOH %T LJMPNFUFST",
LJMPNFUFST);
^
^
!@:7D;F3@57
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
334
A >G<NN OC<O DIC@MDON AMJH 3BJMXBZ7FIJDMF DN -PDPNPUJWF, RCD>C ?J@N IJO C<Q@ <IT NK@>D<G
H@H=@MN T@O:
DMBTT -PDPNPUJWF : 3BJMXBZ7FIJDMF
\^
4@ RDGG <?? < NK@>D<G NBLF4PVOE() H@H=@M API>ODJI OJ -PDPNPUJWF G<O@M ?PMDIB JI@ JA OC@
@S@M>DN@N.
3BJMXBZ$BS DN < 3BJMXBZ7FIJDMF <N R@GG. %JR@Q@M, DA OC@ CD@M<M>CT NPKKJMON ?DAA@M@IO OTK@N
JA M<DGR<T ><MN, OC@I >@MO<DI =@C<QDJMN GDF@ GJ<?DIB <I? PIGJ<?DIB HPNO =@ ?JI@ <>>JM?DIB OJ
OC@DM @S<>O OTK@N. #JM OC<O M@<NJI, 3BJMXBZ$BS ><I JIGT ?@>G<M@ OC@N@ ORJ API>ODJIN <N
<=NOM<>O:
DMBTT 3BJMXBZ$BS : 3BJMXBZ7FIJDMF
\
BCTUSBDU WPJE MPBE();
BCTUSBDU WPJE VOMPBE();
^
)J<?DIB <I? PIGJ<?DIB < K<NN@IB@M ><M DN <N NDHKG@ <N JK@IDIB OC@ ?JJMN JA OC@ ><M, RCDG@
GJ<?DIB <I? PIGJ<?DIB < AM@DBCO ><M H<T DIQJGQ@ KJMO@MN <I? RDI>C@N. 1C@ AJGGJRDIB
NP=>G<NN@N KMJQD?@ ?@ADIDODJIN AJM OC@ <=NOM<>O API>ODJIN JA 3BJMXBZ$BS:
DMBTT 1BTTFOHFS$BS : 3BJMXBZ$BS
\
PWFSSJEF WPJE MPBE()
\
XSJUFMO("5IF QBTTFOHFST BSF HFUUJOH PO");
^
PWFSSJEF WPJE VOMPBE()
\
XSJUFMO("5IF QBTTFOHFST BSF HFUUJOH PGG");
^
^
DMBTT 'SFJHIU$BS : 3BJMXBZ$BS
\
PWFSSJEF WPJE MPBE()
\
XSJUFMO("5IF DSBUFT BSF CFJOH MPBEFE");
^
PWFSSJEF WPJE VOMPBE()
\
XSJUFMO("5IF DSBUFT BSF CFJOH VOMPBEFE");
^
^
B@DIB <I <=NOM<>O >G<NN ?J@N IJO KM@>GP?@ OC@ PN@ JA 3BJMXBZ$BS DI OC@ KMJBM<H. ,=E@>ON JA
3BJMXBZ$BS ><I IJO =@ >JINOMP>O@? =PO 3BJMXBZ$BS ><I =@ PN@? <N <I DIO@MA<>@. AN OC@
NP=>G<NN@N ?@ADI@ OC@ ORJ M@G<ODJINCDKN "K<NN@IB@M ><M DN < M<DGR<T ><M" <I? "AM@DBCO ><M DN <
M<DGR<T ><M", OC@ J=E@>ON JA 1BTTFOHFS$BS <I? 'SFJHIU$BS ><I =@ PN@? DI KG<>@N JA
3BJMXBZ$BS. 1CDN RDGG =@ N@@I DI OC@ 5SBJO >G<NN =@GJR.
1C@ >G<NN OC<O M@KM@N@ION < OM<DI ><I >JINDNO JA < GJ>JHJODQ@ <I? <I <MM<T JA M<DGR<T><MN:
DMBTT 5SBJO : 3BJMXBZ7FIJDMF
\
-PDPNPUJWF MPDPNPUJWF;
3BJMXBZ$BS<> DBST;
!@:7D;F3@57
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
335
// ...
^
& RJPG? GDF@ OJ M@K@<O <I DHKJMO<IO KJDIO: AGOCJPBC =JOC -PDPNPUJWF <I? 3BJMXBZ$BS DIC@MDO
AMJH 3BJMXBZ7FIJDMF, DO RJPG? IJO =@ >JMM@>O OJ DIC@MDO 5SBJO AMJH @DOC@M JA OC@H.
&IC@MDO<I>@ HJ?@GN OC@ "DN <" M@G<ODJINCDK <I? < OM<DI DN I@DOC@M < GJ>JHJODQ@ IJM < K<NN@IB@M
><M. A OM<DI >JINDNON JA OC@H.
&A R@ M@LPDM@ OC<O @Q@MT OM<DI HPNO C<Q@ < GJ>JHJODQ@, OC@ 5SBJO >JINOMP>OJM HPNO @INPM@
OC<O DO O<F@N < Q<GD? -PDPNPUJWF J=E@>O. 0DHDG<MGT, DA OC@ M<DGR<T ><MN <M@ JKODJI<G, OC@T ><I =@
<??@? =T < H@H=@M API>ODJI:
JNQPSU TUE.FYDFQUJPO;
// ...
DMBTT 5SBJO : 3BJMXBZ7FIJDMF
\
// ...
UIJT(-PDPNPUJWF MPDPNPUJWF)
\
FOGPSDF(MPDPNPUJWF !JT OVMM,
"-PDPNPUJWF DBOOPU CF OVMM");
UIJT.MPDPNPUJWF = MPDPNPUJWF;
^
WPJE BEE$BS(3BJMXBZ$BS<> DBST...)
\
UIJT.DBST _= DBST;
^
// ...
^
+JO@ OC<O BEE$BS() ><I Q<GD?<O@ OC@ 3BJMXBZ$BS J=E@>ON <N R@GG. & <H DBIJMDIB OC<O
Q<GD?<ODJI C@M@.
4@ ><I DH<BDI@ OC<O OC@ ?@K<MOPM@N <I? <MMDQ<GN JA OM<DIN NCJPG? <GNJ =@ NPKKJMO@?:
DMBTT 5SBJO : 3BJMXBZ7FIJDMF
\
// ...
WPJE EFQBSU4UBUJPO(TUSJOH TUBUJPO)
\
GPSFBDI (DBS; DBST) \
DBS.MPBE();
^
XSJUFGMO("%FQBSUJOH GSPN UIF %T TUBUJPO", TUBUJPO);
^
WPJE BSSJWF4UBUJPO(TUSJOH TUBUJPO)
\
XSJUFGMO(""SSJWJOH BU UIF %T TUBUJPO", TUBUJPO);
GPSFBDI (DBS; DBST) \
DBS.VOMPBE();
^
^
^
1C@ AJGGJRDIB NBJO() DN H<FDIB PN@ JA OC@ 3BJMXBZ7FIJDMF CD@M<M>CT:
!@:7D;F3@57
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
336
JNQPSU TUE.TUEJP;
// ...
WPJE NBJO()
\
BVUP MPDPNPUJWF = OFX -PDPNPUJWF;
BVUP USBJO = OFX 5SBJO(MPDPNPUJWF);
USBJO.BEE$BS(OFX 1BTTFOHFS$BS, OFX 'SFJHIU$BS);
USBJO.EFQBSU4UBUJPO(""OLBSB");
USBJO.BEWBODF(500);
USBJO.BSSJWF4UBUJPO(")BZEBSQBhB");
^
1C@ 5SBJO >G<NN DN =@DIB PN@? =T API>ODJIN OC<O <M@ KMJQD?@? =T ORJ N@K<M<O@ DIO@MA<>@N:
1. 4C@I OC@ BEWBODF() API>ODJI DN ><GG@?, OC@ 5SBJO J=E@>O DN =@DIB PN@? <N <
3BJMXBZ7FIJDMF =@><PN@ OC<O API>ODJI DN ?@>G<M@? =T 3BJMXBZ7FIJDMF.
2. 4C@I OC@ EFQBSU4UBUJPO() <I? BSSJWF4UBUJPO() API>ODJIN <M@ ><GG@?, USBJO DN =@DIB
PN@? <N < 5SBJO =@><PN@ OCJN@ API>ODJIN <M@ ?@>G<M@? =T 5SBJO.
1C@ =GP@ <MMJRN DI?D><O@ OC<O OC@ MPBE() <I? VOMPBE() API>ODJIN RJMF <>>JM?DIB OJ OC@
<>OP<G OTK@ JA 3BJMXBZ$BS:
5IF QBTTFOHFST BSF HFUUJOH PO l
5IF DSBUFT BSF CFJOH MPBEFE l
%FQBSUJOH GSPN UIF "OLBSB TUBUJPO
5IF WFIJDMF JT BEWBODJOH 500 LJMPNFUFST
"SSJWJOH BU UIF )BZEBSQBiB TUBUJPO
5IF QBTTFOHFST BSF HFUUJOH PGG l
5IF DSBUFT BSF CFJOH VOMPBEFE l
Summary
57.11
t &IC@MDO<I>@ DN AJM OC@ "DN <" M@G<ODJINCDK.
t "<>C >G<NN ><I DIC@MDO AMJH PK OJ JI@ DMBTT.
t TVQFS C<N ORJ PN@N: <GGDIB OC@ >JINOMP>OJM JA OC@ NPK@M>G<NN <I? <>>@NNDIB OC@ H@H=@MN
JA OC@ NPK@M>G<NN.
t PWFSSJEF DN AJM M@?@ADIDIB H@H=@M API>ODJIN JA OC@ NPK@M>G<NN NK@>D<GGT AJM OCDN >G<NN.
t BCTUSBDU M@LPDM@N OC<O < H@H=@M API>ODJI HPNO =@ JQ@MMD??@I.
Exercises
57.12
1. )@O'N HJ?DAT 3BJMXBZ7FIJDMF. &I <??DODJI OJ M@KJMODIB OC@ ?DNO<I>@ OC<O DO <?Q<I>@N, G@O'N
C<Q@ DO <GNJ H<F@ NJPI?N. 1J F@@K OC@ JPOKPO NCJMO, G@O'N KMDIO OC@ NJPI?N K@M 100
FDGJH@O@MN:
DMBTT 3BJMXBZ7FIJDMF
\
WPJE BEWBODF(JO TJ[F@U LJMPNFUFST)
\
XSJUFGMO("5IF WFIJDMF JT BEWBODJOH %T LJMPNFUFST",
LJMPNFUFST);
GPSFBDI (J; 0 .. LJMPNFUFST / 100) \
XSJUFGMO(" %T", NBLF4PVOE());
^
^
!@:7D;F3@57
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
337
// ...
^
%JR@Q@M, NBLF4PVOE() ><IIJO =@ ?@ADI@? =T 3BJMXBZ7FIJDMF =@><PN@ Q@CD>G@N H<T
C<Q@ ?DAA@M@IO NJPI?N:
w ">CJJ >CJJ" AJM -PDPNPUJWF
w ">G<>F >G<>F" AJM 3BJMXBZ$BS
Note: "73H7 Train.makeSound FA F:7 @7JF 7J7D5;E7.
B@><PN@ DO HPNO =@ JQ@MMD??@I, NBLF4PVOE() HPNO =@ ?@>G<M@? <N BCTUSBDU =T OC@
NPK@M>G<NN:
DMBTT 3BJMXBZ7FIJDMF
\
// ...
BCTUSBDU TUSJOH NBLF4PVOE();
^
&HKG@H@IO NBLF4PVOE() AJM OC@ NP=>G<NN@N <I? OMT OC@ >J?@ RDOC OC@ AJGGJRDIB
NBJO():
WPJE NBJO()
\
BVUP SBJMXBZ$BS1 = OFX 1BTTFOHFS$BS;
SBJMXBZ$BS1.BEWBODF(100);
BVUP SBJMXBZ$BS2 = OFX 'SFJHIU$BS;
SBJMXBZ$BS2.BEWBODF(200);
BVUP MPDPNPUJWF = OFX -PDPNPUJWF;
MPDPNPUJWF.BEWBODF(300);
^
*<F@ OC@ KMJBM<H KMJ?P>@ OC@ AJGGJRDIB JPOKPO:
5IF WFIJDMF JT BEWBODJOH 100 LJMPNFUFST
DMBDL DMBDL
5IF WFIJDMF JT BEWBODJOH 200 LJMPNFUFST
DMBDL DMBDL
DMBDL DMBDL
5IF WFIJDMF JT BEWBODJOH 300 LJMPNFUFST
DIPP DIPP
DIPP DIPP
DIPP DIPP
+JO@ OC<O OC@M@ DN IJ M@LPDM@H@IO OC<O OC@ NJPI?N JA 1BTTFOHFS$BS <I? 'SFJHIU$BS
=@ ?DAA@M@IO. 1C@T ><I NC<M@ OC@ N<H@ DHKG@H@IODJI AMJH 3BJMXBZ$BS.
3. 1CDIF <=JPO CJR NBLF4PVOE() ><I =@ DHKG@H@IO@? AJM 5SBJO. ,I@ D?@< DN OC<O
5SBJO.NBLF4PVOE H<T M@OPMI < TUSJOH OC<O >JINDNON JA OC@ NJPI?N JA OC@ H@H=@MN JA
5SBJO.
... F:7 EA>GF;A@E
!@:7D;F3@57
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
338
0CKFDU 58
G<NN@N OC<O ?J IJO @SKGD>DOGT DIC@MDO <IT >G<NN, <POJH<OD><GGT DIC@MDO OC@ 0CKFDU >G<NN.
BT OC<O ?@ADIDODJI, OC@ OJKHJNO >G<NN DI <IT >G<NN CD@M<M>CT DIC@MDON 0CKFDU:
// ": 0CKFDU" JT OPU XSJUUFO; JU JT BVUPNBUJD
DMBTT .VTJDBM*OTUSVNFOU : 0CKFDU
\
// ...
^
// *OIFSJUT 0CKFDU JOEJSFDUMZ
DMBTT 4USJOH*OTUSVNFOU : .VTJDBM*OTUSVNFOU
\
// ...
^
0DI>@ OC@ OJKHJNO >G<NN DIC@MDON 0CKFDU, @Q@MT >G<NN DI?DM@>OGT DIC@MDON 0CKFDU <N R@GG. &I OC<O
N@IN@, @Q@MT >G<NN "DN <I" 0CKFDU.
"Q@MT >G<NN DIC@MDON OC@ AJGGJRDIB H@H=@M API>ODJIN JA 0CKFDU:
t UP4USJOH: 1C@ TUSJOH M@KM@N@IO<ODJI JA OC@ J=E@>O.
t PQ&RVBMT: "LP<GDOT >JHK<MDNJI RDOC <IJOC@M J=E@>O.
t PQ$NQ: 0JMO JM?@M >JHK<MDNJI RDOC <IJOC@M J=E@>O.
t UP)BTI: ANNJ>D<ODQ@ <MM<T C<NC Q<GP@.
1C@ G<NO OCM@@ JA OC@N@ API>ODJIN @HKC<NDU@ OC@ Q<GP@N JA J=E@>ON. 1C@T <GNJ H<F@ < >G<NN
@GDBD=G@ AJM =@DIB OC@ F@T OTK@ JA <NNJ>D<ODQ@ <MM<TN.
B@><PN@ OC@N@ API>ODJIN <M@ DIC@MDO@?, OC@DM M@?@ADIDODJIN AJM OC@ NP=>G<NN@N M@LPDM@ OC@
PWFSSJEF F@TRJM?.
Note: Object 678;@7E AF:7D ?7?47DE 3E I7>>. ):;E 5:3BF7D I;>> ;@5>G67 A@>K F:7E7 8AGD
8G@5F;A@E.
UP4USJOH
58.1
0<H@ RDOC NOMP>ON, UP4USJOH @I<=G@N PNDIB J=E@>ON <N NOMDIBN:
BVUP DMPDL = OFX $MPDL(20, 30, 0);
XSJUFMO(DMPDL); // $BMMT DMPDL.UP4USJOH()
1C@ DIC@MDO@? UP4USJOH() DN PNP<GGT IJO PN@APG; DO KMJ?P>@N EPNO OC@ I<H@ JA OC@ OTK@:
EFOFNF.$MPDL
1C@ K<MO =@AJM@ OC@ I<H@ JA OC@ OTK@ DN OC@ I<H@ JA OC@ HJ?PG@. 1C@ JPOKPO <=JQ@ DI?D><O@N
OC<O $MPDL C<N =@@I ?@ADI@? DI OC@ EFOFNF HJ?PG@.
AN R@ C<Q@ N@@I DI OC@ KM@QDJPN >C<KO@M, OCDN API>ODJI DN <GHJNO <GR<TN JQ@MMD??@I OJ KMJ?P>@
< HJM@ H@<IDIBAPG TUSJOH M@KM@N@IO<ODJI:
JNQPSU TUE.TUSJOH;
DMBTT $MPDL
\
PWFSSJEF TUSJOH UP4USJOH() DPOTU
\
%4<75F
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
339
SFUVSO GPSNBU("%02T:%02T:%02T", IPVS, NJOVUF, TFDPOE);
^
// ...
^
DMBTT "MBSN$MPDL : $MPDL
\
PWFSSJEF TUSJOH UP4USJOH() DPOTU
\
SFUVSO GPSNBU("%T |%02T:%02T", TVQFS.UP4USJOH(),
BMBSN)PVS, BMBSN.JOVUF);
^
// ...
^
// ...
BVUP CFE4JEF$MPDL = OFX "MBSN$MPDL(20, 30, 0, 7, 0);
XSJUFMO(CFE4JEF$MPDL);
1C@ JPOKPO:
20:30:00 z07:00
PQ&RVBMT
58.2
AN R@ C<Q@ N@@I DI OC@ ,K@M<OJM ,Q@MGJ<?DIB >C<KO@M, OCDN H@H=@M API>ODJI DN <=JPO OC@
=@C<QDJM JA OC@ == JK@M<OJM (<I? OC@ != JK@M<OJM DI?DM@>OGT). 1C@ M@OPMI Q<GP@ JA OC@ JK@M<OJM
HPNO =@ USVF DA OC@ J=E@>ON <M@ >JIND?@M@? OJ =@ @LP<G <I? GBMTF JOC@MRDN@.
Warning: 1C@ ?@ADIDODJI JA OCDN API>ODJI HPNO =@ >JINDNO@IO RDOC PQ$NQ(); AJM ORJ J=E@>ON
OC<O PQ&RVBMT() M@OPMIN USVF, PQ$NQ() HPNO M@OPMI U@MJ.
JIOM<MT OJ NOMP>ON, OC@ >JHKDG@M ?J@N IJO ><GG B.PQ&RVBMT(C) MDBCO <R<T RC@I DO N@@N OC@
@SKM@NNDJI B == C. 4C@I ORJ >G<NN J=E@>ON <M@ >JHK<M@? =T OC@ == JK@M<OJM, < AJPM-NO@K
<GBJMDOCH DN @S@>PO@?:
CPPM PQ&RVBMT(0CKFDU B, 0CKFDU C) \
JG (B JT C) SFUVSO USVF; // (1)
JG (B JT OVMM ]] C JT OVMM) SFUVSO GBMTF; // (2)
JG (UZQFJE(B) == UZQFJE(C)) SFUVSO B.PQ&RVBMT(C); // (3)
SFUVSO B.PQ&RVBMT(C) && C.PQ&RVBMT(B); // (4)
^
1. &A OC@ ORJ Q<MD<=G@N KMJQD?@ <>>@NN OJ OC@ N<H@ J=E@>O (JM OC@T <M@ =JOC OVMM), OC@I OC@T
<M@ @LP<G.
2. #JGGJRDIB AMJH OC@ KM@QDJPN >C@>F, DA JIGT JI@ DN OVMM OC@I OC@T <M@ IJO @LP<G.
3. &A =JOC JA OC@ J=E@>ON <M@ JA OC@ N<H@ OTK@, OC@I B.PQ&RVBMT(C) DN ><GG@? OJ ?@O@MHDI@ OC@
@LP<GDOT.
4. ,OC@MRDN@, AJM OC@ ORJ J=E@>ON OJ =@ >JIND?@M@? @LP<G, PQ&RVBMT HPNO C<Q@ =@@I ?@ADI@?
AJM =JOC JA OC@DM OTK@N <I? B.PQ&RVBMT(C) <I? C.PQ&RVBMT(B) HPNO <BM@@ OC<O OC@
J=E@>ON <M@ @LP<G.
A>>JM?DIBGT, DA PQ&RVBMT() DN IJO KMJQD?@? AJM < >G<NN OTK@, OC@I OC@ Q<GP@N JA OC@ J=E@>ON <M@
IJO >JIND?@M@?; M<OC@M, @LP<GDOT DN ?@O@MHDI@? =T >C@>FDIB RC@OC@M OC@ ORJ >G<NN Q<MD<=G@N
KMJQD?@ <>>@NN OJ OC@ N<H@ J=E@>O:
%4<75F
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
340
BVUP WBSJBCMF0 = OFX $MPDL(6, 7, 8);
BVUP WBSJBCMF1 = OFX $MPDL(6, 7, 8);
BTTFSU(WBSJBCMF0 != WBSJBCMF1); // 5IFZ BSF OPU FRVBM
// CFDBVTF UIF PCKFDUT BSF
// EJGGFSFOU
"Q@I OCJPBC OC@ ORJ J=E@>ON <M@ >JINOMP>O@? =T OC@ N<H@ <MBPH@ION <=JQ@, OC@ Q<MD<=G@N <M@
IJO @LP<G =@><PN@ OC@T <M@ IJO <NNJ>D<O@? RDOC OC@ N<H@ J=E@>O.
,I OC@ JOC@M C<I?, =@><PN@ OC@ AJGGJRDIB ORJ Q<MD<=G@N KMJQD?@ <>>@NN OJ OC@ N<H@ J=E@>O,
OC@T <M@ 7CG3>:
BVUP QBSUOFS0 = OFX $MPDL(9, 10, 11);
BVUP QBSUOFS1 = QBSUOFS0;
BTTFSU(QBSUOFS0 == QBSUOFS1); // 5IFZ BSF FRVBM CFDBVTF
// UIF PCKFDU JT UIF TBNF
0JH@ODH@N DO H<F@N HJM@ N@IN@ OJ >JHK<M@ J=E@>ON =T OC@DM Q<GP@N DINO@<? JA OC@DM D?@IODOD@N.
#JM @S<HKG@, DO DN >JI>@DQ<=G@ OC<O WBSJBCMF0 <I? WBSJBCMF1 <=JQ@ >JHK<M@ @LP<G =@><PN@
OC@DM Q<GP@N <M@ OC@ N<H@.
!DAA@M@IO AMJH NOMP>ON, OC@ OTK@ JA OC@ K<M<H@O@M JA PQ&RVBMT AJM >G<NN@N DN 0CKFDU:
DMBTT $MPDL
\
PWFSSJEF CPPM PQ&RVBMT(0CKFDU P) DPOTU
\
// ...
^
// ...
^
AN TJP RDGG N@@ =@GJR, OC@ K<M<H@O@M DN <GHJNO I@Q@M PN@? ?DM@>OGT. #JM OC<O M@<NJI, DO NCJPG?
=@ <>>@KO<=G@ OJ I<H@ DO NDHKGT <N P. *JNO JA OC@ ODH@ OC@ ADMNO OCDIB OJ ?J RDOC OC<O
K<M<H@O@M DN OJ PN@ DO DI < OTK@ >JIQ@MNDJI.
1C@ K<M<H@O@M JA PQ&RVBMT DN OC@ J=E@>O OC<O <KK@<MN JI OC@ MDBCO-C<I? ND?@ JA OC@ ==
JK@M<OJM:
WBSJBCMF0 == WBSJBCMF1; // P SFQSFTFOUT WBSJBCMF1
0DI>@ OC@ KPMKJN@ JA PQ&RVBMT() DN OJ >JHK<M@ ORJ J=E@>ON JA OCDN >G<NN OTK@, OC@ ADMNO OCDIB
OJ ?J DN OJ >JIQ@MO P OJ < Q<MD<=G@ JA OC@ N<H@ OTK@ JA OCDN >G<NN. 0DI>@ DO RJPG? IJO =@
<KKMJKMD<O@ OJ HJ?DAT OC@ MDBCO-C<I? ND?@ J=E@>O DI <I @LP<GDOT >JHK<MDNJI, DO DN <GNJ KMJK@M
OJ >JIQ@MO OC@ OTK@ <N DPOTU:
PWFSSJEF CPPM PQ&RVBMT(0CKFDU P) DPOTU
\
BVUP SIT = DBTU(DPOTU $MPDL)P;
// ...
^
AN TJP RJPG? M@H@H=@M, SIT DN < >JHHJI <==M@QD<ODJI AJM D;9:F-:3@6 E;67. AGNJ,
TUE.DPOW.UP ><I =@ PN@? AJM OC@ >JIQ@MNDJI <N R@GG:
%4<75F
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
341
JNQPSU TUE.DPOW;
// ...
BVUP SIT = UP!(DPOTU $MPDL)(P);
&A OC@ JMDBDI<G J=E@>O JI OC@ MDBCO-C<I? ND?@ ><I =@ >JIQ@MO@? OJ $MPDL, OC@I SIT =@>JH@N <
IJI-OVMM >G<NN Q<MD<=G@. ,OC@MRDN@, SIT DN N@O OJ OVMM, DI?D><ODIB OC<O OC@ J=E@>ON <M@ IJO JA
OC@ N<H@ OTK@.
A>>JM?DIB OJ OC@ ?@NDBI JA < KMJBM<H, DO H<T H<F@ N@IN@ OJ >JHK<M@ J=E@>ON JA ORJ
DI>JHK<OD=G@ OTK@N. & RDGG <NNPH@ C@M@ OC<O AJM OC@ >JHK<MDNJI OJ =@ Q<GD?, SIT HPNO IJO =@
OVMM; NJ, OC@ ADMNO GJBD><G @SKM@NNDJI DI OC@ AJGGJRDIB SFUVSO NO<O@H@IO >C@>FN OC<O DO DN IJO
OVMM. ,OC@MRDN@, DO RJPG? =@ <I @MMJM OJ OMT OJ <>>@NN OC@ H@H=@MN JA SIT:
DMBTT $MPDL
\
JOU IPVS;
JOU NJOVUF;
JOU TFDPOE;
PWFSSJEF CPPM PQ&RVBMT(0CKFDU P) DPOTU
\
BVUP SIT = DBTU(DPOTU $MPDL)P;
SFUVSO (SIT &&
(IPVS == SIT.IPVS) &&
(NJOVUF == SIT.NJOVUF) &&
(TFDPOE == SIT.TFDPOE));
^
// ...
^
4DOC OC<O ?@ADIDODJI, $MPDL J=E@>ON ><I IJR =@ >JHK<M@? =T OC@DM Q<GP@N:
BVUP WBSJBCMF0 = OFX $MPDL(6, 7, 8);
BVUP WBSJBCMF1 = OFX $MPDL(6, 7, 8);
BTTFSU(WBSJBCMF0 == WBSJBCMF1); // /PX UIFZ BSF FRVBM
// CFDBVTF UIFJS WBMVFT
// BSF FRVBM
4C@I ?@ADIDIB PQ&RVBMT DO DN DHKJMO<IO OJ M@H@H=@M OC@ H@H=@MN JA OC@ NPK@M>G<NN. #JM
@S<HKG@, RC@I >JHK<MDIB J=E@>ON JA "MBSN$MPDL DO RJPG? H<F@ N@IN@ OJ <GNJ >JIND?@M OC@
DIC@MDO@? H@H=@MN:
DMBTT "MBSN$MPDL : $MPDL
\
JOU BMBSN)PVS;
JOU BMBSN.JOVUF;
PWFSSJEF CPPM PQ&RVBMT(0CKFDU P) DPOTU
\
BVUP SIT = DBTU(DPOTU "MBSN$MPDL)P;
SFUVSO (SIT &&
(BMBSN)PVS == SIT.BMBSN)PVS) &&
(BMBSN.JOVUF == SIT.BMBSN.JOVUF) &&
TVQFS.PQ&RVBMT(P));
^
// ...
^
%4<75F
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
342
1C<O @SKM@NNDJI >JPG? =@ RMDOO@I <N TVQFS == P <N R@GG. %JR@Q@M, OC<O RJPG? DIDOD<O@ OC@
AJPM-NO@K <GBJMDOCH <B<DI <I? <N < M@NPGO, OC@ >J?@ HDBCO =@ < GDOOG@ NGJR@M.
PQ$NQ
58.3
1CDN JK@M<OJM DN PN@? RC@I NJMODIB >G<NN J=E@>ON. PQ$NQ DN OC@ API>ODJI OC<O B@ON ><GG@? =@CDI?
OC@ N>@I@N AJM OC@ <, <=, >, <I? >=.
1CDN JK@M<OJM HPNO M@OPMI < I@B<ODQ@ Q<GP@ RC@I OC@ G@AO-C<I? J=E@>O DN =@AJM@, < KJNDODQ@
Q<GP@ RC@I OC@ G@AO-C<I? J=E@>O DN <AO@M, <I? U@MJ RC@I =JOC J=E@>ON C<Q@ OC@ N<H@ NJMODIB
JM?@M.
Warning: 1C@ ?@ADIDODJI JA OCDN API>ODJI HPNO =@ >JINDNO@IO RDOC PQ&RVBMT(); AJM ORJ J=E@>ON
OC<O PQ&RVBMT() M@OPMIN USVF, PQ$NQ() HPNO M@OPMI U@MJ.
2IGDF@ UP4USJOH <I? PQ&RVBMT, OC@M@ DN IJ ?@A<PGO DHKG@H@IO<ODJI JA OCDN API>ODJI DI
0CKFDU. &A OC@ DHKG@H@IO<ODJI DN IJO <Q<DG<=G@, >JHK<MDIB J=E@>ON AJM NJMO JM?@M ><PN@N <I
@S>@KODJI OJ =@ OCMJRI:
BVUP WBSJBCMF0 = OFX $MPDL(6, 7, 8);
BVUP WBSJBCMF1 = OFX $MPDL(6, 7, 8);
BTTFSU(WBSJBCMF0 <= WBSJBCMF1); // j $BVTFT FYDFQUJPO
PCKFDU.&YDFQUJPO: OFFE PQ$NQ GPS DMBTT EFOFNF.$MPDL
&O DN PK OJ OC@ ?@NDBI JA OC@ KMJBM<H RC<O C<KK@IN RC@I OC@ G@AO-C<I? <I? MDBCO-C<I? J=E@>ON
<M@ JA ?DAA@M@IO OTK@N. ,I@ R<T DN OJ O<F@ <?Q<IO<B@ JA OC@ JM?@M JA OTK@N OC<O DN H<DIO<DI@?
=T OC@ >JHKDG@M <POJH<OD><GGT. 1CDN DN <>CD@Q@? =T ><GGDIB OC@ PQ$NQ API>ODJI JI OC@ UZQFJE
Q<GP@N JA OC@ ORJ OTK@N:
DMBTT $MPDL
\
JOU IPVS;
JOU NJOVUF;
JOU TFDPOE;
PWFSSJEF JOU PQ$NQ(0CKFDU P) DPOTU
\
/* 5BLJOH BEWBOUBHF PG UIF BVUPNBUJDBMMZ-NBJOUBJOFE
* PSEFS PG UIF UZQFT. */
JG (UZQFJE(UIJT) != UZQFJE(P)) \
SFUVSO UZQFJE(UIJT).PQ$NQ(UZQFJE(P));
^
BVUP SIT = DBTU(DPOTU $MPDL)P;
/* /P OFFE UP DIFDL XIFUIFS SIT JT OVMM, CFDBVTF JU JT
* LOPXO BU UIJT MJOF UIBU JU IBT UIF TBNF UZQF BT P. */
JG (IPVS != SIT.IPVS) \
SFUVSO IPVS - SIT.IPVS;
^ FMTF JG (NJOVUF != SIT.NJOVUF) \
SFUVSO NJOVUF - SIT.NJOVUF;
^ FMTF \
SFUVSO TFDPOE - SIT.TFDPOE;
^
^
// ...
^
%4<75F
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
343
1C@ ?@ADIDODJI <=JQ@ ADMNO >C@>FN RC@OC@M OC@ OTK@N JA OC@ ORJ J=E@>ON <M@ OC@ N<H@. &A IJO, DO
PN@N OC@ JM?@MDIB JA OC@ OTK@N OC@HN@GQ@N. ,OC@MRDN@, DO >JHK<M@N OC@ J=E@>ON =T OC@ Q<GP@N
JA OC@DM IPVS, NJOVUF, <I? TFDPOE H@H=@MN.
A >C<DI JA O@MI<MT JK@M<OJMN H<T <GNJ =@ PN@?:
PWFSSJEF JOU PQ$NQ(0CKFDU P) DPOTU
\
JG (UZQFJE(UIJT) != UZQFJE(P)) \
SFUVSO UZQFJE(UIJT).PQ$NQ(UZQFJE(P));
^
BVUP SIT = DBTU(DPOTU $MPDL)P;
SFUVSO (IPVS != SIT.IPVS
IPVS - SIT.IPVS
: (NJOVUF != SIT.NJOVUF
NJOVUF - SIT.NJOVUF
: TFDPOE - SIT.TFDPOE));
^
&A DHKJMO<IO, OC@ >JHK<MDNJI JA OC@ H@H=@MN JA OC@ NPK@M>G<NN HPNO <GNJ =@ >JIND?@M@?. 1C@
AJGGJRDIB "MBSN$MPDL.PQ$NQ DN ><GGDIB $MPDL.PQ$NQ ADMNO:
DMBTT "MBSN$MPDL : $MPDL
\
PWFSSJEF JOU PQ$NQ(0CKFDU P) DPOTU
\
BVUP SIT = DBTU(DPOTU "MBSN$MPDL)P;
DPOTU JOU TVQFS3FTVMU = TVQFS.PQ$NQ(P);
JG (TVQFS3FTVMU != 0) \
SFUVSO TVQFS3FTVMU;
^ FMTF JG (BMBSN)PVS != SIT.BMBSN)PVS) \
SFUVSO BMBSN)PVS - SIT.BMBSN)PVS;
^ FMTF \
SFUVSO BMBSN.JOVUF - SIT.BMBSN.JOVUF;
^
^
// ...
^
A=JQ@, DA OC@ NPK@M>G<NN >JHK<MDNJI M@OPMIN < IJI-U@MJ Q<GP@ OC@I OC<O M@NPGO DN PN@? =@><PN@
OC@ NJMO JM?@M JA OC@ J=E@>ON DN <GM@<?T ?@O@MHDI@? =T OC<O Q<GP@.
"MBSN$MPDL J=E@>ON ><I IJR =@ >JHK<M@? AJM OC@DM NJMO JM?@MN:
BVUP BD0 = OFX "MBSN$MPDL(8, 0, 0, 6, 30);
BVUP BD1 = OFX "MBSN$MPDL(8, 0, 0, 6, 31);
BTTFSU(BD0 < BD1);
PQ$NQ DN PN@? =T JOC@M G<IBP<B@ A@<OPM@N <I? GD=M<MD@N <N R@GG. #JM @S<HKG@, OC@ .TPSU
KMJK@MOT JA <MM<TN O<F@N <?Q<IO<B@ JA PQ$NQ RC@I NJMODIB OC@ @G@H@ION.
PQ$NQ for string members 58.3.1
4C@I NJH@ JA OC@ H@H=@MN <M@ NOMDIBN, OC@T ><I =@ >JHK<M@? @SKGD>DOGT OJ M@OPMI < I@B<ODQ@,
KJNDODQ@, JM U@MJ Q<GP@:
%4<75F
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
344
JNQPSU TUE.FYDFQUJPO;
DMBTT 4UVEFOU
\
TUSJOH OBNF;
PWFSSJEF JOU PQ$NQ(0CKFDU P) DPOTU
\
BVUP SIT = DBTU(4UVEFOU)P;
FOGPSDF(SIT);
JG (OBNF < SIT.OBNF) \
SFUVSO -1;
^ FMTF JG (OBNF > SIT.OBNF) \
SFUVSO 1;
^ FMTF \
SFUVSO 0;
^
^
// ...
^
&INO@<?, OC@ @SDNODIB TUE.BMHPSJUIN.DNQ API>ODJI ><I =@ PN@?, RCD>C C<KK@IN OJ =@ A<NO@M <N
R@GG:
JNQPSU TUE.BMHPSJUIN;
DMBTT 4UVEFOU
\
TUSJOH OBNF;
PWFSSJEF JOU PQ$NQ(0CKFDU P) DPOTU
\
BVUP SIT = DBTU(4UVEFOU)P;
FOGPSDF(SIT);
SFUVSO DNQ(OBNF, SIT.OBNF);
^
// ...
^
AGNJ IJO@ OC<O 4UVEFOU ?J@N IJO NPKKJMO >JHK<MDIB DI>JHK<OD=G@ OTK@N =T @IAJM>DIB OC<O OC@
>JIQ@MNDJI AMJH 0CKFDU OJ 4UVEFOU DN KJNND=G@.
UP)BTI
58.4
1CDN API>ODJI <GGJRN J=E@>ON JA < >G<NN OTK@ OJ =@ PN@? <N <NNJ>D<ODQ@ <MM<T =7KE. &O ?J@N IJO
<AA@>O OC@ ><N@N RC@M@ OC@ OTK@ DN PN@? <N <NNJ>D<ODQ@ <MM<T H3>G7E.
Warning: !@ADIDIB JIGT OCDN API>ODJI DN IJO NPAAD>D@IO. &I JM?@M AJM OC@ >G<NN OTK@ OJ =@ PN@?
<N <NNJ>D<ODQ@ <MM<T F@TN, >JINDNO@IO ?@ADIDODJIN JA PQ&RVBMT <I? PQ$NQ HPNO <GNJ =@ ?@ADI@?.
Hash table indexes 58.4.1
ANNJ>D<ODQ@ <MM<TN <M@ < C<NC O<=G@ DHKG@H@IO<ODJI. %<NC O<=G@ DN < Q@MT A<NO ?<O< NOMP>OPM@
RC@I DO >JH@N OJ N@<M>CDIB @G@H@ION DI OC@ O<=G@. ($AF7: ";=7 ?AEF AF:7D F:;@9E ;@ EA8FI3D7,
F:;E EB776 5A?7E 3F 3 5AEF: 3E: F34>7E ?GEF =77B 7>7?7@FE ;@ 3@ G@AD67D76 I3K, 3@6 F:7K
?3K 47 F3=;@9 GB EB357 F:3F ;E ?AD7 F:3@ 7J35F>K @757EE3DK.)
%4<75F
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
345
1C@ CDBC NK@@? JA C<NC O<=G@N >JH@N AMJH OC@ A<>O OC<O OC@T ADMNO KMJ?P>@ DIO@B@M Q<GP@N AJM
F@TN. 1C@N@ DIO@B@MN <M@ ><GG@? :3E: H3>G7E. 1C@ C<NC Q<GP@N <M@ OC@I PN@? AJM DI?@SDIB DIOJ
<I DIO@MI<G <MM<T OC<O DN H<DIO<DI@? =T OC@ O<=G@.
A =@I@ADO JA OCDN H@OCJ? DN OC@ A<>O OC<O <IT OTK@ OC<O ><I =@ >JIQ@MO@? OJ <I DIO@B@M Q<GP@
><I =@ PN@? <N OC@ F@T OTK@ JA <NNJ>D<ODQ@ <MM<TN. UP)BTI DN OC@ API>ODJI OC<O M@OPMIN OC@
C<NC O<=G@ DI?@S Q<GP@ AJM <I J=E@>O.
AGOCJPBC K@MC<KN IJO Q@MT H@<IDIBAPG, @Q@I $MPDL J=E@>ON ><I =@ PN@? <N <NNJ>D<ODQ@ <MM<T
F@T Q<GP@N:
TUSJOH<$MPDL> UJNF5BHT;
UJNF5BHT<OFX $MPDL(12, 0, 0)> = "/PPO";
1C@ ?@A<PGO ?@ADIDODJI JA UP)BTI OC<O DN DIC@MDO@? AMJH $MPDL KMJ?P>@N ?DAA@M@IO C<NC Q<GP@N
AJM ?DAA@M@IO J=E@>ON. 1CDN DN NDHDG<M OJ CJR OC@ ?@A<PGO =@C<QDJM JA PQ&RVBMT >JIND?@MN
?DAA@M@IO J=E@>ON <N =@DIB IJO @LP<G.
1C@ >J?@ <=JQ@ >JHKDG@N <I? MPIN @Q@I RC@I OC@M@ DN IJ NK@>D<G ?@ADIDODJI JA UP)BTI AJM
$MPDL. %JR@Q@M, DON ?@A<PGO =@C<QDJM DN <GHJNO I@Q@M RC<O DN ?@NDM@?. 1J N@@ OC<O ?@A<PGO
=@C<QDJM, G@O'N OMT OJ <>>@NN <I @G@H@IO =T <I J=E@>O OC<O DN ?DAA@M@IO AMJH OC@ JI@ OC<O C<N
=@@I PN@? RC@I DIN@MODIB OC@ @G@H@IO. AGOCJPBC OC@ I@R $MPDL J=E@>O =@GJR C<N OC@ N<H@
Q<GP@ <N OC@ $MPDL J=E@>O OC<O C<N =@@I PN@? RC@I DIN@MODIB DIOJ OC@ <NNJ>D<ODQ@ <MM<T <=JQ@,
OC@ Q<GP@ ><IIJO =@ AJPI?:
JG (OFX $MPDL(12, 0, 0) JO UJNF5BHT) \
XSJUFMO("&YJTUT");
^ FMTF \
XSJUFMO(".JTTJOH");
^
A>>JM?DIB OJ OC@ JO JK@M<OJM, OC@M@ DN IJ @G@H@IO DI OC@ O<=G@ OC<O >JMM@NKJI?N OJ OC@ Q<GP@
$MPDL(12, 0, 0):
.JTTJOH
1C@ M@<NJI AJM OCDN NPMKMDNDIB =@C<QDJM DN OC<O OC@ F@T J=E@>O OC<O C<N =@@I PN@? RC@I
DIN@MODIB OC@ @G@H@IO DN IJO OC@ N<H@ <N OC@ F@T J=E@>O OC<O C<N =@@I PN@? RC@I <>>@NNDIB
OC@ @G@H@IO.
Selecting members for UP)BTI 58.4.2
AGOCJPBC OC@ C<NC Q<GP@ DN ><G>PG<O@? AMJH OC@ H@H=@MN JA <I J=E@>O, IJO @Q@MT H@H=@M DN
NPDO<=G@ AJM OCDN O<NF.
1C@ ><I?D?<O@N <M@ OC@ H@H=@MN OC<O ?DNODIBPDNC J=E@>ON AMJH @<>C JOC@M. #JM @S<HKG@, OC@
H@H=@MN OBNF <I? MBTU/BNF JA < 4UVEFOU >G<NN RJPG? =@ NPDO<=G@ DA OCJN@ H@H=@MN ><I =@
PN@? AJM D?@IODATDIB J=E@>ON JA OC<O OTK@.
,I OC@ JOC@M C<I?, < HSBEFT <MM<T JA < 4UVEFOU >G<NN RJPG? IJO =@ NPDO<=G@ =JOC =@><PN@
H<IT J=E@>ON H<T C<Q@ OC@ N<H@ <MM<T <I? <GNJ DO DN GDF@GT OC<O OC@ HSBEFT <MM<T H<T >C<IB@
JQ@M ODH@.
%4<75F
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
346
Calculating hash values 58.4.3
1C@ >CJD>@ JA C<NC Q<GP@N C<N < ?DM@>O @AA@>O JI OC@ K@MAJMH<I>@ JA <NNJ>D<ODQ@ <MM<TN.
#PMOC@MHJM@, < C<NC ><G>PG<ODJI OC<O DN @AA@>ODQ@ JI JI@ OTK@ JA ?<O< H<T IJO =@ <N @AA@>ODQ@
JI <IJOC@M OTK@ JA ?<O<. AN :3E: 3>9AD;F:?E <M@ =@TJI? OC@ N>JK@ JA OCDN =JJF, & RDGG BDQ@ EPNO
JI@ BPD?@GDI@ C@M@: &I B@I@M<G, DO DN =@OO@M OJ KMJ?P>@ ?DAA@M@IO C<NC Q<GP@N AJM J=E@>ON OC<O
<M@ >JIND?@M@? OJ C<Q@ ?DAA@M@IO Q<GP@N. %JR@Q@M, DO DN IJO <I @MMJM DA ORJ J=E@>ON RDOC
?DAA@M@IO Q<GP@N KMJ?P>@ OC@ N<H@ DI?@S Q<GP@; DO DN H@M@GT PI?@NDM<=G@ AJM K@MAJMH<I>@
M@<NJIN.
&O DN >JI>@DQ<=G@ OC<O <GG JA OC@ H@H=@MN JA $MPDL <M@ NDBIDAD><IO OJ ?DNODIBPDNC DON J=E@>ON
AMJH @<>C JOC@M. #JM OC<O M@<NJI, OC@ C<NC Q<GP@N ><I =@ ><G>PG<O@? AMJH OC@ Q<GP@N JA DON
OCM@@ H@H=@MN. ):7 @G?47D A8 E75A@6E E;@57 ?;6@;9:F RJPG? =@ @AA@>ODQ@ C<NC Q<GP@N AJM
J=E@>ON OC<O M@KM@N@IO ?DAA@M@IO KJDION DI ODH@:
DMBTT $MPDL
\
JOU IPVS;
JOU NJOVUF;
JOU TFDPOE;
PWFSSJEF TJ[F@U UP)BTI() DPOTU
\
/* #FDBVTF UIFSF BSF 3600 TFDPOET JO BO IPVS BOE 60
* TFDPOET JO B NJOVUF: */
SFUVSO (3600 * IPVS) + (60 * NJOVUF) + TFDPOE;
^
// ...
^
4C@I@Q@M $MPDL DN PN@? <N OC@ F@T OTK@ JA <NNJ>D<ODQ@ <MM<TN, OC<O NK@>D<G ?@ADIDODJI JA
UP)BTI RJPG? =@ PN@?. AN < M@NPGO, @Q@I OCJPBC OC@ ORJ F@T J=E@>ON JA $MPDL(12, 0, 0)
<=JQ@ <M@ ?DNODI>O, OC@T RJPG? IJR KMJ?P>@ OC@ N<H@ C<NC Q<GP@.
1C@ I@R JPOKPO:
&YJTUT
0DHDG<M OJ OC@ JOC@M H@H=@M API>ODJIN, OC@ NPK@M>G<NN H<T I@@? OJ =@ >JIND?@M@? <N R@GG. #JM
@S<HKG@, "MBSN$MPDL.UP)BTI ><I O<F@ <?Q<IO<B@ JA $MPDL.UP)BTI ?PMDIB DON DI?@S
><G>PG<ODJI:
DMBTT "MBSN$MPDL : $MPDL
\
JOU BMBSN)PVS;
JOU BMBSN.JOVUF;
PWFSSJEF TJ[F@U UP)BTI() DPOTU
\
SFUVSO TVQFS.UP)BTI() + BMBSN)PVS + BMBSN.JOVUF;
^
// ...
^
Note: )3=7 F:7 53>5G>3F;A@ 34AH7 <GEF 3E 3@ 7J3?B>7. !@ 97@7D3>, 366;@9 ;@F797D H3>G7E ;E @AF
3@ 78875F;H7 I3K A8 97@7D3F;@9 :3E: H3>G7E.
1C@M@ <M@ @SDNODIB @AAD>D@IO <GBJMDOCHN AJM ><G>PG<ODIB C<NC Q<GP@N AJM Q<MD<=G@N JA AGJ<ODIB
KJDIO, <MM<T, <I? NOMP>O OTK@N. 1C@N@ <GBJMDOCHN <M@ <Q<DG<=G@ OJ OC@ KMJBM<HH@M <N R@GG.
%4<75F
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
347
4C<O I@@?N OJ =@ ?JI@ DN OJ ><GG HFU)BTI() JI OC@ UZQFJE JA @<>C H@H=@M. 1C@ NTIO<S JA OCDN
H@OCJ? DN OC@ N<H@ AJM AGJ<ODIB KJDIO, <MM<T, <I? NOMP>O OTK@N.
#JM @S<HKG@, C<NC Q<GP@N JA < 4UVEFOU OTK@ ><I =@ ><G>PG<O@? AMJH DON OBNF H@H=@M <N DI OC@
AJGGJRDIB >J?@:
DMBTT 4UVEFOU
\
TUSJOH OBNF;
PWFSSJEF TJ[F@U UP)BTI() DPOTU
\
SFUVSO UZQFJE(OBNF).HFU)BTI(&OBNF);
^
// ...
^
Hash values for structs 58.4.4
0DI>@ NOMP>ON <M@ Q<GP@ OTK@N, C<NC Q<GP@N AJM OC@DM J=E@>ON <M@ ><G>PG<O@? <POJH<OD><GGT =T <I
@AAD>D@IO <GBJMDOCH. 1C<O <GBJMDOCH O<F@N <GG JA OC@ H@H=@MN JA OC@ J=E@>O DIOJ >JIND?@M<ODJI.
4C@I OC@M@ DN < NK@>DAD> M@<NJI GDF@ I@@?DIB OJ @S>GP?@ >@MO<DI H@H=@MN AMJH OC@ C<NC
><G>PG<ODJI, UP)BTI() ><I =@ JQ@MMD??@I AJM NOMP>ON <N R@GG.
Exercises
58.5
1. 0O<MO RDOC OC@ AJGGJRDIB >G<NN, RCD>C M@KM@N@ION >JGJM@? KJDION:
FOVN $PMPS \ CMVF, HSFFO, SFE ^
DMBTT 1PJOU
\
JOU Y;
JOU Z;
$PMPS DPMPS;
UIJT(JOU Y, JOU Z, $PMPS DPMPS)
\
UIJT.Y = Y;
UIJT.Z = Z;
UIJT.DPMPS = DPMPS;
^
^
&HKG@H@IO PQ&RVBMT AJM OCDN >G<NN DI < R<T OC<O DBIJM@N >JGJMN. 4C@I DHKG@H@IO@? DI
OC<O R<T, OC@ AJGGJRDIB BTTFSU >C@>F NCJPG? K<NN:
// %JGGFSFOU DPMPST
BVUP CMVF1PJOU = OFX 1PJOU(1, 2, $PMPS.CMVF);
BVUP HSFFO1PJOU = OFX 1PJOU(1, 2, $PMPS.HSFFO);
// 5IFZ BSF TUJMM FRVBM
BTTFSU(CMVF1PJOU == HSFFO1PJOU);
2. &HKG@H@IO PQ$NQ =T >JIND?@MDIB ADMNO Y OC@I Z. 1C@ AJGGJRDIB BTTFSU >C@>FN NCJPG? K<NN:
BVUP SFE1PJOU1 = OFX 1PJOU(-1, 10, $PMPS.SFE);
BVUP SFE1PJOU2 = OFX 1PJOU(-2, 10, $PMPS.SFE);
BVUP SFE1PJOU3 = OFX 1PJOU(-2, 7, $PMPS.SFE);
BTTFSU(SFE1PJOU1 < CMVF1PJOU);
%4<75F
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
348
BTTFSU(SFE1PJOU3 < SFE1PJOU2);
/* &WFO UIPVHI CMVF JT CFGPSF HSFFO JO FOVN $PMPS,
* CFDBVTF DPMPS JT CFJOH JHOPSFE, CMVF1PJOU NVTU OPU CF
* CFGPSF HSFFO1PJOU. */
BTTFSU(!(CMVF1PJOU < HSFFO1PJOU));
)DF@ OC@ 4UVEFOU >G<NN <=JQ@, TJP ><I DHKG@H@IO PQ$NQ =T @S>GP?DIB DI>JHK<OD=G@
OTK@N =T OC@ C@GK JA FOGPSDF.
3. JIND?@M OC@ AJGGJRDIB >G<NN OC<O >JH=DI@N OCM@@ 1PJOU J=E@>ON DI <I <MM<T:
DMBTT 5SJBOHVMBS"SFB
\
1PJOU<3> QPJOUT;
UIJT(1PJOU POF, 1PJOU UXP, 1PJOU UISFF)
\
QPJOUT = < POF, UXP, UISFF >;
^
^
&HKG@H@IO UP)BTI AJM OC<O >G<NN. AB<DI, OC@ AJGGJRDIB BTTFSU >C@>FN NCJPG? K<NN:
/* BSFB1 BOE BSFB2 BSF DPOTUSVDUFE CZ EJTUJODU QPJOUT UIBU
* IBQQFO UP IBWF UIF TBNF WBMVFT. (3FNFNCFS UIBU
* CMVF1PJOU BOE HSFFO1PJOU TIPVME CF DPOTJEFSFE FRVBM.) */
BVUP BSFB1 = OFX 5SJBOHVMBS"SFB(CMVF1PJOU, HSFFO1PJOU, SFE1PJOU1);
BVUP BSFB2 = OFX 5SJBOHVMBS"SFB(HSFFO1PJOU, CMVF1PJOU, SFE1PJOU1);
// 5IF BSFBT TIPVME CF FRVBM
BTTFSU(BSFB1 == BSFB2);
// "O BTTPDJBUJWF BSSBZ
EPVCMF<5SJBOHVMBS"SFB> BSFBT;
// " WBMVF JT CFJOH FOUFSFE CZ BSFB1
BSFBT<BSFB1> = 1.25;
// 5IF WBMVF JT CFJOH BDDFTTFE CZ BSFB2
BTTFSU(BSFB2 JO BSFBT);
BTTFSU(BSFBT<BSFB2> == 1.25);
/@H@H=@M OC<O PQ&RVBMT <I? PQ$NQ HPNO <GNJ =@ ?@ADI@? RC@I UP)BTI DN ?@ADI@?.
... F:7 EA>GF;A@E
%4<75F
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
349
Interfaces 59
1C@ JOUFSGBDF F@TRJM? DA AJM ?@ADIDIB DIO@MA<>@N DI >G<NN CD@M<M>CD@N. JOUFSGBDF DN Q@MT
NDHDG<M OJ DMBTT RDOC OC@ AJGGJRDIB M@NOMD>ODJIN:
t 1C@ H@H=@M API>ODJIN OC<O DO ?@>G<M@N (=PO IJO DHKG@H@ION) <M@ <=NOM<>O @Q@I RDOCJPO OC@
BCTUSBDU F@TRJM?.
t 1C@ H@H=@M API>ODJIN OC<O DO DHKG@H@ION HPNO =@ TUBUJD JM GJOBM. (TUBUJD <I? GJOBM
H@H=@M API>ODJIN <M@ @SKG<DI@? =@GJR.)
t &ON H@H=@M Q<MD<=G@N HPNO =@ TUBUJD.
t &IO@MA<>@N ><I DIC@MDO JIGT DIO@MA<>@N.
!@NKDO@ OC@N@ M@NOMD>ODJIN, OC@M@ DN IJ GDHDO JI OC@ IPH=@M JA JOUFSGBDFN OC<O < >G<NN ><I
DIC@MDO AMJH. (&I >JIOM<NO, < >G<NN ><I DIC@MDO AMJH PK OJ JI@ DMBTT.)
Definition
59.1
&IO@MA<>@N <M@ ?@ADI@? =T OC@ JOUFSGBDF F@TRJM?, OC@ N<H@ R<T <N >G<NN@N:
JOUFSGBDF 4PVOE&NJUUFS
\
// ...
^
AI JOUFSGBDF DA AJM ?@>G<MDIB H@H=@M API>ODJIN OC<O <M@ DHKGD>DOGT <=NOM<>O:
JOUFSGBDF 4PVOE&NJUUFS
\
TUSJOH FNJU4PVOE(); // %FDMBSFE (OPU JNQMFNFOUFE)
^
G<NN@N OC<O DIC@MDO AMJH OC<O DIO@MA<>@ RJPG? C<Q@ OJ KMJQD?@ OC@ DHKG@H@IO<ODJIN JA OC@
<=NOM<>O API>ODJIN JA OC@ DIO@MA<>@.
Inheriting from an JOUFSGBDF
59.2
1C@ JOUFSGBDF DIC@MDO<I>@ NTIO<S DN OC@ N<H@ <N DMBTT DIC@MDO<I>@:
DMBTT 7JPMJO : 4PVOE&NJUUFS
\
TUSJOH FNJU4PVOE()
\
SFUVSO "z{{";
^
^
DMBTT #FMM : 4PVOE&NJUUFS
\
TUSJOH FNJU4PVOE()
\
SFUVSO "EJOH";
^
^
&IO@MA<>@N NPKKJMO KJGTHJMKCDNH: #PI>ODJIN OC<O O<F@ DIO@MA<>@ K<M<H@O@MN ><I PN@ OCJN@
K<M<H@O@MN RDOCJPO I@@?DIB OJ FIJR OC@ <>OP<G OTK@N JA J=E@>ON. #JM @S<HKG@, OC@ AJGGJRDIB
API>ODJI OC<O O<F@N < K<M<H@O@M JA 4PVOE&NJUUFS ><GGN FNJU4PVOE() JI OC<O K<M<H@O@M
RDOCJPO I@@?DIB OJ FIJR OC@ <>OP<G OTK@ JA OC@ J=E@>O:
!@F7D8357E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
350
WPJE VTF4PVOE&NJUUJOH0CKFDU(4PVOE&NJUUFS PCKFDU)
\
// ... TPNF PQFSBUJPOT ...
XSJUFMO(PCKFDU.FNJU4PVOE());
// ... NPSF PQFSBUJPOT ...
^
'PNO GDF@ RDOC >G<NN@N, OC<O API>ODJI ><I =@ ><GG@? RDOC <IT OTK@ JA J=E@>O OC<O DIC@MDON AMJH
OC@ 4PVOE&NJUUFS DIO@MA<>@:
VTF4PVOE&NJUUJOH0CKFDU(OFX 7JPMJO);
VTF4PVOE&NJUUJOH0CKFDU(OFX #FMM);
1C@ NK@>D<G FNJU4PVOE() API>ODJI AJM @<>C J=E@>O RJPG? B@O ><GG@? <I? OC@ JPOKPON JA
7JPMJO.FNJU4PVOE <I? #FMM.FNJU4PVOE RJPG? =@ KMDIO@?:
xyy
EJOH
Inheriting from more than one JOUFSGBDF
59.3
A >G<NN ><I =@ DIC@MDO@? AMJH PK OJ JI@ DMBTT. 1C@M@ DN IJ GDHDO JI OC@ IPH=@M JA JOUFSGBDFN
OJ DIC@MDO AMJH.
)@O'N >JIND?@M OC@ AJGGJRDIB DIO@MA<>@ OC<O M@KM@N@ION >JHHPID><ODJI ?@QD>@N:
JOUFSGBDF $PNNVOJDBUJPO%FWJDF
\
WPJE UBML(TUSJOH NFTTBHF);
TUSJOH MJTUFO();
^
&A < 1IPOF >G<NN I@@?N OJ =@ PN@? =JOC <N < NJPI? @HDOO@M <I? < >JHHPID><ODJI ?@QD>@, DO ><I
DIC@MDO =JOC JA OCJN@ DIO@MA<>@N:
DMBTT 1IPOF : 4PVOE&NJUUFS, $PNNVOJDBUJPO%FWJDF
\
// ...
^
1C<O ?@ADIDODJI M@KM@N@ION =JOC JA OC@N@ M@G<ODJINCDKN: "KCJI@ DN < NJPI? @HDOO@M" <I? "KCJI@
DN < >JHHPID><ODJI ?@QD>@."
&I JM?@M OJ >JINOMP>O J=E@>ON JA OCDN >G<NN, 1IPOF HPNO DHKG@H@IO OC@ <=NOM<>O API>ODJIN JA
=JOC JA OC@ DIO@MA<>@N:
DMBTT 1IPOF : 4PVOE&NJUUFS, $PNNVOJDBUJPO%FWJDF
\
TUSJOH FNJU4PVOE() // GPS 4PVOE&NJUUFS
\
SFUVSO "SSSJOH";
^
WPJE UBML(TUSJOH NFTTBHF) // GPS $PNNVOJDBUJPO%FWJDF
\
// ... QVU UIF NFTTBHF PO UIF MJOF ...
^
TUSJOH MJTUFO() // GPS $PNNVOJDBUJPO%FWJDF
\
!@F7D8357E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
351
TUSJOH TPVOE0O5IF-JOF;
// ... HFU UIF NFTTBHF GSPN UIF MJOF ...
SFUVSO TPVOE0O5IF-JOF;
^
^
A >G<NN ><I DIC@MDO AMJH <IT IPH=@M JA DIO@MA<>@N <N DO H<F@N N@IN@ <>>JM?DIB OJ OC@ ?@NDBI
JA OC@ KMJBM<H.
Inheriting from JOUFSGBDF and DMBTT
59.4
G<NN@N ><I NODGG DIC@MDO AMJH PK OJ JI@ DMBTT <N R@GG:
DMBTT $MPDL
\
// ... DMPDL JNQMFNFOUBUJPO ...
^
DMBTT "MBSN$MPDL : $MPDL, 4PVOE&NJUUFS
\
TUSJOH FNJU4PVOE()
\
SFUVSO "CFFQ";
^
^
"MBSN$MPDL DIC@MDON OC@ H@H=@MN JA $MPDL. A??DODJI<GGT, DO <GNJ KMJQD?@N OC@ FNJU4PVOE()
API>ODJI OC<O OC@ 4PVOE&NJUUFS DIO@MA<>@ M@LPDM@N.
Inheriting JOUFSGBDF from JOUFSGBDF
59.5
AI DIO@MA<>@ OC<O DN DIC@MDO@? AMJH <IJOC@M DIO@MA<>@ @AA@>ODQ@GT DI>M@<N@N OC@ IPH=@M JA
API>ODJIN OC<O OC@ NP=>G<NN@N HPNO DHKG@H@IO:
JOUFSGBDF .VTJDBM*OTUSVNFOU : 4PVOE&NJUUFS
\
WPJE BEKVTU5VOJOH();
^
A>>JM?DIB OJ OC@ ?@ADIDODJI <=JQ@, DI JM?@M OJ =@ < .VTJDBM*OTUSVNFOU, =JOC OC@
FNJU4PVOE() API>ODJI OC<O 4PVOE&NJUUFS M@LPDM@N <I? OC@ BEKVTU5VOJOH() API>ODJI OC<O
.VTJDBM*OTUSVNFOU M@LPDM@N HPNO =@ DHKG@H@IO@?.
#JM @S<HKG@, DA 7JPMJO DIC@MDON AMJH .VTJDBM*OTUSVNFOU DINO@<? JA 4PVOE&NJUUFS, DO HPNO
IJR <GNJ DHKG@H@IO BEKVTU5VOJOH():
DMBTT 7JPMJO : .VTJDBM*OTUSVNFOU
\
TUSJOH FNJU4PVOE() // GPS 4PVOE&NJUUFS
\
SFUVSO "z{{";
^
WPJE BEKVTU5VOJOH() // GPS .VTJDBM*OTUSVNFOU
\
// ... TQFDJBM UVOJOH PG UIF WJPMJO ...
^
^
!@F7D8357E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
352
TUBUJD member functions
59.6
& C<Q@ ?@G<T@? @SKG<DIDIB TUBUJD H@H=@M API>ODJIN PIODG OCDN >C<KO@M OJ F@@K OC@ @<MGD@M
>C<KO@MN NCJMO@M. TUBUJD H@H=@M API>ODJIN <M@ <Q<DG<=G@ AJM NOMP>ON, >G<NN@N, <I? DIO@MA<>@N.
/@BPG<M H@H=@M API>ODJIN <M@ <GR<TN ><GG@? JI <I J=E@>O. 1C@ H@H=@M Q<MD<=G@N OC<O <M@
M@A@M@I>@? DIND?@ OC@ H@H=@M API>ODJI <M@ OC@ H@H=@MN JA < K<MOD>PG<M J=E@>O:
TUSVDU 'PP
\
JOU J;
WPJE NPEJGZ(JOU WBMVF)
\
J = WBMVF;
^
^
WPJE NBJO()
\
BVUP PCKFDU0 = 'PP();
BVUP PCKFDU1 = 'PP();
PCKFDU0.NPEJGZ(10); // PCKFDU0.J DIBOHFT
PCKFDU1.NPEJGZ(10); // PCKFDU1.J DIBOHFT
^
1C@ H@H=@MN ><I <GNJ =@ M@A@M@I>@? =T UIJT:
WPJE NPEJGZ(JOU WBMVF)
\
UIJT.J = WBMVF; // FRVJWBMFOU PG UIF QSFWJPVT POF
^
A TUBUJD H@H=@M API>ODJI ?J@N IJO JK@M<O@ JI <I J=E@>O; OC@M@ DN IJ J=E@>O OC<O OC@ UIJT
F@TRJM? RJPG? M@A@M OJ, NJ UIJT DN IJO Q<GD? DIND?@ < TUBUJD API>ODJI. #JM OC<O M@<NJI, IJI@
JA OC@ M@BPG<M H@H=@M Q<MD<=G@N <M@ <Q<DG<=G@ DIND?@ TUBUJD H@H=@M API>ODJIN:
TUSVDU 'PP
\
JOU J;
TUBUJD WPJE DPNNPO'VODUJPO(JOU WBMVF)
\
J = WBMVF; // j DPNQJMBUJPO &3303
UIJT.J = WBMVF; // j DPNQJMBUJPO &3303
^
^
TUBUJD H@H=@M API>ODJIN ><I PN@ JIGT OC@ TUBUJD H@H=@M Q<MD<=G@N.
)@O'N M@?@NDBI OC@ 1PJOU NOMP>O OC<O R@ C<Q@ N@@I @<MGD@M DI OC@ 0OMP>ON >C<KO@M, OCDN ODH@
RDOC < TUBUJD H@H=@M API>ODJI. &I OC@ AJGGJRDIB >J?@, @Q@MT 1PJOU J=E@>O B@ON < PIDLP@ D?,
RCD>C DN ?@O@MHDI@? =T < TUBUJD H@H=@M API>ODJI:
JNQPSU TUE.TUEJP;
TUSVDU 1PJOU
\
TJ[F@U JE; // 0CKFDU JE
JOU MJOF;
JOU DPMVNO;
// 5IF JE UP CF VTFE GPS UIF OFYU PCKFDU
!@F7D8357E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
353
TUBUJD TJ[F@U OFYU*E;
UIJT (JOU MJOF, JOU DPMVNO)
\
UIJT.MJOF = MJOF;
UIJT.DPMVNO = DPMVNO;
UIJT.JE = NBLF/FX*E();
^
TUBUJD TJ[F@U NBLF/FX*E()
\
JNNVUBCMF OFX*E = OFYU*E;
++OFYU*E;
SFUVSO OFX*E;
^
^
WPJE NBJO()
\
BVUP UPQ = 1PJOU(7, 0);
BVUP NJEEMF = 1PJOU(8, 0);
BVUP CPUUPN = 1PJOU(9, 0);
XSJUFMO(UPQ.JE);
XSJUFMO(NJEEMF.JE);
XSJUFMO(CPUUPN.JE);
^
1C@ TUBUJD NBLF/FX*E() API>ODJI ><I PN@ OC@ >JHHJI Q<MD<=G@ OFYU*E. AN < M@NPGO, @Q@MT
J=E@>O B@ON < PIDLP@ D?:
0
1
2
AGOCJPBC OC@ @S<HKG@ <=JQ@ >JIO<DIN < TUSVDU, TUBUJD H@H=@M API>ODJIN <M@ <Q<DG<=G@ AJM
>G<NN@N <I? DIO@MA<>@N <N R@GG.
GJOBM member functions
59.7
& C<Q@ ?@G<T@? @SKG<DIDIB GJOBM H@H=@M API>ODJIN PIODG OCDN >C<KO@M OJ F@@K OC@ @<MGD@M
>C<KO@MN NCJMO@M. GJOBM H@H=@M API>ODJIN <M@ <Q<DG<=G@ JIGT AJM >G<NN@N <I? DIO@MA<>@N; OC@T
<M@ IJO M@G@Q<IO OJ NOMP>ON =@><PN@ NOMP>ON ?J IJO NPKKJMO DIC@MDO<I>@.
GJOBM NK@>DAD@N OC<O < H@H=@M API>ODJI ><IIJO =@ M@?@ADI@? =T < NP=>G<NN. &I < N@IN@, OC@
DHKG@H@IO<ODJI OC<O OCDN DMBTT JM JOUFSGBDF KMJQD?@N DN OC@ 8;@3> DHKG@H@IO<ODJI JA OC<O
API>ODJI. AI @S<HKG@ JA < ><N@ RC@M@ OCDN A@<OPM@ DN PN@APG DN RC@M@ OC@ B@I@M<G NO@KN JA <I
<GBJMDOCH <M@ ?@ADI@? =T <I DIO@MA<>@ <I? OC@ ADI@M ?@O<DGN <M@ G@AO OJ NP=>G<NN@N.
)@O'N N@@ <I @S<HKG@ JA OCDN RDOC < (BNF DIO@MA<>@. 1C@ B@I@M<G NO@KN JA KG<TDIB < B<H@ DN
=@DIB ?@O@MHDI@? =T OC@ QMBZ() API>ODJI JA OC@ AJGGJRDIB JOUFSGBDF:
JOUFSGBDF (BNF
\
GJOBM WPJE QMBZ()
\
TUSJOH OBNF = HBNF/BNF();
XSJUFGMO("4UBSUJOH %T", OBNF);
JOUSPEVDF1MBZFST();
QSFQBSF();
CFHJO();
!@F7D8357E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
354
FOE();
XSJUFGMO("&OEJOH %T", OBNF);
^
TUSJOH HBNF/BNF();
WPJE JOUSPEVDF1MBZFST();
WPJE QSFQBSF();
WPJE CFHJO();
WPJE FOE();
^
&O DN IJO KJNND=G@ AJM NP=>G<NN@N OJ HJ?DAT OC@ ?@ADIDODJI JA OC@ QMBZ() H@H=@M API>ODJI. 1C@
NP=>G<NN@N ><I (<I? HPNO) KMJQD?@ OC@ ?@ADIDODJIN JA OC@ ADQ@ <=NOM<>O H@H=@M API>ODJIN OC<O
<M@ ?@>G<M@? =T OC@ DIO@MA<>@. BT ?JDIB NJ, OC@ NP=>G<NN@N >JHKG@O@ OC@ HDNNDIB NO@KN JA OC@
<GBJMDOCH:
JNQPSU TUE.TUEJP;
JNQPSU TUE.TUSJOH;
JNQPSU TUE.SBOEPN;
JNQPSU TUE.DPOW;
DMBTT %JDF4VNNJOH(BNF : (BNF
\
TUSJOH QMBZFS;
TJ[F@U DPVOU;
TJ[F@U TVN;
TUSJOH HBNF/BNF()
\
SFUVSO "%JDF 4VNNJOH (BNF";
^
WPJE JOUSPEVDF1MBZFST()
\
XSJUF("8IBU JT ZPVS OBNF ");
QMBZFS = DIPNQ(SFBEMO());
^
WPJE QSFQBSF()
\
XSJUF(")PX NBOZ UJNFT UP UISPX UIF EJDF ");
SFBEG(" %T", &DPVOU);
TVN = 0;
^
WPJE CFHJO()
\
GPSFBDI (J; 0 .. DPVOU) \
JNNVUBCMF EJDF = VOJGPSN(1, 7);
XSJUFGMO("%T: %T", J, EJDF);
TVN += EJDF;
^
^
WPJE FOE()
\
XSJUFGMO("1MBZFS: %T, %JDF TVN: %T, "WFSBHF: %T",
QMBZFS, TVN, UP!EPVCMF(TVN) / DPVOU);
^
^
WPJE VTF(BNF((BNF HBNF)
\
HBNF.QMBZ();
^
WPJE NBJO()
!@F7D8357E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
355
\
VTF(BNF(OFX %JDF4VNNJOH(BNF());
^
AGOCJPBC OC@ @S<HKG@ <=JQ@ >JIO<DIN <I JOUFSGBDF, GJOBM H@H=@M API>ODJIN <M@ <Q<DG<=G@
AJM >G<NN@N <N R@GG.
How to use
59.8
JOUFSGBDF DN < >JHHJIGT PN@? A@<OPM@. 1C@M@ DN JI@ JM HJM@ JOUFSGBDF <O OC@ OJK JA <GHJNO
@Q@MT >G<NN CD@M<M>CT. A FDI? JA CD@M<M>CT OC<O DN >JHHJIGT @I>JPIO@M@? DI KMJBM<HN DIQJGQ@N
< NDIBG@ JOUFSGBDF <I? < IPH=@M JA >G<NN@N OC<O DHKG@H@IO OC<O DIO@MA<>@:
.VTJDBM*OTUSVNFOU
(JOUFSGBDF)
/ ] = =
7JPMJO (VJUBS 'MVUF ...
AGOCJPBC OC@M@ <M@ HJM@ >JHKGD><O@? CD@M<M>CD@N DI KM<>OD>@, OC@ NDHKG@ CD@M<M>CT <=JQ@
NJGQ@N H<IT KMJ=G@HN.
&O DN <GNJ >JHHJI OJ HJQ@ >JHHJI DHKG@H@IO<ODJI ?@O<DGN JA >G<NN CD@M<M>CD@N OJ
DIO@MH@?D<O@ >G<NN@N. 1C@ NP=>G<NN@N DIC@MDO AMJH OC@N@ DIO@MH@?D<O@ >G<NN@N. 1C@
4USJOH*OTUSVNFOU <I? 8JOE*OTUSVNFOU >G<NN@N =@GJR ><I >JIO<DI OC@ >JHHJI H@H=@MN JA
OC@DM M@NK@>ODQ@ NP=>G<NN@N:
.VTJDBM*OTUSVNFOU
(JOUFSGBDF)
/ =
4USJOH*OTUSVNFOU 8JOE*OTUSVNFOU
/ ] = / ] =
7JPMJO 7JPMB ... 'MVUF $MBSJOFU ...
1C@ NP=>G<NN@N RJPG? DHKG@H@IO OC@DM M@NK@>ODQ@ NK@>D<G ?@ADIDODJIN JA H@H=@M API>ODJIN.
Abstraction
59.9
&IO@MA<>@N C@GK H<F@ K<MON JA KMJBM<HN DI?@K@I?@IO AMJH @<>C JOC@M. 1CDN DN ><GG@?
34EFD35F;A@. #JM @S<HKG@, < KMJBM<H OC<O ?@<GN RDOC HPND><G DINOMPH@ION ><I =@ RMDOO@I
KMDH<MDGT =T PNDIB OC@ .VTJDBM*OTUSVNFOU DIO@MA<>@, RDOCJPO @Q@M NK@>DATDIB OC@ <>OP<G OTK@N
JA OC@ HPND><G DINOMPH@ION.
A .VTJDJBO >G<NN ><I >JIO<DI < .VTJDBM*OTUSVNFOU RDOCJPO @Q@M FIJRDIB OC@ <>OP<G OTK@ JA
OC@ DINOMPH@IO:
DMBTT .VTJDJBO
\
.VTJDBM*OTUSVNFOU JOTUSVNFOU;
// ...
^
!DAA@M@IO OTK@N JA HPND><G DINOMPH@ION ><I =@ >JH=DI@? DI < >JGG@>ODJI RDOCJPO M@B<M? OJ OC@
<>OP<G OTK@N JA OC@N@ DINOMPH@ION:
.VTJDBM*OTUSVNFOU<> PSDIFTUSB*OTUSVNFOUT;
*JNO JA OC@ API>ODJIN JA OC@ KMJBM<H ><I =@ RMDOO@I JIGT =T PNDIB OCDN DIO@MA<>@:
!@F7D8357E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
356
CPPM OFFET5VOJOH(.VTJDBM*OTUSVNFOU JOTUSVNFOU)
\
CPPM SFTVMU;
// ...
SFUVSO SFTVMU;
^
WPJE QMBZ*O5VOF(.VTJDBM*OTUSVNFOU JOTUSVNFOU)
\
JG (OFFET5VOJOH(JOTUSVNFOU))\
JOTUSVNFOU.BEKVTU5VOJOH();
^
XSJUFMO(JOTUSVNFOU.FNJU4PVOE());
^
A4EFD35F;@9 3I3K K<MON JA < KMJBM<H AMJH @<>C JOC@M <GGJRN H<FDIB >C<IB@N DI JI@ K<MO JA
OC@ KMJBM<H RDOCJPO I@@?DIB OJ HJ?DAT OC@ JOC@M K<MON. 4C@I DHKG@H@IO<ODJIN JA >@MO<DI
K<MON JA OC@ KMJBM<H <M@ 47:;@6 < K<MOD>PG<M DIO@MA<>@, OC@ >J?@ OC<O PN@N JIGT OC<O DIO@MA<>@
?J@N IJO B@O <AA@>O@?.
Example
59.10
1C@ AJGGJRDIB KMJBM<H ?@ADI@N OC@ 4PVOE&NJUUFS, .VTJDBM*OTUSVNFOU, <I?
$PNNVOJDBUJPO%FWJDF DIO@MA<>@N:
JNQPSU TUE.TUEJP;
JOUFSGBDF 4PVOE&NJUUFS
\
TUSJOH FNJU4PVOE();
^
/* 5IJT DMBTT OFFET UP JNQMFNFOU POMZ FNJU4PVOE(). */
DMBTT #FMM : 4PVOE&NJUUFS
\
TUSJOH FNJU4PVOE()
\
SFUVSO "EJOH";
^
^
JOUFSGBDF .VTJDBM*OTUSVNFOU : 4PVOE&NJUUFS
\
WPJE BEKVTU5VOJOH();
^
/* 5IJT DMBTT OFFET UP JNQMFNFOU CPUI FNJU4PVOE() BOE
* BEKVTU5VOJOH(). */
DMBTT 7JPMJO : .VTJDBM*OTUSVNFOU
\
TUSJOH FNJU4PVOE()
\
SFUVSO "z{{";
^
WPJE BEKVTU5VOJOH()
\
// ... UVOJOH PG UIF WJPMJO ...
^
^
JOUFSGBDF $PNNVOJDBUJPO%FWJDF
\
WPJE UBML(TUSJOH NFTTBHF);
TUSJOH MJTUFO();
!@F7D8357E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
357
^
/* 5IJT DMBTT OFFET UP JNQMFNFOU FNJU4PVOE(), UBML(), BOE
* MJTUFO(). */
DMBTT 1IPOF : 4PVOE&NJUUFS, $PNNVOJDBUJPO%FWJDF
\
TUSJOH FNJU4PVOE()
\
SFUVSO "SSSJOH";
^
WPJE UBML(TUSJOH NFTTBHF)
\
// ... QVU UIF NFTTBHF PO UIF MJOF ...
^
TUSJOH MJTUFO()
\
TUSJOH TPVOE0O5IF-JOF;
// ... HFU UIF NFTTBHF GSPN UIF MJOF ...
SFUVSO TPVOE0O5IF-JOF;
^
^
DMBTT $MPDL
\
// ... UIF JNQMFNFOUBUJPO PG $MPDL ...
^
/* 5IJT DMBTT OFFET UP JNQMFNFOU POMZ FNJU4PVOE(). */
DMBTT "MBSN$MPDL : $MPDL, 4PVOE&NJUUFS
\
TUSJOH FNJU4PVOE()
\
SFUVSO "CFFQ";
^
// ... UIF JNQMFNFOUBUJPO PG "MBSN$MPDL ...
^
WPJE NBJO()
\
4PVOE&NJUUFS<> EFWJDFT;
EFWJDFT _= OFX #FMM;
EFWJDFT _= OFX 7JPMJO;
EFWJDFT _= OFX 1IPOF;
EFWJDFT _= OFX "MBSN$MPDL;
GPSFBDI (EFWJDF; EFWJDFT) \
XSJUFMO(EFWJDF.FNJU4PVOE());
^
^
B@><PN@ EFWJDFT DN < 4PVOE&NJUUFS NGD>@, DO ><I >JIO<DI J=E@>ON JA <IT OTK@ OC<O DIC@MDON
AMJH 4PVOE&NJUUFS (D.@. OTK@N OC<O C<Q@ <I "DN <" M@G<ODJINCDK RDOC 4PVOE&NJUUFS). AN <
M@NPGO, OC@ JPOKPO JA OC@ KMJBM<H >JINDNON JA ?DAA@M@IO NJPI?N OC<O <M@ @HDOO@? =T OC@
?DAA@M@IO OTK@N JA J=E@>ON:
EJOH
xyy
SSSJOH
CFFQ
!@F7D8357E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
358
Summary
59.11
t JOUFSGBDF ?@ADI@N <I DIO@MA<>@, RCD>C DN NDHDG<M OJ >G<NN@N OC<O >JINDNO JIGT JA <=NOM<>O
API>ODJIN. JOUFSGBDF ><I >JIO<DI JIGT TUBUJD H@H=@M Q<MD<=G@N <I? TUBUJD JM GJOBM
H@H=@M API>ODJIN.
t &I JM?@M OJ =@ <=G@ OJ >JINOMP>O J=E@>ON JA < >G<NN, OC<O >G<NN HPNO DI>GP?@ DHKG@H@IO<ODJIN
AJM <GG JA OC@ H@H=@M API>ODJIN JA <GG JA OC@ DIO@MA<>@N OC<O DO DIC@MDON AMJH.
t JOUFSGBDF ?J@N IJO C<Q@ < M@NOMD>ODJI JA DMBTT: &O DN KJNND=G@ OJ DIC@MDO AMJH PIGDHDO@?
IPH=@M JA JOUFSGBDFN.
t A >JHHJI CD@M<M>CT >JINDNON JA < NDIBG@ JOUFSGBDF <I? < IPH=@M JA NP=>G<NN@N OC<O
DHKG@H@IO OC<O DIO@MA<>@.
!@F7D8357E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
359
EFTUSPZ and TDPQFE 60
4@ C<Q@ N@@I OC@ GDA@ODH@N JA J=E@>ON DI OC@ )DA@ODH@N <I? #PI?<H@IO<G ,K@M<ODJIN >C<KO@M.
&I G<O@M >C<KO@MN, R@ C<Q@ N@@I OC<O OC@ J=E@>ON <M@ KM@K<M@? AJM PN@ DI OC@ >JINOMP>OJM,
RCD>C DN ><GG@? UIJT(); <I? OC@ ADI<G JK@M<ODJIN JA J=E@>ON <M@ <KKGD@? DI OC@ ?@NOMP>OJM,
RCD>C DN ><GG@? _UIJT().
#JM NOMP>ON <I? JOC@M Q<GP@ OTK@N, OC@ ?@NOMP>OJM DN @S@>PO@? <O OC@ ODH@ RC@I OC@ GDA@ODH@ JA
<I J=E@>O @I?N. #JM >G<NN@N <I? JOC@M M@A@M@I>@ OTK@N, DO DN @S@>PO@? =T OC@ B<M=<B@ >JGG@>OJM
NJH@ ODH@ DI OC@ APOPM@. 1C@ DHKJMO<IO ?DNODI>ODJI DN OC<O OC@ ?@NOMP>OJM JA < >G<NN J=E@>O DN
IJO @S@>PO@? RC@I DON GDA@ODH@ @I?N.
0TNO@H M@NJPM>@N <M@ >JHHJIGT M@OPMI@? =<>F OJ OC@ NTNO@H DI ?@NOMP>OJMN. #JM @S<HKG@,
TUE.TUEJP.'JMF M@OPMIN OC@ ADG@ M@NJPM>@ =<>F OJ OC@ JK@M<ODIB NTNO@H DI DON ?@NOMP>OJM. AN DO
DN IJO >@MO<DI RC@I OC@ ?@NOMP>OJM JA < >G<NN J=E@>O RDGG =@ ><GG@?, OC@ NTNO@H M@NJPM>@N OC<O DO
CJG?N H<T IJO =@ M@OPMI@? PIODG OJJ G<O@ RC@I JOC@M J=E@>ON ><IIJO B@O < CJG? JA OC@ N<H@
M@NJPM>@.
An example of calling destructors late
60.1
)@O'N ?@ADI@ < >G<NN OJ N@@ OC@ @AA@>ON JA @S@>PODIB >G<NN ?@NOMP>OJMN G<O@. 1C@ AJGGJRDIB
>JINOMP>OJM DI>M@H@ION < TUBUJD >JPIO@M, <I? OC@ ?@NOMP>OJM ?@>M@H@ION DO. AN TJP
M@H@H=@M, OC@M@ DN JIGT JI@ JA @<>C TUBUJD H@H=@M, RCD>C DN NC<M@? =T <GG JA OC@ J=E@>ON JA <
OTK@. 0P>C < >JPIO@M RJPG? DI?D><O@ OC@ IPH=@M JA J=E@>ON OC<O <M@ T@O OJ =@ ?@NOMJT@?.
DMBTT -JGFUJNF0CTFSWFE
\
JOU<> BSSBZ; // j #FMPOHT UP FBDI PCKFDU
TUBUJD TJ[F@U DPVOUFS; // j 4IBSFE CZ BMM PCKFDUT
UIJT()
\
/*
* 8F BSF VTJOH B SFMBUJWFMZ MBSHF BSSBZ UP NBLF FBDI
* PCKFDU DPOTVNF B MBSHF BNPVOU PG NFNPSZ. )PQFGVMMZ
* UIJT XJMM NBLF UIF HBSCBHF DPMMFDUPS DBMM PCKFDU
* EFTUSVDUPST NPSF GSFRVFOUMZ UP PQFO VQ TQBDF GPS
* NPSF PCKFDUT.
*/
BSSBZ.MFOHUI = 30@000;
/*
* *ODSFNFOU UIF DPVOUFS GPS UIJT PCKFDU UIBU JT CFJOH
* DPOTUSVDUFE.
*/
++DPVOUFS;
^
_UIJT()
\
/*
* %FDSFNFOU UIF DPVOUFS GPS UIJT PCKFDU UIBU JT CFJOH
* EFTUSPZFE.
*/
--DPVOUFS;
^
^
1C@ AJGGJRDIB KMJBM<H >JINOMP>ON J=E@>ON JA OC<O >G<NN DIND?@ < GJJK:
67EFDAK 3@6 E5AB76
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
360
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
GPSFBDI (J; 0 .. 20) \
BVUP WBSJBCMF = OFX -JGFUJNF0CTFSWFE; // j TUBSU
XSJUF(-JGFUJNF0CTFSWFE.DPVOUFS, ' ');
^ // j FOE
XSJUFMO();
^
1C@ GDA@ODH@ JA @<>C -JGFUJNF0CTFSWFE J=E@>O DN DI A<>O Q@MT NCJMO: &ON GDA@ NO<MON RC@I DO DN
>JINOMP>O@? =T OC@ OFX F@TRJM? <I? @I?N <O OC@ >GJNDIB >PMGT =M<>F@O JA OC@ GPSFBDI GJJK.
"<>C J=E@>O OC@I =@>JH@N OC@ M@NKJIND=DGDOT JA OC@ B<M=<B@ >JGG@>OJM. 1C@ TUBSU <I? FOE
>JHH@ION DI?D><O@ OC@ NO<MO <I? @I? JA OC@ GDA@ODH@N.
"Q@I OCJPBC OC@M@ DN PK OJ JI@ J=E@>O <GDQ@ <O < BDQ@I ODH@, OC@ Q<GP@ JA OC@ >JPIO@M DI?D><O@N
OC<O OC@ ?@NOMP>OJM DN IJO @S@>PO@? RC@I OC@ GDA@ODH@ @I?N:
1 2 3 4 5 6 7 8 2 3 4 5 6 7 8 2 3 4 5 6
A>>JM?DIB OJ OC<O JPOKPO, OC@ H@HJMT NR@@K <GBJMDOCH JA OC@ B<M=<B@ >JGG@>OJM C<N ?@G<T@?
@S@>PODIB OC@ ?@NOMP>OJM AJM PK OJ 8 J=E@>ON. ($AF7: ):7 AGFBGF ?3K 47 6;887D7@F 67B7@6;@9 A@
F:7 93D4397 5A>>75F;A@ 3>9AD;F:?, 3H3;>34>7 ?7?ADK, 3@6 AF:7D 835FADE.)
EFTUSPZ() to execute the destructor
60.2
EFTUSPZ() @S@>PO@N OC@ ?@NOMP>OJM AJM <I J=E@>O:
WPJE NBJO()
\
GPSFBDI (J; 0 .. 20) \
BVUP WBSJBCMF = OFX -JGFUJNF0CTFSWFE;
XSJUF(-JGFUJNF0CTFSWFE.DPVOUFS, ' ');
EFTUSPZ(WBSJBCMF);
^
XSJUFMO();
^
)DF@ =@AJM@, OC@ Q<GP@ JA -JGFUJNF0CTFSWFE.DPVOUFS DN DI>M@H@IO@? =T OC@ >JINOMP>OJM <N <
M@NPGO JA OFX, <I? =@>JH@N 1. 1CDN ODH@, MDBCO <AO@M DO B@ON KMDIO@?, EFTUSPZ() @S@>PO@N OC@
?@NOMP>OJM AJM OC@ J=E@>O <I? OC@ Q<GP@ JA OC@ >JPIO@M DN ?@>M@H@IO@? <B<DI ?JRI OJ U@MJ. #JM
OC<O M@<NJI, OCDN ODH@ DON Q<GP@ DN <GR<TN 1:
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
,I>@ ?@NOMJT@?, OC@ J=E@>O NCJPG? =@ >JIND?@M@? OJ =@ DI <I DIQ<GD? NO<O@ <I? HPNO IJO =@
PN@? <ITHJM@:
EFTUSPZ(WBSJBCMF);
// ...
// 8BSOJOH: 6TJOH B QPUFOUJBMMZ JOWBMJE PCKFDU
XSJUFMO(WBSJBCMF.BSSBZ);
AGOCJPBC EFTUSPZ() DN KMDH<MDGT AJM M@A@M@I>@ OTK@N, DO ><I <GNJ =@ ><GG@? JI TUSVDU J=E@>ON
OJ ?@NOMJT OC@H =@AJM@ OC@ @I? JA OC@DM IJMH<G GDA@ODH@N.
67EFDAK 3@6 E5AB76
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
361
When to use
60.3
AN C<N =@@I N@@I DI OC@ KM@QDJPN @S<HKG@, EFTUSPZ() DN PN@? RC@I M@NJPM>@N I@@? OJ =@
M@G@<N@? <O < NK@>DAD> ODH@ RDOCJPO M@GTDIB JI OC@ B<M=<B@ >JGG@>OJM.
Example
60.4
4@ C<? ?@NDBI@? <I 9NM&MFNFOU NOMP>O DI OC@ JINOMP>OJM <I? ,OC@M 0K@>D<G #PI>ODJIN
>C<KO@M. 1C<O NOMP>O R<N =@DIB PN@? AJM KMDIODIB 5*) @G@H@ION DI OC@ AJMH<O
<UBH>WBMVF</UBH>. -MDIODIB OC@ >GJNDIB O<B C<N =@@I OC@ M@NKJIND=DGDOT JA OC@ ?@NOMP>OJM:
TUSVDU 9NM&MFNFOU
\
// ...
_UIJT()
\
XSJUFMO(JOEFOUBUJPO, "</", OBNF, '>');
^
^
1C@ AJGGJRDIB JPOKPO R<N KMJ?P>@? =T < KMJBM<H OC<O PN@? OC<O NOMP>O. 1CDN ODH@, & <H
M@KG<>DIB OC@ RJM? ">G<NN" RDOC ">JPMN@" OJ <QJD? >JIAPNDIB DO RDOC OC@ DMBTT F@TRJM?:
<DPVSTFT>
<DPVSTF0>
<HSBEF>
72
</HSBEF> l 5IF DMPTJOH UBHT BQQFBS PO DPSSFDU MJOFT
<HSBEF>
97
</HSBEF> l
<HSBEF>
90
</HSBEF> l
</DPVSTF0> l
<DPVSTF1>
<HSBEF>
77
</HSBEF> l
<HSBEF>
87
</HSBEF> l
<HSBEF>
56
</HSBEF> l
</DPVSTF1> l
</DPVSTFT> l
1C@ KM@QDJPN JPOKPO C<KK@IN OJ =@ >JMM@>O =@><PN@ 9NM&MFNFOU DN < TUSVDU. 1C@ ?@NDM@?
JPOKPO DN <>CD@Q@? NDHKGT =T KG<>DIB OC@ J=E@>ON DI <KKMJKMD<O@ N>JK@N:
WPJE NBJO()
\
JNNVUBCMF DPVSTFT = 9NM&MFNFOU("DPVSTFT", 0);
67EFDAK 3@6 E5AB76
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
362
GPSFBDI (DPVSTF*E; 0 .. 2) \
JNNVUBCMF DPVSTF5BH = "DPVSTF" _ UP!TUSJOH(DPVSTF*E);
JNNVUBCMF DPVSTF&MFNFOU = 9NM&MFNFOU(DPVSTF5BH, 1);
GPSFBDI (J; 0 .. 3) \
JNNVUBCMF HSBEF&MFNFOU = 9NM&MFNFOU("HSBEF", 2);
JNNVUBCMF SBOEPN(SBEF = VOJGPSN(50, 101);
XSJUFMO(JOEFOUBUJPO4USJOH(3), SBOEPN(SBEF);
^ // j HSBEF&MFNFOU JT EFTUSPZFE
^ // j DPVSTF&MFNFOU JT EFTUSPZFE
^ // j DPVSTFT JT EFTUSPZFE
1C@ ?@NOMP>OJM KMDION OC@ >GJNDIB O<BN <N OC@ J=E@>ON B@ON ?@NOMJT@?.
1J N@@ CJR >G<NN@N =@C<Q@ ?DAA@M@IOGT, G@O'N >JIQ@MO 9NM&MFNFOU OJ < >G<NN:
JNQPSU TUE.TUEJP;
JNQPSU TUE.BSSBZ;
JNQPSU TUE.SBOEPN;
JNQPSU TUE.DPOW;
TUSJOH JOEFOUBUJPO4USJOH(JO JOU MFWFM)
\
SFUVSO SFQMJDBUF(" ", MFWFM * 2);
^
DMBTT 9NM&MFNFOU
\
TUSJOH OBNF;
TUSJOH JOEFOUBUJPO;
UIJT(JO TUSJOH OBNF, JO JOU MFWFM)
\
UIJT.OBNF = OBNF;
UIJT.JOEFOUBUJPO = JOEFOUBUJPO4USJOH(MFWFM);
XSJUFMO(JOEFOUBUJPO, '<', OBNF, '>');
^
_UIJT()
\
XSJUFMO(JOEFOUBUJPO, "</", OBNF, '>');
^
^
WPJE NBJO()
\
JNNVUBCMF DPVSTFT =
OFX JNNVUBCMF(9NM&MFNFOU)("DPVSTFT", 0);
GPSFBDI (DPVSTF*E; 0 .. 2) \
JNNVUBCMF DPVSTF5BH = "DPVSTF" _ UP!TUSJOH(DPVSTF*E);
JNNVUBCMF DPVSTF&MFNFOU =
OFX JNNVUBCMF(9NM&MFNFOU)(DPVSTF5BH, 1);
GPSFBDI (J; 0 .. 3) \
JNNVUBCMF HSBEF&MFNFOU =
OFX JNNVUBCMF(9NM&MFNFOU)("HSBEF", 2);
JNNVUBCMF SBOEPN(SBEF = VOJGPSN(50, 101);
XSJUFMO(JOEFOUBUJPO4USJOH(3), SBOEPN(SBEF);
^
^
^
67EFDAK 3@6 E5AB76
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
363
AN OC@ M@NKJIND=DGDOT JA ><GGDIB OC@ ?@NOMP>OJMN <M@ IJR G@AO OJ OC@ B<M=<B@ >JGG@>OJM, OC@
KMJBM<H ?J@N IJO KMJ?P>@ OC@ ?@NDM@? JPOKPO:
<DPVSTFT>
<DPVSTF0>
<HSBEF>
57
<HSBEF>
98
<HSBEF>
87
<DPVSTF1>
<HSBEF>
84
<HSBEF>
60
<HSBEF>
99
</HSBEF> l 5IF DMPTJOH UBHT BQQFBS BU UIF FOE
</HSBEF> l
</HSBEF> l
</DPVSTF1> l
</HSBEF> l
</HSBEF> l
</HSBEF> l
</DPVSTF0> l
</DPVSTFT> l
1C@ ?@NOMP>OJM DN NODGG @S@>PO@? AJM @Q@MT J=E@>O =PO OCDN ODH@ <O OC@ @I? RC@I OC@ KMJBM<H DN
@SDODIB. ($AF7: ):7 93D4397 5A>>75FAD 6A7E @AF 9G3D3@F77 F:3F F:7 67EFDG5FAD I;>> 47 53>>76 8AD
7H7DK A4<75F. !@ D73>;FK, ;F ;E BAEE;4>7 F:3F F:7D7 3D7 @A 5>AE;@9 F39E BD;@F76 3F 3>>.)
EFTUSPZ() @INPM@N OC<O OC@ ?@NOMP>OJM DN ><GG@? <O ?@NDM@? KJDION DI OC@ KMJBM<H:
WPJE NBJO()
\
JNNVUBCMF DPVSTFT =
OFX JNNVUBCMF(9NM&MFNFOU)("DPVSTFT", 0);
GPSFBDI (DPVSTF*E; 0 .. 2) \
JNNVUBCMF DPVSTF5BH = "DPVSTF" _ UP!TUSJOH(DPVSTF*E);
JNNVUBCMF DPVSTF&MFNFOU =
OFX JNNVUBCMF(9NM&MFNFOU)(DPVSTF5BH, 1);
GPSFBDI (J; 0 .. 3) \
JNNVUBCMF HSBEF&MFNFOU =
OFX JNNVUBCMF(9NM&MFNFOU)("HSBEF", 2);
JNNVUBCMF SBOEPN(SBEF = VOJGPSN(50, 101);
XSJUFMO(JOEFOUBUJPO4USJOH(3), SBOEPN(SBEF);
EFTUSPZ(HSBEF&MFNFOU);
^
EFTUSPZ(DPVSTF&MFNFOU);
^
EFTUSPZ(DPVSTFT);
^
67EFDAK 3@6 E5AB76
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
364
4DOC OCJN@ >C<IB@N, OC@ JPOKPO JA OC@ >J?@ IJR H<O>C@N OC@ JPOKPO JA OC@ >J?@ OC<O PN@
NOMP>ON:
<DPVSTFT>
<DPVSTF0>
<HSBEF>
66
</HSBEF> l 5IF DMPTJOH UBHT BQQFBS PO DPSSFDU MJOFT
<HSBEF>
75
</HSBEF> l
<HSBEF>
68
</HSBEF> l
</DPVSTF0> l
<DPVSTF1>
<HSBEF>
73
</HSBEF> l
<HSBEF>
62
</HSBEF> l
<HSBEF>
100
</HSBEF> l
</DPVSTF1> l
</DPVSTFT> l
TDPQFE() to call the destructor automatically
60.5
1C@ KMJBM<H <=JQ@ C<N < R@<FI@NN: 1C@ N>JK@N H<T =@ @SDO@? =@AJM@ OC@ EFTUSPZ() GDI@N
<M@ @S@>PO@?, >JHHJIGT =T OCMJRI @S>@KODJIN. &A OC@ EFTUSPZ() GDI@N HPNO =@ @S@>PO@? @Q@I
RC@I @S>@KODJIN <M@ OCMJRI, < NJGPODJI DN OJ O<F@ <?Q<IO<B@ JA TDPQF() <I? JOC@M A@<OPM@N
OC<O R@ C<Q@ N@@I DI OC@ "S>@KODJIN >C<KO@M.
AIJOC@M NJGPODJI DN OJ >JINOMP>O >G<NN J=E@>ON =T TUE.UZQFDPOT.TDPQFE DINO@<? JA =T OC@ OFX
F@TRJM?. TDPQFE() RM<KN OC@ >G<NN J=E@>O DIND?@ < TUSVDU <I? OC@ ?@NOMP>OJM JA OC<O TUSVDU
J=E@>O ?@NOMJTN OC@ >G<NN J=E@>O RC@I DON@GA BJ@N JPO JA N>JK@.
1C@ @AA@>O JA TDPQFE() DN OJ H<F@ >G<NN J=E@>ON =@C<Q@ NDHDG<M OJ NOMP>O J=E@>ON M@B<M?DIB
GDA@ODH@N.
4DOC OC@ AJGGJRDIB >C<IB@N, OC@ KMJBM<H KMJ?P>@N OC@ @SK@>O@? JPOKPO <N =@AJM@:
JNQPSU TUE.UZQFDPOT;
// ...
WPJE NBJO()
\
JNNVUBCMF DPVSTFT =
TDPQFE!(JNNVUBCMF(9NM&MFNFOU))("DPVSTFT", 0);
GPSFBDI (DPVSTF*E; 0 .. 2) \
JNNVUBCMF DPVSTF5BH = "DPVSTF" _ UP!TUSJOH(DPVSTF*E);
JNNVUBCMF DPVSTF&MFNFOU =
TDPQFE!(JNNVUBCMF(9NM&MFNFOU))(DPVSTF5BH, 1);
GPSFBDI (J; 0 .. 3) \
67EFDAK 3@6 E5AB76
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
365
JNNVUBCMF HSBEF&MFNFOU =
TDPQFE!(JNNVUBCMF(9NM&MFNFOU))("HSBEF", 2);
JNNVUBCMF SBOEPN(SBEF = VOJGPSN(50, 101);
XSJUFMO(JOEFOUBUJPO4USJOH(3), SBOEPN(SBEF);
^
^
^
+JO@ OC<O OC@M@ <M@ IJ EFTUSPZ() GDI@N <ITHJM@.
AGNJ IJO@ OC<O OC@ JNNVUBCMF F@TRJM?N H<?@ OCDN KMJBM<H GJJF HJM@ >JHKGD><O@? OC<I
I@>@NN<MT. 1C@ >J?@ RJPG? =@ NDHKG@M RDOC HPO<=G@ J=E@>ON:
BVUP DPVSTFT = TDPQFE!9NM&MFNFOU("DPVSTFT", 0);
Summary
60.6
t EFTUSPZ() DN AJM @S@>PODIB OC@ ?@NOMP>OJM JA < >G<NN J=E@>O @SKGD>DOGT.
t ,=E@>ON OC<O <M@ >JINOMP>O@? =T TDPQFE() <M@ ?@NOMJT@? PKJI G@<QDIB OC@DM M@NK@>ODQ@
N>JK@N.
67EFDAK 3@6 E5AB76
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
366
Modules and Libraries 61
1C@ =PDG?DIB =GJ>FN JA ! KMJBM<HN (<I? GD=M<MD@N) <M@ HJ?PG@N.
! HJ?PG@N <M@ =<N@? JI < NDHKG@ >JI>@KO: "Q@MT NJPM>@ ADG@ DN < HJ?PG@. A>>JM?DIBGT, OC@
NDIBG@ ADG@N OC<O R@ C<Q@ =@@I RMDODIB JPM KMJBM<HN DI C<Q@ <GG =@@I DI?DQD?P<G HJ?PG@N.
BT ?@A<PGO, OC@ I<H@ JA < HJ?PG@ DN OC@ N<H@ <N DON ADG@I<H@ RDOCJPO OC@ .E @SO@INDJI. 4C@I
@SKGD>DOGT NK@>DAD@?, OC@ I<H@ JA OC@ HJ?PG@ DN ?@ADI@? =T OC@ NPEVMF F@TRJM?, RCD>C HPNO
<KK@<M <N OC@ ADMNO IJI->JHH@IO GDI@ DI OC@ NJPM>@ ADG@.
#JM @S<HKG@, <NNPHDIB OC<O OC@ I<H@ JA < NJPM>@ ADG@ DN "><O.?", OC@ I<H@ JA OC@ HJ?PG@
RJPG? =@ NK@>DAD@? =T OC@ NPEVMF F@TRJM?:
NPEVMF DBU;
DMBTT $BU
\
// ...
^
1C@ NPEVMF GDI@ DN JKODJI<G. 4C@I IJO NK@>DAD@?, DO DN OC@ N<H@ <N OC@ ADG@ I<H@ RDOCJPO OC@ .E
@SO@INDJI.
File and module names
61.1
! NPKKJMON 2ID>J?@ DI NJPM>@ >J?@ <I? HJ?PG@ I<H@N. %JR@Q@M, OC@ 2ID>J?@ NPKKJMO JA ADG@
NTNO@HN Q<MT. #JM @S<HKG@, <GOCJPBC HJNO )DIPS ADG@ NTNO@HN NPKKJMO 2ID>J?@, OC@ ADG@ I<H@N
DI 4DI?JRN ADG@ NTNO@HN H<T IJO ?DNODIBPDNC =@OR@@I GJR@M <I? PKK@M ><N@ G@OO@MN.
A??DODJI<GGT, HJNO ADG@ NTNO@HN GDHDO OC@ >C<M<>O@MN OC<O ><I =@ PN@? DI ADG@ <I? ?DM@>OJMT
I<H@N.
#JM KJMO<=DGDOT M@<NJIN, & M@>JHH@I? OC<O TJP PN@ JIGT GJR@M ><N@ A0&& G@OO@MN DI ADG@ I<H@N.
#JM @S<HKG@, "M@NPH@.?" RJPG? =@ < NPDO<=G@ ADG@ I<H@ AJM < >G<NN I<H@? 3bTVNb.
A>>JM?DIBGT, OC@ I<H@ JA OC@ HJ?PG@ RJPG? >JINDNO JA A0&& G@OO@MN <N R@GG:
NPEVMF SFTVNF; // .PEVMF OBNF DPOTJTUJOH PG "4$** MFUUFST
DMBTT 3aTVNa // 1SPHSBN DPEF DPOTJTUJOH PG 6OJDPEF DIBSBDUFST
\
// ...
^
Packages
61.2
A >JH=DI<ODJI JA M@G<O@? HJ?PG@N <M@ ><GG@? < B35=397. ! K<>F<B@N <M@ < NDHKG@ >JI>@KO <N
R@GG: 1C@ NJPM>@ ADG@N OC<O <M@ DIND?@ OC@ N<H@ ?DM@>OJMT <M@ >JIND?@M@? OJ =@GJIB OJ OC@ N<H@
K<>F<B@. 1C@ I<H@ JA OC@ ?DM@>OJMT =@>JH@N OC@ I<H@ JA OC@ K<>F<B@, RCD>C HPNO <GNJ =@
NK@>DAD@? <N OC@ ADMNO K<MON JA HJ?PG@ I<H@N.
#JM @S<HKG@, DA "><O.?" <I? "?JB.?" <M@ DIND?@ OC@ ?DM@>OJMT "<IDH<G", OC@I NK@>DATDIB OC@
?DM@>OJMT I<H@ <GJIB RDOC OC@ HJ?PG@ I<H@ H<F@N OC@H =@ < K<MO JA OC@ N<H@ K<>F<B@:
NPEVMF BOJNBM.DBU;
DMBTT $BU
\
#A6G>7E 3@6 ";4D3D;7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
367
// ...
^
0DHDG<MGT, AJM OC@ EPH HJ?PG@:
NPEVMF BOJNBM.EPH;
DMBTT %PH
\
// ...
^
0DI>@ K<>F<B@ I<H@N >JMM@NKJI? OJ ?DM@>OJMT I<H@N, OC@ K<>F<B@ I<H@N JA HJ?PG@N OC<O <M@
?@@K@M OC<I JI@ ?DM@>OJMT G@Q@G HPNO M@AG@>O OC<O CD@M<M>CT. #JM @S<HKG@, DA OC@ "<IDH<G"
?DM@>OJMT DI>GP?@? < "Q@MO@=M<O@" ?DM@>OJMT, OC@ I<H@ JA < HJ?PG@ DIND?@ OC<O ?DM@>OJMT RJPG?
DI>GP?@ WFSUFCSBUF <N R@GG:
NPEVMF BOJNBM.WFSUFCSBUF.DBU;
1C@ ?DM@>OJMT CD@M<M>CD@N ><I =@ <M=DOM<MDGT >JHKG@S ?@K@I?DIB JI OC@ I@@?N JA OC@ KMJBM<H.
/@G<ODQ@GT NCJMO KMJBM<HN PNP<GGT C<Q@ <GG JA OC@DM NJPM>@ ADG@N DI < NDIBG@ ?DM@>OJMT.
Using modules in programs
61.3
1C@ JNQPSU F@TRJM?, RCD>C R@ C<Q@ =@@I PNDIB DI <GHJNO @Q@MT KMJBM<H NJ A<M, DN AJM
DIOMJ?P>DIB < HJ?PG@ OJ OC@ >PMM@IO HJ?PG@:
JNQPSU TUE.TUEJP;
1C@ HJ?PG@ I<H@ H<T >JIO<DI OC@ K<>F<B@ I<H@ <N R@GG. #JM @S<HKG@, OC@ TUE. K<MO <=JQ@
DI?D><O@N OC<O TUEJP DN < HJ?PG@ OC<O DN < K<MO JA OC@ TUE K<>F<B@.
1C@ BOJNBM.DBU <I? BOJNBM.EPH HJ?PG@N RJPG? =@ DHKJMO@? NDHDG<MGT. )@O'N <NNPH@ OC<O OC@
AJGGJRDIB >J?@ DN DIND?@ < ADG@ I<H@? "?@I@H@.?":
NPEVMF EFOFNF; // UIF OBNF PG UIJT NPEVMF
JNQPSU BOJNBM.DBU; // B NPEVMF UIBU JU VTFT
JNQPSU BOJNBM.EPH; // BOPUIFS NPEVMF UIBU JU VTFT
WPJE NBJO()
\
BVUP DBU = OFX $BU();
BVUP EPH = OFX %PH();
^
Note: AE 67E5D;476 47>AI, 8AD F:7 BDA9D3? FA 47 4G;>F 5ADD75F>K, F:AE7 ?A6G>7 8;>7E ?GEF 3>EA
47 BDAH;676 FA F:7 >;@=7D.
Locations of modules
61.4
1C@ >JHKDG@M ADI?N OC@ HJ?PG@ ADG@N =T >JIQ@MODIB OC@ K<>F<B@ <I? HJ?PG@ I<H@N ?DM@>OGT OJ
?DM@>OJMT <I? ADG@ I<H@N.
#JM @S<HKG@, OC@ KM@QDJPN ORJ HJ?PG@N RJPG? =@ GJ><O@? <N "<IDH<G/><O.?" <I? "<IDH<G/
?JB.?", M@NK@>ODQ@GT (JM "<IDH<G9><O.?" <I? "<IDH<G9?JB.?", ?@K@I?DIB JI OC@ ADG@ NTNO@H).
JIND?@MDIB OC@ H<DI NJPM>@ ADG@ <N R@GG, OC@ KMJBM<H <=JQ@ >JINDNON JA OCM@@ ADG@N.
#A6G>7E 3@6 ";4D3D;7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
368
Long and short module names
61.5
1C@ I<H@N OC<O <M@ PN@? DI OC@ KMJBM<H H<T =@ NK@GG@? JPO RDOC OC@ HJ?PG@ <I? K<>F<B@
I<H@N:
BVUP DBU0 = $BU();
BVUP DBU1 = BOJNBM.DBU.$BU(); // TBNF BT BCPWF
1C@ GJIB I<H@N <M@ IJMH<GGT IJO I@@?@? =PO NJH@ODH@N OC@M@ <M@ I<H@ >JIAGD>ON. #JM
@S<HKG@, RC@I M@A@MMDIB OJ < I<H@ OC<O <KK@<MN DI HJM@ OC<I JI@ HJ?PG@, OC@ >JHKDG@M
><IIJO ?@>D?@ RCD>C JI@ DN H@<IO.
1C@ AJGGJRDIB KMJBM<H DN NK@GGDIB JPO OC@ GJIB I<H@N OJ ?DNODIBPDNC =@OR@@I ORJ N@K<M<O@
+BHVBS NOMP>ON OC<O <M@ ?@ADI@? DI ORJ N@K<M<O@ HJ?PG@N: BOJNBM <I? DBS:
JNQPSU BOJNBM.KBHVBS;
JNQPSU DBS.KBHVBS;
// ...
BVUP DPOGMJDUFE = +BHVBS(); // j DPNQJMBUJPO &3303
BVUP NZ"OJNBM = BOJNBM.KBHVBS.+BHVBS(); // j DPNQJMFT
BVUP NZ$BS = DBS.KBHVBS.+BHVBS(); // j DPNQJMFT
Adding module definitions to the program
61.6
1C@ JNQPSU F@TRJM? DN IJO NPAAD>D@IO OJ H<F@ HJ?PG@N =@>JH@ K<MON JA OC@ KMJBM<H. &O
NDHKGT H<F@N <Q<DG<=G@ OC@ A@<OPM@N JA < HJ?PG@ DIND?@ OC@ >PMM@IO HJ?PG@. 1C<O HP>C DN
I@@?@? JIGT OJ 5A?B;>7 OC@ >J?@.
&O DN IJO KJNND=G@ OJ =PDG? OC@ KM@QDJPN KMJBM<H JIGT =T OC@ H<DI NJPM>@ ADG@, "?@I@H@.?":
$ ENE EFOFNF.E -X
EFOFNF.P: *O GVODUJPO A@%NBJO':
EFOFNF.E: VOEFGJOFE SFGFSFODF UP A@%6BOJNBM3DBU3$BU7@@$MBTT;'
EFOFNF.E: VOEFGJOFE SFGFSFODF UP A@%6BOJNBM3EPH3%PH7@@$MBTT;'
DPMMFDU2: ME SFUVSOFE 1 FYJU TUBUVT
--- FSSPSMFWFM 1
1CJN@ @MMJM H@NN<B@N <M@ B@I@M<O@? =T OC@ >;@=7D. AGOCJPBC OC@T <M@ IJO PN@M-AMD@I?GT
H@NN<B@N, OC@T DI?D><O@ OC<O NJH@ ?@ADIDODJIN OC<O <M@ I@@?@? =T OC@ KMJBM<H <M@ HDNNDIB.
1C@ <>OP<G =PDG? JA OC@ KMJBM<H DN OC@ M@NKJIND=DGDOT JA OC@ GDIF@M, RCD>C B@ON ><GG@?
<POJH<OD><GGT =T OC@ >JHKDG@M =@CDI? OC@ N>@I@N. 1C@ >JHKDG@M K<NN@N OC@ HJ?PG@N OC<O DO C<N
EPNO >JHKDG@? OJ OC@ GDIF@M, <I? OC@ GDIF@M >JH=DI@N OCJN@ HJ?PG@N (<I? GD=M<MD@N) OJ KMJ?P>@
OC@ @S@>PO<=G@ KMJBM<H.
#JM OC<O M@<NJI, <GG JA OC@ HJ?PG@N OC<O H<F@ PK OC@ KMJBM<H HPNO =@ KMJQD?@? OJ OC@ GDIF@M.
#JM OC@ KMJBM<H <=JQ@ OJ =@ =PDGO, "<IDH<G/><O.?" <I? "<IDH<G/?JB.?" HPNO <GNJ =@ NK@>DAD@?
JI OC@ >JHKDG<ODJI GDI@:
$ ENE EFOFNF.E BOJNBM/DBU.E BOJNBM/EPH.E -X
&INO@<? JA C<QDIB OJ H@IODJI OC@ HJ?PG@N DI?DQD?P<GGT @Q@MT ODH@ JI OC@ >JHH<I? GDI@, OC@T
><I =@ >JH=DI@? <N GD=M<MD@N.
#A6G>7E 3@6 ";4D3D;7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
369
Libraries
61.7
A >JGG@>ODJI JA >JHKDG@? HJ?PG@N DN ><GG@? < GD=M<MT. )D=M<MD@N <M@ IJO KMJBM<HN OC@HN@GQ@N;
OC@T ?J IJO C<Q@ OC@ NBJO() API>ODJI. )D=M<MD@N >JIO<DI >JHKDG@? ?@ADIDODJIN JA API>ODJIN,
NOMP>ON, >G<NN@N, <I? JOC@M A@<OPM@N JA HJ?PG@N, RCD>C <M@ OJ =@ GDIF@? G<O@M =T OC@ GDIF@M OJ
KMJ?P>@ OC@ KMJBM<H.
?H?'N -MJC >JHH<I? GDI@ JKODJI DN AJM H<FDIB GD=M<MD@N. 1C@ AJGGJRDIB >JHH<I? H<F@N <
GD=M<MT OC<O >JIO<DIN OC@ "><O.?" <I? OC@ "?JB.?" HJ?PG@N. 1C@ I<H@ JA OC@ GD=M<MT DN NK@>DAD@?
=T OC@ -PG NRDO>C:
$ ENE BOJNBM/DBU.E BOJNBM/EPH.E -MJC -PGBOJNBM -X
1C@ <>OP<G I<H@ JA OC@ GD=M<MT ADG@ ?@K@I?N JI OC@ KG<OAJMH. #JM @S<HKG@, OC@ @SO@INDJI JA
GD=M<MT ADG@N DN .B PI?@M )DIPS NTNO@HN: BOJNBM.B.
,I>@ OC<O GD=M<MT DN =PDGO, &O DN IJO I@>@NN<MT OJ NK@>DAT OC@ "<IDH<G/><O.?" <I? "<IDH<G/?JB.?"
HJ?PG@N DI?DQD?P<GGT <ITHJM@. 1C@ GD=M<MT ADG@ DN NPAAD>D@IO:
$ ENE EFOFNF.E BOJNBM.B -X
1C@ >JHH<I? <=JQ@ M@KG<>@N OC@ AJGGJRDIB JI@:
$ ENE EFOFNF.E BOJNBM/DBU.E BOJNBM/EPH.E -X
AN <I @S>@KODJI, OC@ ! NO<I?<M? GD=M<MT -CJ=JN I@@? IJO =@ NK@>DAD@? JI OC@ >JHH<I? GDI@.
1C<O GD=M<MT DN <POJH<OD><GGT DI>GP?@? =@CDI? OC@ N>@I@N. ,OC@MRDN@, DO >JPG? =@ NK@>DAD@?
NDHDG<M OJ OC@ AJGGJRDIB GDI@:
$ ENE EFOFNF.E BOJNBM.B /VTS/MJC64/MJCQIPCPT2.B -X
Note: ):7 @3?7 3@6 >A53F;A@ A8 F:7 &:A4AE >;4D3DK ?3K 47 6;887D7@F A@ 6;887D7@F EKEF7?E.
#A6G>7E 3@6 ";4D3D;7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
370
Encapsulation and Protection Attributes 62
AGG JA OC@ NOMP>ON <I? >G<NN@N OC<O R@ C<Q@ ?@ADI@? NJ A<M C<Q@ <GG =@@I <>>@NND=G@ AMJH OC@
AGFE;67.
)@O'N >JIND?@M OC@ AJGGJRDIB NOMP>O:
FOVN (FOEFS \ GFNBMF, NBMF ^
TUSVDU 4UVEFOU
\
TUSJOH OBNF;
(FOEFS HFOEFS;
^
1C@ H@H=@MN JA OC<O NOMP>O DN AM@@GT <>>@NND=G@ OJ OC@ M@NO JA OC@ KMJBM<H:
BVUP TUVEFOU = 4UVEFOU("5JN", (FOEFS.NBMF);
XSJUFGMO("%T JT B %T TUVEFOU.", TUVEFOU.OBNF, TUVEFOU.HFOEFS);
0P>C AM@@?JH DN < >JIQ@ID@I>@ DI KMJBM<HN. #JM @S<HKG@, OC@ KM@QDJPN GDI@ C<N =@@I PN@APG
OJ KMJ?P>@ OC@ AJGGJRDIB JPOKPO:
5JN JT B NBMF TUVEFOU.
%JR@Q@M, OCDN AM@@?JH DN <GNJ < GD<=DGDOT. AN <I @S<HKG@, G@O'N <NNPH@ OC<O K@MC<KN =T HDNO<F@,
OC@ I<H@ JA < NOP?@IO J=E@>O B@ON HJ?DAD@? DI OC@ KMJBM<H:
TUVEFOU.OBNF = ""OOB";
1C<O <NNDBIH@IO H<T KPO OC@ J=E@>O DI <I DIQ<GD? NO<O@:
"OOB JT B NBMF TUVEFOU.
AN <IJOC@M @S<HKG@, G@O'N >JIND?@M < 4DIPPM >G<NN. )@O'N <NNPH@ OC<O OCDN >G<NN C<N ORJ
H@H=@M Q<MD<=G@N OC<O NOJM@ OC@ IPH=@MN JA OC@ H<G@ <I? A@H<G@ NOP?@ION N@K<M<O@GT:
DMBTT 4DIPPM
\
4UVEFOU<> TUVEFOUT;
TJ[F@U GFNBMF$PVOU;
TJ[F@U NBMF$PVOU;
WPJE BEE(JO 4UVEFOU TUVEFOU)
\
TUVEFOUT _= TUVEFOU;
GJOBM TXJUDI (TUVEFOU.HFOEFS) \
DBTF (FOEFS.GFNBMF:
++GFNBMF$PVOU;
CSFBL;
DBTF (FOEFS.NBMF:
++NBMF$PVOU;
CSFBL;
^
^
PWFSSJEF TUSJOH UP4USJOH() DPOTU
\
E@53BEG>3F;A@ 3@6 &DAF75F;A@ AFFD;4GF7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
371
SFUVSO GPSNBU("%T GFNBMF, %T NBMF; UPUBM %T TUVEFOUT",
GFNBMF$PVOU, NBMF$PVOU, TUVEFOUT.MFOHUI);
^
^
1C@ BEE() H@H=@M API>ODJI <??N NOP?@ION RCDG@ @INPMDIB OC<O OC@ >JPION <M@ <GR<TN >JMM@>O:
BVUP TDIPPM = OFX 4DIPPM;
TDIPPM.BEE(4UVEFOU("-JOETFZ", (FOEFS.GFNBMF));
TDIPPM.BEE(4UVEFOU(".BSL", (FOEFS.NBMF));
XSJUFMO(TDIPPM);
1C@ KMJBM<H KMJ?P>@N OC@ AJGGJRDIB >JINDNO@IO JPOKPO:
1 GFNBMF, 1 NBMF; UPUBM 2 TUVEFOUT
%JR@Q@M, =@DIB <=G@ OJ <>>@NN OC@ H@H=@MN JA 4DIPPM AM@@GT RJPG? IJO BP<M<IO@@ OC<O OCDN
>JINDNO@I>T RJPG? <GR<TN =@ H<DIO<DI@?. )@O'N >JIND?@M <??DIB < I@R @G@H@IO OJ OC@
TUVEFOUT H@H=@M, OCDN ODH@ ?DM@>OGT:
TDIPPM.TUVEFOUT _= 4UVEFOU("/BODZ", (FOEFS.GFNBMF);
B@><PN@ OC@ I@R NOP?@IO C<N =@@I <??@? OJ OC@ <MM<T ?DM@>OGT, RDOCJPO BJDIB OCMJPBC OC@
BEE() H@H=@M API>ODJI, OC@ 4DIPPM J=E@>O DN IJR DI <I DI>JINDNO@IO NO<O@:
1 GFNBMF, 1 NBMF; UPUBM 3 TUVEFOUT
Encapsulation
62.1
"I><KNPG<ODJI DN < KMJBM<HHDIB >JI>@KO JA M@NOMD>ODIB <>>@NN OJ H@H=@MN OJ <QJD? KMJ=G@HN
NDHDG<M OJ OC@ JI@ <=JQ@.
AIJOC@M =@I@ADO JA @I><KNPG<ODJI DN OJ @GDHDI<O@ OC@ I@@? OJ FIJR OC@ DHKG@H@IO<ODJI ?@O<DGN
JA OTK@N. &I < N@IN@, @I><KNPG<ODJI <GGJRN KM@N@IODIB < OTK@ <N < =G<>F =JS OC<O DN PN@? JIGT
OCMJPBC DON DIO@MA<>@.
A??DODJI<GGT, KM@Q@IODIB PN@MN AMJH <>>@NNDIB OC@ H@H=@MN ?DM@>OGT <GGJRN >C<IBDIB OC@
H@H=@MN JA < >G<NN AM@@GT DI OC@ APOPM@. AN GJIB <N OC@ API>ODJIN OC<O ?@ADI@ OC@ DIO@MA<>@ JA <
>G<NN DN F@KO OC@ N<H@, DON DHKG@H@IO<ODJI ><I =@ >C<IB@? AM@@GT.
"I><KNPG<ODJI DN IJO AJM M@NOMD>ODIB <>>@NN OJ N@INDODQ@ ?<O< GDF@ < >M@?DO ><M? IPH=@M JM <
K<NNRJM?, <I? DO ><IIJO =@ PN@? AJM OC<O KPMKJN@. "I><KNPG<ODJI DN < ?@Q@GJKH@IO OJJG: &O
<GGJRN PNDIB <I? >J?DIB OTK@N @<NDGT <I? N<A@GT.
Protection attributes
62.2
-MJO@>ODJI <OOMD=PO@N GDHDO <>>@NN OJ H@H=@MN JA NOMP>ON, >G<NN@N, <I? HJ?PG@N. 1C@M@ <M@ ORJ
R<TN JA NK@>DATDIB KMJO@>ODJI <OOMD=PO@N:
t AO NOMP>O JM >G<NN G@Q@G OJ NK@>DAT OC@ KMJO@>ODJI JA @Q@MT NOMP>O JM >G<NN H@H=@M
DI?DQD?P<GGT.
t AO HJ?PG@ G@Q@G OJ NK@>DAT OC@ KMJO@>ODJI JA @Q@MT A@<OPM@ JA < HJ?PG@ DI?DQD?P<GGT: >G<NN,
NOMP>O, API>ODJI, @IPH, @O>.
-MJO@>ODJI <OOMD=PO@N ><I =@ NK@>DAD@? =T OC@ AJGGJRDIB F@TRJM?N. 1C@ ?@A<PGO <OOMD=PO@ DN
QVCMJD.
E@53BEG>3F;A@ 3@6 &DAF75F;A@ AFFD;4GF7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
372
t QVCMJD: 0K@>DAD@N <>>@NND=DGDOT =T <IT K<MO JA OC@ KMJBM<H RDOCJPO <IT M@NOMD>ODJI.
AI @S<HKG@ JA OCDN DN TUEPVU. *@M@GT DHKJMODIB TUE.TUEJP H<F@N TUEPVU <Q<DG<=G@ OJ
@Q@MT HJ?PG@ OC<O DHKJMO@? DO.
t QSJWBUF: 0K@>DAD@N M@NOMD>O@? <>>@NND=DGDOT.
QSJWBUF >G<NN H@H=@MN <I? HJ?PG@ H@H=@MN ><I JIGT =@ <>>@NN@? =T OC@ HJ?PG@
OC<O ?@ADI@N OC<O H@H=@M.
A??DODJI<GGT, QSJWBUF H@H=@M API>ODJIN ><IIJO =@ JQ@MMD??@I =T NP=>G<NN@N.
t QBDLBHF: 0K@>DAD@N K<>F<B@-G@Q@G <>>@NND=DGDOT.
A A@<OPM@ OC<O DN H<MF@? <N QBDLBHF ><I =@ <>>@NN@? =T <GG JA OC@ >J?@ OC<O DN < K<MO
JA OC@ N<H@ K<>F<B@. 1C@ QBDLBHF <OOMD=PO@ DIQJGQ@N JIGT OC@ DII@M-HJNO K<>F<B@.
#JM @S<HKG@, < QBDLBHF ?@ADIDODJI OC<O DN DIND?@ OC@ BOJNBM.WFSUFCSBUF.DBU HJ?PG@
><I =@ <>>@NN@? =T <IT JOC@M HJ?PG@ JA OC@ WFSUFCSBUF K<>F<B@.
0DHDG<M OJ OC@ QSJWBUF <OOMD=PO@, QBDLBHF H@H=@M API>ODJIN ><IIJO =@ JQ@MMD??@I =T
NP=>G<NN@N.
t QSPUFDUFE: 0K@>DAD@N <>>@NND=DGDOT =T ?@MDQ@? >G<NN@N.
1CDN <OOMD=PO@ @SO@I?N OC@ QSJWBUF <OOMD=PO@: A QSPUFDUFE H@H=@M ><I =@ <>>@NN@?
IJO JIGT =T OC@ HJ?PG@ OC<O ?@ADI@N DO, =PO <GNJ =T OC@ >G<NN@N OC<O DIC@MDO AMJH OC@
>G<NN OC<O ?@ADI@N OC<O QSPUFDUFE H@H=@M.
A??DODJI<GGT, OC@ FYQPSU <OOMD=PO@ NK@>DAD@N <>>@NND=DGDOT AMJH OC@ JPOND?@ JA OC@ KMJBM<H.
Definition
62.3
-MJO@>ODJI <OOMD=PO@N ><I =@ NK@>DAD@? DI OCM@@ R<TN.
4C@I RMDOO@I DI AMJIO JA < NDIBG@ ?@ADIDODJI, DO NK@>DAD@N OC@ KMJO@>ODJI <OOMD=PO@ JA OC<O
?@ADIDODJI JIGT. 1CDN DN NDHDG<M OJ OC@ '<Q< KMJBM<HHDIB G<IBP<B@:
QSJWBUF JOU GPP;
QSJWBUF WPJE CBS()
\
// ...
^
4C@I NK@>DAD@? =T < >JGJI, DO NK@>DAD@N OC@ KMJO@>ODJI <OOMD=PO@N JA <GG JA OC@ AJGGJRDIB
?@ADIDODJIN PIODG OC@ I@SO NK@>DAD><ODJI JA < KMJO@>ODJI <OOMD=PO@. 1CDN DN NDHDG<M OJ OC@ ++
KMJBM<HHDIB G<IBP<B@:
QSJWBUF:
// ...
// ... BMM PG UIF EFGJOJUJPOT IFSF BSF QSJWBUF ...
// ...
QSPUFDUFE:
// ...
// ... BMM PG UIF EFGJOJUJPOT IFSF BSF QSPUFDUFE ...
// ...
4C@I NK@>DAD@? AJM < =GJ>F, OC@ KMJO@>ODJI <OOMD=PO@ DN AJM <GG JA OC@ ?@ADIDODJIN OC<O <M@ DIND?@
OC<O =GJ>F:
QSJWBUF \
// ...
E@53BEG>3F;A@ 3@6 &DAF75F;A@ AFFD;4GF7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
373
// ... BMM PG UIF EFGJOJUJPOT IFSF BSF QSJWBUF ...
// ...
^
Module imports are private by default
62.4
A HJ?PG@ OC<O DN DHKJMO@? =T JNQPSU DN KMDQ<O@ OJ OC@ HJ?PG@ OC<O DHKJMON DO. &O RJPG? IJO =@
QDND=G@ OJ JOC@M HJ?PG@N OC<O DHKJMO DO DI?DM@>OGT. #JM @S<HKG@, DA < TDIPPM HJ?PG@ DHKJMON
TUE.TUEJP, HJ?PG@N OC<O DHKJMO TDIPPM ><IIJO <POJH<OD><GGT PN@ OC@ TUE.TUEJP HJ?PG@.
)@O'N <NNPH@ OC<O OC@ TDIPPM HJ?PG@ NO<MON =T OC@ AJGGJRDIB GDI@N:
NPEVMF TDIPPM.TDIPPM;
JNQPSU TUE.TUEJP; // JNQPSUFE GPS UIJT NPEVMF'T PXO VTF...
// ...
1C@ AJGGJRDIB KMJBM<H ><IIJO =@ >JHKDG@? =@><PN@ XSJUFMO DN IJO QDND=G@ OJ DO:
JNQPSU TDIPPM.TDIPPM;
WPJE NBJO()
\
XSJUFMO("IFMMP"); // j DPNQJMBUJPO &3303
^
TUE.TUEJP HPNO =@ DHKJMO@? =T OC<O HJ?PG@ <N R@GG:
JNQPSU TDIPPM.TDIPPM;
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
XSJUFMO("IFMMP"); // OPX DPNQJMFT
^
0JH@ODH@N DO DN ?@NDM@? OC<O < HJ?PG@ KM@N@ION JOC@M HJ?PG@N DI?DM@>OGT. #JM @S<HKG@, DO
RJPG? H<F@ N@IN@ AJM < TDIPPM HJ?PG@ OJ <POJH<OD><GGT DHKJMO < TUVEFOU HJ?PG@ AJM DON
PN@MN. 1CDN DN <>CD@Q@? =T H<MFDIB OC@ JNQPSU <N QVCMJD:
NPEVMF TDIPPM.TDIPPM;
QVCMJD JNQPSU TDIPPM.TUVEFOU;
// ...
4DOC OC<O ?@ADIDODJI, HJ?PG@N OC<O DHKJMO TDIPPM ><I PN@ OC@ ?@ADIDODJIN OC<O <M@ DIND?@ OC@
TUVEFOU HJ?PG@ RDOCJPO I@@?DIB OJ DHKJMO DO:
JNQPSU TDIPPM.TDIPPM;
WPJE NBJO()
\
BVUP TUVEFOU = 4UVEFOU("5JN", (FOEFS.NBMF);
// ...
^
AGOCJPBC OC@ KMJBM<H <=JQ@ DHKJMON JIGT OC@ TDIPPM HJ?PG@, OC@ TUVEFOU.4UVEFOU NOMP>O DN
<GNJ <Q<DG<=G@ OJ DO.
E@53BEG>3F;A@ 3@6 &DAF75F;A@ AFFD;4GF7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
374
When to use encapsulation
62.5
"I><KNPG<ODJI <QJD?N KMJ=G@HN NDHDG<M OJ OC@ JI@ R@ C<Q@ N@@I DI OC@ DIOMJ?P>ODJI N@>ODJI JA
OCDN >C<KO@M. &O DN <I DIQ<GP<=G@ OJJG OJ @INPM@ OC<O J=E@>ON <M@ <GR<TN DI >JINDNO@IO NO<O@N.
"I><KNPG<ODJI C@GKN KM@N@MQ@ NOMP>O <I? >G<NN ;@H3D;3@FE =T KMJO@>ODIB H@H=@MN AMJH ?DM@>O
HJ?DAD><ODJIN =T OC@ PN@MN JA OC@ OTK@.
"I><KNPG<ODJI KMJQD?@N AM@@?JH JA DHKG@H@IO<ODJI =T <=NOM<>ODIB DHKG@H@IO<ODJIN <R<T
AMJH PN@M >J?@. ,OC@MRDN@, DA PN@MN C<? ?DM@>O <>>@NN OJ AJM @S<HKG@ 4DIPPM.TUVEFOUT, DO
RJPG? =@ C<M? OJ HJ?DAT OC@ ?@NDBI JA OC@ >G<NN =T >C<IBDIB OC<O <MM<T @.B. OJ <I <NNJ>D<ODQ@
<MM<T, =@><PN@ OCDN RJPG? <AA@>O <GG PN@M >J?@ OC<O C<N =@@I <>>@NNDIB OC<O H@H=@M.
"I><KNPG<ODJI DN JI@ JA OC@ HJNO KJR@MAPG =@I@ADON JA J=E@>O JMD@IO@? KMJBM<HHDIB.
Example
62.6
)@O'N ?@ADI@ OC@ 4UVEFOU NOMP>O <I? OC@ 4DIPPM >G<NN =T O<FDIB <?Q<IO<B@ JA @I><KNPG<ODJI
<I? G@O'N PN@ OC@H DI < NCJMO O@NO KMJBM<H.
1CDN @S<HKG@ KMJBM<H RDGG >JINDNO JA OCM@@ ADG@N. AN TJP M@H@H=@M AMJH OC@ KM@QDJPN >C<KO@M,
=@DIB K<MON JA OC@ TDIPPM K<>F<B@, ORJ JA OC@N@ ADG@N RDGG =@ PI?@M OC@ "N>CJJG" ?DM@>OJMT:
t "N>CJJG/NOP?@IO.?": 1C@ TUVEFOU HJ?PG@ OC<O ?@ADI@N OC@ 4UVEFOU NOMP>O
t "N>CJJG/N>CJJG.?": 1C@ TDIPPM HJ?PG@ OC<O ?@ADI@N OC@ 4DIPPM >G<NN
t "?@I@H@.?": A NCJMO O@NO KMJBM<H
%@M@ DN OC@ "N>CJJG/NOP?@IO.?" ADG@:
NPEVMF TDIPPM.TUVEFOU;
JNQPSU TUE.TUSJOH;
JNQPSU TUE.DPOW;
FOVN (FOEFS \ GFNBMF, NBMF ^
TUSVDU 4UVEFOU
\
QBDLBHF TUSJOH OBNF;
QBDLBHF (FOEFS HFOEFS;
TUSJOH UP4USJOH() DPOTU
\
SFUVSO GPSNBU("%T JT B %T TUVEFOU.",
OBNF, UP!TUSJOH(HFOEFS));
^
^
1C@ H@H=@MN JA OCDN NOMP>O <M@ H<MF@? <N QBDLBHF OJ @I<=G@ <>>@NN JIGT OJ HJ?PG@N JA OC@
N<H@ K<>F<B@. 4@ RDGG NJJI N@@ OC<O 4DIPPM RDGG =@ <>>@NNDIB OC@N@ H@H=@MN ?DM@>OGT. (+JO@
OC<O @Q@I OCDN NCJPG? =@ >JIND?@M@? <N QDJG<ODIB OC@ KMDI>DKG@ JA @I><KNPG<ODJI. 0ODGG, G@O'N
NOD>F RDOC OC@ QBDLBHF <OOMD=PO@ DI OCDN @S<HKG@ KMJBM<H.)
1C@ AJGGJRDIB DN OC@ "N>CJJG/N>CJJG.?" HJ?PG@ OC<O H<F@N PN@ JA OC@ KM@QDJPN JI@:
NPEVMF TDIPPM.TDIPPM;
QVCMJD JNQPSU TDIPPM.TUVEFOU; // 1
JNQPSU TUE.TUSJOH;
DMBTT 4DIPPM
\
E@53BEG>3F;A@ 3@6 &DAF75F;A@ AFFD;4GF7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
375
QSJWBUF: // 2
4UVEFOU<> TUVEFOUT;
TJ[F@U GFNBMF$PVOU;
TJ[F@U NBMF$PVOU;
QVCMJD: // 3
WPJE BEE(JO 4UVEFOU TUVEFOU)
\
TUVEFOUT _= TUVEFOU;
GJOBM TXJUDI (TUVEFOU.HFOEFS) \ // 4B
DBTF (FOEFS.GFNBMF:
++GFNBMF$PVOU;
CSFBL;
DBTF (FOEFS.NBMF:
++NBMF$PVOU;
CSFBL;
^
^
PWFSSJEF TUSJOH UP4USJOH() DPOTU
\
TUSJOH SFTVMU = GPSNBU(
"%T GFNBMF, %T NBMF; UPUBM %T TUVEFOUT",
GFNBMF$PVOU, NBMF$PVOU, TUVEFOUT.MFOHUI);
GPSFBDI (J, TUVEFOU; TUVEFOUT) \
SFTVMU _= (J == 0) ": " : ", ";
SFTVMU _= TUVEFOU.OBNF; // 4C
^
SFUVSO SFTVMU;
^
^
1. TDIPPM.TUVEFOU DN =@DIB DHKJMO@? KP=GD>GT NJ OC<O OC@ PN@MN JA TDIPPM.TDIPPM RDGG IJO
I@@? OJ DHKJMO OC<O HJ?PG@ @SKGD>DOGT. &I < N@IN@, OC@ TUVEFOU HJ?PG@ DN H<?@ <Q<DG<=G@ =T
OC@ TDIPPM HJ?PG@.
2. AGG JA OC@ H@H=@M Q<MD<=G@N JA 4DIPPM <M@ H<MF@? <N KMDQ<O@. 1CDN DN DHKJMO<IO OJ C@GK
KMJO@>O OC@ >JINDNO@I>T JA OC@ H@H=@M Q<MD<=G@N JA OCDN >G<NN.
3. #JM OCDN >G<NN OJ =@ PN@APG, DO HPNO KM@N@IO NJH@ H@H=@M API>ODJIN. BEE() <I?
UP4USJOH() <M@ H<?@ <Q<DG<=G@ OJ OC@ PN@MN JA OCDN >G<NN.
4. AN OC@ ORJ H@H=@M Q<MD<=G@N JA 4UVEFOU C<Q@ =@@I H<MF@? <N QBDLBHF, =@DIB < K<MO JA
OC@ N<H@ K<>F<B@, 4DIPPM ><I <>>@NN OCJN@ Q<MD<=G@N.
#DI<GGT, OC@ AJGGJRDIB DN < O@NO KMJBM<H OC<O PN@N OCJN@ OTK@N:
JNQPSU TUE.TUEJP;
JNQPSU TDIPPM.TDIPPM;
WPJE NBJO()
\
BVUP TUVEFOU = 4UVEFOU("5JN", (FOEFS.NBMF);
XSJUFMO(TUVEFOU);
BVUP TDIPPM = OFX 4DIPPM;
TDIPPM.BEE(4UVEFOU("-JOETFZ", (FOEFS.GFNBMF));
TDIPPM.BEE(4UVEFOU(".BSL", (FOEFS.NBMF));
TDIPPM.BEE(4UVEFOU("/BODZ", (FOEFS.GFNBMF));
E@53BEG>3F;A@ 3@6 &DAF75F;A@ AFFD;4GF7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
376
XSJUFMO(TDIPPM);
^
1CDN KMJBM<H ><I PN@ 4UVEFOU <I? 4DIPPM JIGT OCMJPBC OC@DM KP=GD> DIO@MA<>@N. &O ><IIJO
<>>@NN OC@ H@H=@M Q<MD<=G@N JA OCJN@ OTK@N. AN < M@NPGO, OC@ J=E@>ON RJPG? <GR<TN =@
>JINDNO@IO:
5JN JT B NBMF TUVEFOU.
2 GFNBMF, 1 NBMF; UPUBM 3 TUVEFOUT: -JOETFZ, .BSL, /BODZ
+JO@ OC<O OC@ KMJBM<H DIO@M<>ON RDOC 4DIPPM JIGT =T DON BEE() <I? UP4USJOH() API>ODJIN. AN
GJIB <N OC@ DIO@MA<>@N JA OC@N@ API>ODJIN <M@ F@KO OC@ N<H@, >C<IB@N DI OC@DM DHKG@H@IO<ODJIN
RJPG? IJO <AA@>O OC@ KMJBM<H <=JQ@.
E@53BEG>3F;A@ 3@6 &DAF75F;A@ AFFD;4GF7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
377
Universal Function Call Syntax (UFCS) 63
2#0 DN < A@<OPM@ OC<O DN <KKGD@? =T OC@ >JHKDG@M <POJH<OD><GGT. &O @I<=G@N OC@ H@H=@M
API>ODJI NTIO<S @Q@I AJM M@BPG<M API>ODJIN. &O ><I =@ @SKG<DI@? NDHKGT =T >JHK<MDIB ORJ
@SKM@NNDJIN:
WBSJBCMF.GPP(arguments)
4C@I OC@ >JHKDG@M @I>JPIO@MN <I @SKM@NNDJI NP>C <N OC@ JI@ <=JQ@, DA OC@M@ DN IJ H@H=@M
API>ODJI I<H@? GPP OC<O ><I =@ ><GG@? JI WBSJBCMF RDOC OC@ KMJQD?@? <MBPH@ION, OC@I OC@
>JHKDG@M <GNJ OMD@N OJ >JHKDG@ OC@ AJGGJRDIB @SKM@NNDJI:
GPP(WBSJBCMF, arguments)
&A OCDN I@R @SKM@NNDJI ><I DI?@@? =@ >JHKDG@?, OC@I OC@ >JHKDG@M NDHKGT <>>@KON OC<O JI@. AN
< M@NPGO, <GOCJPBC GPP() @QD?@IOGT C<N =@@I < M@BPG<M API>ODJI, DO B@ON <>>@KO@? OJ =@ PN@? =T
OC@ H@H=@M API>ODJI NTIO<S.
2#0 DN < A@<OPM@ OC<O C<N =@@I <??@? OJ ! <AO@M OCDN =JJF C<N =@@I NO<MO@?. #JM OC<O M@<NJI,
HJNO JA OC@ @S<HKG@N DI OCDN =JJF ?J IJO O<F@ <?Q<IO<B@ JA 2#0.
4@ FIJR OC<O API>ODJIN OC<O <M@ >GJN@GT M@G<O@? OJ < OTK@ <M@ ?@ADI@? <N H@H=@M API>ODJIN JA
OC<O OTK@. 1CDN DN @NK@>D<GGT DHKJMO<IO AJM @I><KNPG<ODJI <N JIGT OC@ H@H=@M API>ODJIN JA <
OTK@ (<I? OC<O OTK@'N HJ?PG@) ><I <>>@NN DON QSJWBUF H@H=@MN.
)@O'N >JIND?@M < $BS >G<NN RCD>C H<DIO<DIN OC@ <HJPIO JA AP@G:
DMBTT $BS
\
FOVN FDPOPNZ = 12.5; // LJMPNFUFST QFS MJUFS (BWFSBHF)
QSJWBUF EPVCMF GVFM"NPVOU; // MJUFST
UIJT(EPVCMF GVFM"NPVOU)
\
UIJT.GVFM"NPVOU = GVFM"NPVOU;
^
EPVCMF GVFM() DPOTU
\
SFUVSO GVFM"NPVOU;
^
// ...
^
AGOCJPBC H@H=@M API>ODJIN <M@ Q@MT PN@APG <I? NJH@ODH@N I@>@NN<MT, IJO @Q@MT API>ODJI OC<O
JK@M<O@N JI < OTK@ NCJPG? =@ < H@H=@M API>ODJI. 0JH@ JK@M<ODJIN JI < OTK@ <M@ OJJ NK@>DAD>
OJ < >@MO<DI <KKGD><ODJI OJ =@ H@H=@M API>ODJIN. #JM @S<HKG@, < API>ODJI OC<O ?@O@MHDI@N
RC@OC@M < ><M ><I OM<Q@G < NK@>DAD> ?DNO<I>@ H<T HJM@ <KKMJKMD<O@GT =@ ?@ADI@? <N < M@BPG<M
API>ODJI:
CPPM DBO5SBWFM($BS DBS, EPVCMF EJTUBODF)
\
SFUVSO (DBS.GVFM() * DBS.FDPOPNZ) >= EJTUBODF;
^
1CDN I<OPM<GGT =MDIBN < ?DN>M@K<I>T DI ><GGDIB API>ODJIN OC<O <M@ M@G<O@? OJ < OTK@: J=E@>ON
<KK@<M <O ?DAA@M@IO KG<>@N DI OC@N@ ORJ NTIO<S@N:
*@;H7DE3> FG@5F;A@ C3>> (K@F3J (*FC()
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
378
WPJE NBJO()
\
BVUP DBS = OFX $BS(5);
BVUP SFNBJOJOH'VFM = DBS.GVFM(); // .FNCFS GVODUJPO TZOUBY
JG (DBO5SBWFM(DBS, 100)) \ // 3FHVMBS GVODUJPO TZOUBY
// ...
^
^
2#0 M@HJQ@N OCDN ?DN>M@K<I>T =T <GGJRDIB M@BPG<M API>ODJIN OJ =@ ><GG@? =T OC@ H@H=@M
API>ODJI NTIO<S:
JG (DBS.DBO5SBWFM(100)) \ // 3FHVMBS GVODUJPO, DBMMFE CZ UIF
// NFNCFS GVODUJPO TZOUBY
// ...
^
1CDN A@<OPM@ DN <Q<DG<=G@ AJM API?<H@IO<G OTK@N <N R@GG, DI>GP?DIB GDO@M<GN:
JOU IBMG(JOU WBMVF)
\
SFUVSO WBMVF / 2;
^
WPJE NBJO()
\
BTTFSU(42.IBMG() == 21);
^
AN R@ RDGG N@@ DI OC@ I@SO >C<KO@M, RC@I OC@M@ <M@ IJ <MBPH@ION OJ K<NN OJ < API>ODJI, OC<O
API>ODJI ><I =@ ><GG@? RDOCJPO K<M@IOC@N@N. 4C@I OC<O A@<OPM@ DN PN@? <N R@GG, OC@ @SKM@NNDJI
<=JQ@ B@ON @Q@I NCJMO@M. AGG OCM@@ JA OC@ AJGGJRDIB NO<O@H@ION <M@ @LPDQ<G@IO:
SFTVMU = IBMG(WBMVF);
SFTVMU = WBMVF.IBMG();
SFTVMU = WBMVF.IBMG;
2#0 DN @NK@>D<GGT PN@APG RC@I API>ODJI ><GGN <M@ >C<DI@?. )@O'N N@@ OCDN JI < BMJPK JA
API>ODJIN OC<O JK@M<O@ JI JOU NGD>@N:
// 3FUVSOT UIF SFTVMU PG EJWJEJOH BMM PG UIF FMFNFOUT CZ
// 'EJWJTPS'
JOU<> EJWJEF(JOU<> TMJDF, JOU EJWJTPS)
\
JOU<> SFTVMU;
GPSFBDI (WBMVF; TMJDF) \
SFTVMU _= WBMVF / EJWJTPS;
^
SFUVSO SFTVMU;
^
// 3FUVSOT UIF SFTVMU PG NVMUJQMZJOH BMM PG UIF FMFNFOUT CZ
// 'NVMUJQMJFS'
JOU<> NVMUJQMZ(JOU<> TMJDF, JOU NVMUJQMJFS)
\
JOU<> SFTVMU;
GPSFBDI (WBMVF; TMJDF) \
SFTVMU _= WBMVF * NVMUJQMJFS;
^
*@;H7DE3> FG@5F;A@ C3>> (K@F3J (*FC()
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
379
SFUVSO SFTVMU;
^
// 'JMUFST PVU FMFNFOUT UIBU IBWF PEE WBMVFT
JOU<> FWFOT(JOU<> TMJDF)
\
JOU<> SFTVMU;
GPSFBDI (WBMVF; TMJDF) \
JG (!(WBMVF % 2)) \
SFTVMU _= WBMVF;
^
^
SFUVSO SFTVMU;
^
4C@I RMDOO@I =T OC@ M@BPG<M NTIO<S, RDOCJPO O<FDIB <?Q<IO<B@ JA 2#0, <I @SKM@NNDJI OC<O
>C<DIN OCM@@ ><GGN OJ OC@N@ API>ODJIN ><I =@ RMDOO@I <N DI OC@ AJGGJRDIB KMJBM<H:
JNQPSU TUE.TUEJP;
// ...
WPJE NBJO()
\
BVUP WBMVFT = < 1, 2, 3, 4, 5 >;
XSJUFMO(FWFOT(EJWJEF(NVMUJQMZ(WBMVFT, 10), 3)));
^
1C@ Q<GP@N <M@ ADMNO HPGODKGD@? =T 10, OC@I ?DQD?@? =T 3, <I? ADI<GGT JIGT OC@ @Q@I IPH=@MN <M@
PN@?:
<6, 10, 16>
A KMJ=G@H RDOC OC@ @SKM@NNDJI <=JQ@ DN OC<O <GOCJPBC OC@ K<DM JA NVMUJQMZ <I? 10 <M@ M@G<O@?
<I? OC@ K<DM JA EJWJEF <I? 3 <M@ M@G<O@?, K<MON JA @<>C K<DM @I? PK RMDOO@I <R<T AMJH @<>C
JOC@M. 2#0 @GDHDI<O@N OCDN DNNP@ <I? @I<=G@N < HJM@ I<OPM<G NTIO<S OC<O M@AG@>ON OC@ <>OP<G
JM?@M JA JK@M<ODJIN:
XSJUFMO(WBMVFT.NVMUJQMZ(10).EJWJEF(3).FWFOT);
0JH@ KMJBM<HH@MN O<F@ <?Q<IO<B@ JA 2#0 @Q@I AJM ><GGN GDF@ XSJUFMO():
WBMVFT.NVMUJQMZ(10).EJWJEF(3).FWFOT.XSJUFMO;
AN <I <ND?@, OC@ @IODM@ KMJBM<H <=JQ@ >JPG? C<Q@ =@@I RMDOO@I DI < HP>C NDHKG@M R<T =T
NBQ() <I? GJMUFS():
JNQPSU TUE.TUEJP;
JNQPSU TUE.BMHPSJUIN;
WPJE NBJO()
\
BVUP WBMVFT = < 1, 2, 3, 4, 5 >;
XSJUFMO(WBMVFT
.NBQ!(B => B * 10)
.NBQ!(B => B / 3)
.GJMUFS!(B => !(B % 2)));
^
*@;H7DE3> FG@5F;A@ C3>> (K@F3J (*FC()
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
380
1C@ KMJBM<H <=JQ@ O<F@N <?Q<IO<B@ JA F7?B>3F7E, D3@97E, <I? >3?463 8G@5F;A@E, <GG JA RCD>C
RDGG =@ @SKG<DI@? DI G<O@M >C<KO@MN.
*@;H7DE3> FG@5F;A@ C3>> (K@F3J (*FC()
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
381
Properties 64
-MJK@MOD@N <GGJR PNDIB H@H=@M API>ODJIN GDF@ H@H=@M Q<MD<=G@N.
4@ <M@ A<HDGD<M RDOC OCDN A@<OPM@ AMJH NGD>@N. 1C@ MFOHUI KMJK@MOT JA < NGD>@ M@OPMIN OC@
IPH=@M JA @G@H@ION JA OC<O NGD>@:
JOU<> TMJDF = < 7, 8, 9 >;
BTTFSU(TMJDF.MFOHUI == 3);
)JJFDIB H@M@GT <O OC<O PN<B@, JI@ HDBCO OCDIF OC<O .MFOHUI C<N =@@I DHKG@H@IO@? <N <
H@H=@M Q<MD<=G@:
TUSVDU 4MJDF*NQMFNFOUBUJPO
\
JOU MFOHUI;
// ...
^
%JR@Q@M, OC@ JOC@M API>ODJI<GDOT JA OCDN KMJK@MOT KMJQ@N OC<O DO ><IIJO =@ < H@H=@M Q<MD<=G@:
ANNDBIDIB < I@R Q<GP@ OJ OC@ .MFOHUI KMJK@MOT <>OP<GGT >C<IB@N OC@ G@IBOC JA OC@ NGD>@,
NJH@ODH@N =T <??DIB I@R @G@H@ION OJ OC@ PI?@MGTDIB <MM<T:
TMJDF.MFOHUI = 5; // 5IF TMJDF OPX IBT 5 FMFNFOUT
BTTFSU(TMJDF.MFOHUI == 5);
Note: ):7 .length BDAB7DFK A8 8;J76->7@9F: 3DD3KE 53@@AF 47 ?A6;8;76.
1C@ <NNDBIH@IO OJ .MFOHUI <=JQ@ DIQJGQ@N HJM@ >JHKGD><O@? JK@M<ODJIN OC<I < NDHKG@ Q<GP@
>C<IB@: !@O@MHDIDIB RC@OC@M OC@ <MM<T C<N ><K<>DOT AJM OC@ I@R G@IBOC, <GGJ><ODIB HJM@
H@HJMT DA IJO, <I? HJQDIB OC@ @SDNODIB @G@H@ION OJ OC@ I@R KG<>@; <I? ADI<GGT DIDOD<GDUDIB
@<>C <??DODJI<G @G@H@IO =T .JOJU.
"QD?@IOGT, OC@ <NNDBIH@IO OJ .MFOHUI JK@M<O@N GDF@ < API>ODJI.
-MJK@MOD@N <M@ H@H=@M API>ODJIN OC<O <M@ PN@? GDF@ H@H=@M Q<MD<=G@N. 1C@T <M@ ?@ADI@? =T
OC@ !QSPQFSUZ <OOMD=PO@.
Calling functions without parentheses
64.1
AN C<N =@@I H@IODJI@? DI OC@ KM@QDJPN >C<KO@M, RC@I OC@M@ DN IJ <MBPH@IO OJ K<NN, API>ODJIN
><I =@ ><GG@? RDOCJPO K<M@IOC@N@N:
XSJUFMO();
XSJUFMO; // 4BNF BT UIF QSFWJPVT MJOF
1CDN A@<OPM@ DN >GJN@GT M@G<O@? OJ KMJK@MOD@N =@><PN@ KMJK@MOD@N <M@ PN@? <GHJNO <GR<TN
RDOCJPO K<M@IOC@N@N.
Property functions that return values
64.2
AN < NDHKG@ @S<HKG@, G@O'N >JIND?@M < M@>O<IBG@ NOMP>O OC<O >JINDNON JA ORJ H@H=@MN:
TUSVDU 3FDUBOHMF
\
EPVCMF XJEUI;
&DAB7DF;7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
382
EPVCMF IFJHIU;
^
)@O'N <NNPH@ OC<O < OCDM? KMJK@MOT JA OCDN OTK@ =@>JH@N < M@LPDM@H@IO, RCD>C NCJPG? KMJQD?@
OC@ <M@< JA OC@ M@>O<IBG@:
BVUP HBSEFO = 3FDUBOHMF(10, 20);
XSJUFMO(HBSEFO.BSFB);
,I@ R<T JA <>CD@QDIB OC<O M@LPDM@H@IO DN OJ ?@ADI@ < OCDM? H@H=@M:
TUSVDU 3FDUBOHMF
\
EPVCMF XJEUI;
EPVCMF IFJHIU;
EPVCMF BSFB;
^
A AG<R DI OC<O ?@NDBI DN OC<O OC@ J=E@>O H<T @<NDGT =@>JH@ DI>JINDNO@IO: AGOCJPBC M@>O<IBG@N
HPNO <GR<TN C<Q@ OC@ DIQ<MD<IO JA "RD?OC * C@DBCO == <M@<", OCDN >JINDNO@I>T H<T =@ =MJF@I DA
OC@ H@H=@MN <M@ <GGJR@? OJ =@ HJ?DAD@? AM@@GT <I? DI?@K@I?@IOGT.
AN <I @SOM@H@ @S<HKG@, J=E@>ON H<T @Q@I =@BDI OC@DM GDQ@N DI DI>JINDNO@IO NO<O@N:
// *ODPOTJTUFOU PCKFDU: 5IF BSFB JT OPU 10 * 20 == 200.
BVUP HBSEFO = 3FDUBOHMF(10, 20, 1111);
A =@OO@M R<T RJPG? =@ OJ M@KM@N@IO OC@ >JI>@KO JA <M@< <N < KMJK@MOT. &INO@<? JA ?@ADIDIB <I
<??DODJI<G H@H=@M, OC@ Q<GP@ JA OC<O H@H=@M DN ><G>PG<O@? =T < API>ODJI I<H@? BSFB, OC@
N<H@ <N OC@ >JI>@KO OC<O DO M@KM@N@ION:
TUSVDU 3FDUBOHMF
\
EPVCMF XJEUI;
EPVCMF IFJHIU;
EPVCMF BSFB() DPOTU !QSPQFSUZ
\
SFUVSO XJEUI * IFJHIU;
^
^
Note: AE KAG IAG>6 D7?7?47D 8DA? F:7 const ref &3D3?7F7DE 3@6 const #7?47D
FG@5F;A@E 5:3BF7D, F:7 const EB75;8;7D A@ F:7 8G@5F;A@ 675>3D3F;A@ 7@EGD7E F:3F F:7 A4<75F ;E
@AF ?A6;8;76 4K F:;E 8G@5F;A@.
1C<O KMJK@MOT API>ODJI @I<=G@N OC@ NOMP>O OJ =@ PN@? <N DA DO C<N < OCDM? H@H=@M Q<MD<=G@:
BVUP HBSEFO = 3FDUBOHMF(10, 20);
XSJUFMO("5IF BSFB PG UIF HBSEFO: ", HBSEFO.BSFB);
AN OC@ Q<GP@ JA OC@ BSFB KMJK@MOT DN ><G>PG<O@? =T HPGODKGTDIB OC@ RD?OC <I? OC@ C@DBCO JA OC@
M@>O<IBG@, OCDN ODH@ DO RJPG? <GR<TN =@ >JINDNO@IO:
5IF BSFB PG UIF HBSEFO: 200
&DAB7DF;7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
383
Property functions that are used in assignment
64.3
0DHDG<M OJ OC@ MFOHUI KMJK@MOT JA NGD>@N, OC@ KMJK@MOD@N JA PN@M-?@ADI@? OTK@N ><I =@ PN@? DI
<NNDBIH@IO JK@M<ODJIN <N R@GG:
HBSEFO.BSFB = 50;
#JM OC<O <NNDBIH@IO OJ <>OP<GGT >C<IB@ OC@ <M@< JA OC@ M@>O<IBG@, OC@ ORJ H@H=@MN JA OC@
NOMP>O HPNO =@ HJ?DAD@? <>>JM?DIBGT. 1J @I<=G@ OCDN API>ODJI<GDOT, R@ ><I <NNPH@ OC<O OC@
M@>O<IBG@ DN 8>7J;4>7 NJ OC<O OJ H<DIO<DI OC@ DIQ<MD<IO JA "RD?OC * C@DBCO == <M@<", OC@ ND?@N JA
OC@ M@>O<IBG@ ><I =@ >C<IB@?.
1C@ API>ODJI OC<O @I<=G@N NP>C <I <NNDBIH@IO NTIO<S DN <GNJ I<H@? <N BSFB <I? DN <GNJ
H<MF@? =T !QSPQFSUZ. 1C@ Q<GP@ OC<O DN PN@? JI OC@ MDBCO-C<I? ND?@ JA OC@ <NNDBIH@IO
=@>JH@N OC@ JIGT K<M<H@O@M JA OCDN API>ODJI.
1C@ AJGGJRDIB <??DODJI<G ?@ADIDODJI JA BSFB() @I<=G@N PNDIB OC<O KMJK@MOT DI <NNDBIH@IO
JK@M<ODJIN <I? @AA@>ODQ@GT HJ?DATDIB OC@ <M@< JA 3FDUBOHMF J=E@>ON:
JNQPSU TUE.TUEJP;
JNQPSU TUE.NBUI;
TUSVDU 3FDUBOHMF
\
EPVCMF XJEUI;
EPVCMF IFJHIU;
EPVCMF BSFB() DPOTU !QSPQFSUZ
\
SFUVSO XJEUI * IFJHIU;
^
WPJE BSFB(EPVCMF OFX"SFB) !QSPQFSUZ
\
BVUP TDBMF = TRSU(OFX"SFB / BSFB);
XJEUI *= TDBMF;
IFJHIU *= TDBMF;
^
^
WPJE NBJO()
\
BVUP HBSEFO = 3FDUBOHMF(10, 20);
XSJUFMO("5IF BSFB PG UIF HBSEFO: ", HBSEFO.BSFB);
HBSEFO.BSFB = 50;
XSJUFGMO("/FX TUBUF: %T Y %T = %T",
HBSEFO.XJEUI, HBSEFO.IFJHIU, HBSEFO.BSFB);
^
1C@ I@R API>ODJI O<F@N <?Q<IO<B@ JA OC@ TRSU API>ODJI AMJH OC@ TUE.NBUI HJ?PG@, RCD>C
M@OPMIN OC@ NLP<M@ MJJO JA OC@ NK@>DAD@? Q<GP@. 4C@I =JOC JA OC@ RD?OC <I? OC@ C@DBCO JA OC@
M@>O<IBG@ <M@ N><G@? =T OC@ NLP<M@ MJJO JA OC@ M<ODJ, OC@I OC@ <M@< RJPG? @LP<G OC@ ?@NDM@?
Q<GP@.
AN < M@NPGO, <NNDBIDIB OC@ LP<MO@M JA DON >PMM@IO Q<GP@ OJ BSFB @I?N PK C<GQDIB =JOC ND?@N JA
OC@ M@>O<IBG@:
5IF BSFB PG UIF HBSEFO: 200
/FX TUBUF: 5 Y 10 = 50
&DAB7DF;7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
384
Properties are not absolutely necessary
64.4
4@ C<Q@ N@@I <=JQ@ CJR 3FDUBOHMF ><I =@ PN@? <N DA DO C<N < OCDM? H@H=@M Q<MD<=G@.
%JR@Q@M, M@BPG<M H@H=@M API>ODJIN >JPG? <GNJ =@ PN@? DINO@<? JA KMJK@MOD@N:
JNQPSU TUE.TUEJP;
JNQPSU TUE.NBUI;
TUSVDU 3FDUBOHMF
\
EPVCMF XJEUI;
EPVCMF IFJHIU;
EPVCMF BSFB() DPOTU
\
SFUVSO XJEUI * IFJHIU;
^
WPJE TFU"SFB(EPVCMF OFX"SFB)
\
BVUP TDBMF = TRSU(OFX"SFB / BSFB);
XJEUI *= TDBMF;
IFJHIU *= TDBMF;
^
^
WPJE NBJO()
\
BVUP HBSEFO = 3FDUBOHMF(10, 20);
XSJUFMO("5IF BSFB PG UIF HBSEFO: ", HBSEFO.BSFB());
HBSEFO.TFU"SFB(50);
XSJUFGMO("/FX TUBUF: %T Y %T = %T",
HBSEFO.XJEUI, HBSEFO.IFJHIU, HBSEFO.BSFB());
^
#PMOC@M, <N R@ C<Q@ N@@I DI OC@ #PI>ODJI ,Q@MGJ<?DIB >C<KO@M, OC@N@ ORJ API>ODJIN >JPG?
@Q@I C<Q@ OC@ N<H@ I<H@N:
EPVCMF BSFB() DPOTU
\
// ...
^
WPJE BSFB(EPVCMF OFX"SFB)
\
// ...
^
When to use
64.5
&O H<T IJO =@ @<NT OJ >CJN@ =@OR@@I M@BPG<M H@H=@M API>ODJIN <I? KMJK@MOD@N. 0JH@ODH@N
M@BPG<M H@H=@M API>ODJIN A@@G HJM@ I<OPM<G <I? NJH@ODH@N KMJK@MOD@N.
%JR@Q@M, <N R@ C<Q@ N@@I DI OC@ "I><KNPG<ODJI <I? -MJO@>ODJI AOOMD=PO@N >C<KO@M, DO DN
DHKJMO<IO OJ M@NOMD>O ?DM@>O <>>@NN OJ H@H=@M Q<MD<=G@N. AGGJRDIB PN@M >J?@ OJ AM@@GT HJ?DAT
H@H=@M Q<MD<=G@N <GR<TN @I?N PK ><PNDIB DNNP@N RDOC >J?@ H<DIO@I<I>@. #JM OC<O M@<NJI,
H@H=@M Q<MD<=G@N =@OO@M =@ @I><KNPG<O@? @DOC@M =T M@BPG<M H@H=@M API>ODJIN JM =T KMJK@MOT
API>ODJIN.
)@<QDIB H@H=@MN GDF@ XJEUI <I? IFJHIU JK@I OJ QVCMJD <>>@NN DN <>>@KO<=G@ JIGT AJM Q@MT
NDHKG@ OTK@N. AGHJNO <GR<TN < =@OO@M ?@NDBI DN OJ PN@ KMJK@MOT API>ODJIN:
&DAB7DF;7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
385
TUSVDU 3FDUBOHMF
\
QSJWBUF:
EPVCMF XJEUI@;
EPVCMF IFJHIU@;
QVCMJD:
EPVCMF BSFB() DPOTU !QSPQFSUZ
\
SFUVSO XJEUI * IFJHIU;
^
WPJE BSFB(EPVCMF OFX"SFB) !QSPQFSUZ
\
BVUP TDBMF = TRSU(OFX"SFB / BSFB);
XJEUI@ *= TDBMF;
IFJHIU@ *= TDBMF;
^
EPVCMF XJEUI() DPOTU !QSPQFSUZ
\
SFUVSO XJEUI@;
^
EPVCMF IFJHIU() DPOTU !QSPQFSUZ
\
SFUVSO IFJHIU@;
^
^
+JO@ CJR OC@ H@H=@MN <M@ H<?@ QSJWBUF NJ OC<O OC@T ><I JIGT =@ <>>@NN@? =T
>JMM@NKJI?DIB KMJK@MOT API>ODJIN.
AGNJ IJO@ OC<O OJ <QJD? >JIAPNDIB OC@DM I<H@N RDOC OC@ H@H=@M API>ODJIN, OC@ I<H@N JA OC@
H@H=@M Q<MD<=G@N <M@ <KK@I?@? =T OC@ @ >C<M<>O@M. D75AD3F;@9 OC@ I<H@N JA H@H=@M
Q<MD<=G@N DN < >JHHJI KM<>OD>@ DI J=E@>O JMD@IO@? KMJBM<HHDIB.
1C<O ?@ADIDODJI JA 3FDUBOHMF NODGG KM@N@ION XJEUI <I? IFJHIU <N DA OC@T <M@ H@H=@M Q<MD<=G@:
BVUP HBSEFO = 3FDUBOHMF(10, 20);
XSJUFGMO("XJEUI: %T, IFJHIU: %T",
HBSEFO.XJEUI, HBSEFO.IFJHIU);
4C@I OC@M@ DN IJ KMJK@MOT API>ODJI OC<O HJ?DAD@N < H@H=@M Q<MD<=G@, OC@I OC<O H@H=@M DN
@AA@>ODQ@GT M@<?-JIGT AMJH OC@ JPOND?@:
HBSEFO.XJEUI = 100; // j DPNQJMBUJPO &3303
1CDN DN DHKJMO<IO AJM >JIOMJGG@? HJ?DAD><ODJIN JA H@H=@MN. 1C@ H@H=@M Q<MD<=G@N ><I JIGT =@
HJ?DAD@? =T OC@ 3FDUBOHMF OTK@ DON@GA OJ @INPM@ OC@ >JINDNO@I>T JA DON J=E@>ON.
4C@I DO G<O@M H<F@N N@IN@ OC<O < H@H=@M Q<MD<=G@ NCJPG? =@ <GGJR@? OJ =@ HJ?DAD@? AMJH OC@
JPOND?@, OC@I DO DN NDHKGT < H<OO@M JA ?@ADIDIB <IJOC@M KMJK@MOT API>ODJI AJM OC<O H@H=@M.
&DAB7DF;7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
386
Contract Programming for Structs and Classes 65
JIOM<>O KMJBM<HHDIB DN Q@MT @AA@>ODQ@ DI M@?P>DIB >J?DIB @MMJMN. 4@ C<Q@ N@@I ORJ JA OC@
>JIOM<>O KMJBM<HHDIB A@<OPM@N @<MGD@M DI OC@ JIOM<>O -MJBM<HHDIB >C<KO@M: 1C@ JO <I?
PVU =GJ>FN @INPM@ DIKPO <I? JPOKPO >JIOM<>ON JA API>ODJIN.
Note: !F ;E H7DK ;?BADF3@F F:3F KAG 5A@E;67D F:7 9G;67>;@7E G@67D F:7 "in 4>A5=E H7DEGE
enforce 5:75=E" E75F;A@ A8 F:3F 5:3BF7D. ):7 7J3?B>7E ;@ F:;E 5:3BF7D 3D7 43E76 A@ F:7
3EEG?BF;A@ F:3F BDA4>7?E I;F: A4<75F 3@6 B3D3?7F7D 5A@E;EF7@5;7E 3D7 6G7 FA BDA9D3??7D
7DDADE. %F:7DI;E7, KAG E:AG>6 GE7 enforce 5:75=E ;@E;67 8G@5F;A@ 4A6;7E.
AN < M@HDI?@M, G@O'N RMDO@ < API>ODJI OC<O ><G>PG<O@N OC@ <M@< JA < OMD<IBG@ =T %@MJI'N AJMHPG<.
4@ RDGG NJJI HJQ@ OC@ JO <I? PVU =GJ>FN JA OCDN API>ODJI OJ OC@ >JINOMP>OJM JA < NOMP>O.
,=QDJPNGT, AJM OCDN ><G>PG<ODJI OJ RJMF >JMM@>OGT, OC@ G@IBOCN JA <GG JA OC@ ND?@N JA OC@ OMD<IBG@
HPNO =@ BM@<O@M OC<I JM @LP<G OJ U@MJ. A??DODJI<GGT, NDI>@ DO DN DHKJNND=G@ OJ C<Q@ < OMD<IBG@
RC@M@ JI@ JA OC@ ND?@N DN BM@<O@M OC<I OC@ NPH JA OC@ JOC@M ORJ, OC<O >JI?DODJI HPNO <GNJ =@
>C@>F@?.
,I>@ OC@N@ DIKPO >JI?DODJIN <M@ N<ODNAD@?, OC@ <M@< JA OC@ OMD<IBG@ RJPG? =@ ><G>PG<O@? <N
BM@<O@M OC<I JM @LP<G OJ U@MJ. 1C@ AJGGJRDIB API>ODJI @INPM@N OC<O <GG JA OC@N@ M@LPDM@H@ION
<M@ N<ODNAD@?:
QSJWBUF JNQPSU TUE.NBUI;
EPVCMF USJBOHMF"SFB(JO EPVCMF B, JO EPVCMF C, JO EPVCMF D)
JO
\
// /P TJEF DBO CF MFTT UIBO [FSP
BTTFSU(B >= 0);
BTTFSU(C >= 0);
BTTFSU(D >= 0);
// /P TJEF DBO CF MPOHFS UIBO UIF TVN PG UIF PUIFS UXP
BTTFSU(B <= (C + D));
BTTFSU(C <= (B + D));
BTTFSU(D <= (B + C));
^
PVU (SFTVMU)
\
BTTFSU(SFTVMU >= 0);
^
CPEZ
\
JNNVUBCMF IBMG1FSJNFUFS = (B + C + D) / 2;
SFUVSO TRSU(IBMG1FSJNFUFS
* (IBMG1FSJNFUFS - B)
* (IBMG1FSJNFUFS - C)
* (IBMG1FSJNFUFS - D));
^
The JO and PVU blocks of member functions
65.1
1C@ JO <I? PVU =GJ>FN ><I =@ PN@? RDOC H@H=@M API>ODJIN <N R@GG.
)@O'N >JIQ@MO OC@ API>ODJI <=JQ@ OJ < H@H=@M API>ODJI JA < 5SJBOHMF NOMP>O:
JNQPSU TUE.TUEJP;
JNQPSU TUE.NBUI;
TUSVDU 5SJBOHMF
CA@FD35F &DA9D3??;@9 8AD (FDG5FE 3@6 C>3EE7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
387
\
QSJWBUF:
EPVCMF B@;
EPVCMF C@;
EPVCMF D@;
QVCMJD:
EPVCMF BSFB() DPOTU !QSPQFSUZ
PVU (SFTVMU)
\
BTTFSU(SFTVMU >= 0);
^
CPEZ
\
JNNVUBCMF IBMG1FSJNFUFS = (B@ + C@ + D@) / 2;
SFUVSO TRSU(IBMG1FSJNFUFS
* (IBMG1FSJNFUFS - B@)
* (IBMG1FSJNFUFS - C@)
* (IBMG1FSJNFUFS - D@));
^
^
WPJE NBJO()
\
BVUP UISFF'PVS'JWF = 5SJBOHMF(3, 4, 5);
XSJUFMO(UISFF'PVS'JWF.BSFB);
^
AN OC@ ND?@N JA OC@ OMD<IBG@ <M@ IJR H@H=@M Q<MD<=G@N, OC@ API>ODJI ?J@N IJO O<F@ K<M<H@O@MN
<ITHJM@. 1C<O DN RCT OCDN API>ODJI ?J@N IJO C<Q@ <I JO =GJ>F. &INO@<?, DO <NNPH@N OC<O OC@
H@H=@MN <GM@<?T C<Q@ >JINDNO@IO Q<GP@N.
1C@ >JINDNO@I>T JA J=E@>ON ><I =@ @INPM@? =T OC@ AJGGJRDIB A@<OPM@N.
JO and PVU blocks for object consistency
65.2
1C@ H@H=@M API>ODJI <=JQ@ DN RMDOO@I PI?@M OC@ <NNPHKODJI OC<O OC@ H@H=@MN JA OC@ J=E@>O
<GM@<?T C<Q@ >JINDNO@IO Q<GP@N. ,I@ R<T JA @INPMDIB OC<O <NNPHKODJI DN OJ ?@ADI@ <I JO =GJ>F
AJM OC@ >JINOMP>OJM NJ OC<O OC@ J=E@>ON <M@ BP<M<IO@@? OJ NO<MO OC@DM GDQ@N DI >JINDNO@IO NO<O@N:
DMBTT 5SJBOHMF
\
// ...
UIJT(JO EPVCMF B, JO EPVCMF C, JO EPVCMF D)
JO
\
// /P TJEF DBO CF MFTT UIBO [FSP
BTTFSU(B >= 0);
BTTFSU(C >= 0);
BTTFSU(D >= 0);
// /P TJEF DBO CF MPOHFS UIBO UIF TVN PG UIF PUIFS UXP
BTTFSU(B <= (C + D));
BTTFSU(C <= (B + D));
BTTFSU(D <= (B + C));
^
CPEZ
\
UIJT.B = B;
UIJT.C = C;
UIJT.D = D;
^
CA@FD35F &DA9D3??;@9 8AD (FDG5FE 3@6 C>3EE7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
388
// ...
^
1CDN KM@Q@ION >M@<ODIB DIQ<GD? 5SJBOHMF J=E@>ON <O MPI ODH@:
BVUP OFHBUJWF4JEF = 5SJBOHMF(-1, 1, 1);
BVUP TJEF5PP-POH = 5SJBOHMF(1, 1, 10);
1C@ JO =GJ>F JA OC@ >JINOMP>OJM RJPG? KM@Q@IO NP>C DIQ<GD? J=E@>ON:
DPSF.FYDFQUJPO."TTFSU&SSPS!EFOFNF.E: "TTFSUJPO GBJMVSF
AGOCJPBC <I PVU =GJ>F C<N IJO =@@I ?@ADI@? AJM OC@ >JINOMP>OJM <=JQ@, DO DN KJNND=G@ OJ ?@ADI@
JI@ OJ @INPM@ OC@ >JINDNO@I>T JA H@H=@MN MDBCO <AO@M >JINOMP>ODJI.
JOWBSJBOU() blocks for object consistency
65.3
1C@ JO <I? PVU =GJ>FN JA >JINOMP>OJMN BP<M<IO@@ OC<O OC@ J=E@>ON NO<MO OC@DM GDQ@N DI
>JINDNO@IO NO<O@N <I? OC@ JO <I? PVU =GJ>FN JA H@H=@M API>ODJIN BP<M<IO@@ OC<O OCJN@
API>ODJIN OC@HN@GQ@N RJMF >JMM@>OGT.
%JR@Q@M, OC@N@ >C@>FN <M@ IJO NPDO<=G@ AJM BP<M<IO@@DIB OC<O OC@ J=E@>ON <M@ <GR<TN DI
>JINDNO@IO NO<O@N. /@K@<ODIB OC@ PVU =GJ>FN AJM @Q@MT H@H=@M API>ODJI RJPG? =@ @S>@NNDQ@
<I? @MMJM-KMJI@.
1C@ >JI?DODJIN OC<O ?@ADI@ OC@ >JINDNO@I>T <I? Q<GD?DOT JA <I J=E@>O <M@ ><GG@? OC@ ;@H3D;3@FE
JA OC<O J=E@>O. #JM @S<HKG@, DA OC@M@ DN < JI@-OJ-JI@ >JMM@NKJI?@I>@ =@OR@@I OC@ JM?@MN <I?
OC@ DIQJD>@N JA < >PNOJH@M >G<NN, OC@I <I DIQ<MD<IO JA OC<O >G<NN RJPG? =@ OC<O OC@ G@IBOCN JA
OC@ JM?@M <I? DIQJD>@ <MM<TN RJPG? =@ @LP<G. 4C@I OC<O >JI?DODJI DN IJO N<ODNAD@? AJM <IT
J=E@>O, OC@I OC@ J=E@>O RJPG? =@ DI <I DI>JINDNO@IO NO<O@.
AN <I @S<HKG@ JA <I DIQ<MD<IO, G@O'N >JIND?@M OC@ 4DIPPM >G<NN AMJH OC@ "I><KNPG<ODJI <I?
-MJO@>ODJI AOOMD=PO@N >C<KO@M:
DMBTT 4DIPPM
\
QSJWBUF:
4UVEFOU<> TUVEFOUT;
TJ[F@U GFNBMF$PVOU;
TJ[F@U NBMF$PVOU;
// ...
^
1C@ J=E@>ON JA OC<O >G<NN <M@ >JINDNO@IO JIGT DA <I DIQ<MD<IO OC<O DIQJGQ@N DON OCM@@ H@H=@MN
<M@ N<ODNAD@?. 1C@ G@IBOC JA OC@ NOP?@IO <MM<T HPNO =@ @LP<G OJ OC@ NPH JA OC@ A@H<G@ <I?
H<G@ NOP?@ION:
BTTFSU(TUVEFOUT.MFOHUI == (GFNBMF$PVOU + NBMF$PVOU));
&A OC<O >JI?DODJI DN @Q@M A<GN@, OC@I OC@M@ HPNO =@ < =PB DI OC@ DHKG@H@IO<ODJI JA OCDN >G<NN.
JOWBSJBOU() =GJ>FN <M@ AJM BP<M<IO@@DIB OC@ DIQ<MD<ION JA PN@M-?@ADI@? OTK@N. JOWBSJBOU()
=GJ>FN <M@ ?@ADI@? DIND?@ OC@ =J?T JA < TUSVDU JM < DMBTT. 1C@T >JIO<DI BTTFSU >C@>FN
NDHDG<M OJ JO <I? PVU =GJ>FN:
CA@FD35F &DA9D3??;@9 8AD (FDG5FE 3@6 C>3EE7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
389
DMBTT 4DIPPM
\
QSJWBUF:
4UVEFOU<> TUVEFOUT;
TJ[F@U GFNBMF$PVOU;
TJ[F@U NBMF$PVOU;
JOWBSJBOU()
\
BTTFSU(TUVEFOUT.MFOHUI == (GFNBMF$PVOU + NBMF$PVOU));
^
// ...
^
1C@M@ ><I =@ JIGT JI@ JOWBSJBOU() =GJ>F DI < PN@M-?@ADI@? OTK@.
1C@ JOWBSJBOU() =GJ>F DN @S@>PO@? <POJH<OD><GGT <O OC@ AJGGJRDIB ODH@N:
t AAO@M OC@ @S@>PODJI JA OC@ >JINOMP>OJM: 1CDN BP<M<IO@@N OC<O @Q@MT J=E@>O NO<MON DON GDA@ DI <
>JINDNO@IO NO<O@.
t B@AJM@ OC@ @S@>PODJI JA OC@ ?@NOMP>OJM: 1CDN BP<M<IO@@N OC<O OC@ ?@NOMP>OJM RDGG =@
@S@>PO@? JI < >JINDNO@IO J=E@>O.
t B@AJM@ <I? <AO@M OC@ @S@>PODJI JA < QVCMJD H@H=@M API>ODJI: 1CDN BP<M<IO@@N OC<O OC@
H@H=@M API>ODJIN ?J IJO DIQ<GD?<O@ OC@ >JINDNO@I>T JA J=E@>ON.
Note: export 8G@5F;A@E 3D7 F:7 E3?7 3E public 8G@5F;A@E ;@ F:;E D793D6. (+7DK 4D;78>K,
export 8G@5F;A@E 3D7 8G@5F;A@E F:3F 3D7 7JBADF76 A@ 6K@3?;5 >;4D3DK ;@F7D8357E.)
&A OC@ BTTFSU >C@>FN DIND?@ JOWBSJBOU() =GJ>FN A<DG, <I "TTFSU&SSPS DN OCMJRI. 1CDN @INPM@N
OC<O OC@ KMJBM<H ?J@N IJO >JIODIP@ MPIIDIB RDOC DIQ<GD? J=E@>ON.
AN RDOC JO <I? PVU =GJ>FN, OC@ >C@>FN DIND?@ JOWBSJBOU() =GJ>FN ><I =@ ?DN<=G@? =T OC@ -
SFMFBTF >JHH<I? GDI@ JKODJI:
ENE EFOFNF.E -X -SFMFBTF
Summary
65.4
JO <I? PVU =GJ>FN <M@ PN@APG DI >JINOMP>OJMN <N R@GG. 1C@T @INPM@ OC<O J=E@>ON <M@
>JINOMP>O@? DI Q<GD? NO<O@N.
JOWBSJBOU() =GJ>FN @INPM@ OC<O J=E@>ON M@H<DI DI Q<GD? NO<O@N OCMJPBCJPO OC@DM GDA@ODH@N.
CA@FD35F &DA9D3??;@9 8AD (FDG5FE 3@6 C>3EE7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
390
Templates 66
1@HKG<O@N <M@ OC@ A@<OPM@ OC<O <GGJRN ?@N>MD=DIB OC@ >J?@ <N < K<OO@MI, AJM OC@ >JHKDG@M OJ
B@I@M<O@ KMJBM<H >J?@ <POJH<OD><GGT. -<MON JA OC@ NJPM>@ >J?@ H<T =@ G@AO OJ OC@ >JHKDG@M OJ
=@ ADGG@? DI PIODG OC<O K<MO DN <>OP<GGT PN@? DI OC@ KMJBM<H. 1C@ >JHKDG@M ADGGN DI OC@ HDNNDIB
K<MON.
1@HKG<O@N <M@ Q@MT PN@APG @NK@>D<GGT DI GD=M<MD@N =@><PN@ OC@T @I<=G@ RMDODIB B@I@MD>
<GBJMDOCHN <I? ?<O< NOMP>OPM@N, DINO@<? JA OTDIB OC@H OJ NK@>DAD> OTK@N.
JHK<M@? OJ OC@ O@HKG<O@ NPKKJMON DI JOC@M G<IBP<B@N, !'N O@HKG<O@N <M@ Q@MT KJR@MAPG <I?
@SO@INDQ@. & RDGG IJO B@O DIOJ <GG JA OC@ ?@O<DGN JA O@HKG<O@N DI OCDN >C<KO@M. & RDGG >JQ@M JIGT
API>ODJI, NOMP>O, <I? >G<NN O@HKG<O@N <I? JIGT FKB7 O@HKG<O@ K<M<H@O@MN. #JM < >JHKG@O@
M@A@M@I>@ JI ! O@HKG<O@N, N@@ -CDGDKK@ 0DB<P?'N D )7?B>3F7E: A )GFAD;3>.
1J N@@ OC@ =@I@ADON JA O@HKG<O@N G@O'N NO<MO RDOC < API>ODJI OC<O KMDION Q<GP@N DI K<M@IOC@N@N:
WPJE QSJOU*O1BSFOT(JOU WBMVF)
\
XSJUFGMO("(%T)", WBMVF);
^
B@><PN@ OC@ K<M<H@O@M DN NK@>DAD@? <N JOU, OC<O API>ODJI ><I JIGT =@ PN@? RDOC Q<GP@N JA OTK@
JOU, JM Q<GP@N OC<O ><I <POJH<OD><GGT =@ >JIQ@MO@? OJ JOU. #JM @S<HKG@, OC@ >JHKDG@M RJPG?
IJO <GGJR ><GGDIB DO RDOC < AGJ<ODIB KJDIO OTK@.
)@O'N <NNPH@ OC<O OC@ M@LPDM@H@ION JA < KMJBM<H >C<IB@N <I? OC<O JOC@M OTK@N I@@? OJ =@
KMDIO@? DI K<M@IOC@N@N <N R@GG. ,I@ JA OC@ NJGPODJIN AJM OCDN RJPG? =@ OJ O<F@ <?Q<IO<B@ JA
API>ODJI JQ@MGJ<?DIB <I? KMJQD?@ JQ@MGJ<?N JA OC@ API>ODJI AJM <GG JA OC@ OTK@N OC<O OC@
API>ODJI DN PN@? RDOC:
// 5IF GVODUJPO UIBU BMSFBEZ FYJTUT
WPJE QSJOU*O1BSFOT(JOU WBMVF)
\
XSJUFGMO("(%T)", WBMVF);
^
// 0WFSMPBEJOH UIF GVODUJPO GPS 'EPVCMF'
WPJE QSJOU*O1BSFOT(EPVCMF WBMVF)
\
XSJUFGMO("(%T)", WBMVF);
^
1CDN NJGPODJI ?J@N IJO N><G@ R@GG =@><PN@ OCDN ODH@ OC@ API>ODJI ><IIJO =@ PN@? RDOC @.B. SFBM
JM <IT PN@M-?@ADI@? OTK@. AGOCJPBC DO DN KJNND=G@ OJ JQ@MGJ<? OC@ API>ODJI AJM JOC@M OTK@N, OC@
>JNO JA ?JDIB OCDN H<T =@ KMJCD=DODQ@.
AI DHKJMO<IO J=N@MQ<ODJI C@M@ DN OC<O M@B<M?G@NN JA OC@ OTK@ JA OC@ K<M<H@O@M, OC@ >JIO@ION JA
OC@ JQ@MGJ<?N RJPG? <GG =@ 97@7D;53>>K OC@ N<H@: < NDIBG@ XSJUFGMO() @SKM@NNDJI.
0P>C ?PKGD><ODJI DN >JHHJI DI <GBJMDOCHN <I? ?<O< NOMP>OPM@N. #JM @S<HKG@, OC@ =DI<MT
N@<M>C <GBJMDOCH DN DI?@K@I?@IO JA OC@ OTK@ JA OC@ @G@H@ION: &O DN <=JPO OC@ NK@>DAD> NO@KN <I?
JK@M<ODJIN JA OC@ N@<M>C. 0DHDG<MGT, OC@ GDIF@? GDNO ?<O< NOMP>OPM@ DN DI?@K@I?@IO JA OC@ OTK@ JA
OC@ @G@H@ION: )DIF@? GDNO DN H@M@GT <=JPO :AI OC@ @G@H@ION <M@ NOJM@? DI OC@ >JIO<DI@M,
M@B<M?G@NN JA OC@DM OTK@.
1@HKG<O@N <M@ PN@APG DI NP>C NDOP<ODJIN: ,I>@ < KD@>@ JA >J?@ DN ?@N>MD=@? <N < O@HKG<O@, OC@
>JHKDG@M B@I@M<O@N JQ@MGJ<?N JA OC@ N<H@ >J?@ <POJH<OD><GGT <>>JM?DIB OJ OC@ <>OP<G PN@N JA
OC<O >J?@ DI OC@ KMJBM<H.
)7?B>3F7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
391
AN & C<Q@ H@IODJI@? <=JQ@, DI OCDN >C<KO@M & RDGG >JQ@M JIGT API>ODJI, NOMP>O, <I? >G<NN
O@HKG<O@N, <I? FKB7 O@HKG<O@ K<M<H@O@MN.
Function templates
66.1
!@ADIDIB < API>ODJI <N < O@HKG<O@ DN G@<QDIB JI@ JM HJM@ JA OC@ OTK@N OC<O DO PN@N <N
PINK@>DAD@?, OJ =@ ?@?P>@? G<O@M =T OC@ >JHKDG@M.
1C@ OTK@N OC<O <M@ =@DIB G@AO PINK@>DAD@? <M@ ?@ADI@? RDOCDI OC@ O@HKG<O@ K<M<H@O@M GDNO,
RCD>C >JH@N =@OR@@I OC@ I<H@ JA OC@ API>ODJI <I? OC@ API>ODJI K<M<H@O@M GDNO. #JM OC<O
M@<NJI, API>ODJI O@HKG<O@N C<Q@ ORJ K<M<H@O@M GDNON: OC@ O@HKG<O@ K<M<H@O@M GDNO <I? OC@
API>ODJI K<M<H@O@M GDNO:
WPJE QSJOU*O1BSFOT(5)(5 WBMVF)
\
XSJUFGMO("(%T)", WBMVF);
^
1C@ 5 RDOCDI OC@ O@HKG<O@ K<M<H@O@M GDNO <=JQ@ H@<IN OC<O 5 ><I =@ <IT OTK@. AGOCJPBC 5 DN
<I <M=DOM<MT I<H@, DO DN <I <>MJITH AJM "OTK@" <I? DN Q@MT >JHHJI DI O@HKG<O@N.
0DI>@ 5 M@KM@N@ION <IT OTK@, OC@ O@HKG<O@? ?@ADIDODJI JA QSJOU*O1BSFOT() <=JQ@ DN NPAAD>D@IO
OJ PN@ DO RDOC <GHJNO @Q@MT OTK@, DI>GP?DIB OC@ PN@M-?@ADI@? JI@N:
JNQPSU TUE.TUEJP;
WPJE QSJOU*O1BSFOT(5)(5 WBMVF)
\
XSJUFGMO("(%T)", WBMVF);
^
WPJE NBJO()
\
QSJOU*O1BSFOT(42); // XJUI JOU
QSJOU*O1BSFOT(1.2); // XJUI EPVCMF
BVUP NZ7BMVF = .Z4USVDU();
QSJOU*O1BSFOT(NZ7BMVF); // XJUI .Z4USVDU
^
TUSVDU .Z4USVDU
\
TUSJOH UP4USJOH() DPOTU
\
SFUVSO "IFMMP";
^
^
1C@ >JHKDG@M >JIND?@MN <GG JA OC@ PN@N JA QSJOU*O1BSFOT() DI OC@ KMJBM<H <I? B@I@M<O@N
>J?@ OJ NPKKJMO <GG OCJN@ PN@N. 1C@ KMJBM<H DN OC@I >JHKDG@? <N DA OC@ API>ODJI C<N =@@I
JQ@MGJ<?@? @SKGD>DOGT AJM JOU, EPVCMF, <I? .Z4USVDU:
)7?B>3F7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
392
/*
* /PUF: 5IFTF GVODUJPOT BSF OPU QBSU PG UIF TPVSDF
* DPEF. 5IFZ BSF UIF FRVJWBMFOUT PG UIF GVODUJPOT UIBU
* UIF DPNQJMFS XPVME BVUPNBUJDBMMZ HFOFSBUF.
*/
WPJE QSJOU*O1BSFOT(JOU WBMVF)
\
XSJUFGMO("(%T)", WBMVF);
^
WPJE QSJOU*O1BSFOT(EPVCMF WBMVF)
\
XSJUFGMO("(%T)", WBMVF);
^
WPJE QSJOU*O1BSFOT(.Z4USVDU WBMVF)
\
XSJUFGMO("(%T)", WBMVF);
^
1C@ JPOKPO JA OC@ KMJBM<H >JIO<DIN ?DAA@M@IO GDI@N AMJH OC@ ?DAA@M@IO ;@EF3@F;3F;A@E =T OC@
>JHKDG@M JA OC@ API>ODJI O@HKG<O@:
(42)
(1.2)
(IFMMP)
More than one template parameter
66.2
)@O'N >C<IB@ OC@ API>ODJI O@HKG<O@ OJ O<F@ <GNJ OC@ K<M@IOC@NDN >C<M<>O@MN:
WPJE QSJOU*O1BSFOT(5)(5 WBMVF, DIBS PQFOJOH, DIBS DMPTJOH)
\
XSJUFMO(PQFOJOH, WBMVF, DMPTJOH);
^
+JR R@ ><I ><GG OC@ N<H@ API>ODJI RDOC ?DAA@M@IO N@ON JA K<M@IOC@N@N:
QSJOU*O1BSFOT(42, '<', '>');
AGOCJPBC =@DIB <=G@ OJ NK@>DAT OC@ K<M@IOC@N@N H<F@N OC@ API>ODJI HJM@ PN<=G@, NK@>DATDIB
OC@ OTK@ JA OC@ K<M@IOC@N@N <N DIBS H<F@N DO G@NN AG@SD=G@ =@><PN@ DO DN IJO KJNND=G@ OJ ><GG OC@
API>ODJI RDOC >C<M<>O@MN JA OTK@ XDIBS JM EDIBS:
QSJOU*O1BSFOT(42, 'l', 'j'); // j DPNQJMBUJPO &3303
&SSPS: UFNQMBUF EFOFNF.QSJOU*O1BSFOT(5) DBOOPU EFEVDF
UFNQMBUF GVODUJPO GSPN BSHVNFOU UZQFT !()(JOU,XDIBS,XDIBS)
,I@ NJGPODJI RJPG? =@ OJ NK@>DAT OC@ OTK@ JA OC@ K<M@IOC@N@N <N EDIBS =PO OCDN RJPG? NODGG =@
DINPAAD>D@IO <N OCDN ODH@ OC@ API>ODJI >JPG? IJO =@ ><GG@? @.B. RDOC TUSJOH JM PN@M-?@ADI@?
OTK@N.
AIJOC@M NJGPODJI DN OJ G@<Q@ OC@ OTK@ JA OC@ K<M@IOC@N@N OJ OC@ >JHKDG@M <N R@GG. !@ADIDIB <I
<??DODJI<G O@HKG<O@ K<M<H@O@M DINO@<? JA OC@ NK@>DAD> DIBS DN NPAAD>D@IO:
)7?B>3F7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
393
WPJE QSJOU*O1BSFOT(5, 1BSFOT5ZQF)(5 WBMVF,
1BSFOT5ZQF PQFOJOH,
1BSFOT5ZQF DMPTJOH)
\
XSJUFMO(PQFOJOH, WBMVF, DMPTJOH);
^
1C@ H@<IDIB JA OC@ I@R O@HKG<O@ K<M<H@O@M DN NDHDG<M OJ 5'N: 1BSFOT5ZQF ><I =@ <IT OTK@.
&O DN IJR KJNND=G@ OJ PN@ H<IT ?DAA@M@IO OTK@N JA K<M@IOC@N@N. 1C@ AJGGJRDIB <M@ RDOC XDIBS
<I? TUSJOH:
QSJOU*O1BSFOT(42, 'l', 'j');
QSJOU*O1BSFOT(1.2, "-=", "=-");
m42l
-=1.2=-
1C@ AG@SD=DGDOT JA QSJOU*O1BSFOT() C<N =@@I DI>M@<N@?, <N DO IJR RJMFN >JMM@>OGT AJM <IT
>JH=DI<ODJI JA 5 <I? 1BSFOT5ZQF <N GJIB <N OCJN@ OTK@N <M@ KMDIO<=G@ RDOC XSJUFMO().
Type deduction
66.3
1C@ >JHKDG@M'N ?@>D?DIB JI RC<O OTK@ OJ PN@ AJM < O@HKG<O@ K<M<H@O@M DN ><GG@? FKB7
676G5F;A@.
JIODIPDIB AMJH OC@ G<NO @S<HKG@ <=JQ@, OC@ >JHKDG@M ?@>D?@N JI OC@ AJGGJRDIB OTK@N
<>>JM?DIB OJ OC@ ORJ PN@N JA OC@ API>ODJI O@HKG<O@:
t JOU <I? XDIBS RC@I 42 DN KMDIO@?
t EPVCMF <I? TUSJOH RC@I 1.2 DN KMDIO@?
1C@ >JHKDG@M ><I ?@?P>@ OTK@N JIGT AMJH OC@ OTK@N JA OC@ K<M<H@O@M Q<GP@N OC<O <M@ K<NN@?
OJ API>ODJI O@HKG<O@N. AGOCJPBC OC@ >JHKDG@M ><I PNP<GGT ?@?P>@ OC@ OTK@N RDOCJPO <IT
<H=DBPDOT, OC@M@ <M@ ODH@N RC@I OC@ OTK@N HPNO =@ NK@>DAD@? @SKGD>DOGT =T OC@ KMJBM<HH@M.
Explicit type specification
66.4
0JH@ODH@N DO DN IJO KJNND=G@ AJM OC@ >JHKDG@M OJ ?@?P>@ OC@ O@HKG<O@ K<M<H@O@MN. A NDOP<ODJI
OC<O OCDN ><I C<KK@I DN RC@I OC@ OTK@N ?J IJO <KK@<M DI OC@ API>ODJI K<M<H@O@M GDNO. 4C@I
O@HKG<O@ K<M<H@O@MN <M@ IJO M@G<O@? OJ API>ODJI K<M<H@O@MN, OC@ >JHKDG@M ><IIJO ?@?P>@ OC@
O@HKG<O@ K<M<H@O@M OTK@N.
1J N@@ <I @S<HKG@ JA OCDN, G@O'N ?@NDBI < API>ODJI OC<O <NFN < LP@NODJI OJ OC@ PN@M, M@<?N <
Q<GP@ <N < M@NKJIN@, <I? M@OPMIN OC<O Q<GP@. A??DODJI<GGT, G@O'N H<F@ OCDN < API>ODJI O@HKG<O@
NJ OC<O DO ><I =@ PN@? OJ M@<? <IT OTK@ JA M@NKJIN@:
5 HFU3FTQPOTF(5)(TUSJOH RVFTUJPO)
\
XSJUFG("%T (%T): ", RVFTUJPO, 5.TUSJOHPG);
5 SFTQPOTF;
SFBEG(" %T", &SFTQPOTF);
SFUVSO SFTQPOTF;
^
)7?B>3F7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
394
1C<O API>ODJI O@HKG<O@ RJPG? =@ Q@MT PN@APG DI KMJBM<HN OJ M@<? ?DAA@M@IO OTK@N JA Q<GP@N
AMJH OC@ DIKPO. #JM @S<HKG@, OJ M@<? NJH@ PN@M DIAJMH<ODJI, R@ ><I DH<BDI@ ><GGDIB DO <N DI
OC@ AJGGJRDIB GDI@:
HFU3FTQPOTF("8IBU JT ZPVS BHF");
2IAJMOPI<O@GT, OC<O ><GG ?J@N IJO BDQ@ OC@ >JHKDG@M <IT >GP@ <N OJ RC<O OC@ O@HKG<O@
K<M<H@O@M 5 NCJPG? =@. 4C<O DN FIJRI DN OC<O OC@ LP@NODJI DN K<NN@? OJ OC@ API>ODJI <N <
TUSJOH, =PO OC@ OTK@ JA OC@ M@OPMI Q<GP@ ><IIJO =@ ?@?P>@?:
&SSPS: UFNQMBUF EFOFNF.HFU3FTQPOTF(5) DBOOPU EFEVDF UFNQMBUF
GVODUJPO GSPN BSHVNFOU UZQFT !()(TUSJOH)
&I NP>C ><N@N, OC@ O@HKG<O@ K<M<H@O@MN HPNO =@ NK@>DAD@? @SKGD>DOGT =T OC@ KMJBM<HH@M.
1@HKG<O@ K<M<H@O@MN <M@ NK@>DAD@? DI K<M@IOC@N@N <AO@M <I @S>G<H<ODJI H<MF:
HFU3FTQPOTF!(JOU)("8IBU JT ZPVS BHF");
1C@ >J?@ <=JQ@ ><I IJR =@ <>>@KO@? =T OC@ >JHKDG@M <I? OC@ API>ODJI O@HKG<O@ DN >JHKDG@?
<N 5 M@A@MMDIB OJ JOU RDOCDI OC@ ?@ADIDODJI JA OC@ O@HKG<O@.
4C@I OC@M@ DN JIGT JI@ O@HKG<O@ K<M<H@O@M NK@>DAD@?, OC@ K<M@IO@N@N <MJPI? DO <M@ JKODJI<G:
HFU3FTQPOTF!JOU("8IBU JT ZPVS BHF"); // TBNF BT BCPWF
6JP H<T M@>JBIDU@ OC<O NTIO<S AMJH UP!TUSJOH, RCD>C R@ C<Q@ =@@I PNDIB DI @<MGD@M
KMJBM<HN. UP() DN < API>ODJI O@HKG<O@, RCD>C O<F@N OC@ O<MB@O OTK@ JA OC@ >JIQ@MNDJI <N <
O@HKG<O@ K<M<H@O@M. 0DI>@ DO C<N JIGT JI@ O@HKG<O@ K<M<H@O@M OC<O I@@?N OJ =@ NK@>DAD@?, DO DN
>JHHJIGT RMDOO@I <N UP!TUSJOH DINO@<? JA UP!(TUSJOH).
Template instantiation
66.5
APOJH<OD> B@I@M<ODJI JA >J?@ AJM ?DAA@M@IO N@ON JA O@HKG<O@ K<M<H@O@M OTK@N DN ><GG@? <I
;@EF3@F;3F;A@ JA OC<O O@HKG<O@ AJM OC<O NK@>DAD> N@O JA OTK@N. #JM @S<HKG@, UP!TUSJOH <I?
UP!JOU <M@ ORJ ?DNODI>O DINO<IOD<ODJIN JA OC@ UP API>ODJI O@HKG<O@.
AN & RDGG H@IODJI <B<DI DI < N@K<M<O@ N@>ODJI =@GJR, ?DNODI>O DINO<IOD<ODJIN JA O@HKG<O@N
KMJ?P>@ ?DNODI>O <I? DI>JHK<OD=G@ OTK@N.
Template specializations
66.6
AGOCJPBC OC@ HFU3FTQPOTF() API>ODJI O@HKG<O@ ><I DI OC@JMT =@ PN@? AJM <IT O@HKG<O@ OTK@,
OC@ >J?@ OC<O OC@ >JHKDG@M B@I@M<O@N H<T IJO =@ NPDO<=G@ AJM @Q@MT OTK@. )@O'N <NNPH@ OC<O
R@ C<Q@ OC@ AJGGJRDIB OTK@ OC<O M@KM@N@ION KJDION JI < ORJ ?DH@INDJI<G NK<>@:
TUSVDU 1PJOU
\
JOU Y;
JOU Z;
^
AGOCJPBC OC@ DINO<IOD<ODJI JA HFU3FTQPOTF() AJM OC@ 1PJOU OTK@ DON@GA RJPG? =@ ADI@, OC@
B@I@M<O@? SFBEG() ><GG AJM 1PJOU ><IIJO =@ >JHKDG@?. 1CDN DN =@><PN@ OC@ NO<I?<M? GD=M<MT
API>ODJI SFBEG() ?J@N IJO FIJR CJR OJ M@<? < 1PJOU J=E@>O. 1C@ ORJ GDI@N OC<O <>OP<GGT M@<?
)7?B>3F7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
395
OC@ M@NKJIN@ RJPG? GJJF GDF@ OC@ AJGGJRDIB DI OC@ 1PJOU DINO<IOD<ODJI JA OC@ HFU3FTQPOTF()
API>ODJI O@HKG<O@:
1PJOU SFTQPOTF;
SFBEG(" %T", &SFTQPOTF); // j DPNQJMBUJPO &3303
,I@ R<T JA M@<?DIB < 1PJOU J=E@>O RJPG? =@ OJ M@<? OC@ Q<GP@N JA OC@ Y <I? Z H@H=@MN
N@K<M<O@GT <I? OC@I OJ 5A@EFDG5F < 1PJOU J=E@>O AMJH OCJN@ Q<GP@N.
-MJQD?DIB < NK@>D<G ?@ADIDODJI JA < O@HKG<O@ AJM < NK@>DAD> OTK@ DN ><GG@? F7?B>3F7
EB75;3>;L3F;A@. 1C@ NK@>D<GDU<ODJI DN ?@ADI@? =T OC@ OTK@ I<H@ <AO@M < : >C<M<>O@M DI OC@
O@HKG<O@ K<M<H@O@M GDNO. A 1PJOU NK@>D<GDU<ODJI JA OC@ HFU3FTQPOTF() API>ODJI O@HKG<O@ ><I
=@ ?@ADI@? <N DI OC@ AJGGJRDIB >J?@:
// 5IF HFOFSBM EFGJOJUJPO PG UIF GVODUJPO UFNQMBUF (TBNF BT CFGPSF)
5 HFU3FTQPOTF(5)(TUSJOH RVFTUJPO)
\
XSJUFG("%T (%T): ", RVFTUJPO, 5.TUSJOHPG);
5 SFTQPOTF;
SFBEG(" %T", &SFTQPOTF);
SFUVSO SFTQPOTF;
^
// 5IF TQFDJBMJ[BUJPO PG UIF GVODUJPO UFNQMBUF GPS 1PJOU
5 HFU3FTQPOTF(5 : 1PJOU)(TUSJOH RVFTUJPO)
\
XSJUFGMO("%T (1PJOU)", RVFTUJPO);
BVUP Y = HFU3FTQPOTF!JOU(" Y");
BVUP Z = HFU3FTQPOTF!JOU(" Z");
SFUVSO 1PJOU(Y, Z);
^
+JO@ OC<O OC@ NK@>D<GDU<ODJI O<F@N <?Q<IO<B@ JA OC@ B@I@M<G ?@ADIDODJI JA HFU3FTQPOTF() OJ
M@<? ORJ JOU Q<GP@N OJ =@ PN@? <N OC@ Q<GP@N JA OC@ Y <I? Z H@H=@MN.
&INO@<? JA DINO<IOD<ODIB OC@ O@HKG<O@ DON@GA, IJR OC@ >JHKDG@M PN@N OC@ NK@>D<GDU<ODJI <=JQ@
RC@I@Q@M HFU3FTQPOTF() DN ><GG@? AJM OC@ 1PJOU OTK@:
BVUP DFOUFS = HFU3FTQPOTF!1PJOU("8IFSF JT UIF DFOUFS");
ANNPHDIB OC<O OC@ PN@M @IO@MN 11 <I? 22:
8IFSF JT UIF DFOUFS (1PJOU)
Y (JOU): 11
Z (JOU): 22
1C@ HFU3FTQPOTF!JOU() ><GGN <M@ ?DM@>O@? OJ OC@ B@I@M<G ?@ADIDODJI JA OC@ O@HKG<O@ <I? OC@
HFU3FTQPOTF!1PJOU() ><GGN <M@ ?DM@>O@? OJ OC@ 1PJOU NK@>D<GDU<ODJI JA DO.
AN <IJOC@M @S<HKG@, G@O'N >JIND?@M PNDIB OC@ N<H@ O@HKG<O@ RDOC TUSJOH. AN TJP RJPG?
M@H@H=@M AMJH OC@ 0OMDIBN >C<KO@M, SFBEG() RJPG? M@<? <GG JA OC@ >C<M<>O@MN AMJH OC@ DIKPO
<N K<MO JA < NDIBG@ TUSJOH PIODG OC@ @I? JA OC@ DIKPO. #JM OC<O M@<NJI, OC@ ?@A<PGO ?@ADIDODJI JA
HFU3FTQPOTF() RJPG? IJO =@ PN@APG RC@I M@<?DIB TUSJOH M@NKJIN@N:
// 3FBET UIF FOUJSF JOQVU, OPU POMZ UIF OBNF!
BVUP OBNF = HFU3FTQPOTF!TUSJOH("8IBU JT ZPVS OBNF");
)7?B>3F7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
396
4@ ><I KMJQD?@ < O@HKG<O@ NK@>D<GDU<ODJI AJM TUSJOH <N R@GG. 1C@ AJGGJRDIB NK@>D<GDU<ODJI
M@<?N EPNO OC@ >;@7 DINO@<?:
5 HFU3FTQPOTF(5 : TUSJOH)(TUSJOH RVFTUJPO)
\
XSJUFG("%T (TUSJOH): ", RVFTUJPO);
// 3FBE BOE JHOPSF XIJUFTQBDF DIBSBDUFST XIJDI IBWF
// QSFTVNBCMZ CFFO MFGU PWFS GSPN UIF QSFWJPVT VTFS JOQVU
TUSJOH SFTQPOTF;
EP \
SFTQPOTF = DIPNQ(SFBEMO());
^ XIJMF (SFTQPOTF.MFOHUI == 0);
SFUVSO SFTQPOTF;
^
Struct and class templates
66.7
1C@ 1PJOU NOMP>O H<T =@ N@@I <N C<QDIB < GDHDO<ODJI: B@><PN@ DON ORJ H@H=@MN <M@ ?@ADI@?
NK@>DAD><GGT <N JOU, DO ><IIJO M@KM@N@IO AM<>ODJI<G >JJM?DI<O@ Q<GP@N. 1CDN GDHDO<ODJI ><I =@
M@HJQ@? DA OC@ 1PJOU NOMP>O DN ?@ADI@? <N < O@HKG<O@.
)@O'N ADMNO <?? < H@H=@M API>ODJI OC<O M@OPMIN OC@ ?DNO<I>@ OJ <IJOC@M 1PJOU J=E@>O:
JNQPSU TUE.NBUI;
// ...
TUSVDU 1PJOU
\
JOU Y;
JOU Z;
JOU EJTUBODF5P(JO 1PJOU UIBU) DPOTU
\
JNNVUBCMF SFBM Y%JTUBODF = Y - UIBU.Y;
JNNVUBCMF SFBM Z%JTUBODF = Z - UIBU.Z;
JNNVUBCMF EJTUBODF = TRSU((Y%JTUBODF * Y%JTUBODF) +
(Z%JTUBODF * Z%JTUBODF));
SFUVSO DBTU(JOU)EJTUBODF;
^
^
1C<O ?@ADIDODJI JA 1PJOU DN NPDO<=G@ RC@I OC@ M@LPDM@? KM@>DNDJI DN M@G<ODQ@GT GJR: &O ><I
><G>PG<O@ OC@ ?DNO<I>@ =@OR@@I ORJ KJDION <O FDGJH@O@M KM@>DNDJI, @.B. =@OR@@I OC@ >@IO@M <I?
=M<I>C JAAD>@N JA <I JMB<IDU<ODJI:
BVUP DFOUFS = HFU3FTQPOTF!1PJOU("8IFSF JT UIF DFOUFS");
BVUP CSBODI = HFU3FTQPOTF!1PJOU("8IFSF JT UIF CSBODI");
XSJUFMO("%JTUBODF: ", DFOUFS.EJTUBODF5P(CSBODI));
2IAJMOPI<O@GT, 1PJOU DN DI<?@LP<O@ <O CDBC@M KM@>DNDJIN OC<I JOU ><I KMJQD?@.
NOMP>ON <I? >G<NN@N ><I =@ ?@ADI@? <N O@HKG<O@N <N R@GG, =T NK@>DATDIB < O@HKG<O@ K<M<H@O@M
GDNO <AO@M OC@DM I<H@N. #JM @S<HKG@, 1PJOU ><I =@ ?@ADI@? <N < NOMP>O O@HKG<O@ =T KMJQD?DIB <
O@HKG<O@ K<M<H@O@M <I? M@KG<>DIB OC@ JOUN =T OC<O K<M<H@O@M:
TUSVDU 1PJOU(5)
\
)7?B>3F7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
397
5 Y;
5 Z;
5 EJTUBODF5P(JO 1PJOU UIBU) DPOTU
\
JNNVUBCMF SFBM Y%JTUBODF = Y - UIBU.Y;
JNNVUBCMF SFBM Z%JTUBODF = Z - UIBU.Z;
JNNVUBCMF EJTUBODF = TRSU((Y%JTUBODF * Y%JTUBODF) +
(Z%JTUBODF * Z%JTUBODF));
SFUVSO DBTU(5)EJTUBODF;
^
^
0DI>@ NOMP>ON <I? >G<NN@N <M@ IJO API>ODJIN, OC@T ><IIJO =@ ><GG@? RDOC K<M<H@O@MN. 1CDN
H<F@N DO DHKJNND=G@ AJM OC@ >JHKDG@M OJ ?@?P>@ OC@DM O@HKG<O@ K<M<H@O@MN. 1C@ O@HKG<O@
K<M<H@O@M GDNO HPNO <GR<TN =@ NK@>DAD@? AJM NOMP>O <I? >G<NN O@HKG<O@N:
BVUP DFOUFS = 1PJOU!JOU(0, 0);
BVUP CSBODI = 1PJOU!JOU(100, 100);
XSJUFMO("%JTUBODF: ", DFOUFS.EJTUBODF5P(CSBODI));
1C@ ?@ADIDODJIN <=JQ@ H<F@ OC@ >JHKDG@M B@I@M<O@ >J?@ AJM OC@ JOU DINO<IOD<ODJI JA OC@ 1PJOU
O@HKG<O@, RCD>C DN OC@ @LPDQ<G@IO JA DON @<MGD@M IJI-O@HKG<O@ ?@ADIDODJI. %JR@Q@M, IJR DO ><I
=@ PN@? RDOC <IT OTK@. #JM @S<HKG@, RC@I HJM@ KM@>DNDJI DN I@@?@?, RDOC EPVCMF:
BVUP QPJOU1 = 1PJOU!EPVCMF(1.2, 3.4);
BVUP QPJOU2 = 1PJOU!EPVCMF(5.6, 7.8);
XSJUFMO(QPJOU1.EJTUBODF5P(QPJOU2));
AGOCJPBC OC@ O@HKG<O@ DON@GA C<N =@@I ?@ADI@? DI?@K@I?@IOGT JA <IT NK@>DAD> OTK@, DON NDIBG@
?@ADIDODJI H<F@N DO KJNND=G@ OJ M@KM@N@IO KJDION JA Q<MDJPN KM@>DNDJIN.
0DHKGT >JIQ@MODIB 1PJOU OJ < O@HKG<O@ RJPG? ><PN@ >JHKDG<ODJI @MMJMN DI >J?@ OC<O C<N
<GM@<?T =@@I RMDOO@I <>>JM?DIB OJ DON IJI-O@HKG<O@ ?@ADIDODJI. #JM @S<HKG@, IJR OC@ 1PJOU
NK@>D<GDU<ODJI JA HFU3FTQPOTF() ><IIJO =@ >JHKDG@?:
5 HFU3FTQPOTF(5 : 1PJOU)(TUSJOH RVFTUJPO) // j DPNQJMBUJPO &3303
\
XSJUFGMO("%T (1PJOU)", RVFTUJPO);
BVUP Y = HFU3FTQPOTF!JOU(" Y");
BVUP Z = HFU3FTQPOTF!JOU(" Z");
SFUVSO 1PJOU(Y, Z);
^
1C@ M@<NJI AJM OC@ >JHKDG<ODJI @MMJM DN OC<O 1PJOU DON@GA DN IJO < OTK@ <ITHJM@: 1PJOU DN IJR
< EFDG5F F7?B>3F7. ,IGT DINO<IOD<ODJIN JA OC<O O@HKG<O@ RJPG? =@ >JIND?@M@? <N OTK@N. 1C@
AJGGJRDIB >C<IB@N <M@ M@LPDM@? OJ >JMM@>OGT NK@>D<GDU@ HFU3FTQPOTF() AJM <IT DINO<IOD<ODJI JA
1PJOU:
1PJOU!5 HFU3FTQPOTF(5 : 1PJOU!5)(TUSJOH RVFTUJPO) // 2, 1
\
XSJUFGMO("%T (1PJOU!%T)", RVFTUJPO, 5.TUSJOHPG); // 5
BVUP Y = HFU3FTQPOTF!5(" Y"); // 3B
BVUP Z = HFU3FTQPOTF!5(" Z"); // 3C
)7?B>3F7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
398
SFUVSO 1PJOU!5(Y, Z); // 4
^
1. &I JM?@M AJM OCDN O@HKG<O@ NK@>D<GDU<ODJI OJ NPKKJMO <GG DINO<IOD<ODJIN JA 1PJOU, OC@
O@HKG<O@ K<M<H@O@M GDNO HPNO H@IODJI 1PJOU!5. 1CDN NDHKGT H@<IN OC<O OC@
HFU3FTQPOTF() NK@>D<GDU<ODJI DN AJM 1PJOU!5, M@B<M?G@NN JA 5. 1CDN NK@>D<GDU<ODJI RJPG?
H<O>C 1PJOU!JOU, 1PJOU!EPVCMF, @O>.
2. 0DHDG<MGT, OJ M@OPMI OC@ >JMM@>O OTK@ <N OC@ M@NKJIN@, OC@ M@OPMI OTK@ HPNO =@ NK@>DAD@? <N
1PJOU!5 <N R@GG.
3. 0DI>@ OC@ OTK@N JA Y <I? Z H@H=@MN JA 1PJOU!5 <M@ IJR 5, <N JKKJN@? OJ JOU, OC@
H@H=@MN HPNO =@ M@<? =T ><GGDIB HFU3FTQPOTF!5(), IJO HFU3FTQPOTF!JOU(), <N OC@
G<OO@M RJPG? =@ >JMM@>O JIGT AJM 1PJOU!JOU.
4. 0DHDG<M OJ DO@HN 1 <I? 2, OC@ OTK@ JA OC@ M@OPMI Q<GP@ DN 1PJOU!5.
5. 1J KMDIO OC@ I<H@ JA OC@ OTK@ <>>PM<O@GT AJM @Q@MT OTK@, <N DI 1PJOU!JOU, 1PJOU!EPVCMF,
@O>., 5.TUSJOHPG DN PN@?.
Default template parameters
66.8
0JH@ODH@N DO DN >PH=@MNJH@ OJ KMJQD?@ O@HKG<O@ K<M<H@O@M OTK@N @Q@MT ODH@ < O@HKG<O@ DN
PN@?, @NK@>D<GGT RC@I OC<O OTK@ DN <GHJNO <GR<TN < K<MOD>PG<M OTK@. #JM @S<HKG@,
HFU3FTQPOTF() H<T <GHJNO <GR<TN =@ ><GG@? AJM OC@ JOU OTK@ DI OC@ KMJBM<H, <I? JIGT DI <
A@R KG<>@N AJM OC@ EPVCMF OTK@.
&O DN KJNND=G@ OJ NK@>DAT ?@A<PGO OTK@N AJM O@HKG<O@ K<M<H@O@MN, RCD>C <M@ <NNPH@? RC@I OC@
OTK@N <M@ IJO @SKGD>DOGT KMJQD?@?. !@A<PGO K<M<H@O@M OTK@N <M@ NK@>DAD@? <AO@M OC@ = >C<M<>O@M:
5 HFU3FTQPOTF(5 = JOU)(TUSJOH RVFTUJPO)
\
// ...
^
// ...
BVUP BHF = HFU3FTQPOTF("8IBU JT ZPVS BHF");
AN IJ OTK@ C<N =@@I NK@>DAD@? RC@I ><GGDIB HFU3FTQPOTF() <=JQ@, 5 =@>JH@N OC@ ?@A<PGO
OTK@ JOU <I? OC@ ><GG @I?N PK =@DIB OC@ @LPDQ<G@IO JA HFU3FTQPOTF!JOU().
!@A<PGO O@HKG<O@ K<M<H@O@MN ><I =@ NK@>DAD@? AJM NOMP>O <I? >G<NN O@HKG<O@N <N R@GG, =PO DI
OC@DM ><N@ OC@ O@HKG<O@ K<M<H@O@M GDNO HPNO <GR<TN =@ RMDOO@I @Q@I RC@I @HKOT:
TUSVDU 1PJOU(5 = JOU)
\
// ...
^
// ...
1PJOU!() DFOUFS;
0DHDG<M OJ ?@A<PGO API>ODJI K<M<H@O@M Q<GP@N <N R@ C<Q@ N@@I DI OC@ 3<MD<=G@ +PH=@M JA
-<M<H@O@MN >C<KO@M, ?@A<PGO O@HKG<O@ K<M<H@O@MN ><I =@ NK@>DAD@? AJM <GG JA OC@ O@HKG<O@
K<M<H@O@MN JM AJM OC@ >3EF JI@N:
WPJE NZ5FNQMBUF(50, 51 = JOU, 52 = DIBS)()
\
// ...
^
)7?B>3F7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
399
1C@ G<NO ORJ O@HKG<O@ K<M<H@O@MN JA OC<O API>ODJI H<T =@ G@AO PINK@>DAD@? =PO OC@ ADMNO JI@ DN
M@LPDM@?:
NZ5FNQMBUF!TUSJOH();
&I OC<O PN<B@, OC@ N@>JI? <I? OCDM? K<M<H@O@MN <M@ JOU <I? DIBS, M@NK@>ODQ@GT.
Every different template instantiation is a distinct type
66.9
"Q@MT DINO<IOD<ODJI JA < O@HKG<O@ AJM < BDQ@I N@O JA OTK@N DN >JIND?@M@? OJ =@ < ?DNODI>O OTK@.
#JM @S<HKG@, 1PJOU!JOU <I? 1PJOU!EPVCMF <M@ N@K<M<O@ OTK@N:
1PJOU!JOU QPJOU3 = 1PJOU!EPVCMF(0.25, 0.75); // j DPNQJMBUJPO &3303
1CJN@ ?DAA@M@IO OTK@N ><IIJO =@ PN@? DI OC@ <NNDBIH@IO JK@M<ODJI <=JQ@:
&SSPS: DBOOPU JNQMJDJUMZ DPOWFSU FYQSFTTJPO (1PJOU(0.25,0.75))
PG UZQF 1PJOU!(EPVCMF) UP 1PJOU!(JOU)
A compile-time feature
66.10
1@HKG<O@N <M@ @IODM@GT < >JHKDG@-ODH@ A@<OPM@. 1C@ DINO<I>@N JA O@HKG<O@N <M@ B@I@M<O@? =T
OC@ >JHKDG@M <O >JHKDG@ ODH@. 1C@T ><IIJO =@ B@I@M<O@? <O MPI ODH@.
Class template example: stack data structure
66.11
0OMP>O <I? >G<NN O@HKG<O@N <M@ >JHHJIGT PN@? DI OC@ DHKG@H@IO<ODJIN JA ?<O< NOMP>OPM@N.
)@O'N ?@NDBI < NO<>F >JIO<DI@M OC<O RDGG =@ <=G@ OJ >JIO<DI <IT OTK@.
0O<>F DN JI@ JA OC@ NDHKG@NO ?<O< NOMP>OPM@N. &O M@KM@N@ION < >JIO<DI@M RC@M@ @G@H@ION <M@
KG<>@? >JI>@KOP<GGT JI OJK JA @<>C JOC@M <N RJPG? =@ DI < NO<>F JA K<K@MN. +@R @G@H@ION BJ
JI OJK, <I? JIGT OC@ OJKHJNO @G@H@IO DN <>>@NN@?. 4C@I <I @G@H@IO DN M@HJQ@?, DO DN <GR<TN
OC@ OJKHJNO JI@.
&A R@ <GNJ ?@ADI@ < KMJK@MOT OC<O M@OPMIN OC@ OJO<G IPH=@M JA @G@H@ION DI OC@ NO<>F, <GG JA OC@
JK@M<ODJIN JA OCDN ?<O< NOMP>OPM@ RJPG? =@ OC@ AJGGJRDIB:
t A?? @G@H@IO (QVTI())
t /@HJQ@ @G@H@IO (QPQ())
t A>>@NN OC@ OJKHJNO @G@H@IO (.UPQ)
t /@KJMO OC@ IPH=@M JA @G@H@ION (.MFOHUI)
AI <MM<T ><I =@ PN@? OJ NOJM@ OC@ @G@H@ION NP>C OC<O OC@ G<NO @G@H@IO JA OC@ <MM<T RJPG? =@
M@KM@N@IODIB OC@ OJKHJNO @G@H@IO JA OC@ NO<>F. #DI<GGT, DO ><I =@ ?@ADI@? <N < >G<NN O@HKG<O@
OJ =@ <=G@ OJ >JIO<DI @G@H@ION JA <IT OTK@:
DMBTT 4UBDL(5)
\
QSJWBUF:
5<> FMFNFOUT;
QVCMJD:
WPJE QVTI(5 FMFNFOU)
\
)7?B>3F7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
400
FMFNFOUT _= FMFNFOU;
^
WPJE QPQ()
\
--FMFNFOUT.MFOHUI;
^
5 UPQ() DPOTU !QSPQFSUZ
\
SFUVSO FMFNFOUT<$ - 1>;
^
TJ[F@U MFOHUI() DPOTU !QSPQFSUZ
\
SFUVSO FMFNFOUT.MFOHUI;
^
^
AN < ?@NDBI ?@>DNDJI, QVTI() <I? QPQ() <M@ ?@ADI@? <N M@BPG<M H@H=@M API>ODJIN, <I? .UPQ
<I? .MFOHUI <M@ ?@ADI@? <N KMJK@MOD@N =@><PN@ OC@T ><I =@ N@@I <N KMJQD?DIB NDHKG@
DIAJMH<ODJIN <=JPO OC@ NO<>F >JGG@>ODJI.
%@M@ DN < VOJUUFTU =GJ>F AJM OCDN >G<NN OC<O PN@N DON JOU DINO<IOD<ODJI:
VOJUUFTU
\
BVUP TUBDL = OFX 4UBDL!JOU;
// 5IF OFXMZ BEEFE FMFNFOU NVTU BQQFBS PO UPQ
TUBDL.QVTI(42);
BTTFSU(TUBDL.UPQ == 42);
BTTFSU(TUBDL.MFOHUI == 1);
// .UPQ BOE .MFOHUI TIPVME OPU BGGFDU UIF FMFNFOUT
BTTFSU(TUBDL.UPQ == 42);
BTTFSU(TUBDL.MFOHUI == 1);
// 5IF OFXMZ BEEFE FMFNFOU NVTU BQQFBS PO UPQ
TUBDL.QVTI(100);
BTTFSU(TUBDL.UPQ == 100);
BTTFSU(TUBDL.MFOHUI == 2);
// 3FNPWJOH UIF MBTU FMFNFOU NVTU FYQPTF UIF QSFWJPVT POF
TUBDL.QPQ();
BTTFSU(TUBDL.UPQ == 42);
BTTFSU(TUBDL.MFOHUI == 1);
// 5IF TUBDL NVTU CFDPNF FNQUZ XIFO UIF MBTU FMFNFOU JT
// SFNPWFE
TUBDL.QPQ();
BTTFSU(TUBDL.MFOHUI == 0);
^
1J O<F@ <?Q<IO<B@ JA OCDN >G<NN O@HKG<O@, G@O'N OMT PNDIB DO OCDN ODH@ RDOC < PN@M-?@ADI@? OTK@.
AN <I @S<HKG@, C@M@ DN < HJ?DAD@? Q@MNDJI JA 1PJOU:
TUSVDU 1PJOU(5)
\
5 Y;
5 Z;
TUSJOH UP4USJOH() DPOTU
\
SFUVSO GPSNBU("(%T,%T)", Y, Z);
^
^
)7?B>3F7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
401
A 4UBDL OC<O >JIO<DIN @G@H@ION JA OTK@ 1PJOU!EPVCMF ><I =@ ?@ADI@? GDF@ OC@ AJGGJRDIB:
BVUP QPJOUT = OFX 4UBDL!(1PJOU!EPVCMF);
%@M@ DN < O@NO KMJBM<H OC<O ADMNO <??N O@I @G@H@ION OJ OCDN NO<>F <I? OC@I M@HJQ@N OC@H JI@
=T JI@:
JNQPSU TUE.TUSJOH;
JNQPSU TUE.TUEJP;
JNQPSU TUE.SBOEPN;
TUSVDU 1PJOU(5)
\
5 Y;
5 Z;
TUSJOH UP4USJOH() DPOTU
\
SFUVSO GPSNBU("(%T,%T)", Y, Z);
^
^
// 3FUVSOT B SBOEPN WBMVF CFUXFFO -0.50 BOE 0.50.
EPVCMF SBOEPN@EPVCMF()
PVU (SFTVMU)
\
BTTFSU((SFTVMU >= -0.50) && (SFTVMU < 0.50));
^
CPEZ
\
SFUVSO (DBTU(EPVCMF)VOJGPSN(0, 100) - 50) / 100;
^
// 3FUVSOT B 4UBDL UIBU DPOUBJOT 'DPVOU' OVNCFS PG SBOEPN
// 1PJOU!EPVCMF FMFNFOUT.
4UBDL!(1PJOU!EPVCMF) SBOEPN1PJOUT(TJ[F@U DPVOU)
PVU (SFTVMU)
\
BTTFSU(SFTVMU.MFOHUI == DPVOU);
^
CPEZ
\
BVUP QPJOUT = OFX 4UBDL!(1PJOU!EPVCMF);
GPSFBDI (J; 0 .. DPVOU) \
JNNVUBCMF QPJOU = 1PJOU!EPVCMF(SBOEPN@EPVCMF(),
SBOEPN@EPVCMF());
XSJUFMO("BEEJOH : ", QPJOU);
QPJOUT.QVTI(QPJOU);
^
SFUVSO QPJOUT;
^
WPJE NBJO()
\
BVUP TUBDLFE1PJOUT = SBOEPN1PJOUT(10);
XIJMF (TUBDLFE1PJOUT.MFOHUI) \
XSJUFMO("SFNPWJOH: ", TUBDLFE1PJOUT.UPQ);
TUBDLFE1PJOUT.QPQ();
^
^
AN OC@ JPOKPO JA OC@ KMJBM<H NCJRN, OC@ @G@H@ION <M@ M@HJQ@? DI OC@ M@Q@MN@ JM?@M <N OC@T
C<Q@ =@@I <??@?:
)7?B>3F7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
402
BEEJOH : (-0.02,-0.01)
BEEJOH : (0.17,-0.5)
BEEJOH : (0.12,0.23)
BEEJOH : (-0.05,-0.47)
BEEJOH : (-0.19,-0.11)
BEEJOH : (0.42,-0.32)
BEEJOH : (0.48,-0.49)
BEEJOH : (0.35,0.38)
BEEJOH : (-0.2,-0.32)
BEEJOH : (0.34,0.27)
SFNPWJOH: (0.34,0.27)
SFNPWJOH: (-0.2,-0.32)
SFNPWJOH: (0.35,0.38)
SFNPWJOH: (0.48,-0.49)
SFNPWJOH: (0.42,-0.32)
SFNPWJOH: (-0.19,-0.11)
SFNPWJOH: (-0.05,-0.47)
SFNPWJOH: (0.12,0.23)
SFNPWJOH: (0.17,-0.5)
SFNPWJOH: (-0.02,-0.01)
Function template example: binary search algorithm
66.12
BDI<MT N@<M>C DN OC@ A<NO@NO <GBJMDOCH OJ N@<M>C AJM <I @G@H@IO <HJIB OC@ @G@H@ION JA <I
<GM@<?T NJMO@? <MM<T. &O DN < Q@MT NDHKG@ <GBJMDOCH: 1C@ @G@H@IO DI OC@ HD??G@ DN >JIND?@M@?; DA
OC<O @G@H@IO DN OC@ JI@ OC<O C<N =@@I NJPBCO, OC@I OC@ N@<M>C DN JQ@M. &A IJO, OC@I OC@
<GBJMDOCH DN M@K@<O@? JI OC@ @G@H@ION OC<O <M@ @DOC@M JI OC@ G@AO-C<I? ND?@ JM JI OC@ MDBCO-
C<I? ND?@ JA OC@ HD??G@ @G@H@IO, ?@K@I?DIB JI RC@OC@M OC@ NJPBCO @G@H@IO DN BM@<O@M JM G@NN
OC<I OC@ HD??G@ @G@H@IO.
AGBJMDOCHN OC<O M@K@<O OC@HN@GQ@N JI < NH<GG@M M<IB@ JA OC@ DIDOD<G @G@H@ION <M@ M@>PMNDQ@.
)@O'N RMDO@ OC@ =DI<MT N@<M>C <GBJMDOCH M@>PMNDQ@GT =T ><GGDIB DON@GA.
B@AJM@ >JIQ@MODIB DO OJ < O@HKG<O@, G@O'N ADMNO RMDO@ OCDN API>ODJI OJ NPKKJMO JIGT <MM<TN JA JOU.
4@ ><I @<NDGT >JIQ@MO DO OJ < O@HKG<O@ G<O@M, =T <??DIB < O@HKG<O@ K<M<H@O@M GDNO <I?
M@KG<>DIB <KKMJKMD<O@ JOUN DI DON ?@ADIDODJI =T 5N. %@M@ DN < =DI<MT N@<M>C <GBJMDOCH OC<O
RJMFN JI <MM<TN JA JOU:
/*
* 5IJT GVODUJPO SFUVSOT UIF JOEFY PG UIF WBMVF JG JU FYJTUT
* JO UIF BSSBZ, TJ[F@U.NBY PUIFSXJTF.
*/
TJ[F@U CJOBSZ4FBSDI(DPOTU JOU<> WBMVFT, JO JOU WBMVF)
\
// 5IF WBMVF JT OPU JO UIF BSSBZ JG UIF BSSBZ JT FNQUZ.
JG (WBMVFT.MFOHUI == 0) \
SFUVSO TJ[F@U.NBY;
^
JNNVUBCMF NJE1PJOU = WBMVFT.MFOHUI / 2;
JG (WBMVF == WBMVFT<NJE1PJOU>) \
// 'PVOE.
SFUVSO NJE1PJOU;
^ FMTF JG (WBMVF < WBMVFT<NJE1PJOU>) \
// 5IF WBMVF DBO POMZ CF JO UIF MFGU-IBOE TJEF; MFU'T
)7?B>3F7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
403
// TFBSDI JO B TMJDF UIBU SFQSFTFOUT UIBU IBMG.
SFUVSO CJOBSZ4FBSDI(WBMVFT<0 .. NJE1PJOU>, WBMVF);
^ FMTF \
// 5IF WBMVF DBO POMZ CF JO UIF SJHIU-IBOE TJEF; MFU'T
// TFBSDI JO UIF SJHIU-IBOE TJEF.
BVUP JOEFY =
CJOBSZ4FBSDI(WBMVFT<NJE1PJOU + 1 .. $>, WBMVF);
JG (JOEFY != TJ[F@U.NBY) \
// "EKVTU UIF JOEFY; JU JT 0-CBTFE JO UIF
// SJHIU-IBOE TJEF TMJDF.
JOEFY += NJE1PJOU + 1;
^
SFUVSO JOEFY;
^
BTTFSU(GBMTF, "8F TIPVME IBWF OFWFS HPUUFO UP UIJT MJOF");
^
1C@ API>ODJI <=JQ@ DHKG@H@ION OCDN NDHKG@ <GBJMDOCH DI AJPM NO@KN:
t &A OC@ <MM<T DN @HKOT, M@OPMI TJ[F@U.NBY OJ DI?D><O@ OC<O OC@ Q<GP@ C<N IJO =@@I AJPI?.
t &A OC@ @G@H@IO <O OC@ HD?-KJDIO DN @LP<G OJ OC@ NJPBCO Q<GP@, OC@I M@OPMI OC@ DI?@S JA OC<O
@G@H@IO.
t &A OC@ Q<GP@ DN G@NN OC<I OC@ @G@H@IO <O OC@ HD?-KJDIO, OC@I M@K@<O OC@ N<H@ <GBJMDOCH JI
OC@ G@AO-C<I? ND?@.
t "GN@, M@K@<O OC@ N<H@ <GBJMDOCH JI OC@ MDBCO-C<I? ND?@.
%@M@ DN < PIDOO@NO =GJ>F OC<O O@NON OC@ API>ODJI:
VOJUUFTU
\
BVUP BSSBZ = < 1, 2, 3, 5 >;
BTTFSU(CJOBSZ4FBSDI(BSSBZ, 0) == TJ[F@U.NBY);
BTTFSU(CJOBSZ4FBSDI(BSSBZ, 1) == 0);
BTTFSU(CJOBSZ4FBSDI(BSSBZ, 4) == TJ[F@U.NBY);
BTTFSU(CJOBSZ4FBSDI(BSSBZ, 5) == 3);
BTTFSU(CJOBSZ4FBSDI(BSSBZ, 6) == TJ[F@U.NBY);
^
+JR OC<O OC@ API>ODJI C<N =@@I DHKG@H@IO@? <I? O@NO@? AJM JOU, R@ ><I >JIQ@MO DO OJ <
O@HKG<O@. JOU <KK@<MN JIGT DI ORJ KG<>@N DI OC@ ?@ADIDODJI JA OC@ O@HKG<O@:
TJ[F@U CJOBSZ4FBSDI(DPOTU JOU<> WBMVFT, JO JOU WBMVF)
\
// ... JOU EPFT OPU BQQFBS IFSF ...
^
1C@ JOUN OC<O <KK@<M DI OC@ K<M<H@O@M GDNO <M@ OC@ OTK@N JA OC@ @G@H@ION <I? OC@ Q<GP@.
0K@>DATDIB OCJN@ <N O@HKG<O@ K<M<H@O@MN DN NPAAD>D@IO OJ H<F@ OCDN <GBJMDOCH < O@HKG<O@ <I?
OJ =@ PN<=G@ RDOC JOC@M OTK@N <N R@GG:
TJ[F@U CJOBSZ4FBSDI(5)(DPOTU 5<> WBMVFT, JO 5 WBMVF)
\
// ...
^
1C<O API>ODJI O@HKG<O@ ><I =@ PN@? RDOC <IT OTK@ OC<O H<O>C@N OC@ JK@M<ODJIN OC<O <M@
<KKGD@? OJ OC<O OTK@ DI OC@ O@HKG<O@. &I CJOBSZ4FBSDI(), OC@ @G@H@ION <M@ PN@? JIGT RDOC
>JHK<MDNJI JK@M<OJMN == <I? <:
)7?B>3F7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
404
JG (WBMVF == WBMVFT<NJE1PJOU>) \
// ...
^ FMTF JG (WBMVF < WBMVFT<NJE1PJOU>) \
// ...
#JM OC<O M@<NJI, 1PJOU DN IJO M@<?T OJ =@ PN@? RDOC CJOBSZ4FBSDI() T@O:
TUSVDU 1PJOU(5)
\
5 Y;
5 Z;
TUSJOH UP4USJOH() DPOTU
\
SFUVSO GPSNBU("(%T,%T)", Y, Z);
^
^
WPJE NBJO()
\
1PJOU!JOU<> QPJOUT;
GPSFBDI (J; 0 .. 15) \
QPJOUT _= 1PJOU!JOU(J, J);
^
BTTFSU(CJOBSZ4FBSDI(QPJOUT, 1PJOU!JOU(10, 10)) == 10);
^
1C@ KMJBM<H <=JQ@ RJPG? ><PN@ < >JHKDG<ODJI @MMJM:
&SSPS: OFFE NFNCFS GVODUJPO PQ$NQ() GPS TUSVDU
DPOTU(1PJOU!(JOU)) UP DPNQBSF
A>>JM?DIB OJ OC@ @MMJM H@NN<B@, PQ$NQ() I@@?N OJ =@ ?@ADI@? AJM 1PJOU. PQ$NQ() C<N =@@I
>JQ@M@? DI OC@ ,K@M<OJM ,Q@MGJ<?DIB >C<KO@M:
TUSVDU 1PJOU(5)
\
// ...
JOU PQ$NQ(DPOTU SFG 1PJOU UIBU) DPOTU
\
SFUVSO (Y == UIBU.Y
Z - UIBU.Z
: Y - UIBU.Y);
^
^
Summary
66.13
4@ RDGG N@@ JOC@M A@<OPM@N JA O@HKG<O@N DI < G<O@M >C<KO@M. #JM < >JHKG@O@ M@A@M@I>@ JI !
O@HKG<O@N, N@@ -CDGDKK@ 0DB<P?'N D )7?B>3F7E: A )GFAD;3>. 1C@ AJGGJRDIB <M@ RC<O R@ C<Q@
>JQ@M@? DI OCDN >C<KO@M:
t 1@HKG<O@N ?@ADI@ OC@ >J?@ <N < K<OO@MI, AJM OC@ >JHKDG@M OJ B@I@M<O@ DINO<I>@N JA DO
<>>JM?DIB OJ OC@ <>OP<G PN@N DI OC@ KMJBM<H.
t 1@HKG<O@N <M@ < >JHKDG@-ODH@ A@<OPM@.
t 0K@>DATDIB O@HKG<O@ K<M<H@O@M GDNON DN NPAAD>D@IO OJ H<F@ API>ODJI, NOMP>O, <I? >G<NN
?@ADIDODJIN O@HKG<O@N.
)7?B>3F7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
405
WPJE GVODUJPO5FNQMBUF(5)(5 GVODUJPO1BSBNFUFS)
\
// ...
^
DMBTT $MBTT5FNQMBUF(5)
\
// ...
^
t 1@HKG<O@ <MBPH@ION ><I =@ NK@>DAD@? @SKGD>DOGT <AO@M <I @S>G<H<ODJI H<MF. 1C@ K<M@IO@N@N
<M@ IJO I@>@NN<MT RC@I OC@M@ DN JIGT JI@ OJF@I DIND?@ OC@ K<M@IO@N@N.
BVUP PCKFDU1 = OFX $MBTT5FNQMBUF!(EPVCMF);
BVUP PCKFDU2 = OFX $MBTT5FNQMBUF!EPVCMF; // TBNF UIJOH
t "Q@MT ?DAA@M@IO DINO<IOD<ODJI JA < O@HKG<O@ DN < ?DAA@M@IO OTK@.
BTTFSU(UZQFJE($MBTT5FNQMBUF!JOU) !=
UZQFJE($MBTT5FNQMBUF!VJOU));
t 1@HKG<O@ <MBPH@ION ><I JIGT =@ ?@?P>@? AJM API>ODJI O@HKG<O@N.
GVODUJPO5FNQMBUF(42); // GVODUJPO5FNQMBUF!JOU(42) JT EFEVDFE
t 1@HKG<O@N ><I =@ NK@>D<GDU@? AJM OC@ OTK@ OC<O DN <AO@M OC@ : >C<M<>O@M.
DMBTT $MBTT5FNQMBUF(5 : EDIBS)
\
// ...
^
t !@A<PGO O@HKG<O@ <MBPH@ION <M@ NK@>DAD@? <AO@M OC@ = >C<M<>O@M.
WPJE GVODUJPO5FNQMBUF(5 = MPOH)(5 GVODUJPO1BSBNFUFS)
\
// ...
^
)7?B>3F7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
406
BMJBT 67
1C@ BMJBT F@TRJM? <NNDBIN <GD<N@N OJ @SDNODIB I<H@N.
BMJBT NCJPG? IJO =@ >JIAPN@? RDOC BMJBT UIJT.
Shortening a long name 67.0.1
AN R@ C<Q@ @I>JPIO@M@? DI OC@ KM@QDJPN >C<KO@M, NJH@ I<H@N H<T =@>JH@ OJJ GJIB OJ =@
>JIQ@ID@IO. )@O'N >JIND?@M OC@ AJGGJRDIB API>ODJI AMJH OC<O >C<KO@M:
4UBDL!(1PJOU!EPVCMF) SBOEPN1PJOUT(TJ[F@U DPVOU)
\
BVUP QPJOUT = OFX 4UBDL!(1PJOU!EPVCMF);
// ...
^
%<QDIB OJ OTK@ 4UBDL!(1PJOU!EPVCMF) @SKGD>DOGT DI HPGODKG@ KG<>@N DI OC@ KMJBM<H C<N <
IPH=@M JA ?M<R=<>FN:
t )JIB@M I<H@N ><I H<F@ OC@ >J?@ C<M?@M OJ M@<?.
t &O DN PII@>@NN<MT OJ =@ M@HDI?@? <O @Q@MT KJDIO OC<O OC@ OTK@ DN OC@ 4UBDL ?<O< NOMP>OPM@
OC<O >JIO<DIN J=E@>ON JA OC@ EPVCMF DINO<IOD<ODJIN JA OC@ 1PJOU NOMP>O O@HKG<O@.
t &A OC@ M@LPDM@H@ION JA OC@ KMJBM<H >C<IB@ <I? @.B. EPVCMF I@@?N OJ =@ >C<IB@? OJ SFBM,
OCDN >C<IB@ HPNO =@ ><MMD@? JPO DI HPGODKG@ KG<>@N.
1C@N@ ?M<R=<>FN ><I =@ @GDHDI<O@? =T BDQDIB < I@R I<H@ OJ 4UBDL!(1PJOU!EPVCMF):
BMJBT 1PJOUT = 4UBDL!(1PJOU!EPVCMF);
// ...
1PJOUT SBOEPN1PJOUT(TJ[F@U DPVOU)
\
BVUP QPJOUT = OFX 1PJOUT;
// ...
^
&O H<T H<F@ N@IN@ OJ BJ APMOC@M <I? ?@ADI@ ORJ <GD<N@N, JI@ O<FDIB <?Q<IO<B@ JA OC@ JOC@M:
BMJBT 1SFDJTF1PJOU = 1PJOU!EPVCMF;
BMJBT 1PJOUT = 4UBDL!1SFDJTF1PJOU;
1C@ NTIO<S JA BMJBT DN OC@ AJGGJRDIB:
BMJBT new_name = existing_name;
AAO@M OC<O ?@ADIDODJI, OC@ I@R I<H@ <I? OC@ @SDNODIB I<H@ =@>JH@ NTIJITHJPN: 1C@T H@<I
OC@ N<H@ OCDIB DI OC@ KMJBM<H.
6JP H<T @I>JPIO@M OC@ JG?@M NTIO<S JA OCDN A@<OPM@ DI NJH@ KMJBM<HN:
// 6TF PG PME TZOUBY JT EJTDPVSBHFE:
BMJBT existing_name new_name;
BMJBT DN <GNJ PN@APG RC@I NCJMO@IDIB I<H@N RCD>C JOC@MRDN@ I@@? OJ =@ NK@GG@? JPO <GJIB
RDOC OC@DM HJ?PG@ I<H@N. )@O'N <NNPH@ OC<O OC@ I<H@ 2VFFO <KK@<MN DI ORJ N@K<M<O@
3>;3E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
407
HJ?PG@N: DIFTT <I? QBMBDF. 4C@I =JOC HJ?PG@N <M@ DHKJMO@?, OTKDIB H@M@GT 2VFFO RJPG?
><PN@ < >JHKDG<ODJI @MMJM:
JNQPSU DIFTT;
JNQPSU QBMBDF;
// ...
2VFFO QFSTPO; // j DPNQJMBUJPO &3303
1C@ >JHKDG@M ><IIJO ?@>D?@ RCD>C 2VFFO C<N =@@I H@<IO:
&SSPS: DIFTT.2VFFO BU DIFTT.E(1) DPOGMJDUT XJUI
QBMBDF.2VFFO BU QBMBDF.E(1)
A >JIQ@ID@IO R<T JA M@NJGQDIB OCDN >JIAGD>O DN OJ <NNDBI <GD<N@N OJ JI@ JM HJM@ JA OC@ I<H@N:
BMJBT 1BMBDF2VFFO = QBMBDF.2VFFO;
WPJE NBJO()
\
1BMBDF2VFFO QFSTPO;
// ...
1BMBDF2VFFO BOPUIFS1FSTPO;
^
BMJBT RJMFN RDOC JOC@M I<H@N <N R@GG. 1C@ AJGGJRDIB >J?@ BDQ@N < I@R I<H@ OJ < Q<MD<=G@:
JOU WBSJBCMF8JUI"-POH/BNF = 42;
BMJBT WBS = WBSJBCMF8JUI"-POH/BNF;
WBS = 43;
BTTFSU(WBSJBCMF8JUI"-POH/BNF == 43);
Design flexibility 67.0.2
#JM AG@SD=DGDOT, @Q@I API?<H@IO<G OTK@N GDF@ JOU ><I C<Q@ <GD<N@N:
BMJBT $VTUPNFS/VNCFS = JOU;
BMJBT $PNQBOZ/BNF = TUSJOH;
// ...
TUSVDU $VTUPNFS
\
$VTUPNFS/VNCFS OVNCFS;
$PNQBOZ/BNF DPNQBOZ;
// ...
^
&A OC@ PN@MN JA OCDN NOMP>O <GR<TN OTK@ $VTUPNFS/VNCFS <I? $PNQBOZ/BNF DINO@<? JA JOU <I?
TUSJOH, OC@I OC@ ?@NDBI ><I =@ >C<IB@? DI OC@ APOPM@ OJ NJH@ @SO@IO, RDOCJPO <AA@>ODIB PN@M
>J?@.
1CDN C@GKN RDOC OC@ M@<?<=DGDOT JA >J?@ <N R@GG. %<QDIB OC@ OTK@ JA < Q<MD<=G@ <N
$VTUPNFS/VNCFS >JIQ@TN HJM@ DIAJMH<ODJI <=JPO OC@ H@<IDIB JA OC<O Q<MD<=G@ OC<I JOU.
0JH@ODH@N NP>C OTK@ <GD<N@N <M@ ?@ADI@? DIND?@ NOMP>ON <I? >G<NN@N <I? =@>JH@ K<MON JA OC@
DIO@MA<>@N JA OCJN@ OTK@N. 1C@ AJGGJRDIB >G<NN C<N < XFJHIU KMJK@MOT:
3>;3E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
408
DMBTT #PY
\
QSJWBUF:
EPVCMF XFJHIU@;
QVCMJD:
EPVCMF XFJHIU() DPOTU !QSPQFSUZ
\
SFUVSO XFJHIU@;
^
// ...
^
B@><PN@ OC@ H@H=@M Q<MD<=G@ <I? OC@ KMJK@MOT JA OC<O >G<NN DN ?@ADI@? <N EPVCMF, OC@ PN@MN
RJPG? C<Q@ OJ PN@ EPVCMF <N R@GG:
EPVCMF UPUBM8FJHIU = 0;
GPSFBDI (CPY; CPYFT) \
UPUBM8FJHIU += CPY.XFJHIU;
^
)@O'N >JHK<M@ DO OJ <IJOC@M ?@NDBI RC@M@ OC@ OTK@ JA XFJHIU DN ?@ADI@? <N <I BMJBT:
DMBTT #PY
\
QSJWBUF:
8FJHIU XFJHIU@;
QVCMJD:
BMJBT 8FJHIU = EPVCMF;
8FJHIU XFJHIU() DPOTU !QSPQFSUZ
\
SFUVSO XFJHIU@;
^
// ...
^
+JR OC@ PN@M >J?@ RJPG? IJMH<GGT PN@ 8FJHIU <N R@GG:
#PY.8FJHIU UPUBM8FJHIU = 0;
GPSFBDI (CPY; CPYFT) \
UPUBM8FJHIU += CPY.XFJHIU;
^
4DOC OCDN ?@NDBI, >C<IBDIB OC@ <>OP<G OTK@ JA 8FJHIU DI OC@ APOPM@ RJPG? IJO <AA@>O PN@M >J?@.
(1C<O DN, DA OC@ I@R OTK@ NPKKJMON OC@ += JK@M<OJM <N R@GG.)
Revealing hidden names of superclasses 67.0.3
4C@I OC@ N<H@ I<H@ <KK@<MN =JOC DI OC@ NPK@M>G<NN <I? DI OC@ NP=>G<NN, OC@ H<O>CDIB
I<H@N OC<O <M@ DI OC@ NPK@M>G<NN <M@ CD??@I. "Q@I < NDIBG@ I<H@ DI OC@ NP=>G<NN DN NPAAD>D@IO
OJ CD?@ <GG JA OC@ I<H@N JA OC@ NPK@M>G<NN OC<O H<O>C OC<O I<H@:
3>;3E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
409
DMBTT 4VQFS
\
WPJE GPP(JOU Y)
\
// ...
^
^
DMBTT 4VC : 4VQFS
\
WPJE GPP()
\
// ...
^
^
WPJE NBJO()
\
BVUP PCKFDU = OFX 4VC;
PCKFDU.GPP(42); // j DPNQJMBUJPO &3303
^
0DI>@ OC@ <MBPH@IO DN 42, <I JOU Q<GP@, JI@ HDBCO @SK@>O OC<O OC@ 4VQFS.GPP API>ODJI OC<O
O<F@N <I JOU RJPG? =@ ><GG@? AJM OC<O PN@. %JR@Q@M, @Q@I OCJPBC OC@DM K<M<H@O@M GDNON <M@
?DAA@M@IO, 4VC.GPP :;67E 4VQFS.GPP <I? ><PN@N < >JHKDG<ODJI @MMJM. 1C@ >JHKDG@M ?DNM@B<M?N
4VQFS.GPP <GOJB@OC@M <I? M@KJMON OC<O 4VC.GPP ><IIJO =@ ><GG@? =T <I JOU:
&SSPS: GVODUJPO EFOFNF.4VC.GPP () JT OPU DBMMBCMF
VTJOH BSHVNFOU UZQFT (JOU)
+JO@ OC<O OCDN DN IJO OC@ N<H@ <N JQ@MMD?DIB < API>ODJI JA OC@ NPK@M>G<NN. #JM OC<O, OC@
API>ODJI NDBI<OPM@N RJPG? =@ OC@ N<H@ <I? OC@ API>ODJI RJPG? =@ JQ@MMD??@I =T OC@
PWFSSJEF F@TRJM?. (1C@ PWFSSJEF F@TRJM? C<N =@@I @SKG<DI@? DI OC@ &IC@MDO<I>@ >C<KO@M.)
%@M@, IJO JQ@MMD?DIB, =PO < G<IBP<B@ A@<OPM@ ><GG@? @3?7 :;6;@9 DN DI @AA@>O. &A OC@M@ R@M@ IJO
I<H@ CD?DIB, API>ODJIN OC<O C<KK@I OJ C<Q@ OC@ N<H@ I<H@ GPP OC<O <M@ <??@? OJ JM M@HJQ@?
AMJH OC@N@ >G<NN@N HDBCO NDG@IOGT >C<IB@ OC@ API>ODJI OC<O RJPG? B@O ><GG@?. +<H@ CD?DIB
KM@Q@ION NP>C NPMKMDN@N. &O DN < A@<OPM@ JA JOC@M ,,- G<IBP<B@N <N R@GG.
BMJBT ><I M@Q@<G OC@ CD??@I I<H@N RC@I ?@NDM@?:
DMBTT 4VQFS
\
WPJE GPP(JOU Y)
\
// ...
^
^
DMBTT 4VC : 4VQFS
\
WPJE GPP()
\
// ...
^
BMJBT GPP = 4VQFS.GPP;
^
1C@ BMJBT <=JQ@ =MDIBN OC@ GPP I<H@N AMJH OC@ NPK@M>G<NN DIOJ OC@ NP=>G<NN DIO@MA<>@. AN <
M@NPGO, OC@ >J?@ IJR >JHKDG@N <I? 4VQFS.GPP B@ON ><GG@?.
4C@I DO DN HJM@ <KKMJKMD<O@, DO DN KJNND=G@ OJ =MDIB OC@ I<H@N PI?@M < ?DAA@M@IO I<H@ <N R@GG:
3>;3E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
410
BMJBT HFOFSBM'PP = 4VQFS.GPP;
// ...
WPJE NBJO()
\
BVUP PCKFDU = OFX 4VC;
PCKFDU.HFOFSBM'PP(42);
^
+<H@ CD?DIB <AA@>ON H@H=@M Q<MD<=G@N <N R@GG. BMJBT ><I =MDIB OCJN@ I<H@N OJ OC@ NP=>G<NN
DIO@MA<>@ <N R@GG:
DMBTT 4VQFS
\
JOU DJUZ;
^
DMBTT 4VC : 4VQFS
\
TUSJOH DJUZ() DPOTU !QSPQFSUZ
\
SFUVSO ",BZTFSJ";
^
^
/@B<M?G@NN JA JI@ =@DIB < H@H=@M Q<MD<=G@ <I? OC@ JOC@M < H@H=@M API>ODJI, OC@ I<H@ DJUZ
JA OC@ NP=>G<NN CD?@N OC@ I<H@ DJUZ JA OC@ NPK@M>G<NN:
WPJE NBJO()
\
BVUP PCKFDU = OFX 4VC;
PCKFDU.DJUZ = 42; // j DPNQJMBUJPO &3303
^
0DHDG<MGT, OC@ I<H@N JA OC@ H@H=@M Q<MD<=G@N JA OC@ NPK@M>G<NN ><I =@ =MJPBCO OJ OC@
NP=>G<NN DIO@MA<>@ =T BMJBT, KJNND=GT PI?@M < ?DAA@M@IO I<H@:
DMBTT 4VQFS
\
JOU DJUZ;
^
DMBTT 4VC : 4VQFS
\
TUSJOH DJUZ() DPOTU !QSPQFSUZ
\
SFUVSO ",BZTFSJ";
^
BMJBT DJUZ$PEF = 4VQFS.DJUZ;
^
WPJE NBJO()
\
BVUP PCKFDU = OFX 4VC;
PCKFDU.DJUZ$PEF = 42;
^
3>;3E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
411
BMJBT UIJT 68
4@ C<Q@ N@@I OC@ DI?DQD?P<G H@<IDIBN JA OC@ BMJBT <I? OC@ UIJT F@TRJM?N DI KM@QDJPN
>C<KO@MN. 1C@N@ ORJ F@TRJM?N C<Q@ < >JHKG@O@GT ?DAA@M@IO H@<IDIB RC@I PN@? OJB@OC@M <N
BMJBT UIJT.
BMJBT UIJT @I<=G@N 3GFA?3F;5 FKB7 5A@H7DE;A@E (<GNJ FIJRI <N ;?B>;5;F FKB7 5A@H7DE;A@E) JA
PN@M-?@ADI@? OTK@N. AN R@ C<Q@ N@@I DI OC@ ,K@M<OJM ,Q@MGJ<?DIB >C<KO@M, <IJOC@M R<T JA
KMJQD?DIB OTK@ >JIQ@MNDJIN AJM < OTK@ DN =T ?@ADIDIB PQ$BTU AJM OC<O OTK@. 1C@ ?DAA@M@I>@ DN
OC<O, RCDG@ PQ$BTU DN AJM @SKGD>DO OTK@ >JIQ@MNDJIN, BMJBT UIJT DN AJM <POJH<OD> OTK@
>JIQ@MNDJIN.
1C@ F@TRJM?N BMJBT <I? UIJT <M@ RMDOO@I N@K<M<O@GT RC@M@ OC@ I<H@ JA < H@H=@M Q<MD<=G@
JM < H@H=@M API>ODJI DN NK@>DAD@? =@OR@@I OC@H:
BMJBT member_variable_or_member_function UIJT;
BMJBT UIJT @I<=G@N OC@ NK@>DAD> >JIQ@MNDJI AMJH OC@ PN@M-?@ADI@? OTK@ OJ OC@ OTK@ JA OC<O
H@H=@M. 1C@ Q<GP@ JA OC@ H@H=@M =@>JH@N OC@ M@NPGODIB Q<GP@ JA OC@ >JIQ@MNDJI .
1C@ AJGGJRDIB 'SBDUJPO @S<HKG@ PN@N BMJBT UIJT RDOC < ?7?47D 8G@5F;A@. 1C@
5FBDIJOH"TTJTUBOU @S<HKG@ OC<O DN APMOC@M =@GJR RDGG PN@ DO RDOC ?7?47D H3D;34>7E.
0DI>@ OC@ M@OPMI OTK@ JA WBMVF() =@GJR DN EPVCMF, OC@ AJGGJRDIB BMJBT UIJT @I<=G@N
<POJH<OD> >JIQ@MNDJI JA 'SBDUJPO J=E@>ON OJ EPVCMF Q<GP@N:
JNQPSU TUE.TUEJP;
TUSVDU 'SBDUJPO
\
MPOH OVNFSBUPS;
MPOH EFOPNJOBUPS;
EPVCMF WBMVF() DPOTU !QSPQFSUZ
\
SFUVSO DBTU(EPVCMF)OVNFSBUPS / EFOPNJOBUPS;
^
BMJBT WBMVF UIJT;
// ...
^
EPVCMF DBMDVMBUF(EPVCMF MIT, EPVCMF SIT)
\
SFUVSO 2 * MIT + SIT;
^
WPJE NBJO()
\
BVUP GSBDUJPO = 'SBDUJPO(1, 4); // NFBOJOH 14
XSJUFMO(DBMDVMBUF(GSBDUJPO, 0.75));
^
WBMVF() B@ON ><GG@? <POJH<OD><GGT OJ KMJ?P>@ < EPVCMF Q<GP@ RC@I 'SBDUJPO J=E@>ON <KK@<M
DI KG<>@N RC@M@ < EPVCMF Q<GP@ DN @SK@>O@?. 1C<O DN RCT OC@ Q<MD<=G@ GSBDUJPO ><I =@ K<NN@?
OJ DBMDVMBUF() <N <I <MBPH@IO. WBMVF() M@OPMIN 0.25 <N OC@ Q<GP@ JA 14 <I? OC@ KMJBM<H
KMDION OC@ M@NPGO JA 2 * 0.25 + 0.75:
1.25
3>;3E F:;E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
412
Multiple inheritance
68.1
4@ C<Q@ N@@I DI OC@ &IC@MDO<I>@ >C<KO@M OC<O >G<NN@N ><I DIC@MDO AMJH JIGT JI@ DMBTT. (,I
OC@ JOC@M C<I?, OC@M@ DN IJ GDHDO DI OC@ IPH=@M JA JOUFSGBDFN OJ DIC@MDO AMJH.) 0JH@ JOC@M
J=E@>O JMD@IO@? G<IBP<B@N <GGJR DIC@MDODIB AMJH HPGODKG@ >G<NN@N. 1CDN DN ><GG@? ?G>F;B>7
;@:7D;F3@57.
BMJBT UIJT @I<=G@N PNDIB ! >G<NN@N DI ?@NDBIN OC<O >JPG? =@I@ADO AMJH HPGODKG@ DIC@MDO<I>@.
*PGODKG@ BMJBT UIJT ?@>G<M<ODJIN @I<=G@ OTK@N OJ =@ PN@? DI KG<>@N JA HPGODKG@ ?DAA@M@IO
OTK@N.
Note: 6?6 2.062, F:7 5A?B;>7D F:3F ! :3H7 GE76 I:;>7 ID;F;@9 F:;E 5:3BF7D, 3>>AIE A@>K A@7
alias this 675>3D3F;A@.
1C@ AJGGJRDIB 5FBDIJOH"TTJTUBOU >G<NN C<N ORJ H@H=@M Q<MD<=G@N JA OTK@N 4UVEFOU <I?
5FBDIFS. 1C@ BMJBT UIJT ?@>G<M<ODJIN RJPG? <GGJR J=E@>ON JA OCDN OTK@ OJ =@ PN@? DI KG<>@N
JA =JOC 4UVEFOU <I? 5FBDIFS:
JNQPSU TUE.TUEJP;
DMBTT 4UVEFOU
\
TUSJOH OBNF;
VJOU<> HSBEFT;
UIJT(TUSJOH OBNF)
\
UIJT.OBNF = OBNF;
^
^
DMBTT 5FBDIFS
\
TUSJOH OBNF;
TUSJOH TVCKFDU;
UIJT(TUSJOH OBNF, TUSJOH TVCKFDU)
\
UIJT.OBNF = OBNF;
UIJT.TVCKFDU = TVCKFDU;
^
^
DMBTT 5FBDIJOH"TTJTUBOU
\
4UVEFOU TUVEFOU*EFOUJUZ;
5FBDIFS UFBDIFS*EFOUJUZ;
UIJT(TUSJOH OBNF, TUSJOH TVCKFDU)
\
UIJT.TUVEFOU*EFOUJUZ = OFX 4UVEFOU(OBNF);
UIJT.UFBDIFS*EFOUJUZ = OFX 5FBDIFS(OBNF, TVCKFDU);
^
/* 5IF GPMMPXJOH UXP 'BMJBT UIJT' EFDMBSBUJPOT XJMM FOBCMF
* UIJT UZQF UP CF VTFE CPUI BT B 4UVEFOU BOE BT B 5FBDIFS.
*
* /PUF: ENE 2.062 EPFT OPU TVQQPSU NVMUJQMF 'BMJBT UIJT'
* EFDMBSBUJPOT. */
BMJBT UFBDIFS*EFOUJUZ UIJT;
BMJBT TUVEFOU*EFOUJUZ UIJT;
^
WPJE BUUFOE$MBTT(5FBDIFS UFBDIFS, 4UVEFOU<> TUVEFOUT)
JO
\
BTTFSU(UFBDIFS !JT OVMM);
3>;3E F:;E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
413
BTTFSU(TUVEFOUT.MFOHUI > 0);
^
CPEZ
\
XSJUFG("%T JT UFBDIJOH %T UP UIF GPMMPXJOH TUVEFOUT:",
UFBDIFS.OBNF, UFBDIFS.TVCKFDU);
GPSFBDI (TUVEFOU; TUVEFOUT) \
XSJUFG(" %T", TUVEFOU.OBNF);
^
XSJUFMO();
^
WPJE NBJO()
\
BVUP TUVEFOUT = < OFX 4UVEFOU("4IFMMZ"),
OFX 4UVEFOU("4UBO") >;
/* "O PCKFDU UIBU DBO CF VTFE CPUI BT B 5FBDIFS BOE B
* 4UVEFOU: */
BVUP UJN = OFX 5FBDIJOH"TTJTUBOU("5JN", "NBUI");
// 'UJN' JT UIF UFBDIFS JO UIF GPMMPXJOH VTF:
BUUFOE$MBTT(UJN, TUVEFOUT);
// 'UJN' JT POF PG UIF TUVEFOUT JO UIF GPMMPXJOH VTF:
BVUP BNZ = OFX 5FBDIFS(""NZ", "QIZTJDT");
BUUFOE$MBTT(BNZ, TUVEFOUT _ UJN);
^
1C@ JPOKPO JA OC@ KMJBM<H NCJRN OC<O OC@ N<H@ J=E@>O C<N =@@I PN@? <N ORJ ?DAA@M@IO OTK@N:
5JN JT UFBDIJOH NBUI UP UIF GPMMPXJOH TUVEFOUT: 4IFMMZ 4UBO
"NZ JT UFBDIJOH QIZTJDT UP UIF GPMMPXJOH TUVEFOUT: 4IFMMZ 4UBO 5JN
3>;3E F:;E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
414
Pointers 69
-JDIO@MN <M@ Q<MD<=G@N OC<O KMJQD?@ <>>@NN OJ JOC@M Q<MD<=G@N. 1C@ Q<GP@ JA < KJDIO@M DN OC@
<??M@NN JA OC@ Q<MD<=G@ OC<O DO KMJQD?@N <>>@NN OJ.
-JDIO@MN ><I KJDIO <O <IT OTK@ JA Q<MD<=G@, J=E@>O, <I? @Q@I JOC@M KJDIO@MN. &I OCDN >C<KO@M, &
RDGG M@A@M OJ <GG JA OC@N@ NDHKGT <N H3D;34>7E.
-JDIO@MN <M@ GJR G@Q@G A@<OPM@N JA HD>MJKMJ>@NNJMN. 1C@T <M@ <I DHKJMO<IO K<MO JA NTNO@H
KMJBM<HHDIB.
1C@ NTIO<S <I? N@H<IOD>N JA KJDIO@MN DI ! <M@ DIC@MDO@? ?DM@>OGT AMJH . AGOCJPBC KJDIO@MN
<M@ IJOJMDJPNGT OC@ HJNO ?DAAD>PGO A@<OPM@ JA OJ >JHKM@C@I?, OC@T NCJPG? IJO =@ <N ?DAAD>PGO
DI !. 1CDN DN =@><PN@ JOC@M A@<OPM@N JA ! OC<O <M@ N@H<IOD><GGT >GJN@ OJ KJDIO@MN <M@ HJM@
PN@APG DI NDOP<ODJIN RC@M@ KJDIO@MN RJPG? C<Q@ OJ =@ PN@? DI JOC@M G<IBP<B@N. 4C@I OC@ D?@<N
=@CDI? KJDIO@MN <M@ <GM@<?T PI?@MNOJJ? AMJH OCJN@ JOC@M A@<OPM@N JA !, KJDIO@MN NCJPG? =@
@<ND@M OJ BM<NK.
1C@ NCJMO @S<HKG@N OCMJPBCJPO OC@ HJNO JA OCDN >C<KO@M <M@ ?@>D?@?GT NDHKG@. 1C@ KMJBM<HN
<O OC@ @I? JA OC@ >C<KO@M RDGG =@ HJM@ M@<GDNOD>.
1C@ I<H@N GDF@ QUS (NCJMO AJM "KJDIO@M") OC<O & C<Q@ PN@? DI OC@N@ @S<HKG@N NCJPG? IJO =@
>JIND?@M@? <N PN@APG I<H@N DI B@I@M<G. AN <GR<TN, I<H@N HPNO =@ >CJN@I OJ =@ HJM@
H@<IDIBAPG <I? @SKG<I<OJMT DI <>OP<G KMJBM<HN.
The concept of a reference
69.1
AGOCJPBC R@ C<Q@ @I>JPIO@M@? M@A@M@I>@N H<IT ODH@N DI OC@ KM@QDJPN >C<KO@MN, G@O'N
NPHH<MDU@ OCDN >JI>@KO JI@ HJM@ ODH@.
The SFG variables in GPSFBDI loops 69.1.1
AN R@ C<Q@ N@@I DI OC@ GPSFBDI )JJK >C<KO@M, IJMH<GGT OC@ GJJK Q<MD<=G@N <M@ 5AB;7E JA
@G@H@ION:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
JOU<> OVNCFST = < 1, 11, 111 >;
GPSFBDI (OVNCFS; OVNCFST) \
OVNCFS = 0; // j UIF DPQZ DIBOHFT, OPU UIF FMFNFOU
^
XSJUFMO(""GUFS UIF MPPQ: ", OVNCFST);
^
1C@ OVNCFS OC<O B@ON <NNDBI@? 0 @<>C ODH@ DN < >JKT JA JI@ JA OC@ @G@H@ION JA OC@ <MM<T.
*J?DATDIB OC<O >JKT ?J@N IJO HJ?DAT OC@ @G@H@IO:
"GUFS UIF MPPQ: <1, 11, 111>
4C@I OC@ <>OP<G @G@H@ION I@@? OJ =@ HJ?DAD@?, OC@ GPSFBDI Q<MD<=G@ HPNO =@ ?@ADI@? <N SFG:
GPSFBDI (SFG OVNCFS; OVNCFST) \
OVNCFS = 0; // j UIF BDUVBM FMFNFOU DIBOHFT
^
&A;@F7DE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
415
1CDN ODH@ OVNCFS DN < M@A@M@I>@ OJ <I <>OP<G @G@H@IO DI OC@ <MM<T:
"GUFS UIF MPPQ: <0, 0, 0>
SFG function parameters 69.1.2
AN R@ C<Q@ N@@I DI OC@ #PI>ODJI -<M<H@O@MN >C<KO@M, OC@ K<M<H@O@MN JA H3>G7 FKB7E <M@
IJMH<GGT >JKD@N JA OC@ <MBPH@ION:
JNQPSU TUE.TUEJP;
WPJE BEE)BMG(EPVCMF WBMVF)
\
WBMVF += 0.5; // j %PFT OPU BGGFDU 'WBMVF' JO NBJO
^
WPJE NBJO()
\
EPVCMF WBMVF = 1.5;
BEE)BMG(WBMVF);
XSJUFMO("5IF WBMVF BGUFS DBMMJOH UIF GVODUJPO: ", WBMVF);
^
B@><PN@ OC@ API>ODJI K<M<H@O@M DN IJO ?@ADI@? <N SFG, OC@ <NNDBIH@IO DIND?@ OC@ API>ODJI
<AA@>ON JIGT OC@ GJ><G Q<MD<=G@ OC@M@. 1C@ Q<MD<=G@ DI NBJO() DN IJO <AA@>O@?:
5IF WBMVF BGUFS DBMMJOH UIF GVODUJPO: 1.5
1C@ SFG F@TRJM? RJPG? H<F@ OC@ API>ODJI K<M<H@O@M < M@A@M@I>@ OJ OC@ <MBPH@IO:
WPJE BEE)BMG(SFG EPVCMF WBMVF)
\
WBMVF += 0.5;
^
1CDN ODH@ OC@ Q<MD<=G@ DI NBJO() B@ON HJ?DAD@?:
5IF WBMVF BGUFS DBMMJOH UIF GVODUJPO: 2
Reference types 69.1.3
0JH@ OTK@N <M@ M@A@M@I>@ OTK@N. 3<MD<=G@N JA NP>C OTK@N KMJQD?@ <>>@NN OJ N@K<M<O@ Q<MD<=G@N:
t G<NN Q<MD<=G@N
t 0GD>@N
t ANNJ>D<ODQ@ <MM<TN
4@ C<Q@ N@@I OCDN ?DNODI>ODJI DI OC@ 3<GP@ 1TK@N <I? /@A@M@I>@ 1TK@N >C<KO@M. 1C@ AJGGJRDIB
@S<HKG@ ?@HJINOM<O@N M@A@M@I>@ OTK@N =T ORJ DMBTT Q<MD<=G@N:
JNQPSU TUE.TUEJP;
DMBTT 1FO
\
EPVCMF JOL;
UIJT()
\
&A;@F7DE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
416
JOL = 15;
^
WPJE VTF(EPVCMF BNPVOU)
\
JOL -= BNPVOU;
^
^
WPJE NBJO()
\
BVUP QFO = OFX 1FO;
BVUP PUIFS1FO = QFO; // j /PX CPUI WBSJBCMFT QSPWJEF
// BDDFTT UP UIF TBNF PCKFDU
XSJUFGMO("#FGPSF: %T %T", QFO.JOL, PUIFS1FO.JOL);
QFO.VTF(1); // j UIF TBNF PCKFDU JT VTFE
PUIFS1FO.VTF(2); // j UIF TBNF PCKFDU JT VTFE
XSJUFGMO(""GUFS : %T %T", QFO.JOL, PUIFS1FO.JOL);
^
B@><PN@ >G<NN@N <M@ M@A@M@I>@ OTK@N, OC@ >G<NN Q<MD<=G@N QFO <I? PUIFS1FO KMJQD?@ <>>@NN OJ
OC@ N<H@ 1FO J=E@>O. AN < M@NPGO, PNDIB @DOC@M JA OCJN@ >G<NN Q<MD<=G@N <AA@>ON OC@ N<H@ J=E@>O:
#FGPSF: 15 15
"GUFS : 12 12
1C<O NDIBG@ J=E@>O <I? OC@ ORJ >G<NN Q<MD<=G@N RJPG? =@ G<D? JPO DI H@HJMT NDHDG<M OJ OC@
AJGGJRDIB ADBPM@:
(5IF 1FO PCKFDU) QFO PUIFS1FO
---+-------------------+--- ---+---+--- ---+---+---
] JOL ] ] P ] ] P ]
---+-------------------+--- ---+-]-+--- ---+-]-+---
q ] ]
] ] ]
+--------------------+------------+
/@A@M@I>@N BA;@F 3F <>OP<G Q<MD<=G@N <N QFO <I? PUIFS1FO ?J <=JQ@.
-MJBM<HHDIB G<IBP<B@N DHKG@H@IO OC@ M@A@M@I>@ <I? KJDIO@M >JI>@KON =T NK@>D<G M@BDNO@MN
JA OC@ HD>MJKMJ>@NNJM, RCD>C <M@ NK@>DAD><GGT AJM BA;@F;@9 3F H@HJMT GJ><ODJIN.
B@CDI? OC@ N>@I@N, !'N CDBC@M-G@Q@G >JI>@KON >G<NN Q<MD<=G@N, NGD>@N, <I? <NNJ>D<ODQ@ <MM<TN
<M@ <GG DHKG@H@IO@? =T KJDIO@MN. AN OC@N@ CDBC@M-G@Q@G A@<OPM@N <M@ <GM@<?T @AAD>D@IO <I?
>JIQ@ID@IO, KJDIO@MN <M@ M<M@GT I@@?@? DI ! KMJBM<HHDIB. 0ODGG, DO DN DHKJMO<IO AJM !
KMJBM<HH@MN OJ PI?@MNO<I? KJDIO@MN R@GG.
Syntax
69.2
1C@ KJDIO@M NTIO<S JA ! DN HJNOGT OC@ N<H@ <N DI . AGOCJPBC OCDN ><I =@ N@@I <N <I
<?Q<IO<B@, OC@ K@>PGD<MDOD@N JA 'N KJDIO@M NTIO<S <M@ I@>@NN<MDGT DIC@MDO@? =T ! <N R@GG. #JM
@S<HKG@, OC@ ?DAA@M@IO H@<IDIBN JA OC@ * >C<M<>O@M H<T =@ >JIAPNDIB.
4DOC OC@ @S>@KODJI JA WPJE KJDIO@MN, @Q@MT KJDIO@M DN <NNJ>D<O@? RDOC < >@MO<DI OTK@ <I? ><I
KJDIO <O JIGT Q<MD<=G@N JA OC<O NK@>DAD> OTK@. #JM @S<HKG@, <I JOU KJDIO@M ><I JIGT KJDIO <O
Q<MD<=G@N JA OTK@ JOU.
1C@ KJDIO@M ?@ADIDODJI NTIO<S >JINDNON JA OC@ <NNJ>D<O@? OTK@ <I? < * >C<M<>O@M:
&A;@F7DE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
417
type_to_point_at * name_of_the_pointer_variable;
A>>JM?DIBGT, < KJDIO@M Q<MD<=G@ OC<O RJPG? =@ KJDIODIB <O JOU Q<MD<=G@N RJPG? =@ ?@ADI@? GDF@
OCDN:
JOU * NZ1PJOUFS;
1C@ * >C<M<>O@M DI OC<O NTIO<S H<T =@ KMJIJPI>@? <N "KJDIO@M". 0J, OC@ OTK@ JA NZ1PJOUFS
<=JQ@ DN <I "DIO KJDIO@M". 1C@ NK<>@N =@AJM@ <I? <AO@M OC@ * >C<M<>O@M <M@ JKODJI<G. 1C@
AJGGJRDIB NTIO<S@N <M@ >JHHJI <N R@GG:
JOU* NZ1PJOUFS;
JOU *NZ1PJOUFS;
4C@I DO DN NK@>DAD><GGT < KJDIO@M OTK@ OC<O DN =@DIB H@IODJI@? <N DI "DIO KJDIO@M", DO DN >JHHJI
OJ RMDO@ OC@ OTK@ RDOCJPO <IT NK<>@N <N DI JOU*.
Pointer value and the address-of operator &
69.3
B@DIB Q<MD<=G@N OC@HN@GQ@N KJDIO@MN C<Q@ Q<GP@N <N R@GG. 1C@ ?@A<PGO Q<GP@ JA < KJDIO@M DN OC@
NK@>D<G Q<GP@ OVMM, RCD>C H@<IN OC<O OC@ KJDIO@M DN IJO BA;@F;@9 3F <IT Q<MD<=G@ T@O (D.@. ?J@N
IJO KMJQD?@ <>>@NN OJ <IT Q<MD<=G@).
1J H<F@ < KJDIO@M KMJQD?@ <>>@NN OJ < Q<MD<=G@, OC@ Q<GP@ JA OC@ KJDIO@M HPNO =@ N@O OJ OC@
<??M@NN JA OC<O Q<MD<=G@. 1C@ KJDIO@M NO<MON KJDIODIB <O OC@ Q<MD<=G@ OC<O DN <O OC<O NK@>DAD>
<??M@NN. #MJH IJR JI, & RDGG ><GG OC<O Q<MD<=G@ F:7 BA;@F77.
1C@ & JK@M<OJM RCD>C R@ C<Q@ PN@? H<IT ODH@N =@AJM@ RDOC SFBEG C<N <GNJ =@@I =MD@AGT
H@IODJI@? DI OC@ 3<GP@ 1TK@N <I? /@A@M@I>@ 1TK@N >C<KO@M. 1CDN JK@M<OJM KMJ?P>@N OC@
<??M@NN JA OC@ Q<MD<=G@ OC<O DN RMDOO@I <AO@M DO. &ON Q<GP@ ><I =@ PN@? RC@I DIDOD<GDUDIB <
KJDIO@M:
JOU NZ7BSJBCMF = 180;
JOU * NZ1PJOUFS = &NZ7BSJBCMF;
&IDOD<GDUDIB NZ1PJOUFS =T OC@ <??M@NN JA NZ7BSJBCMF H<F@N NZ1PJOUFS KJDIO <O NZ7BSJBCMF.
1C@ Q<GP@ JA OC@ KJDIO@M DN OC@ N<H@ <N OC@ <??M@NN JA NZ7BSJBCMF:
XSJUFMO("5IF BEESFTT PG NZ7BSJBCMF: ", &NZ7BSJBCMF);
XSJUFMO("5IF WBMVF PG NZ1PJOUFS : ", NZ1PJOUFS);
5IF BEESFTT PG NZ7BSJBCMF: 7'''2$&73'10
5IF WBMVF PG NZ1PJOUFS : 7'''2$&73'10
Note: ):7 366D7EE H3>G7 ;E >;=7>K FA 47 6;887D7@F 7H7DK F;?7 F:7 BDA9D3? ;E EF3DF76.
1C@ AJGGJRDIB ADBPM@ DN < M@KM@N@IO<ODJI JA OC@N@ ORJ Q<MD<=G@N DI H@HJMT:
NZ7BSJBCMF BU NZ1PJOUFS BU
BEESFTT 7'''2$&73'10 TPNF PUIFS BEESFTT
---+----------------+--- ---+----------------+---
] 180 ] ] 7'''2$&73'10 ]
---+----------------+--- ---+--------]-------+---
q ]
] ]
+---------------------------+
&A;@F7DE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
418
1C@ Q<GP@ JA NZ1PJOUFS DN OC@ <??M@NN JA NZ7BSJBCMF, >JI>@KOP<GGT BA;@F;@9 3F OC@ Q<MD<=G@
OC<O DN <O OC<O GJ><ODJI.
0DI>@ KJDIO@MN <M@ Q<MD<=G@N <N R@GG, OC@ & JK@M<OJM ><I KMJ?P>@ OC@ <??M@NN JA OC@ KJDIO@M <N
R@GG:
XSJUFMO("5IF BEESFTT PG NZ1PJOUFS : ", &NZ1PJOUFS);
5IF BEESFTT PG NZ1PJOUFS : 7'''2$&73'18
0DI>@ OC@ ?DAA@M@I>@ =@OR@@I OC@ ORJ <??M@NN@N <=JQ@ DN 8, M@H@H=@MDIB OC<O <I JOU O<F@N
PK 4 =TO@N, R@ ><I ?@?P>@ OC<O NZ7BSJBCMF <I? NZ1PJOUFS <M@ 4 =TO@N <K<MO DI H@HJMT.
AAO@M M@HJQDIB OC@ <MMJR OC<O M@KM@N@IO@? OC@ >JI>@KO JA BA;@F;@9 3F, R@ ><I KD>OPM@ OC@
>JIO@ION JA H@HJMT <MJPI? OC@N@ <??M@NN@N GDF@ OCDN:
7'''2$&73'10 7'''2$&73'14 7'''2$&73'18
: : : :
---+----------------+----------------+----------------+---
] 180 ] (VOVTFE) ] 7'''2$&73'10 ]
---+----------------+----------------+----------------+---
1C@ I<H@N JA Q<MD<=G@N, API>ODJIN, >G<NN@N, @O>. <I? F@TRJM?N <M@ IJO K<MON JA KMJBM<HN JA
>JHKDG@? G<IBP<B@N GDF@ !. 1C@ Q<MD<=G@N OC<O C<Q@ =@@I ?@ADI@? =T OC@ KMJBM<HH@M DI OC@
NJPM>@ >J?@ <M@ >JIQ@MO@? OJ =TO@N OC<O J>>PKT H@HJMT JM M@BDNO@MN JA OC@ HD>MJKMJ>@NNJM.
Note: ):7 @3?7E (3.=.3. EK?4A>E) ?3K 35FG3>>K 47 ;@5>G676 ;@ BDA9D3?E FA :7>B I;F:
674G99;@9 4GF F:AE7 @3?7E 6A @AF 38875F F:7 AB7D3F;A@ A8 F:7 BDA9D3?.
The access operator *
69.4
4@ C<Q@ N@@I <=JQ@ OC<O OC@ * >C<M<>O@M RCD>C IJMH<GGT M@KM@N@ION HPGODKGD><ODJI DN <GNJ
PN@? RC@I ?@ADIDIB KJDIO@MN. A ?DAAD>PGOT RDOC OC@ NTIO<S JA KJDIO@MN DN OC<O OC@ N<H@
>C<M<>O@M C<N < OCDM? H@<IDIB: &O DN <GNJ PN@? RC@I <>>@NNDIB OC@ KJDIO@@ OCMJPBC OC@
KJDIO@M.
4C@I DO DN RMDOO@I =@AJM@ OC@ I<H@ JA < KJDIO@M, DO H@<IN F:7 H3D;34>7 F:3F F:7 BA;@F7D ;E
BA;@F;@9 3F (D.@. OC@ KJDIO@@):
XSJUFMO("5IF WBMVF UIBU JU JT QPJOUJOH BU: ", *NZ1PJOUFS);
5IF WBMVF UIBU JU JT QPJOUJOH BU: 180
The . (dot) operator to access a member of the pointee
69.5
&A TJP FIJR KJDIO@MN AMJH , OCDN JK@M<OJM DN OC@ N<H@ <N OC@ -> JK@M<OJM DI OC<O G<IBP<B@.
4@ C<Q@ N@@I <=JQ@ OC<O OC@ * JK@M<OJM DN PN@? AJM <>>@NNDIB OC@ KJDIO@@. 1C<O DN NPAAD>D@IOGT
PN@APG AJM KJDIO@MN JA API?<H@IO<G OTK@N GDF@ JOU*: 1C@ Q<GP@ JA < API?<H@IO<G OTK@ DN
<>>@NN@? NDHKGT =T RMDODIB *NZ1PJOUFS.
%JR@Q@M, RC@I OC@ KJDIO@@ DN < NOMP>O JM < >G<NN J=E@>O, OC@ N<H@ NTIO<S =@>JH@N
DI>JIQ@ID@IO. 1J N@@ RCT, G@O'N >JIND?@M OC@ AJGGJRDIB NOMP>O:
TUSVDU $PPSEJOBUF
\
&A;@F7DE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
419
JOU Y;
JOU Z;
TUSJOH UP4USJOH() DPOTU
\
SFUVSO GPSNBU("(%T,%T)", Y, Z);
^
^
%@M@ DN < >J?@ OC<O ?@ADI@N <I J=E@>O <I? < KJDIO@M JA OC<O OTK@:
BVUP DFOUFS = $PPSEJOBUF(0, 0);
$PPSEJOBUF * QUS = &DFOUFS; // QPJOUFS EFGJOJUJPO
XSJUFMO(*QUS); // PCKFDU BDDFTT
1C<O NTIO<S DN >JIQ@ID@IO RC@I <>>@NNDIB OC@ Q<GP@ JA OC@ @IODM@ $PPSEJOBUF J=E@>O:
(0,0)
%JR@Q@M, OC@ >J?@ =@>JH@N >JHKGD><O@? RC@I <>>@NNDIB < H@H=@M JA <I J=E@>O OCMJPBC <
KJDIO@M <I? OC@ * JK@M<OJM:
// "EKVTU UIF Y DPPSEJOBUF
(*QUS).Y += 10;
1C<O @SKM@NNDJI HJ?DAD@N OC@ Q<GP@ JA OC@ Y H@H=@M JA OC@ DFOUFS J=E@>O. 1C@ G@AO-C<I? ND?@
JA OC<O @SKM@NNDJI ><I =@ @SKG<DI@? =T OC@ AJGGJRDIB NO@KN:
t QUS: 1C@ KJDIO@M OC<O KJDION <O DFOUFS
t *QUS: A>>@NNDIB OC@ J=E@>O (D.@. DFOUFS DON@GA)
t (*QUS): -<M@IOC@N@N NJ OC<O OC@ . (?JO) JK@M<OJM DN <KKGD@? OJ OC@ J=E@>O, IJO OJ OC@
KJDIO@M
t (*QUS).Y: 1C@ Y H@H=@M JA OC@ J=E@>O OC<O QUS DN KJDIODIB <O
1J M@?P>@ OC@ >JHKG@SDOT JA KJDIO@M NTIO<S DI !, OC@ . (?JO) JK@M<OJM DN OM<IA@MM@? OJ OC@
KJDIO@@ <I? KMJQD?@N <>>@NN OJ OC@ H@H=@M JA OC@ J=E@>O. (1C@ @S>@KODJIN OJ OCDN MPG@ <M@ <O
OC@ @I? JA OCDN N@>ODJI.)
0J, OC@ KM@QDJPN @SKM@NNDJI DN IJMH<GGT RMDOO@I <N:
QUS.Y += 10;
0DI>@ OC@ KJDIO@M DON@GA ?J@N IJO C<Q@ < H@H=@M I<H@? Y, .Y DN <KKGD@? OJ OC@ KJDIO@@ <I?
OC@ Y H@H=@M JA DFOUFS B@ON HJ?DAD@?:
(10,0)
+JO@ OC<O OCDN DN OC@ N<H@ <N OC@ PN@ JA OC@ . (?JO) JK@M<OJM RDOC >G<NN@N. 4C@I OC@ . (?JO)
JK@M<OJM DN <KKGD@? OJ < >G<NN H3D;34>7, DO KMJQD?@N <>>@NN OJ < H@H=@M JA OC@ >G<NN A4<75F:
DMBTT $MBTT5ZQF
\
JOU NFNCFS;
^
// ...
// 7BSJBCMF PO UIF MFGU, PCKFDU PO UIF SJHIU
$MBTT5ZQF WBSJBCMF = OFX $MBTT5ZQF;
&A;@F7DE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
420
// "QQMJFE UP UIF WBSJBCMF CVU BDDFTTFT UIF NFNCFS PG
// UIF PCKFDU
WBSJBCMF.NFNCFS = 42;
AN TJP M@H@H=@M AMJH OC@ G<NN@N >C<KO@M, OC@ >G<NN J=E@>O DN >JINOMP>O@? =T OC@ OFX
F@TRJM? JI OC@ MDBCO-C<I? ND?@. WBSJBCMF DN < >G<NN Q<MD<=G@ OC<O KMJQD?@N <>>@NN OJ DO.
/@<GDUDIB OC<O DO DN OC@ N<H@ RDOC KJDIO@MN DN <I DI?D><ODJI OC<O >G<NN Q<MD<=G@N <I? KJDIO@MN
<M@ DHKG@H@IO@? NDHDG<MGT =T OC@ >JHKDG@M.
1C@M@ DN <I @S>@KODJI OJ OCDN MPG@ =JOC AJM >G<NN Q<MD<=G@N <I? AJM KJDIO@MN. 1TK@ KMJK@MOD@N
GDF@ .TJ[FPG <M@ <KKGD@? OJ OC@ OTK@ JA OC@ KJDIO@M, IJO OJ OC@ OTK@ JA OC@ KJDIO@@:
DIBS D;
DIBS * Q;
XSJUFMO(Q.TJ[FPG); // TJ[F PG UIF QPJOUFS, OPU UIF QPJOUFF
.TJ[FPG KMJ?P>@N OC@ NDU@ JA Q, RCD>C DN < DIBS*, IJO OC@ NDU@ JA D, RCD>C DN < DIBS. ,I <
64-=DO NTNO@H KJDIO@MN <M@ 8-=TO@ GJIB:
8
Modifying the value of a pointer
69.6
1C@ Q<GP@N JA KJDIO@MN ><I =@ DI>M@H@IO@? JM ?@>M@H@IO@?, <I? OC@T ><I =@ PN@? DI <??DODJI
<I? NP=OM<>ODJI:
++QUS;
--QUS;
QUS += 2;
QUS -= 2;
XSJUFMO(QUS + 3);
XSJUFMO(QUS - 3);
!DAA@M@IO AMJH OC@DM <MDOCH@OD> >JPIO@MK<MON, OC@N@ JK@M<ODJIN ?J IJO HJ?DAT OC@ <>OP<G Q<GP@
=T OC@ NK@>DAD@? <HJPIO. /<OC@M, OC@ Q<GP@ JA OC@ KJDIO@M B@ON HJ?DAD@? NJ OC<O DO IJR KJDION
<O OC@ Q<MD<=G@ OC<O DN < >@MO<DI IPH=@M JA Q<MD<=G@N =@TJI? OC@ >PMM@IO JI@. 1C@ <HJPIO JA
OC@ DI>M@H@IO JM OC@ ?@>M@H@IO NK@>DAD@N CJR H<IT Q<MD<=G@N <R<T NCJPG? OC@ KJDIO@M IJR
KJDIO <O.
#JM @S<HKG@, DI>M@H@IODIB OC@ Q<GP@ JA < KJDIO@M H<F@N DO KJDIO <O OC@ I@SO Q<MD<=G@:
++QUS; // 4UBSUT QPJOUJOH BU B WBSJBCMF UIBU JT OFYU JO
// NFNPSZ GSPN UIF PME WBSJBCMF
#JM OC<O OJ RJMF >JMM@>OGT, OC@ <>OP<G Q<GP@ JA OC@ KJDIO@M HPNO =@ DI>M@H@IO@? =T OC@ NDU@ JA
OC@ Q<MD<=G@. #JM @S<HKG@, =@><PN@ OC@ NDU@ JA JOU DN 4, DI>M@H@IODIB < KJDIO@M JA OTK@ JOU*
>C<IB@N DON Q<GP@ =T 4. 1C@ KMJBM<HH@M I@@? IJO K<T <OO@IODJI OJ OCDN ?@O<DG; OC@ KJDIO@M
Q<GP@ DN HJ?DAD@? =T OC@ >JMM@>O <HJPIO <POJH<OD><GGT.
Warning: &O DN PI?@ADI@? =@C<QDJM OJ KJDIO <O < GJ><ODJI OC<O DN IJO < Q<GD? =TO@ OC<O =@GJIBN
OC@ KMJBM<H. "Q@I DA DO DN IJO <>OP<GGT PN@? OJ <>>@NN <IT Q<MD<=G@ OC@M@, DO DN DIQ<GD? AJM <
KJDIO@M OJ KJDIO <O < IJI@SDNO@IO Q<MD<=G@. (1C@ JIGT @S>@KODJI JA OCDN MPG@ DN OC<O DO DN Q<GD? OJ
KJDIO <O OC@ DH<BDI<MT @G@H@IO JI@ K<NO OC@ @I? JA <I <MM<T. 1CDN RDGG =@ @SKG<DI@? G<O@M
=@GJR.)
&A;@F7DE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
421
#JM @S<HKG@, DO DN DIQ<GD? OJ DI>M@H@IO < KJDIO@M OC<O KJDION <O NZ7BSJBCMF, =@><PN@
NZ7BSJBCMF DN ?@ADI@? <N < NDIBG@ JOU:
++NZ1PJOUFS; // j VOEFGJOFE CFIBWJPS
2I?@ADI@? =@C<QDJM H@<IN OC<O DO ><IIJO =@ FIJRI RC<O OC@ =@C<QDJM JA OC@ KMJBM<H RDGG =@
<AO@M OC<O JK@M<ODJI. 1C@M@ H<T =@ NTNO@HN RC@M@ OC@ KMJBM<H >M<NC@N <AO@M DI>M@H@IODIB
OC<O KJDIO@M. %JR@Q@M, JI HJNO HJ?@MI NTNO@HN OC@ KJDIO@M DN GDF@GT OJ KJDIO <O OC@ PIPN@?
H@HJMT GJ><ODJI OC<O C<N =@@I NCJRI <N =@DIB =@OR@@I NZ7BSJBCMF <I? NZ1PJOUFS DI OC@
KM@QDJPN ADBPM@.
#JM OC<O M@<NJI, OC@ Q<GP@ JA < KJDIO@M HPNO =@ DI>M@H@IO@? JM ?@>M@H@IO@? JIGT DA OC@M@ DN <
Q<GD? J=E@>O <O OC@ I@R GJ><ODJI. AMM<TN (<I? NGD>@N) C<Q@ OC<O KMJK@MOT: 1C@ @G@H@ION JA <I
<MM<T <M@ ND?@ =T ND?@ DI H@HJMT.
A KJDIO@M OC<O DN KJDIODIB <O <I @G@H@IO JA < NGD>@ ><I =@ DI>M@H@IO@? N<A@GT <N GJIB <N DO ?J@N
IJO BJ =@TJI? OC@ @I? JA OC@ NGD>@. &I>M@H@IODIB NP>C < KJDIO@M =T OC@ ++ JK@M<OJM H<F@N DO
KJDIO <O OC@ I@SO @G@H@IO:
JNQPSU TUE.TUEJP;
JNQPSU TUE.TUSJOH;
JNQPSU TUE.DPOW;
FOVN $PMPS \ SFE, ZFMMPX, CMVF ^
TUSVDU $SBZPO
\
$PMPS DPMPS;
EPVCMF MFOHUI;
TUSJOH UP4USJOH() DPOTU
\
SFUVSO GPSNBU("%TDN %T DSBZPO", MFOHUI, DPMPS);
^
^
WPJE NBJO()
\
XSJUFGMO("$SBZPO PCKFDUT BSF %T CZUFT FBDI.", $SBZPO.TJ[FPG);
$SBZPO<> DSBZPOT = < $SBZPO($PMPS.SFE, 11),
$SBZPO($PMPS.ZFMMPX, 12),
$SBZPO($PMPS.CMVF, 13) >;
$SBZPO * QUS = &DSBZPOT<0>; // (1)
GPS (JOU J = 0; J != DSBZPOT.MFOHUI; ++J) \
XSJUFMO("1PJOUFS WBMVF: ", QUS); // (2)
XSJUFMO("$SBZPO: ", *QUS); // (3)
++QUS; // (4)
^
^
1. !@ADIDODJI: 1C@ KJDIO@M DN DIDOD<GDU@? =T OC@ <??M@NN JA OC@ ADMNO @G@H@IO.
2. 2NDIB DON Q<GP@: 1C@ Q<GP@ JA OC@ KJDIO@M DN OC@ <??M@NN JA OC@ @G@H@IO OC<O DO DN KJDIODIB
<O.
3. A>>@NNDIB OC@ @G@H@IO OC<O DN =@DIB KJDIO@? <O.
4. -JDIODIB <O OC@ I@SO @G@H@IO.
1C@ JPOKPO:
&A;@F7DE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
422
$SBZPO PCKFDUT BSF 16 CZUFT FBDI.
1PJOUFS WBMVF: 7'37"$9&6'$0
$SBZPO: 11DN SFE DSBZPO
1PJOUFS WBMVF: 7'37"$9&6'%0
$SBZPO: 12DN ZFMMPX DSBZPO
1PJOUFS WBMVF: 7'37"$9&6'&0
$SBZPO: 13DN CMVF DSBZPO
+JO@ OC<O OC@ GJJK <=JQ@ DN DO@M<O@? < OJO<G JA DSBZPOT.MFOHUI ODH@N NJ OC<O OC@ KJDIO@M DN
<GR<TN PN@? AJM <>>@NNDIB < Q<GD? @G@H@IO.
Pointers are risky
69.7
1C@ >JHKDG@M <I? OC@ ! MPIODH@ @IQDMJIH@IO ><IIJO BP<M<IO@@ OC<O OC@ KJDIO@MN <M@ <GR<TN
PN@? >JMM@>OGT. &O DN OC@ KMJBM<HH@M'N M@NKJIND=DGDOT OJ @INPM@ OC<O < KJDIO@M DN @DOC@M OVMM JM
KJDION <O < Q<GD? H@HJMT GJ><ODJI (<O < Q<MD<=G@, <O <I @G@H@IO JA <I <MM<T, @O>.).
#JM OC<O M@<NJI, DO DN <GR<TN =@OO@M OJ >JIND?@M CDBC@M-G@Q@G A@<OPM@N JA ! =@AJM@ OCDIFDIB
<=JPO PNDIB KJDIO@MN.
The element one past the end of an array
69.8
&O DN Q<GD? OJ KJDIO <O OC@ DH<BDI<MT @G@H@IO JI@ K<NO OC@ @I? JA <I <MM<T.
1CDN DN < PN@APG D?DJH OC<O DN NDHDG<M OJ IPH=@M M<IB@N. 4C@I ?@ADIDIB < NGD>@ RDOC < IPH=@M
M<IB@, OC@ N@>JI? DI?@S DN JI@ K<NO OC@ @G@H@ION JA OC@ NGD>@:
JOU<> WBMVFT = < 0, 1, 2, 3 >;
XSJUFMO(WBMVFT<1 .. 3>); // 1 BOE 2 JODMVEFE, 3 FYDMVEFE
1CDN D?DJH ><I =@ PN@? RDOC KJDIO@MN <N R@GG. &O DN < >JHHJI API>ODJI ?@NDBI DI <I? ++
RC@M@ < API>ODJI K<M<H@O@M KJDION <O OC@ ADMNO @G@H@IO <I? <IJOC@M JI@ KJDION <O OC@ @G@H@IO
<AO@M OC@ G<NO @G@H@IO:
JNQPSU TUE.TUEJP;
WPJE UFO5JNFT(JOU * CFHJO, JOU * FOE)
\
XIJMF (CFHJO != FOE) \
*CFHJO *= 10;
++CFHJO;
^
^
WPJE NBJO()
\
JOU<> WBMVFT = < 0, 1, 2, 3 >;
// 5IF BEESFTT PG UIF TFDPOE FMFNFOU:
JOU * CFHJO = &WBMVFT<1>;
// 5IF BEESFTT PG UXP FMFNFOUT CFZPOE UIBU POF
UFO5JNFT(CFHJO, CFHJO + 2);
XSJUFMO(WBMVFT);
^
1C@ Q<GP@ CFHJO + 2 H@<IN ORJ @G@H@ION <AO@M OC@ JI@ OC<O CFHJO DN KJDIODIB <O (D.@. OC@
@G@H@IO <O DI?@S 3).
&A;@F7DE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
423
1C@ UFO5JNFT() API>ODJI O<F@N ORJ KJDIO@M K<M<H@O@MN. &O PN@N OC@ @G@H@IO OC<O OC@ ADMNO JI@
DN KJDIODIB <O =PO DO I@Q@M <>>@NN@N OC@ @G@H@IO OC<O OC@ N@>JI? JI@ DN KJDIODIB <O. AN < M@NPGO,
JIGT OC@ @G@H@ION <O DI?@S@N 1 <I? 2 B@O HJ?DAD@?:
<0, 10, 20, 3>
0P>C API>ODJIN ><I =@ DHKG@H@IO@? =T < GPS GJJK <N R@GG:
GPS ( ; CFHJO != FOE; ++CFHJO) \
*CFHJO *= 10;
^
1RJ KJDIO@MN OC<O ?@ADI@ < M<IB@ ><I <GNJ =@ PN@? RDOC GPSFBDI GJJKN:
GPSFBDI (QUS; CFHJO .. FOE) \
*QUS *= 10;
^
#JM OC@N@ H@OCJ?N OJ =@ <KKGD><=G@ OJ 3>> A8 F:7 7>7?7@FE JA < NGD>@, OC@ N@>JI? KJDIO@M HPNO
I@>@NN<MDGT KJDIO <AO@M OC@ G<NO @G@H@IO:
// 5IF TFDPOE QPJOUFS JT QPJOUJOH BU UIF JNBHJOBSZ FMFNFOU
// QBTU UIF FOE PG UIF BSSBZ:
UFO5JNFT(CFHJO, CFHJO + WBMVFT.MFOHUI);
1C<O DN OC@ M@<NJI RCT DO DN G@B<G OJ KJDIO <O OC@ DH<BDI<MT @G@H@IO JI@ =@TJI? OC@ G<NO
@G@H@IO JA <I <MM<T.
Using pointers with the array indexing operator <>
69.9
AGOCJPBC DO DN IJO <=NJGPO@GT I@>@NN<MT DI !, KJDIO@MN ><I ?DM@>OGT =@ PN@? AJM <>>@NNDIB
@G@H@ION JA <I <MM<T =T <I DI?@S Q<GP@:
EPVCMF<> GMPBUT = < 0.0, 1.1, 2.2, 3.3, 4.4 >;
EPVCMF * QUS = &GMPBUT<2>;
*QUS = -100; // EJSFDU BDDFTT UP XIBU JU QPJOUT BU
QUS<1> = -200; // BDDFTT CZ JOEFYJOH
XSJUFMO(GMPBUT);
1C@ JPOKPO:
<0, 1.1, -100, -200, 4.4>
&I OC<O NTIO<S, OC@ @G@H@IO OC<O OC@ KJDIO@M DN KJDIODIB <O DN OCJPBCO JA =@DIB OC@ ADMNO @G@H@IO
JA <I DH<BDI<MT NGD>@. 1C@ <> JK@M<OJM KMJQD?@N <>>@NN OJ OC@ NK@>DAD@? @G@H@IO JA OC<O NGD>@.
1C@ QUS <=JQ@ DIDOD<GGT KJDION <O OC@ @G@H@IO <O DI?@S 2 JA OC@ JMDBDI<G GMPBUT NGD>@. QUS<1> DN
< M@A@M@I>@ OJ OC@ @G@H@IO 1 JA OC@ DH<BDI<MT NGD>@ OC<O NO<MON <O QUS (D.@. DI?@S 3 JA OC@
JMDBDI<G NGD>@).
AGOCJPBC OCDN =@C<QDJM H<T N@@H >JHKGD><O@?, OC@M@ DN < Q@MT NDHKG@ >JIQ@MNDJI =@CDI? OC<O
NTIO<S. B@CDI? OC@ N>@I@N, OC@ >JHKDG@M >JIQ@MON OC@ QPJOUFS<JOEFY> NTIO<S OJ OC@
*(QPJOUFS + JOEFY) @SKM@NNDJI:
&A;@F7DE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
424
QUS<1> = -200; // TMJDF TZOUBY
*(QUS + 1) = -200; // UIF FRVJWBMFOU PG UIF QSFWJPVT MJOF
AN & C<Q@ H@IODJI@? @<MGD@M, OC@ >JHKDG@M H<T IJO BP<M<IO@@ OC<O OCDN @SKM@NNDJI M@A@MN OJ <
Q<GD? @G@H@IO. !'N NGD>@N KMJQD?@ < HP>C N<A@M <GO@MI<ODQ@ <I? NCJPG? =@ >JIND?@M@? DINO@<?:
EPVCMF<> TMJDF = GMPBUT<2 .. 4>;
TMJDF<0> = -100;
TMJDF<1> = -200;
+JMH<GGT, DI?@S Q<GP@N <M@ >C@>F@? AJM NGD>@N <O MPI ODH@:
TMJDF<2> = -300; // 3VOUJNF FSSPS: BDDFTTJOH PVUTJEF PG UIF TMJDF
B@><PN@ OC@ NGD>@ <=JQ@ ?J@N IJO C<Q@ <I @G@H@IO <O DI?@S 2, <I @S>@KODJI RJPG? =@ OCMJRI
<O MPI ODH@ (PIG@NN OC@ KMJBM<H C<N =@@I >JHKDG@? RDOC OC@ -SFMFBTF >JHKDG@M NRDO>C):
DPSF.FYDFQUJPO.3BOHF&SSPS!EFOFNF(8391): 3BOHF WJPMBUJPO
Producing a slice from a pointer
69.10
-JDIO@MN <M@ IJO <N N<A@ JM <N PN@APG <N NGD>@N =@><PN@ <GOCJPBC OC@T ><I =@ PN@? RDOC OC@
NGD>@ DI?@SDIB JK@M<OJM, OC@T <M@ IJO <R<M@ JA OC@ Q<GD? M<IB@ JA @G@H@ION.
%JR@Q@M, RC@I OC@ IPH=@M JA Q<GD? @G@H@ION DN FIJRI, < KJDIO@M ><I =@ PN@? OJ >JINOMP>O <
NGD>@.
)@O'N <NNPH@ OC<O OC@ NBLF0CKFDUT() API>ODJI =@GJR DN DIND?@ < GD=M<MT. )@O'N <NNPH@ OC<O
NBLF0CKFDUT H<F@N NK@>DAD@? IPH=@M JA 4USVDU J=E@>ON <I? M@OPMIN < KJDIO@M OJ OC@ ADMNO JI@
JA OCJN@ J=E@>ON:
4USVDU * QUS = NBLF0CKFDUT(10);
1C@ NTIO<S OC<O KMJ?P>@N < NGD>@ AMJH < KJDIO@M DN OC@ AJGGJRDIB:
/* ... */ TMJDF = QPJOUFS<0 .. DPVOU>;
A>>JM?DIBGT, < NGD>@ OJ OC@ 10 J=E@>ON OC<O <M@ M@OPMI@? =T NBLF0CKFDUT() ><I =@ >JINOMP>O@?
=T OC@ AJGGJRDIB >J?@:
4USVDU<> TMJDF = QUS<0 .. 10>;
AAO@M OC<O ?@ADIDODJI, TMJDF DN M@<?T OJ =@ PN@? N<A@GT DI OC@ KMJBM<H EPNO GDF@ <IT JOC@M NGD>@:
XSJUFMO(TMJDF<1>); // QSJOUT UIF TFDPOE FMFNFOU
WPJE* can point at any type
69.11
AGOCJPBC DO DN <GHJNO I@Q@M I@@?@? DI !, 'N NK@>D<G KJDIO@M OTK@ WPJE* DN <Q<DG<=G@ DI ! <N
R@GG. WPJE* ><I KJDIO <O <IT OTK@:
JOU OVNCFS = 42;
EPVCMF PUIFS/VNCFS = 1.25;
WPJE * DBO1PJOU"U"OZUIJOH;
&A;@F7DE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
425
DBO1PJOU"U"OZUIJOH = &OVNCFS;
DBO1PJOU"U"OZUIJOH = &PUIFS/VNCFS;
1C@ WPJE* <=JQ@ DN <=G@ KJDIO <O Q<MD<=G@N JA ORJ ?DAA@M@IO OTK@N: JOU <I? EPVCMF.
WPJE* KJDIO@MN <M@ Q@MT GDHDO@? DI API>ODJI<GDOT: 1C@T ><IIJO =@ DI>M@H@IO@? JM ?@>M@H@IO@?
IJM OC@T ><I KMJQD?@ <>>@NN OJ OC@ KJDIO@@. 1CDN DN < >JIN@LP@I>@ JA OC@DM AG@SD=DGDOT. 4C@I OC@
<>OP<G OTK@ DN PIFIJRI, DON NDU@ ><IIJO =@ FIJRI @DOC@M:
*DBO1PJOU"U"OZUIJOH = 43; // j DPNQJMBUJPO &3303
&INO@<?, DON Q<GP@ HPNO ADMNO =@ >JIQ@MO@? OJ < KJDIO@M JA OC@ >JMM@>O OTK@:
JOU OVNCFS = 42; // (1)
WPJE * DBO1PJOU"U"OZUIJOH = &OVNCFS; // (2)
// ...
JOU * JOU1PJOUFS = DBTU(JOU*)DBO1PJOU"U"OZUIJOH; // (3)
*JOU1PJOUFS = 43; // (4)
1. 1C@ <>OP<G Q<MD<=G@
2. 0OJMDIB OC@ <??M@NN JA OC@ Q<MD<=G@ DI < WPJE*
3. ANNDBIDIB OC<O <??M@NN OJ < KJDIO@M JA OC@ >JMM@>O OTK@
4. *J?DATDIB OC@ Q<MD<=G@ OCMJPBC OC@ I@R KJDIO@M
WPJE* DN NJH@ODH@N I@@?@? RC@I DIO@M<>ODIB RDOC GD=M<MD@N OC<O <M@ RMDOO@I DI . 0DI>@
?J@N IJO C<Q@ CDBC@M G@Q@G A@<OPM@N GDF@ DIO@MA<>@N, >G<NN@N, O@HKG<O@N, @O>. GD=M<MD@N HPNO
M@GT JI OC@ WPJE* OTK@.
Using pointers in logical expressions
69.12
-JDIO@MN ><I <POJH<OD><GGT =@ >JIQ@MO@? OJ CPPM. -JDIO@MN OC<O C<Q@ OC@ Q<GP@ OVMM KMJ?P>@
GBMTF <I? OC@ JOC@MN KMJ?P>@ USVF. &I JOC@M RJM?N, KJDIO@MN OC<O ?J IJO KJDIO <O <IT Q<MD<=G@
<M@ GBMTF.
)@O'N >JIND?@M < API>ODJI OC<O KMDION J=E@>ON OJ OC@ NO<I?<M? JPOKPO. )@O'N ?@NDBI OCDN API>ODJI
NJ OC<O DO <GNJ KMJQD?@N OC@ IPH=@M JA =TO@N OC<O DO C<N EPNO JPOKPO. %JR@Q@M, G@O'N C<Q@ DO
KMJ?P>@ OCDN DIAJMH<ODJI JIGT RC@I NK@>DAD><GGT M@LP@NO@?.
&O DN KJNND=G@ OJ H<F@ OCDN =@C<QDJM JKODJI<G =T >C@>FDIB RC@OC@M OC@ Q<GP@ JA < KJDIO@M DN
OVMM JM IJO:
WPJE QSJOU($SBZPO DSBZPO, TJ[F@U * OVNCFS0G#ZUFT)
\
JNNVUBCMF JOGP = GPSNBU("$SBZPO: %T", DSBZPO);
XSJUFMO(JOGP);
JG (OVNCFS0G#ZUFT) \
*OVNCFS0G#ZUFT = JOGP.MFOHUI;
^
^
4C@I OC@ ><GG@M ?J@N IJO I@@? OCDN NK@>D<G DIAJMH<ODJI, OC@T ><I K<NN OVMM <N OC@ <MBPH@IO:
QSJOU($SBZPO($PMPS.ZFMMPX, 7), OVMM);
4C@I OC@ IPH=@M JA =TO@N DN DI?@@? DHKJMO<IO, OC@I < IJI-OVMM KJDIO@M Q<GP@ HPNO =@
K<NN@?:
&A;@F7DE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
426
TJ[F@U OVNCFS0G#ZUFT;
QSJOU($SBZPO($PMPS.CMVF, 8), &OVNCFS0G#ZUFT);
XSJUFGMO("%T CZUFT XSJUUFO UP UIF PVUQVU", OVNCFS0G#ZUFT);
+JO@ OC<O OCDN DN EPNO <I @S<HKG@. ,OC@MRDN@, DO RJPG? =@ =@OO@M AJM < API>ODJI GDF@ QSJOU() OJ
M@OPMI OC@ IPH=@M JA =TO@N PI>JI?DODJI<GGT:
TJ[F@U QSJOU($SBZPO DSBZPO)
\
JNNVUBCMF JOGP = GPSNBU("$SBZPO: %T", DSBZPO);
XSJUFMO(JOGP);
SFUVSO JOGP.MFOHUI;
^
OFX returns a pointer for some types
69.13
OFX, RCD>C R@ C<Q@ =@@I PNDIB JIGT AJM >JINOMP>ODIB >G<NN J=E@>ON ><I =@ PN@? RDOC JOC@M
OTK@N <N R@GG: NOMP>ON, <MM<TN, <I? API?<H@IO<G OTK@N. 1C@ Q<MD<=G@N OC<O <M@ >JINOMP>O@? =T
OFX <M@ ><GG@? ?TI<HD> Q<MD<=G@N.
OFX ADMNO <GGJ><O@N NK<>@ AMJH H@HJMT AJM OC@ Q<MD<=G@ <I? OC@I >JINOMP>ON OC@ Q<MD<=G@ DI
OC<O NK<>@. 1C@ Q<MD<=G@ DON@GA ?J@N IJO C<Q@ < NTH=JGD> I<H@ DI OC@ KMJBM<H; DO DN OJ =@
<>>@NN@? OCMJPBC OC@ M@A@M@I>@ OC<O DN M@OPMI@? =T OFX.
1C@ M@A@M@I>@ OC<O OFX M@OPMIN DN < ?DAA@M@IO FDI? ?@K@I?DIB JI OC@ OTK@ JA OC@ Q<MD<=G@:
t #JM >G<NN J=E@>ON, DO DN < 5>3EE H3D;34>7:
$MBTT DMBTT7BSJBCMF = OFX $MBTT;
t #JM NOMP>O J=E@>ON <I? Q<MD<=G@N JA API?<H@IO<G OTK@N, DO DN < BA;@F7D:
4USVDU * TUSVDU1PJOUFS = OFX 4USVDU;
JOU * JOU1PJOUFS = OFX JOU;
t #JM <MM<TN, DO DN < E>;57:
JOU<> TMJDF = OFX JOU<100>;
1CDN ?DNODI>ODJI DN PNP<GGT IJO J=QDJPN RC@I OC@ OTK@ DN IJO NK@GG@?-JPO JI OC@ G@AO-C<I? ND?@:
BVUP DMBTT7BSJBCMF = OFX $MBTT;
BVUP TUSVDU1PJOUFS = OFX 4USVDU;
BVUP JOU1PJOUFS = OFX JOU;
BVUP TMJDF = OFX JOU<100>;
1C@ AJGGJRDIB KMJBM<H KMDION OC@ M@OPMI OTK@ JA OFX AJM ?DAA@M@IO FDI?N JA Q<MD<=G@N:
JNQPSU TUE.TUEJP;
TUSVDU 4USVDU
\^
DMBTT $MBTT
\^
WPJE NBJO()
\
XSJUFMO(UZQFPG(OFX JOU ).TUSJOHPG);
XSJUFMO(UZQFPG(OFX JOU<5>).TUSJOHPG);
&A;@F7DE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
427
XSJUFMO(UZQFPG(OFX 4USVDU).TUSJOHPG);
XSJUFMO(UZQFPG(OFX $MBTT ).TUSJOHPG);
^
OFX M@OPMIN KJDIO@MN AJM NOMP>ON <I? API?<H@IO<G OTK@N:
JOU*
JOU<>
4USVDU*
$MBTT
The .QUS property of arrays
69.14
1C@ .QUS KMJK@MOT JA <MM<TN <I? NGD>@N DN OC@ <??M@NN JA OC@ ADMNO @G@H@IO. 1C@ OTK@ JA OCDN
Q<GP@ DN < KJDIO@M OJ OC@ OTK@ JA OC@ @G@H@ION:
JOU<> OVNCFST = < 7, 12 >;
JOU * BEESFTT0G'JSTU&MFNFOU = OVNCFST.QUS;
XSJUFMO("'JSTU FMFNFOU: ", *BEESFTT0G'JSTU&MFNFOU);
1CDN KMJK@MOT DN PN@APG @NK@>D<GGT RC@I DIO@M<>ODIB RDOC GD=M<MD@N. 0JH@ API>ODJIN O<F@
OC@ <??M@NN JA OC@ ADMNO JA < IPH=@M JA >JIN@>PODQ@ @G@H@ION DI H@HJMT.
/@H@H=@MDIB OC<O NOMDIBN <M@ <GNJ <MM<TN, OC@ .QUS KMJK@MOT ><I =@ PN@? RDOC NOMDIBN <N
R@GG. %JR@Q@M, IJO@ OC<O OC@ ADMNO @G@H@IO JA < NOMDIB I@@? IJO =@ OC@ ADMNO >7FF7D JA OC@ NOMDIB;
M<OC@M, OC@ ADMNO 2ID>J?@ >J?@ PIDO JA OC<O G@OO@M. AN <I @S<HKG@, OC@ G@OO@M ] DN NOJM@? <N ORJ
>J?@ PIDON DI < DIBS NOMDIB.
4C@I <>>@NN@? OCMJPBC OC@ .QUS KMJK@MOT, OC@ >J?@ PIDON JA NOMDIBN ><I =@ <>>@NN@?
DI?DQD?P<GGT. 4@ RDGG N@@ OCDN DI OC@ @S<HKG@N N@>ODJI =@GJR.
The JO operator of associative arrays
69.15
A>OP<GGT, R@ C<Q@ PN@? KJDIO@MN @<MGD@M DI OC@ ANNJ>D<ODQ@ AMM<TN >C<KO@M. &I OC<O >C<KO@M, &
C<? DIO@IODJI<GGT IJO H@IODJI@? OC@ @S<>O OTK@ JA OC@ JO JK@M<OJM <I? C<? PN@? DO JIGT DI
GJBD><G @SKM@NNDJIN:
JG ("QVSQMF" JO DPMPS$PEFT) \
// UIFSF JT BO FMFNFOU GPS LFZ "QVSQMF"
^ FMTF \
// OP FMFNFOU GPS LFZ "QVSQMF"
^
&I A<>O, OC@ JO JK@M<OJM M@OPMIN OC@ <??M@NN JA OC@ @G@H@IO DA OC@M@ DN <I @G@H@IO AJM OC@
NK@>DAD@? F@T; JOC@MRDN@, DO M@OPMIN OVMM. 1C@ JG NO<O@H@IO <=JQ@ <>OP<GGT M@GD@N JI OC@
<POJH<OD> >JIQ@MNDJI JA OC@ KJDIO@M Q<GP@ OJ CPPM.
4C@I OC@ M@OPMI Q<GP@ JA JO DN NOJM@? DI < KJDIO@M, OC@ @G@H@IO ><I =@ <>>@NN@? @AAD>D@IOGT
OCMJPBC OC<O KJDIO@M:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
TUSJOH<JOU> OVNCFST =
&A;@F7DE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
428
< 0 : "[FSP", 1 : "POF", 2 : "UXP", 3 : "UISFF" >;
JOU OVNCFS = 2;
BVUP FMFNFOU = OVNCFS JO OVNCFST; // (1)
JG (FMFNFOU) \ // (2)
XSJUFGMO("* LOPX: %T.", *FMFNFOU); // (3)
^ FMTF \
XSJUFGMO("* EPO'U LOPX UIF TQFMMJOH PG %T.", OVNCFS);
^
^
1C@ KJDIO@M Q<MD<=G@ FMFNFOU DN DIDOD<GDU@? =T OC@ Q<GP@ JA OC@ JO JK@M<OJM (1) <I? DON Q<GP@ DN
PN@? DI < GJBD><G @SKM@NNDJI (2). 1C@ Q<GP@ JA OC@ @G@H@IO DN <>>@NN@? OCMJPBC OC<O KJDIO@M (3)
JIGT DA OC@ KJDIO@M DN IJO OVMM.
1C@ <>OP<G OTK@ JA FMFNFOU <=JQ@ DN < KJDIO@M OJ OC@ N<H@ OTK@ JA OC@ @G@H@ION (D.@. Q<GP@N) JA
OC@ <NNJ>D<ODQ@ <MM<T. 0DI>@ OC@ @G@H@ION JA OVNCFST <=JQ@ <M@ JA OTK@ TUSJOH, JO M@OPMIN <
TUSJOH*. A>>JM?DIBGT, OC@ OTK@ >JPG? C<Q@ =@@I NK@GG@? JPO @SKGD>DOGT:
TUSJOH * FMFNFOU = OVNCFS JO OVNCFST;
When to use pointers
69.16
When required by libraries 69.16.1
AGOCJPBC KJDIO@M K<M<H@O@MN <M@ M<M@ DI ! GD=M<MD@N, R@ C<Q@ <GM@<?T N@@I OC<O SFBEG() DN
JI@ API>ODJI OC<O M@LPDM@N KJDIO@MN.
AN <IJOC@M @S<HKG@, OC@ AJGGJRDIB API>ODJI AMJH OC@ $OF! GD=M<MT O<F@N < KJDIO@M <N R@GG:
(EL(FPNFUSZ HFPNFUSZ;
// ... TFU UIF NFNCFST PG 'HFPNFUSZ' ...
XJOEPX.TFU(FPNFUSZ)JOUT(/* ... */, &HFPNFUSZ, /* ... */);
When referencing variables of value types 69.16.2
-JDIO@MN ><I =@ PN@? AJM M@A@MMDIB OJ GJ><G Q<MD<=G@N. 1C@ AJGGJRDIB KMJBM<H >JPION OC@
JPO>JH@N JA AGDKKDIB < >JDI. &O O<F@N <?Q<IO<B@ JA < KJDIO@M RC@I M@A@MMDIB OJ JI@ JA ORJ GJ><G
Q<MD<=G@N:
JNQPSU TUE.TUEJP;
JNQPSU TUE.SBOEPN;
WPJE NBJO()
\
TJ[F@U IFBET$PVOU = 0;
TJ[F@U UBJMT$PVOU = 0;
GPSFBDI (J; 0 .. 100) \
TJ[F@U * UIF$PVOUFS = (VOJGPSN(0, 2) == 1)
&IFBET$PVOU
: &UBJMT$PVOU;
++(*UIF$PVOUFS);
^
XSJUFGMO("IFBET: %T UBJMT: %T", IFBET$PVOU, UBJMT$PVOU);
^
&A;@F7DE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
429
,=QDJPNGT, OC@M@ <M@ JOC@M R<TN JA <>CD@QDIB OC@ N<H@ BJ<G. #JM @S<HKG@, PNDIB OC@ O@MI<MT
JK@M<OJM DI < ?DAA@M@IO R<T:
VOJGPSN(0, 2) ++IFBET$PVOU : ++UBJMT$PVOU;
BT PNDIB <I JG NO<O@H@IO:
JG (VOJGPSN(0, 2)) \
++IFBET$PVOU;
^ FMTF \
++UBJMT$PVOU;
^
As member variables of data structures 69.16.3
-JDIO@MN <M@ @NN@IOD<G RC@I DHKG@H@IODIB H<IT ?<O< NOMP>OPM@N.
2IGDF@ OC@ @G@H@ION JA <I <MM<T =@DIB I@SO OJ @<>C JOC@M DI H@HJMT, @G@H@ION JA H<IT JOC@M
?<O< NOMP>OPM@N <M@ <K<MO. 0P>C ?<O< NOMP>OPM@N <M@ =<N@? JI OC@ >JI>@KO JA OC@DM @G@H@ION
BA;@F;@9 3F JOC@M @G@H@ION.
#JM @S<HKG@, @<>C IJ?@ JA < GDIF@? GDNO BA;@FE 3F OC@ I@SO IJ?@. 0DHDG<MGT, @<>C IJ?@ JA <
=DI<MT OM@@ BA;@FE 3F OC@ G@AO <I? MDBCO =M<I>C@N PI?@M OC<O IJ?@. -JDIO@MN <M@ @I>JPIO@M@? DI
HJNO JOC@M ?<O< NOMP>OPM@N <N R@GG.
AGOCJPBC DO DN KJNND=G@ OJ O<F@ <?Q<IO<B@ JA !'N M@A@M@I>@ OTK@N, KJDIO@MN H<T =@ HJM@
I<OPM<G <I? @AAD>D@IO DI NJH@ ><N@N.
4@ RDGG N@@ @S<HKG@N JA KJDIO@M H@H=@MN =@GJR.
When accessing memory directly 69.16.4
B@DIB GJR-G@Q@G HD>MJKMJ>@NNJM A@<OPM@N, KJDIO@MN KMJQD?@ =TO@-G@Q@G <>>@NN OJ H@HJMT
GJ><ODJIN. +JO@ OC<O NP>C GJ><ODJIN HPNO NODGG =@GJIB OJ Q<GD? Q<MD<=G@N. &O DN PI?@ADI@?
=@C<QDJM OJ <OO@HKO OJ <>>@NN < M<I?JH H@HJMT GJ><ODJI.
Examples
69.17
A simple linked list 69.17.1
1C@ @G@H@ION JA GDIF@? GDNON <M@ NOJM@? DI @A67E. 1C@ >JI>@KO JA < GDIF@? GDNO DN =<N@? JI @<>C
IJ?@ KJDIODIB <O OC@ I@SO JI@. 1C@ G<NO IJ?@ C<N IJ JOC@M IJ?@ OJ KJDIO <O, NJ DO DN N@O OJ OVMM:
GJSTU MBTU
OPEF OPEF OPEF
+---------+---+ +---------+---+ +---------+------+
] FMFNFOU ] P----r ] FMFNFOU ] P----r ... ] FMFNFOU ] OVMM ]
+---------+---+ +---------+---+ +---------+------+
1C@ ADBPM@ <=JQ@ H<T =@ HDNG@<?DIB: &I M@<GDOT, OC@ IJ?@N <M@ IJO ND?@-=T-ND?@ DI H@HJMT.
"<>C IJ?@ ?J@N KJDIO OJ OC@ I@SO IJ?@ =PO OC@ I@SO IJ?@ H<T =@ <O < >JHKG@O@GT ?DAA@M@IO
GJ><ODJI.
1C@ AJGGJRDIB NOMP>O ><I =@ PN@? AJM M@KM@N@IODIB OC@ IJ?@N JA NP>C < GDIF@? GDNO JA JOUN:
TUSVDU /PEF
\
&A;@F7DE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
430
JOU FMFNFOU;
/PEF * OFYU;
// ...
^
Note: B753GE7 ;F 5A@F3;@E 3 D787D7@57 FA F:7 E3?7 FKB7 3E ;FE7>8, Node ;E 3 D75GDE;H7 FKB7.
1C@ >JI>@KO JA OC@ RCJG@ GDNO ><I =@ M@KM@N@IO@? =T < NDIBG@ KJDIO@M OC<O KJDION <O OC@ ADMNO
IJ?@, RCD>C DN >JHHJIGT ><GG@? F:7 :736:
TUSVDU -JTU
\
/PEF * IFBE;
// ...
^
1J F@@K OC@ @S<HKG@ NCJMO, G@O'N ?@ADI@ EPNO JI@ API>ODJI OC<O <??N <I @G@H@IO OJ OC@ C@<? JA
OC@ GDNO:
TUSVDU -JTU
\
/PEF * IFBE;
WPJE JOTFSU"U)FBE(JOU FMFNFOU)
\
IFBE = OFX /PEF(FMFNFOU, IFBE);
^
// ...
^
1C@ GDI@ DIND?@ JOTFSU"U)FBE() F@@KN OC@ IJ?@N >;@=76 =T <??DIB < I@R IJ?@ OJ OC@ C@<? JA
OC@ GDNO. (A API>ODJI OC<O <??N OJ OC@ @I? JA OC@ GDNO RJPG? =@ HJM@ I<OPM<G <I? HJM@ PN@APG.
4@ RDGG N@@ OC<O API>ODJI G<O@M DI JI@ JA OC@ KMJ=G@HN.)
1C@ MDBCO-C<I? ND?@ @SKM@NNDJI JA OC<O GDI@ >JINOMP>ON < /PEF J=E@>O. 4C@I OCDN I@R J=E@>O DN
>JINOMP>O@?, DON OFYU H@H=@M DN DIDOD<GDU@? =T OC@ >PMM@IO C@<? JA OC@ GDNO. 4C@I OC@ IFBE
H@H=@M JA OC@ GDNO DN <NNDBI@? OJ OCDN I@RGT GDIF@? IJ?@, OC@ I@R @G@H@IO @I?N PK =@DIB OC@
ADMNO @G@H@IO.
1C@ AJGGJRDIB KMJBM<H O@NON OC@N@ ORJ NOMP>ON:
JNQPSU TUE.TUEJP;
JNQPSU TUE.DPOW;
JNQPSU TUE.TUSJOH;
TUSVDU /PEF
\
JOU FMFNFOU;
/PEF * OFYU;
TUSJOH UP4USJOH() DPOTU
\
TUSJOH SFTVMU = UP!TUSJOH(FMFNFOU);
JG (OFYU) \
SFTVMU _= " -> " _ UP!TUSJOH(*OFYU);
^
SFUVSO SFTVMU;
^
^
&A;@F7DE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
431
TUSVDU -JTU
\
/PEF * IFBE;
WPJE JOTFSU"U)FBE(JOU FMFNFOU)
\
IFBE = OFX /PEF(FMFNFOU, IFBE);
^
TUSJOH UP4USJOH() DPOTU
\
SFUVSO GPSNBU("(%T)", IFBE UP!TUSJOH(*IFBE) : "");
^
^
WPJE NBJO()
\
-JTU OVNCFST;
XSJUFMO("CFGPSF: ", OVNCFST);
GPSFBDI (OVNCFS; 0 .. 10) \
OVNCFST.JOTFSU"U)FBE(OVNCFS);
^
XSJUFMO("BGUFS : ", OVNCFST);
^
1C@ JPOKPO:
CFGPSF: ()
BGUFS : (9 -> 8 -> 7 -> 6 -> 5 -> 4 -> 3 -> 2 -> 1 -> 0)
Observing the contents of memory by VCZUF* 69.17.2
1C@ ?<O< NOJM@? <O @<>C H@HJMT <??M@NN DN < =TO@. "Q@MT Q<MD<=G@ DN >JINOMP>O@? JI < KD@>@ JA
H@HJMT OC<O >JINDNON JA <N H<IT =TO@N <N OC@ NDU@ JA OC@ OTK@ JA OC<O Q<MD<=G@.
A NPDO<=G@ KJDIO@M OTK@ OJ J=N@MQ@ OC@ >JIO@IO JA < H@HJMT GJ><ODJI DN VCZUF*. ,I>@ OC@
<??M@NN JA < Q<MD<=G@ DN <NNDBI@? OJ < VCZUF KJDIO@M, OC@I <GG JA OC@ =TO@N JA OC<O Q<MD<=G@ ><I
=@ J=N@MQ@? =T DI>M@H@IODIB OC@ KJDIO@M.
)@O'N >JIND?@M OC@ AJGGJRDIB DIO@B@M OC<O DN DIDOD<GDU@? =T OC@ C@S<?@>DH<G IJO<ODJI NJ OC<O DO
RDGG =@ @<NT OJ PI?@MNO<I? CJR DON =TO@N <M@ KG<>@? DI H@HJMT:
JOU WBSJBCMF = 0Y01@02@03@04;
A KJDIO@M OC<O KJDION <O OC<O Q<MD<=G@ ><I =@ ?@ADI@? GDF@ OCDN:
JOU * BEESFTT = &WBSJBCMF;
1C@ Q<GP@ JA OC<O KJDIO@M ><I =@ <NNDBI@? OJ < VCZUF KJDIO@M =T OC@ DBTU JK@M<OJM:
VCZUF * CZUF1PJOUFS = DBTU(VCZUF*)BEESFTT;
0P>C < KJDIO@M <GGJRN <>>@NNDIB OC@ AJPM =TO@N JA OC@ JOU Q<MD<=G@ DI?DQD?P<GGT:
XSJUFMO(CZUF1PJOUFS<0>);
XSJUFMO(CZUF1PJOUFS<1>);
XSJUFMO(CZUF1PJOUFS<2>);
XSJUFMO(CZUF1PJOUFS<3>);
&A;@F7DE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
432
&A TJPM HD>MJKMJ>@NNJM DN >;FF>7-7@6;3@ GDF@ HDI@, TJP NCJPG? N@@ OC@ =TO@N JA OC@ Q<GP@
0Y01@02@03@04 DI M@Q@MN@:
4
3
2
1
)@O'N PN@ OC<O D?@< DI < API>ODJI OC<O RDGG =@ PN@APG RC@I J=N@MQDIB OC@ =TO@N JA <GG OTK@N JA
Q<MD<=G@N:
JNQPSU TUE.TUEJP;
WPJE QSJOU#ZUFT(5)(SFG 5 WBSJBCMF)
\
DPOTU VCZUF * CFHJO = DBTU(VCZUF*)&WBSJBCMF; // (1)
XSJUFGMO("UZQF : %T", 5.TUSJOHPG);
XSJUFGMO("WBMVF : %T", WBSJBCMF);
XSJUFGMO("BEESFTT: %T", CFHJO); // (2)
XSJUFG ("CZUFT : ");
XSJUFGMO("%(%02Y %)", CFHJO<0 .. 5.TJ[FPG>); // (3)
XSJUFMO();
^
1. ANNDBIDIB OC@ <??M@NN JA OC@ Q<MD<=G@ OJ < VCZUF KJDIO@M.
2. -MDIODIB OC@ Q<GP@ JA OC@ KJDIO@M.
3. ,=O<DIDIB OC@ NDU@ JA OC@ OTK@ =T .TJ[FPG <I? KMDIODIB OC@ =TO@N JA OC@ Q<MD<=G@. (+JO@
CJR < NGD>@ DN KMJ?P>@? AMJH OC@ CFHJO KJDIO@M <I? OC@I OC<O NGD>@ DN KMDIO@? ?DM@>OGT =T
XSJUFGMO().)
AIJOC@M R<T JA KMDIODIB OC@ =TO@N RJPG? =@ OJ <KKGT OC@ * JK@M<OJM DI?DQD?P<GGT:
GPSFBDI (CZUF1PJOUFS; CFHJO .. CFHJO + 5.TJ[FPG) \
XSJUFG("%02Y ", *CZUF1PJOUFS);
^
1C@ Q<GP@ JA CZUF1PJOUFS RJPG? >C<IB@ AMJH CFHJO OJ CFHJO + 5.TJ[FPG OJ QDNDO <GG JA OC@
=TO@N JA OC@ Q<MD<=G@. +JO@ OC<O OC@ Q<GP@ CFHJO + 5.TJ[FPG DN JPOND?@ JA OC@ M<IB@ <I? DN
I@Q@M <>>@NN@?.
1C@ AJGGJRDIB KMJBM<H ><GGN QSJOU#ZUFT() RDOC Q<MDJPN OTK@N JA Q<MD<=G@N:
TUSVDU 4USVDU
\
JOU GJSTU;
JOU TFDPOE;
^
DMBTT $MBTT
\
JOU J;
JOU K;
JOU L;
UIJT(JOU J, JOU K, JOU L)
\
UIJT.J = J;
UIJT.K = K;
UIJT.L = L;
^
&A;@F7DE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
433
^
WPJE NBJO()
\
JOU JOUFHFS7BSJBCMF = 0Y11223344;
QSJOU#ZUFT(JOUFHFS7BSJBCMF);
EPVCMF EPVCMF7BSJBCMF = EPVCMF.OBO;
QSJOU#ZUFT(EPVCMF7BSJBCMF);
TUSJOH TMJDF = "B CSJHIU BOE DIBSNJOH GB`BEF";
QSJOU#ZUFT(TMJDF);
JOU<3> BSSBZ = < 1, 2, 3 >;
QSJOU#ZUFT(BSSBZ);
BVUP TUSVDU0CKFDU = 4USVDU(0YBB, 0YCC);
QSJOU#ZUFT(TUSVDU0CKFDU);
BVUP DMBTT7BSJBCMF = OFX $MBTT(1, 2, 3);
QSJOU#ZUFT(DMBTT7BSJBCMF);
^
1C@ JPOKPO JA OC@ KMJBM<H DN DIAJMH<ODQ@:
UZQF : JOU
WBMVF : 287454020
BEESFTT: 7'''19"83'#0
CZUFT : 44 33 22 11 (1)
UZQF : EPVCMF
WBMVF : OBO
BEESFTT: 7'''19"83'#8
CZUFT : 00 00 00 00 00 00 G8 7G (2)
UZQF : TUSJOH
WBMVF : B CSJHIU BOE DIBSNJOH GBaBEF
BEESFTT: 7'''19"83'$0
CZUFT : 1E 00 00 00 00 00 00 00 F0 68 48 00 00 00 00 00
(3)
UZQF : JOU<3-6>
WBMVF : <1, 2, 3>
BEESFTT: 7'''19"83'%0
CZUFT : 01 00 00 00 02 00 00 00 03 00 00 00 (1)
UZQF : 4USVDU
WBMVF : 4USVDU(170, 187)
BEESFTT: 7'''19"83'&8
CZUFT : BB 00 00 00 CC 00 00 00 (1)
UZQF : $MBTT
WBMVF : EFOFNF.$MBTT
BEESFTT: 7'''19"83''0
CZUFT : 80 EG 79 E5 97 7G 00 00 (4)
Observations:
&A;@F7DE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
434
1. AGOCJPBC DI M@Q@MN@ JM?@M JI GDOOG@-@I?D<I NTNO@HN, OC@ =TO@N JA NJH@ JA OC@ OTK@N <M@ <N
JI@ RJPG? @SK@>O: 1C@ =TO@N <M@ G<D? JPO DI H@HJMT ND?@ =T ND?@ AJM JOUN, ADS@?-G@IBOC
<MM<TN (JOU<3>), <I? NOMP>O J=E@>ON.
2. JIND?@MDIB OC<O OC@ =TO@N JA OC@ NK@>D<G Q<GP@ JA EPVCMF.OBO <M@ <GNJ DI M@Q@MN@ JM?@M DI
H@HJMT, R@ ><I N@@ OC<O DO DN M@KM@N@IO@? =T OC@ NK@>D<G =DO K<OO@MI 0S7AA8000000000000.
3. TUSJOH DN M@KJMO@? OJ =@ >JINDNODIB JA 16 =TO@N =PO DO DN DHKJNND=G@ OJ ADO OC@ G@OO@MN "B
CSJHIU BOE DIBSNJOH GB`BEF" DIOJ NJ A@R =TO@N. 1CDN DN ?P@ OJ OC@ A<>O OC<O =@CDI? OC@
N>@I@N TUSJOH DN <>OP<GGT DHKG@H@IO@? <N < NOMP>O. -M@ADSDIB DON I<H@ =T @@ OJ NOM@NN OC@
A<>O OC<O DO DN <I DIO@MI<G OTK@ PN@? =T OC@ >JHKDG@M, OC<O NOMP>O DN NDHDG<M OJ OC@ AJGGJRDIB
JI@:
TUSVDU @@TUSJOH
\
TJ[F@U MFOHUI;
DIBS * QUS; // UIF BDUVBM DIBSBDUFST
^
1C@ @QD?@I>@ JA OCDN A<>O DN CD??@I DI OC@ =TO@N OC<O <M@ KMDIO@? AJM TUSJOH <=JQ@.
+JO@ OC<O =@><PN@ \ DN H<?@ PK JA ORJ 21#-8 >J?@ PIDON, OC@ 28 G@OO@MN JA OC@ NOMDIB
"B CSJHIU BOE DIBSNJOH GB`BEF" >JINDNON JA < OJO<G JA 29 =TO@N. 1C@ Q<GP@
0S000000000000001?, OC@ ADMNO 8 JA OC@ =TO@N JA OC@ NOMDIB DI OC@ JPOKPO <=JQ@, DN
<GNJ 29. 1CDN DN < NOMJIB DI?D><OJM OC<O NOMDIBN <M@ DI?@@? G<D? JPO DI H@HJMT <N DI OC@
NOMP>O <=JQ@.
4. 0DHDG<MGT, DO DN IJO KJNND=G@ OJ ADO OC@ OCM@@ JOU H@H=@MN JA OC@ >G<NN J=E@>O DI 8 =TO@N. 1C@
JPOKPO <=JQ@ CDION <O OC@ KJNND=DGDOT OC<O =@CDI? OC@ N>@I@N < >G<NN Q<MD<=G@ DN
DHKG@H@IO@? <N < NDIBG@ KJDIO@M OC<O KJDION <O OC@ <>OP<G >G<NN J=E@>O:
TUSVDU @@$MBTT@7BSJBCMF5ZQF
\
@@$MBTT@"DUVBM0CKFD5ZQF * PCKFDU;
^
)@O'N IJR >JIND?@M < HJM@ AG@SD=G@ API>ODJI. &INO@<? JA KMDIODIB OC@ =TO@N JA < Q<MD<=G@, G@O'N
?@ADI@ < API>ODJI OC<O KMDION NK@>DAD@? IPH=@M JA =TO@N <O < NK@>DAD@? GJ><ODJI:
JNQPSU TUE.TUEJP;
JNQPSU TUE.BTDJJ;
WPJE QSJOU.FNPSZ(5)(5 * MPDBUJPO, TJ[F@U MFOHUI)
\
DPOTU VCZUF * CFHJO = DBTU(VCZUF*)MPDBUJPO;
GPSFBDI (BEESFTT; CFHJO .. CFHJO + MFOHUI) \
DIBS D = (JT1SJOUBCMF(*BEESFTT) *BEESFTT : '.');
XSJUFGMO("%T: %02Y %T", BEESFTT, *BEESFTT, D);
^
^
0DI>@ NJH@ JA OC@ 21#-8 >J?@ PIDON H<T >JMM@NKJI? OJ >JIOMJG >C<M<>O@MN JA OC@ >JINJG@ <I?
?DNMPKO DON JPOKPO, R@ KMDIO JIGT OC@ KMDIO<=G@ >C<M<>O@MN =T ADMNO >C@>FDIB OC@H DI?DQD?P<GGT
=T TUE.BTDJJ.JT1SJOUBCMF(). 1C@ IJI-KMDIO<=G@ >C<M<>O@MN <M@ KMDIO@? <N < ?JO.
4@ ><I PN@ OC<O API>ODJI OJ KMDIO OC@ 21#-8 >J?@ PIDON JA < TUSJOH OCMJPBC DON .QUS KMJK@MOT:
WPJE NBJO()
\
TUSJOH T = "B CSJHIU BOE DIBSNJOH GB`BEF";
&A;@F7DE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
435
QSJOU.FNPSZ(T.QUS, T.MFOHUI);
^
AN N@@I DI OC@ JPOKPO, OC@ G@OO@M \ >JINDNON JA ORJ =TO@N:
47#4'0: 61 B
47#4'1: 20
47#4'2: 62 C
47#4'3: 72 S
47#4'4: 69 J
47#4'5: 67 H
47#4'6: 68 I
47#4'7: 74 U
47#4'8: 20
47#4'9: 61 B
47#4'": 6F O
47#4'#: 64 E
47#4'$: 20
47#4'%: 63 D
47#4'&: 68 I
47#4'': 61 B
47#500: 72 S
47#501: 6E N
47#502: 69 J
47#503: 6F O
47#504: 67 H
47#505: 20
47#506: 66 G
47#507: 61 B
47#508: D3 .
47#509: B7 .
47#50": 61 B
47#50#: 64 E
47#50$: 65 F
Exercises
69.18
1. #DS OC@ AJGGJRDIB API>ODJI NJ OC<O OC@ Q<GP@N JA OC@ <MBPH@ION OC<O <M@ K<NN@? OJ DO <M@
NR<KK@?. #JM OCDN @S@M>DN@, ?J IJO NK@>DAT OC@ K<M<H@O@MN <N SFG =PO O<F@ OC@H <N
KJDIO@MN:
WPJE TXBQ(JOU MIT, JOU SIT)
\
JOU UFNQ = MIT;
MIT = SIT;
SIT = UFNQ;
^
WPJE NBJO()
\
JOU J = 1;
JOU K = 2;
TXBQ(J, K);
&A;@F7DE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
436
// 5IFJS WBMVFT TIPVME CF TXBQQFE
BTTFSU(J == 2);
BTTFSU(K == 1);
^
4C@I TJP NO<MO OC@ KMJBM<H TJP RDGG IJOD>@ OC<O OC@ BTTFSU >C@>FN >PMM@IOGT A<DG.
2. JIQ@MO OC@ GDIF@? GDNO OC<O R@ C<Q@ ?@ADI@? <=JQ@ OJ < O@HKG<O@ NJ OC<O DO ><I =@ PN@? AJM
NOJMDIB @G@H@ION JA <IT OTK@.
3. &O DN HJM@ I<OPM<G OJ <?? @G@H@ION OJ OC@ @I? JA < GDIF@? GDNO. *J?DAT -JTU NJ OC<O DO DN
KJNND=G@ OJ <?? @G@H@ION OJ OC@ @I? <N R@GG.
#JM OCDN @S@M>DN@, <I <??DODJI<G KJDIO@M H@H=@M Q<MD<=G@ OC<O KJDION <O OC@ G<NO
@G@H@IO RDGG =@ PN@APG.
... F:7 EA>GF;A@E
&A;@F7DE
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
437
Bit Operations 70
1CDN >C<KO@M >JQ@MN JK@M<ODJIN JI =DON, OC@ NH<GG@NO ?<O< PIDON. BDO JK@M<ODJIN <M@ <HJIB OC@
HJNO API?<H@IO<G A@<OPM@N JA HD>MJKMJ>@NNJMN.
0TNO@H KMJBM<HH@MN HPNO PI?@MNO<I? =DO JK@M<ODJIN <O G@<NO OJ PN@ 8>39 K<M<H@O@MN
>JMM@>OGT.
Representation of data at the lowest level
70.1
-MJBM<HHDIB G<IBP<B@N <M@ <=NOM<>ODJIN. A PN@M OTK@ GDF@ 4UVEFOU ?@ADI@? DI <
KMJBM<HHDIB G<IBP<B@ DN IJO ?DM@>OGT M@G<O@? OJ OC@ DIO@MI<GN JA OC@ >JHKPO@M. -MJBM<HHDIB
G<IBP<B@N <M@ OJJGN OC<O C@GK CPH<IN PN@ OC@ C<M?R<M@ RDOCJPO I@@?DIB OJ FIJR OC@ ?@O<DGN
JA OC@ C<M?R<M@.
AGOCJPBC DO DN PNP<GGT IJO I@>@NN<MT OJ ?@<G RDOC OC@ C<M?R<M@ ?DM@>OGT, DO DN C@GKAPG OJ
PI?@MNO<I? CJR ?<O< DN M@KM@N@IO@? <O C<M?R<M@ G@Q@G.
Transistor 70.1.1
1C@ KMJ>@NNDIB <=DGDOD@N JA HJ?@MI @G@>OMJID> ?@QD>@N <M@ HJNOGT =<N@? JI OC@ @G@>OMJID>
@G@H@IO ><GG@? F:7 FD3@E;EFAD. A NDBIDAD><IO <=DGDOT JA OC@ OM<INDNOJM DN OC<O DO ><I =@ >JIOMJGG@?
=T JOC@M K<MON JA OC@ @G@>OMJID> >DM>PDO OC<O OC@ OM<INDNOJM DN < K<MO JA. &I < R<T, DO <GGJRN OC@
@G@>OMJID> >DM>PDO =@ <R<M@ JA DON@GA <I? =@ <=G@ OJ >C<IB@ DON JRI NO<O@.
Bit 70.1.2
1C@ NH<GG@NO PIDO JA DIAJMH<ODJI DN < =DO. A =DO ><I =@ M@KM@N@IO@? =T <IT ORJ-NO<O@ NTNO@H
(@.B. =T < NK@>D<G <MM<IB@H@IO JA < A@R OM<INDNOJMN JA <I @G@>OMJID> >DM>PDO). A =DO ><I C<Q@
JI@ JA ORJ Q<GP@N: 0 JM 1. &I OC@ >JHKPO@M'N H@HJMT, OC@ DIAJMH<ODJI OC<O DN NOJM@? DI < =DO
K@MNDNON PIODG < I@R Q<GP@ DN NOJM@? JM PIODG OC@ @I@MBT NJPM>@ DN ?DN>JII@>O@?.
JHKPO@MN ?J IJO KMJQD?@ ?DM@>O <>>@NN OJ =DON. ,I@ M@<NJI DN OC<O ?JDIB NJ RJPG? >JHKGD><O@
OC@ ?@NDBI JA OC@ >JHKPO@M <I? <N < >JIN@LP@I>@ H<F@ OC@ >JHKPO@M HJM@ @SK@INDQ@.
AIJOC@M M@<NJI DN OC<O OC@M@ <M@ IJO H<IT >JI>@KON OC<O ><I =@ M@KM@N@IO@? =T < NDIBG@ =DO.
Byte 70.1.3
A =TO@ DN < >JH=DI<ODJI JA 8 =DON. 1C@ NH<GG@NO PIDO JA DIAJMH<ODJI OC<O ><I =@ <??M@NN@?
PIDLP@GT DN < =TO@. JHKPO@MN M@<? AMJH JM RMDO@ OJ H@HJMT <O G@<NO JI@ =TO@ <O < ODH@.
#JM OC<O M@<NJI, <GOCJPBC DO ><MMD@N JI@ =DO JA DIAJMH<ODJI (GBMTF JM USVF), @Q@I CPPM HPNO
=@ DHKG@H@IO@? <N JI@ =TO@:
XSJUFGMO("%T JT %T CZUF(T)", CPPM.TUSJOHPG, CPPM.TJ[FPG);
CPPM JT 1 CZUF(T)
Register 70.1.4
!<O< OC<O <M@ =@DIB JK@M<O@? JI DI < HD>MJKMJ>@NNJM <M@ NOJM@? DI M@BDNO@MN. /@BDNO@MN
KMJQD?@ Q@MT GDHDO@? =PO Q@MT A<NO JK@M<ODJIN.
1C@ NDU@ JA OC@ M@BDNO@MN ?@K@I? JI OC@ <M>CDO@>OPM@ JA OC@ HD>MJKMJ>@NNJM. #JM @S<HKG@,
32-=DO HD>MJKMJ>@NNJMN >JHHJIGT C<Q@ 4-=TO@ M@BDNO@MN <I? 64-=DO HD>MJKMJ>@NNJMN
B;F %B7D3F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
438
>JHHJIGT C<Q@ 8-=TO@ M@BDNO@MN. 1C@ NDU@ JA OC@ M@BDNO@MN ?@O@MHDI@ CJR HP>C DIAJMH<ODJI
OC@ HD>MJKMJ>@NNJM ><I KMJ>@NN @AAD>D@IOGT <O < ODH@ <I? CJR H<IT H@HJMT <??M@NN@N OC<O DO
><I NPKKJMO.
"Q@MT O<NF OC<O DN <>CD@Q@? =T < KMJBM<HHDIB G<IBP<B@ @I?N PK =@DIB @S@>PO@? =T JI@ JM
HJM@ M@BDNO@MN JA OC@ HD>MJKMJ>@NNJM.
Binary number system
70.2
1C@ ?@>DH<G IPH=@M NTNO@H RCD>C DN PN@? DI ?<DGT GDA@ >JINDNON JA 10 IPH@M<GN: 0123456789.
&I >JIOM<NO, OC@ =DI<MT IPH=@M NTNO@H RCD>C DN PN@? =T >JHKPO@M C<M?R<M@ >JINDNON JA 2
IPH@M<GN: 0 <I? 1. 1CDN DN < ?DM@>O >JIN@LP@I>@ JA < =DO >JINDNODIB JA ORJ Q<GP@N. &A =DON C<?
OCM@@ Q<GP@N OC@I OC@ >JHKPO@MN RJPG? PN@ < IPH=@M NTNO@H =<N@? JI OCM@@ IPH@M<GN.
1C@ ?DBDON JA OC@ ?@>DH<G NTNO@H <M@ I<H@? DI>M@H@IO<GGT <N A@7E, F7@E, :G@6D76E,
F:AGE3@6E, @O>. #JM @S<HKG@, OC@ IPH=@M 1023 ><I =@ @SK<I?@? <N DI OC@ AJGGJRDIB R<T:
1023 == 1 DPVOU PG UIPVTBOE, OP IVOESFE, 2 DPVOUT PG UFO, BOE 3 DPVOUT PG POF
+<OPM<GGT, HJQDIB JI@ ?DBDO OJ OC@ G@AO HPGODKGD@N OC@ Q<GP@ JA OC<O ?DBDO =T 10: 1, 10, 100,
1000, @O>.
4C@I OC@ N<H@ MPG@N <M@ <KKGD@? OJ < NTNO@H OC<O C<N ORJ IPH@M<GN, R@ <MMDQ@ <O OC@ =DI<MT
IPH=@M NTNO@H. 1C@ ?DBDON <M@ I<H@? DI>M@H@IO<GGT <N A@7E, FIAE, 8AGDE, 7;9:FE, @O>. &I JOC@M
RJM?N, HJQDIB JI@ ?DBDO OJ OC@ G@AO RJPG? HPGODKGT OC@ Q<GP@ JA OC<O ?DBDO =T 2: 1, 2, 4, 8, @O>.
#JM @S<HKG@, OC@ 4;@3DK IPH=@M 1011 ><I =@ @SK<I?@? <N DI OC@ AJGGJRDIB R<T:
1011 == 1 DPVOU PG FJHIU, OP GPVS, 1 DPVOU PG UXP, BOE 1 DPVOU PG POF
1J H<F@ DO @<NT OJ M@A@M OJ ?DBDON, OC@T <M@ IPH=@M@? AMJH OC@ MDBCOHJNO ?DBDO OJ OC@ G@AOHJNO
?DBDO, NO<MODIB =T 0. 1C@ AJGGJRDIB O<=G@ GDNON OC@ Q<GP@N JA <GG JA OC@ ?DBDON JA < 32-=DO PINDBI@?
IPH=@M DI OC@ =DI<MT NTNO@H:
B;F %B7D3F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
439
%JHJU 7BMVF
31 2,147,483,648
30 1,073,741,824
29 536,870,912
28 268,435,456
27 134,217,728
26 67,108,864
25 33,554,432
24 16,777,216
23 8,388,608
22 4,194,304
21 2,097,152
20 1,048,576
19 524,288
18 262,144
17 131,072
16 65,536
15 32,768
14 16,384
13 8,192
12 4,096
11 2,048
10 1,024
9 512
8 256
7 128
6 64
5 32
4 16
3 8
2 4
1 2
0 1
1C@ =DON OC<O C<Q@ CDBC@M Q<GP@N <M@ ><GG@? OC@ GBB7D =DON <I? OC@ =DON OC<O C<Q@ GJR@M Q<GP@N
<M@ ><GG@? OC@ >AI7D =DON.
/@H@H=@MDIB AMJH OC@ )DO@M<GN >C<KO@M OC<O =DI<MT GDO@M<GN <M@ NK@>DAD@? =T OC@ 0C KM@ADS, OC@
AJGGJRDIB KMJBM<H ?@HJINOM<O@N CJR OC@ Q<GP@ JA < GDO@M<G RJPG? >JMM@NKJI? OJ OC@ MJRN JA
OC@ KM@QDJPN O<=G@:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
// 1073741824 4 1
// m m m
JOU OVNCFS = 0C@01000000@00000000@00000000@00000101;
XSJUFMO(OVNCFS);
^
1C@ JPOKPO:
B;F %B7D3F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
440
1073741829
+JO@ OC<O OC@ GDO@M<G >JINDNON JA JIGT OCM@@ IJI-U@MJ =DON. 1C@ Q<GP@ OC<O DN KMDIO@? DN OC@ NPH
JA OC@ Q<GP@N OC<O >JMM@NKJI? OJ OCJN@ =DON AMJH OC@ KM@QDJPN O<=G@: 1073741824 + 4 + 1 ==
1073741829.
The sign bit of signed integer types 70.2.1
1C@ PKK@MHJNO =DO JA < NDBI@? OTK@ ?@O@MHDI@N RC@OC@M OC@ Q<GP@ DN KJNDODQ@ JM I@B<ODQ@:
JOU OVNCFS = 0C@10000000@00000000@00000000@00000000;
XSJUFMO(OVNCFS);
-2147483648
%JR@Q@M, OC@ PKK@MHJNO =DO DN IJO @IODM@GT N@K<M<O@ AMJH OC@ Q<GP@. #JM @S<HKG@, <N
@QD?@I>@? <=JQ@, OC@ A<>O OC<O <GG JA OC@ JOC@M =DON JA OC@ IPH=@M =@DIB 0 ?J@N IJO H@<I OC<O
OC@ Q<GP@ DN -0. (&I A<>O, -0 DN IJO < Q<GD? Q<GP@ AJM DIO@B@MN.) & RDGG IJO B@O DIOJ HJM@ ?@O<DG DI
OCDN >C<KO@M JOC@M OC<I IJODIB OC<O OCDN DN ?P@ OJ OC@ FIAE 5A?B>7?7@F M@KM@N@IO<ODJI, RCD>C
DN PN@? =T ! <N R@GG.
4C<O DN DHKJMO<IO C@M@ DN OC<O 2,147,483,648; OC@ CDBC@NO Q<GP@ DI OC@ KM@QDJPN O<=G@, DN JIGT
AJM PINDBI@? DIO@B@M OTK@N. 1C@ N<H@ @SK@MDH@IO RDOC VJOU RJPG? KMDIO OC<O @S<>O Q<GP@:
VJOU OVNCFS = 0C@10000000@00000000@00000000@00000000;
XSJUFMO(OVNCFS);
2147483648
-<MOGT AJM OC<O M@<NJI, PIG@NN OC@M@ DN < M@<NJI IJO OJ, =DO JK@M<ODJIN HPNO <GR<TN =@ @S@>PO@?
JI PINDBI@? OTK@N: VCZUF, VJOU, <I? VMPOH.
Hexadecimal number system
70.3
AN ><I =@ N@@I DI OC@ GDO@M<GN <=JQ@, >JINDNODIB JIGT JA 0N <I? 1N, OC@ =DI<MT NTNO@H H<T IJO
=@ M@<?<=G@ @NK@>D<GGT RC@I OC@ IPH=@MN <M@ G<MB@.
#JM OC<O M@<NJI, OC@ HJM@ M@<?<=G@ C@S<?@>DH<G NTNO@H C<N =@@I RD?@GT <?JKO@? @NK@>D<GGT
DI >JHKPO@M O@>CIJGJBD@N.
1C@ C@S<?@>DH<G NTNO@H C<N 16 IPH@M<GN. 0DI>@ <GKC<=@ON ?J IJO C<Q@ HJM@ OC<I 10
IPH@M<GN, OCDN NTNO@H =JMMJRN 6 G@OO@MN AMJH OC@ )<ODI <GKC<=@O <I? PN@N OC@H <GJIB RDOC
M@BPG<M IPH@M<GN: 0123456789<=>?@A. 1C@ IPH@M<GN <, =, >, ?, @, <I? A C<Q@ OC@ Q<GP@N 10,
11, 12, 13, 14, <I? 15, M@NK@>ODQ@GT. 1C@ G@OO@MN AB!"# ><I =@ PN@? <N R@GG.
0DHDG<M OJ JOC@M IPH=@M NTNO@HN, OC@ Q<GP@ JA @Q@MT ?DBDO DN 16 ODH@N OC@ Q<GP@ JA OC@ ?DBDO JI
DON MDBCO-C<I? ND?@: 1, 16, 256, 4096, @O>. #JM @S<HKG@, OC@ Q<GP@N JA <GG JA OC@ ?DBDON JA <I
8-?DBDO PINDBI@? C@S<?@>DH<G IPH=@M <M@ OC@ AJGGJRDIB:
B;F %B7D3F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
441
%JHJU 7BMVF
7 268,435,456
6 16,777,216
5 1,048,576
4 65,536
3 4,096
2 256
1 16
0 1
/@H@H=@MDIB OC<O C@S<?@>DH<G GDO@M<GN <M@ NK@>DAD@? =T OC@ 0Y KM@ADS, R@ ><I N@@ CJR OC@
Q<GP@N JA OC@ ?DBDON >JIOMD=PO@ OJ OC@ JQ@M<GG Q<GP@ JA < IPH=@M:
// 1048576 4096 1
// m m m
VJOU TBZf = 0Y@0030@B00G;
XSJUFMO(TBZf);
3186703
1C@ Q<GP@ OC<O DN KMDIO@? DN =T OC@ >JIOMD=PODJIN JA <GG JA OC@ IJI-U@MJ ?DBDON: 3 >JPIO JA
1048576, B >JPIO JA 4096, <I? G >JPIO JA 1. /@H@H=@MDIB OC<O B M@KM@N@ION 10 <I? G
M@KM@N@ION 15, OC@ Q<GP@ DN 3145728 + 40960 + 15 == 3186703.
&O DN NOM<DBCOAJMR<M? OJ >JIQ@MO =@OR@@I =DI<MT <I? C@S<?@>DH<G IPH=@MN. &I JM?@M OJ
>JIQ@MO < C@S<?@>DH<G IPH=@M OJ =DI<MT, OC@ ?DBDON JA OC@ C@S<?@>DH<G IPH=@M <M@ >JIQ@MO@?
OJ OC@DM =DI<MT M@KM@N@IO<ODJIN DI?DQD?P<GGT. 1C@ >JMM@NKJI?DIB M@KM@N@IO<ODJIN DI OC@ OCM@@
IPH=@M NTNO@HN <M@ <N DI OC@ AJGGJRDIB O<=G@:
)FYBEFDJNBM #JOBSZ %FDJNBM
0 0000 0
1 0001 1
2 0010 2
3 0011 3
4 0100 4
5 0101 5
6 0110 6
7 0111 7
8 1000 8
9 1001 9
B 1010 10
C 1011 11
D 1100 12
E 1101 13
F 1110 14
G 1111 15
#JM @S<HKG@, OC@ C@S<?@>DH<G IPH=@M 0S0030<00A ><I =@ RMDOO@I DI OC@ =DI<MT AJMH =T
>JIQ@MODIB DON ?DBDON DI?DQD?P<GGT <>>JM?DIB OJ OC@ KM@QDJPN O<=G@:
// IFYBEFDJNBM: 0 0 3 0 B 0 0 G
VJOU CJOBSZ = 0C@0000@0000@0011@0000@1010@0000@0000@1111;
B;F %B7D3F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
442
JIQ@MODIB AMJH =DI<MT OJ C@S<?@>DH<G DN OC@ M@Q@MN@: 1C@ ?DBDON JA OC@ =DI<MT IPH=@M <M@
>JIQ@MO@? OJ OC@DM C@S<?@>DH<G M@KM@N@IO<ODJIN AJPM ?DBDON <O < ODH@. #JM @S<HKG@, C@M@ DN
CJR OJ RMDO@ DI C@S<?@>DH<G OC@ N<H@ =DI<MT Q<GP@ OC<O R@ C<Q@ PN@? @<MGD@M:
// CJOBSZ: 0100 0000 0000 0000 0000 0000 0000 0101
VJOU IFYBEFDJNBM = 0Y@@@4@@@@0@@@@0@@@@0@@@@0@@@@0@@@@0@@@@5;
Bit operations
70.4
AAO@M BJDIB JQ@M CJR Q<GP@N <M@ M@KM@N@IO@? =T =DON <I? CJR IPH=@MN <M@ M@KM@N@IO@? DI
=DI<MT <I? C@S<?@>DH<G, R@ ><I IJR N@@ JK@M<ODJIN OC<O >C<IB@ Q<GP@N <O =DO-G@Q@G.
B@><PN@ OC@M@ DN IJ ?DM@>O <>>@NN OJ DI?DQD?P<G =DON, @Q@I OCJPBC OC@N@ JK@M<ODJIN <M@ <O =DO-
G@Q@G, OC@T <AA@>O <O G@<NO 8 =DON <O < ODH@. #JM @S<HKG@, AJM < Q<MD<=G@ JA OTK@ VCZUF, < =DO
JK@M<ODJI RJPG? =@ <KKGD@? OJ <GG JA OC@ 8 =DON JA OC<O Q<MD<=G@.
AN OC@ PKK@MHJNO =DO DN OC@ NDBI =DO AJM NDBI@? OTK@N, & RDGG DBIJM@ NDBI@? OTK@N <I? PN@ JIGT
VJOU DI OC@ @S<HKG@N =@GJR. 6JP ><I M@K@<O OC@N@ JK@M<ODJIN RDOC VMPOH <I? VCZUF, <N R@GG
<N CZUF, JOU, <I? MPOH <N GJIB <N TJP M@H@H=@M OC@ NK@>D<G H@<IDIB JA OC@ PKK@MHJNO =DO.
)@O'N ADMNO ?@ADI@ < API>ODJI RCD>C RDGG =@ PN@APG G<O@M RC@I @S<HDIDIB CJR =DO JK@M<OJMN
RJMF. 1CDN API>ODJI RDGG KMDIO < Q<GP@ DI =DI<MT, C@S<?@>DH<G, <I? ?@>DH<G NTNO@HN:
JNQPSU TUE.TUEJP;
WPJE QSJOU(VJOU OVNCFS)
\
XSJUFGMO("%032C %08Y %10T", OVNCFS, OVNCFS, OVNCFS);
^
WPJE NBJO()
\
QSJOU(123456789);
^
%@M@ DN OC@ N<H@ Q<GP@ KMDIO@? DI OC@ =DI<MT, C@S<?@>DH<G, <I? ?@>DH<G IPH=@M NTNO@HN:
00000111010110111100110100010101 075CDE15 123456789
Complement operator: _ 70.4.1
$AF 47 5A@8GE76 I;F: F:7 4;@3DK ~ AB7D3FAD F:3F ;E GE76 8AD 3DD3K 5A@53F7@3F;A@, F:;E ;E F:7
G@3DK ~ AB7D3FAD.
1CDN JK@M<OJM >JIQ@MON @<>C =DO JA < Q<GP@ OJ DON JKKJNDO@: 1C@ =DON OC<O <M@ 0 =@>JH@ 1, <I?
OC@ =DON OC<O <M@ 1 =@>JH@ 0.
VJOU WBMVF = 123456789;
XSJUF(" "); QSJOU(WBMVF);
XSJUFMO("_ --------------------------------");
XSJUF(" "); QSJOU(_WBMVF);
1C@ @AA@>O DN J=QDJPN DI OC@ =DI<MT M@KM@N@IO<ODJI. "Q@MT =DO C<N =@@I M@Q@MN@? (PI?@M OC@
?<NC@? GDI@):
00000111010110111100110100010101 075CDE15 123456789
_ --------------------------------
11111000101001000011001011101010 G8B432FB 4171510506
B;F %B7D3F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
443
%@M@ DN OC@ NPHH<MT JA CJR OC@ PI<MT _ JK@M<OJM RJMFN:
_0 l 1
_1 l 0
And operator: & 70.4.2
& DN < =DI<MT JK@M<OJM, RMDOO@I =@OR@@I ORJ @SKM@NNDJIN. 1C@ HD>MJKMJ>@NNJM >JIND?@MN ORJ
>JMM@NKJI?DIB =DON JA OC@ ORJ @SKM@NNDJIN N@K<M<O@GT AMJH <GG JA OC@ JOC@M =DON: BDON 31, 30,
29, @O>. JA OC@ @SKM@NNDJIN <M@ @Q<GP<O@? N@K<M<O@GT. 1C@ Q<GP@ JA @<>C M@NPGO<IO =DO DN 1 DA
=JOC JA OC@ >JMM@NKJI?DIB =DON JA OC@ @SKM@NNDJIN <M@ 1; 0 JOC@MRDN@.
VJOU MIT = 123456789;
VJOU SIT = 987654321;
XSJUF(" "); QSJOU(MIT);
XSJUF(" "); QSJOU(SIT);
XSJUFMO("& --------------------------------");
XSJUF(" "); QSJOU(MIT & SIT);
1C@ AJGGJRDIB JPOKPO >JIO<DIN ADMNO OC@ G@AO-C<I? ND?@ @SKM@NNDJI (GCN) <I? OC@I OC@ MDBCO-C<I?
ND?@ @SKM@NNDJI (MCN). 1C@ M@NPGO JA OC@ & JK@M<ODJI DN PI?@M OC@ ?<NC@? GDI@:
00000111010110111100110100010101 075CDE15 123456789
00111010110111100110100010110001 3BEF68C1 987654321
& --------------------------------
00000010010110100100100000010001 025B4811 39471121
+JO@ OC<O OC@ =DON JA OC@ M@NPGO OC<O C<Q@ OC@ Q<GP@ 1 <M@ OC@ JI@N RC@M@ OC@ >JMM@NKJI?DIB
=DON JA OC@ @SKM@NNDJIN <M@ =JOC 1.
1CDN JK@M<OJM DN ><GG@? OC@ 3@6 JK@M<OJM =@><PN@ DO KMJ?P>@N 1 RC@I =JOC OC@ G@AO-C<I? ND?@
3@6 OC@ MDBCO-C<I? ND?@ =DON <M@ 1. AHJIB OC@ AJPM KJNND=G@ >JH=DI<ODJIN JA 0 <I? 1 Q<GP@N,
JIGT OC@ JI@ RC@M@ =JOC JA OC@ Q<GP@N <M@ 1 KMJ?P>@N 1:
0 & 0 l 0
0 & 1 l 0
1 & 0 l 0
1 & 1 l 1
,=N@MQ<ODJIN:
t 4C@I JI@ JA OC@ =DON DN 0, M@B<M?G@NN JA OC@ JOC@M =DO OC@ M@NPGO DN <GR<TN 0. A>>JM?DIBGT,
"3@6;@9 < =DO =T 0" H@<IN OJ >G@<M OC<O =DO.
t 4C@I JI@ JA OC@ =DON DN 1, OC@ M@NPGO DN OC@ Q<GP@ JA OC@ JOC@M =DO; 3@6;@9 =T 1 C<N IJ @AA@>O.
Or operator: ] 70.4.3
] DN < =DI<MT JK@M<OJM, RMDOO@I =@OR@@I ORJ @SKM@NNDJIN. 1C@ HD>MJKMJ>@NNJM >JIND?@MN ORJ
>JMM@NKJI?DIB =DON JA OC@ ORJ @SKM@NNDJIN N@K<M<O@GT AMJH <GG JA OC@ JOC@M =DON. 1C@ Q<GP@ JA
@<>C M@NPGO<IO =DO DN 0 DA =JOC JA OC@ >JMM@NKJI?DIB =DON JA OC@ @SKM@NNDJIN <M@ 0; 1 JOC@MRDN@.
VJOU MIT = 123456789;
VJOU SIT = 987654321;
XSJUF(" "); QSJOU(MIT);
XSJUF(" "); QSJOU(SIT);
B;F %B7D3F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
444
XSJUFMO("] --------------------------------");
XSJUF(" "); QSJOU(MIT ] SIT);
00000111010110111100110100010101 075CDE15 123456789
00111010110111100110100010110001 3BEF68C1 987654321
] --------------------------------
00111111110111111110110110110101 3GEGFEC5 1071639989
+JO@ OC<O OC@ =DON JA OC@ M@NPGO OC<O C<Q@ OC@ Q<GP@ 0 <M@ OC@ JI@N RC@M@ OC@ >JMM@NKJI?DIB
=DON JA OC@ @SKM@NNDJIN <M@ =JOC 0. 4C@I OC@ >JMM@NKJI?DIB =DO DI OC@ G@AO-C<I? ND?@ JM DI OC@
MDBCO-C<I? ND?@ DN 1, OC@I OC@ M@NPGO DN 1:
0 ] 0 l 0
0 ] 1 l 1
1 ] 0 l 1
1 ] 1 l 1
,=N@MQ<ODJIN:
t 4C@I JI@ JA OC@ =DON DN 1, M@B<M?G@NN JA OC@ JOC@M =DO OC@ M@NPGO DN <GR<TN 1. A>>JM?DIBGT,
"ADD;@9 < =DO =T 1" H@<IN OJ N@O DO.
t 4C@I JI@ JA OC@ =DON DN 0, OC@ M@NPGO DN OC@ Q<GP@ JA OC@ JOC@M =DO; ADD;@9 =T 0 C<N IJ @AA@>O.
Xor operator: ? 70.4.4
-AD DN OC@ NCJMO AJM 7J5>GE;H7 AD. 1CDN DN < =DI<MT JK@M<OJM <N R@GG. &O KMJ?P>@N 1 DA OC@
>JMM@NKJI?DIB =DON JA OC@ ORJ @SKM@NNDJIN <M@ ?DAA@M@IO:
VJOU MIT = 123456789;
VJOU SIT = 987654321;
XSJUF(" "); QSJOU(MIT);
XSJUF(" "); QSJOU(SIT);
XSJUFMO("? --------------------------------");
XSJUF(" "); QSJOU(MIT ? SIT);
00000111010110111100110100010101 075CDE15 123456789
00111010110111100110100010110001 3BEF68C1 987654321
? --------------------------------
00111101100001011010010110100100 3E85B5B4 1032168868
+JO@ OC<O OC@ =DON JA OC@ M@NPGO OC<O C<Q@ OC@ Q<GP@ 1 <M@ OC@ JI@N RC@M@ OC@ >JMM@NKJI?DIB
=DON JA OC@ @SKM@NNDJIN <M@ ?DAA@M@IO AMJH @<>C JOC@M.
0 ? 0 l 0
0 ? 1 l 1
1 ? 0 l 1
1 ? 1 l 0
,=N@MQ<ODJI:
t "-ADD;@9 < =DO" RDOC DON@GA H@<IN OJ >G@<M OC<O =DO.
/@B<M?G@NN JA DON Q<GP@, JADD;@9 < Q<MD<=G@ RDOC DON@GA <GR<TN KMJ?P>@N 0:
B;F %B7D3F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
445
VJOU WBMVF = 123456789;
QSJOU(WBMVF ? WBMVF);
00000000000000000000000000000000 00000000 0
Right-shift operator: >> 70.4.5
1CDN JK@M<OJM NCDAON OC@ =DON JA <I @SKM@NNDJI =T OC@ NK@>DAD@? IPH=@M JA =DON OJ OC@ MDBCO. 1C@
MDBCOHJNO =DON, RCD>C ?J IJO C<Q@ MJJH OJ NCDAO DIOJ, B@O 6DABB76 AMJH OC@ Q<GP@. #JM
PINDBI@? OTK@N, OC@ G@AOHJNO =DON <M@ ADGG@? RDOC U@MJN.
1C@ AJGGJRDIB @S<HKG@ KMJ?P>@N < M@NPGO =T NCDAODIB < Q<GP@ =T ORJ =DON OJ OC@ MDBCO:
VJOU WBMVF = 123456789;
QSJOU(WBMVF);
QSJOU(WBMVF >> 2);
&I OC@ AJGGJRDIB JPOKPO, & C<Q@ DI?D><O@? OC@ =DON OC<O <M@ BJDIB OJ =@ GJNO ?P@ OJ ?MJKKDIB JAA
AMJH OC@ MDBCO-C<I? ND?@ DI BM<T, <I? OC@ G@AOHJNO =DON OC<O B@O OC@ Q<GP@ 0 DI =GP@:
00000111010110111100110100010101 075CDE15 123456789
00000001110101101111001101000101 01E6G345 30864197
+JO@ OC<O OC@ =DON JOC@M OC<I BM<T <I? =GP@ C<Q@ =@@I NCDAO@? ORJ =DO KJNDODJIN OJ OC@ MDBCO.
1C@ I@R =DON OC<O @IO@M AMJH OC@ G@AO-C<I? ND?@ <M@ 0 JIGT AJM PINDBI@? OTK@N. #JM NDBI@?
OTK@N, OC@ Q<GP@ JA OC@ G@AOHJNO =DON <M@ ?@O@MHDI@? =T < KMJ>@NN ><GG@? E;9@ 7JF7@E;A@. 0DBI
@SO@INDJI KM@N@MQ@N OC@ Q<GP@ JA OC@ NDBI =DO JA OC@ JMDBDI<G @SKM@NNDJI. 1C@ Q<GP@ JA OC<O =DO
DN PN@? AJM <GG JA OC@ =DON OC<O 7@F7D AMJH OC@ G@AO.
)@O'N N@@ OCDN @AA@>O JI < Q<GP@ JA < NDBI@? OTK@ RC@M@ OC@ NDBI =DO DN 1 (D.@. OC@ Q<GP@ DN
I@B<ODQ@):
JOU WBMVF = 0Y80010300;
QSJOU(WBMVF);
QSJOU(WBMVF >> 3);
B@><PN@ OC@ G@AOHJNO =DO JA OC@ JMDBDI<G Q<GP@ DN 1, <GG JA OC@ I@R =DON JA OC@ M@NPGO <M@ 1 <N
R@GG:
10000000000000010000001100000000 80010300 2147549952
11110000000000000010000001100000 G0002060 4026540128
4C@I OC@ G@AOHJNO =DO DN 0, OC@I <GG JA OC@ I@RN =DON <M@ 0:
JOU WBMVF = 0Y40010300;
QSJOU(WBMVF);
QSJOU(WBMVF >> 3);
01000000000000010000001100000000 40010300 1073808128
00001000000000000010000001100000 08002060 134226016
B;F %B7D3F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
446
Unsigned right-shift operator: >>> 70.4.6
1CDN JK@M<OJM RJMFN NDHDG<MGT OJ OC@ M@BPG<M MDBCO-NCDAO JK@M<OJM. 1C@ ?DAA@M@I>@ DN OC<O OC@
I@R G@AOHJNO =DON <M@ <GR<TN 0 M@B<M?G@NN JA OC@ OTK@ JA OC@ @SKM@NNDJI <I? OC@ Q<GP@ JA OC@
G@AOHJNO =DO:
JOU WBMVF = 0Y80010300;
QSJOU(WBMVF);
QSJOU(WBMVF >>> 3);
10000000000000010000001100000000 80010300 2147549952
00010000000000000010000001100000 10002060 268443744
Left-shift operator: << 70.4.7
1CDN JK@M<OJM RJMFN <N OC@ M@Q@MN@ JA OC@ MDBCO-NCDAO JK@M<OJM. 1C@ =DON <M@ NCDAO@? OJ OC@ G@AO:
VJOU WBMVF = 123456789;
QSJOU(WBMVF);
QSJOU(WBMVF << 4);
1C@ =DON JI OC@ G@AO-C<I? ND?@ <M@ GJNO <I? OC@ I@R =DON JI OC@ MDBCO-C<I? ND?@ <M@ 0:
00000111010110111100110100010101 075CDE15 123456789
01110101101111001101000101010000 75CDE150 1975308624
Operators with assignment 70.4.8
AGG JA OC@ JK@M<OJMN <=JQ@ C<Q@ <NNDBIH@IO >JPIO@MK<MON: _=, &=, ]=, ?=, >>=, >>>=, <I? <<=.
0DHDG<M OJ OC@ JK@M<OJMN OC<O R@ C<Q@ N@@I DI OC@ ,K@M<OJM ,Q@MGJ<?DIB >C<KO@M, OC@N@
JK@M<OJMN <NNDBI OC@ M@NPGO =<>F OJ OC@ G@AO-C<I? JK@M<I?.
)@O'N N@@ OCDN JI OC@ &= JK@M<OJM:
WBMVF = WBMVF & 123;
WBMVF &= 123; // UIF TBNF BT BCPWF
Semantics
70.5
*@M@GT PI?@MNO<I?DIB CJR OC@N@ JK@M<OJMN RJMF <O =DO-G@Q@G H<T IJO =@ NPAAD>D@IO OJ N@@ CJR
OC@T <M@ PN@APG DI KMJBM<HN. 1C@ AJGGJRDIB N@>ODJIN ?@N>MD=@ >JHHJI R<TN OC<O OC@N@
JK@M<OJMN <M@ PN@? DI.
] is a union set 70.5.1
1C@ ] JK@M<OJM KMJ?P>@N OC@ PIDJI JA OC@ 1 =DON DI OC@ ORJ @SKM@NNDJIN.
AN <I @SOM@H@ @S<HKG@, G@O'N >JIND?@M ORJ Q<GP@N OC<O =JOC C<Q@ <GO@MI<ODIB =DON N@O OJ 1. 1C@
PIDJI JA OC@N@ Q<GP@N RJPG? KMJ?P>@ < M@NPGO RC@M@ <GG JA OC@ =DON <M@ 1:
VJOU MIT = 0YBBBBBBBB;
VJOU SIT = 0Y55555555;
XSJUF(" "); QSJOU(MIT);
XSJUF(" "); QSJOU(SIT);
B;F %B7D3F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
447
XSJUFMO("] --------------------------------");
XSJUF(" "); QSJOU(MIT ] SIT);
10101010101010101010101010101010 BBBBBBBB 2863311530
01010101010101010101010101010101 55555555 1431655765
] --------------------------------
11111111111111111111111111111111 GGGGGGGG 4294967295
& is an intersection set 70.5.2
1C@ & JK@M<OJM KMJ?P>@N OC@ DIO@MN@>ODJI JA OC@ 1 =DON DI OC@ ORJ @SKM@NNDJIN.
AN <I @SOM@H@ @S<HKG@, G@O'N >JIND?@M OC@ G<NO ORJ Q<GP@N <B<DI. 0DI>@ IJI@ JA OC@ 1 =DON JA
OC@ KM@QDJPN ORJ @SKM@NNDJIN H<O>C OC@ JI@N DI OC@ JOC@M @SKM@NNDJI, <GG JA OC@ =DON JA OC@
M@NPGO <M@ 0:
VJOU MIT = 0YBBBBBBBB;
VJOU SIT = 0Y55555555;
XSJUF(" "); QSJOU(MIT);
XSJUF(" "); QSJOU(SIT);
XSJUFMO("& --------------------------------");
XSJUF(" "); QSJOU(MIT & SIT);
10101010101010101010101010101010 BBBBBBBB 2863311530
01010101010101010101010101010101 55555555 1431655765
& --------------------------------
00000000000000000000000000000000 00000000 0
]= sets selected bits to 1 70.5.3
1J PI?@MNO<I? CJR OCDN RJMFN, DO C@GKN OJ N@@ JI@ JA OC@ @SKM@NNDJIN <N OC@ 35FG3> @SKM@NNDJI
<I? OC@ JOC@M @SKM@NNDJI <N < E7>75FAD AJM OC@ =DON OJ N@O OJ 1:
VJOU FYQSFTTJPO = 0Y00GG00GG;
VJOU CJUT5P4FU = 0Y10001000;
XSJUF("CFGPSF : "); QSJOU(FYQSFTTJPO);
XSJUF("UP TFU UP 1: "); QSJOU(CJUT5P4FU);
FYQSFTTJPO ]= CJUT5P4FU;
XSJUF("BGUFS : "); QSJOU(FYQSFTTJPO);
1C@ =@AJM@ <I? <AO@M Q<GP@N JA OC@ =DON OC<O <M@ <AA@>O@? <M@ DI?D><O@? DI =GP@:
CFGPSF : 00000000111111110000000011111111 00GG00GG 16711935
UP TFU UP 1: 00010000000000000001000000000000 10001000 268439552
BGUFS : 00010000111111110001000011111111 10GG10GG 285151487
&I < N@IN@, CJUT5P4FU ?@O@MHDI@N RCD>C =DON OJ N@O OJ 1. 1C@ JOC@M =DON <M@ IJO <AA@>O@?.
&= clears selected bits 70.5.4
,I@ JA OC@ @SKM@NNDJIN ><I =@ N@@I <N OC@ 35FG3> @SKM@NNDJI <I? OC@ JOC@M @SKM@NNDJI ><I =@
N@@I <N < E7>75FAD AJM OC@ =DON OJ >G@<M (OJ N@O OJ 0):
B;F %B7D3F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
448
VJOU FYQSFTTJPO = 0Y00GG00GG;
VJOU CJUT5P$MFBS = 0YGGFGGGFG;
XSJUF("CFGPSF : "); QSJOU(FYQSFTTJPO);
XSJUF("CJUT UP DMFBS: "); QSJOU(CJUT5P$MFBS);
FYQSFTTJPO &= CJUT5P$MFBS;
XSJUF("BGUFS : "); QSJOU(FYQSFTTJPO);
1C@ =@AJM@ <I? <AO@M Q<GP@N JA OC@ =DON OC<O <M@ <AA@>O@? <M@ DI?D><O@? DI =GP@:
CFGPSF : 00000000111111110000000011111111 00GG00GG 16711935
CJUT UP DMFBS: 11111111111011111111111111101111 GGFGGGFG 4293918703
BGUFS : 00000000111011110000000011101111 00FG00FG 15663343
&I < N@IN@, CJUT5P$MFBS ?@O@MHDI@N RCD>C =DON OJ N@O OJ 0. 1C@ JOC@M =DON <M@ IJO <AA@>O@?.
& determines whether a bit is 1 or not 70.5.5
&A JI@ JA OC@ @SKM@NNDJIN C<N JIGT JI@ =DO N@O OJ 1, OC@I DO ><I =@ PN@? OJ LP@MT RC@OC@M OC@
>JMM@NKJI?DIB =DO JA OC@ JOC@M @SKM@NNDJI DN 1:
VJOU FYQSFTTJPO = 123456789;
VJOU CJU5P2VFSZ = 0Y00010000;
QSJOU(FYQSFTTJPO);
QSJOU(CJU5P2VFSZ);
XSJUFMO(FYQSFTTJPO & CJU5P2VFSZ "ZFT, 1" : "OPU 1");
1C@ =DO OC<O DN =@DIB CG7D;76 DN DI?D><O@? =T =GP@:
00000111010110111100110100010101 075CDE15 123456789
00000000000000010000000000000000 00010000 65536
ZFT, 1
)@O'N LP@MT <IJOC@M =DO JA OC@ N<H@ @SKM@NNDJI =T OCDN ODH@ C<QDIB <IJOC@M =DO JA CJU5P2VFSZ
N@O OJ 1:
VJOU CJU5P2VFSZ = 0Y00001000;
00000111010110111100110100010101 075CDE15 123456789
00000000000000000001000000000000 00001000 4096
OPU 1
4C@I OC@ LP@MT @SKM@NNDJI C<N HJM@ OC<I JI@ =DO N@O OJ 1, OC@I OC@ LP@MT RJPG? ?@O@MHDI@
RC@OC@M 3>> JA OC@ >JMM@NKJI?DIB =DON DI OC@ JOC@M @SKM@NNDJI <M@ 1.
Right-shifting by one is the equivalent of dividing by two 70.5.6
0CDAODIB <GG JA OC@ =DON JA < Q<GP@ =T JI@ KJNDODJI OJ OC@ MDBCO KMJ?P>@N C<GA JA OC@ JMDBDI<G
Q<GP@. 1C@ M@<NJI AJM OCDN ><I =@ N@@I DI OC@ ?DBDO-Q<GP@ O<=G@ <=JQ@: &I OC<O O<=G@, @Q@MT =DO
C<N C<GA OC@ Q<GP@ JA OC@ =DO OC<O DN JI DON G@AO.
0CDAODIB < Q<GP@ OJ OC@ MDBCO HPGODKG@ =DON <O < ODH@ H@<IN ?DQD?DIB =T 2 AJM OC<O H<IT ODH@N.
#JM @S<HKG@, MDBCO-NCDAODIB =T 3 =DON RJPG? ?DQD?@ < Q<GP@ =T 8:
B;F %B7D3F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
449
VJOU WBMVF = 8000;
XSJUFMO(WBMVF >> 3);
1000
A>>JM?DIB OJ CJR OC@ FIAE 5A?B>7?7@F NTNO@H RJMFN, MDBCO-NCDAODIB C<N OC@ N<H@ @AA@>O JI
NDBI@? Q<GP@N:
JOU WBMVF = -8000;
XSJUFMO(WBMVF >> 3);
-1000
Left-shifting by one is the equivalent of multiplying by two 70.5.7
B@><PN@ @<>C =DO DN ORJ ODH@N OC@ Q<GP@ JA OC@ =DO JI DON MDBCO, NCDAODIB < Q<GP@ JI@ =DO OJ OC@
G@AO H@<IN HPGODKGTDIB OC<O Q<GP@ =T ORJ:
VJOU WBMVF = 10;
XSJUFMO(WBMVF << 5);
*PGODKGTDIB =T 2 < OJO<G JA 5 ODH@N DN OC@ N<H@ <N HPGODKGTDIB =T 32:
320
Common uses
70.6
Flags 70.6.1
#G<BN <M@ NDIBG@-=DO DI?@K@I?@IO ?<O< OC<O <M@ F@KO OJB@OC@M DI OC@ N<H@ Q<MD<=G@. AN OC@T <M@
JIGT JI@ =DO RD?@ @<>C, OC@T <M@ NPDO<=G@ AJM M@KM@N@IODIB =DI<MT >JI>@KON GDF@ @I<=G@?/
?DN<=G@?, Q<GD?/DIQ<GD?, @O>.
0P>C JI@-=DO >JI>@KON <M@ NJH@ODH@N @I>JPIO@M@? DI ! HJ?PG@N OC<O <M@ =<N@? JI
GD=M<MD@N.
#G<BN <M@ PNP<GGT ?@ADI@? <N IJI-JQ@MG<KKDIB Q<GP@N JA <I FOVN OTK@.
AN <I @S<HKG@, G@O'N >JIND?@M < ><M M<>DIB B<H@ RC@M@ OC@ M@<GDNH JA OC@ B<H@ DN
>JIADBPM<=G@:
t 1C@ AP@G >JINPHKODJI DN M@<GDNOD> JM IJO.
t JGGDNDJIN ><I ?<H<B@ OC@ ><MN JM IJO.
t 1DM@N ><I ?@O@MDJM<O@ =T PN@ JM IJO.
t 0FD? H<MFN <M@ G@AO JI OC@ MJ<? NPMA<>@ JM IJO.
1C@N@ >JIADBPM<ODJI JKODJIN ><I =@ NK@>DAD@? <O MPI ODH@ =T OC@ AJGGJRDIB FOVN Q<GP@N:
FOVN 3FBMJTN
\
GVFM6TF = 1 << 0,
CPEZ%BNBHF = 1 << 1,
UJSF6TF = 1 << 2,
B;F %B7D3F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
450
TLJE.BSLT = 1 << 3
^
+JO@ OC<O <GG JA OCJN@ Q<GP@N >JINDNO JA NDIBG@ =DON OC<O ?J IJO >JIAGD>O RDOC @<>C JOC@M. "<>C
Q<GP@ DN ?@O@MHDI@? =T G@AO-NCDAODIB 1 =T < ?DAA@M@IO IPH=@M JA =DON. 1C@ >JMM@NKJI?DIB =DO
M@KM@N@IO<ODJIN <M@ OC@ AJGGJRDIB:
GVFM6TF : 0001
CPEZ%BNBHF: 0010
UJSF6TF : 0100
TLJE.BSLT : 1000
0DI>@ OC@DM 1 =DON ?J IJO H<O>C JOC@MN', OC@N@ Q<GP@N ><I =@ >JH=DI@? =T OC@ ] JK@M<OJM OJ =@
F@KO DI OC@ N<H@ Q<MD<=G@. #JM @S<HKG@, OC@ ORJ >JIADBPM<ODJI JKODJIN OC<O <M@ M@G<O@? OJ ODM@N
><I =@ >JH=DI@? <N DI OC@ AJGGJRDIB >J?@:
3FBMJTN GMBHT = 3FBMJTN.UJSF6TF ] 3FBMJTN.TLJE.BSLT;
XSJUFGMO("%C", GMBHT);
1C@ =DON JA OC@N@ ORJ AG<BN RJPG? =@ ND?@-=T-ND?@ DI OC@ Q<MD<=G@ GMBHT:
1100
)<O@M, OC@N@ AG<BN ><I =@ LP@MD@? =T OC@ & JK@M<OJM:
JG (GMBHT & 3FBMJTN.GVFM6TF) \
// ... DPEF SFMBUFE UP GVFM DPOTVNQUJPO ...
^
JG (GMBHT & 3FBMJTN.UJSF6TF) \
// ... DPEF SFMBUFE UP UJSF DPOTVNQUJPO ...
^
1C@ & JK@M<OJM KMJ?P>@N 1 JIGT DA OC@ NK@>DAD@? AG<B DN N@O DI GMBHT.
AGNJ IJO@ OC<O OC@ M@NPGO DN PN<=G@ DI OC@ JG >JI?DODJI ?P@ OJ <POJH<OD> >JIQ@MNDJI JA OC@ IJI-
U@MJ Q<GP@ OJ USVF. 1C@ >JI?DODJI<G @SKM@NNDJI DN GBMTF RC@I OC@ M@NPGO JA & DN 0 <I? USVF
JOC@MRDN@. AN < M@NPGO, OC@ >JMM@NKJI?DIB >J?@ =GJ>F DN @S@>PO@? JIGT DA OC@ AG<B DN @I<=G@?.
Masking 70.6.2
&I NJH@ GD=M<MD@N <I? NJH@ KMJOJ>JGN <I DIO@B@M Q<GP@ H<T ><MMT HJM@ OC<I JI@ KD@>@ JA
DIAJMH<ODJI. #JM @S<HKG@, OC@ PKK@M 3 =DON JA < 32-=DO Q<GP@ H<T C<Q@ < >@MO<DI H@<IDIB,
RCDG@ OC@ GJR@M 29 =DON H<T C<Q@ <IJOC@M H@<IDIB. 1C@N@ N@K<M<O@ K<MON JA ?<O< ><I =@
@SOM<>O@? AMJH OC@ Q<MD<=G@ =T H<NFDIB.
1C@ AJPM J>O@ON JA <I &-Q4 <??M@NN <M@ <I @S<HKG@ JA OCDN >JI>@KO. 1C@ J>O@ON <M@ OC@
DI?DQD?P<G Q<GP@N OC<O H<F@ PK OC@ >JHHJI ?JOO@? M@KM@N@IO<ODJI JA <I &-Q4 <??M@NN. 1C@T
<M@ <GG F@KO DI < NDIBG@ 32-=DO Q<GP@. #JM @S<HKG@, OC@ &-Q4 <??M@NN 192.168.1.2 DN OC@ 32-=DO
Q<GP@ 0S>0<80102:
D0 == 12 * 16 + 0 = 192
B8 == 10 * 16 + 8 = 168
01 == 0 * 16 + 1 = 1
02 == 0 * 16 + 2 = 2
B;F %B7D3F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
451
A H<NF >JINDNON JA < IPH=@M JA 1 =DON OC<O RJPG? 5AH7D OC@ NK@>DAD> K<MO JA < Q<MD<=G@.
"A@6";@9 OC@ Q<GP@ =T OC@ H<NF @SOM<>ON OC@ K<MO JA OC@ Q<MD<=G@ OC<O DN >JQ@M@? =T OC<O H<NF.
#JM @S<HKG@, OC@ H<NF Q<GP@ JA 0S000000AA RJPG? >JQ@M OC@ GJR@M 8 =DON JA < Q<GP@:
VJOU WBMVF = 123456789;
VJOU NBTL = 0Y000000GG;
XSJUF("WBMVF : "); QSJOU(WBMVF);
XSJUF("NBTL : "); QSJOU(NBTL);
XSJUF("SFTVMU: "); QSJOU(WBMVF & NBTL);
1C@ =DON OC<O <M@ >JQ@M@? =T OC@ H<NF <M@ DI?D><O@? DI =GP@. AGG JA OC@ JOC@M =DON <M@ >G@<M@?:
WBMVF : 00000111010110111100110100010101 075CDE15 123456789
NBTL : 00000000000000000000000011111111 000000GG 255
SFTVMU: 00000000000000000000000000010101 00000015 21
)@O'N <KKGT OC@ N<H@ H@OCJ? OJ OC@ 0S>0<80102 &-Q4 <??M@NN RDOC < H<NF OC<O RJPG? >JQ@M
OC@ PKK@MHJNO 8 =DON:
VJOU WBMVF = 0YD0B80102;
VJOU NBTL = 0YGG000000;
XSJUF("WBMVF : "); QSJOU(WBMVF);
XSJUF("NBTL : "); QSJOU(NBTL);
XSJUF("SFTVMU: "); QSJOU(WBMVF & NBTL);
1CDN H<NF >JQ@MN OC@ PKK@MHJNO 8 =DON JA OC@ Q<GP@:
WBMVF : 11000000101010000000000100000010 D0B80102 3232235778
NBTL : 11111111000000000000000000000000 GG000000 4278190080
SFTVMU: 11000000000000000000000000000000 D0000000 3221225472
%JR@Q@M, IJO@ OC<O OC@ KMDIO@? M@NPGO DN IJO OC@ @SK@>O@? 192 =PO 3221225472. 1C<O DN
=@><PN@ OC@ H<NF@? Q<GP@ HPNO <GNJ =@ NCDAO@? <GG OC@ R<T OJ OC@ MDBCO-C<I? ND?@. 0CDAODIB OC@
Q<GP@ 24 =DO KJNDODJIN OJ OC@ MDBCO RJPG? KMJ?P>@ OC@ Q<GP@ OC<O OCJN@ 8 =DON M@KM@N@IO:
VJOU WBMVF = 0YD0B80102;
VJOU NBTL = 0YGG000000;
XSJUF("WBMVF : "); QSJOU(WBMVF);
XSJUF("NBTL : "); QSJOU(NBTL);
XSJUF("SFTVMU: "); QSJOU((WBMVF & NBTL) >> 24);
WBMVF : 11000000101010000000000100000010 D0B80102 3232235778
NBTL : 11111111000000000000000000000000 GG000000 4278190080
SFTVMU: 00000000000000000000000011000000 000000D0 192
Exercises
70.7
1. 4MDO@ < API>ODJI OC<O M@OPMIN <I &-Q4 <??M@NN DI DON ?JOO@? AJMH:
TUSJOH EPUUFE(VJOU BEESFTT)
\
// ...
^
B;F %B7D3F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
452
VOJUUFTU
\
BTTFSU(EPUUFE(0YD0B80102) == "192.168.1.2");
^
2. 4MDO@ < API>ODJI OC<O >JIQ@MON AJPM J>O@O Q<GP@N OJ OC@ >JMM@NKJI?DIB 32-=DO &-Q4 <??M@NN:
VJOU JQ"EESFTT(VCZUF PDUFU3, // NPTU TJHOJGJDBOU PDUFU
VCZUF PDUFU2,
VCZUF PDUFU1,
VCZUF PDUFU0) // MFBTU TJHOJGJDBOU PDUFU
\
// ...
^
VOJUUFTU
\
BTTFSU(JQ"EESFTT(192, 168, 1, 2) == 0YD0B80102);
^
3. 4MDO@ < API>ODJI OC<O ><I =@ PN@? AJM H<FDIB < H<NF. &O NCJPG? NO<MO RDOC OC@ NK@>DAD@? =DO
<I? C<Q@ OC@ NK@>DAD@? RD?OC:
VJOU NBTL(JOU MPXFTU#JU, JOU XJEUI)
\
// ...
^
VOJUUFTU
\
BTTFSU(NBTL(2, 5) ==
0C@0000@0000@0000@0000@0000@0000@0111@1100);
// k
// MPXFTU CJU JT 2,
// BOE UIF NBTL JT 5-CJU XJEF
^
... F:7 EA>GF;A@E
B;F %B7D3F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
453
Conditional Compilation 71
JI?DODJI<G >JHKDG<ODJI DN AJM >JHKDGDIB K<MON JA KMJBM<HN DI NK@>D<G R<TN ?@K@I?DIB JI
>@MO<DI >JHKDG@ ODH@ >JI?DODJIN. 0JH@ODH@N, @IODM@ N@>ODJIN JA < KMJBM<H H<T I@@? OJ =@
O<F@I JPO <I? IJO >JHKDG@? <O <GG.
JI?DODJI<G >JHKDG<ODJI DIQJGQ@N >JI?DODJI >C@>FN OC<O <M@ @Q<GP<=G@ <O >JHKDG@ ODH@.
/PIODH@ >JI?DODJI<G NO<O@H@ION GDF@ JG, GPS, XIJMF <M@ IJO >JI?DODJI<G >JHKDG<ODJI A@<OPM@N.
4@ C<Q@ <GM@<?T @I>JPIO@M@? NJH@ A@<OPM@N DI OC@ KM@QDJPN >C<KO@MN, RCD>C ><I =@ N@@I <N
>JI?DODJI<G >JHKDG<ODJI:
t VOJUUFTU =GJ>FN <M@ >JHKDG@? <I? MPI JIGT DA OC@ -VOJUUFTU >JHKDG@M NRDO>C DN @I<=G@?.
t 1C@ >JIOM<>O KMJBM<HHDIB =GJ>FN JO, PVU, <I? JOWBSJBOU <M@ <>ODQ<O@? JIGT DA OC@ -
SFMFBTF >JHKDG@M NRDO>C DN @AF @I<=G@?.
2IDO O@NON <I? >JIOM<>ON <M@ <=JPO KMJBM<H >JMM@>OI@NN; RC@OC@M OC@T <M@ DI>GP?@? DI OC@
KMJBM<H NCJPG? IJO >C<IB@ OC@ =@C<QDJM JA OC@ KMJBM<H.
t 1@HKG<O@ NK@>D<GDU<ODJIN <M@ >JHKDG@? DIOJ OC@ KMJBM<H JIGT AJM NK@>DAD> OTK@N. 4C@I <
NK@>D<GDU<ODJI DN IJO <>OP<GGT PN@? DI OC@ KMJBM<H, OC@ NK@>D<GDU<ODJI DN IJO >JHKDG@?:
WPJE TXBQ(5)(SFG 5 MIT, SFG 5 SIT)
\
5 UFNQ = MIT;
MIT = SIT;
SIT = UFNQ;
^
VOJUUFTU
\
BVUP B = 'Y';
BVUP C = 'Z';
TXBQ(B, C);
BTTFSU(B == 'Z');
BTTFSU(C == 'Y');
^
WPJE TXBQ(5 : VJOU)(SFG 5 MIT, SFG 5 SIT)
\
MIT ?= SIT;
SIT ?= MIT;
MIT ?= SI; // 5:10!
^
WPJE NBJO()
\^
1C@ VJOU NK@>D<GDU<ODJI <=JQ@ C<N =@@I DHKG@H@IO@? =T O<FDIB <?Q<IO<B@ JA OC@ ?
(JAD) JK@M<OJM, KM@NPH<=GT PI?@M OC@ =@GD@A OC<O DO RJPG? =@ @S@>PO@? A<NO@M OC<I OC@
B@I@M<G <GBJMDOCH. (Note: )A F:7 5A@FD3DK, A@ ?AEF ?A67D@ ?;5DABDA57EEADE F:;E
?7F:A6 ;E E>AI7D F:3@ F:7 A@7 F:3F GE7E 3 F7?BAD3DK H3D;34>7.)
!@NKDO@ OC@ OTKJ <O OC@ @I? JA OC<O NK@>D<GDU<ODJI, NDI>@ OC@ VJOU NK@>D<GDU<ODJI DN
I@Q@M <>OP<GGT PN@?, OC@ KMJBM<H B@ON >JHKDG@? RDOCJPO <IT @MMJMN.
Note: ):;E ;E 3@AF:7D 7J3?B>7 A8 :AI ;?BADF3@F G@;F F7EFE 3D7; F:7 ?;EF3=7 IAG>6
:3H7 477@ @AF;576 ;8 F:7D7 I7D7 3 G@;F F7EF 8AD F:3F EB75;3>;L3F;A@:
VOJUUFTU
\
VJOU J = 42;
CA@6;F;A@3> CA?B;>3F;A@
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
454
VJOU K = 7;
TXBQ(J, K);
BTTFSU(J == 7);
BTTFSU(K == 42);
^
1CDN @S<HKG@ NCJRN OC<O O@HKG<O@ NK@>D<GDU<ODJIN <M@ <GNJ >JHKDG@? PI?@M >@MO<DI
>JI?DODJIN.
1C@ AJGGJRDIB <M@ OC@ A@<OPM@N JA ! OC<O <M@ NK@>DAD><GGT AJM >JI?DODJI<G >JHKDG<ODJI:
t EFCVH
t WFSTJPO
t TUBUJD JG
t JT @SKM@NNDJI
t @@USBJUT
4@ RDGG N@@ OC@ JT @SKM@NNDJI DI OC@ I@SO >C<KO@M <I? @@USBJUT DI < G<O@M >C<KO@M.
debug
71.1
EFCVH DN PN@APG ?PMDIB KMJBM<H ?@Q@GJKH@IO. 1C@ @SKM@NNDJIN <I? NO<O@H@ION OC<O <M@
H<MF@? <N EFCVH <M@ >JHKDG@? DIOJ OC@ KMJBM<H JIGT RC@I OC@ -EFCVH >JHKDG@M NRDO>C DN
@I<=G@?:
EFCVH a_conditionally_compiled_expression;
EFCVH \
// ... DPOEJUJPOBMMZ DPNQJMFE DPEF ...
^ FMTF \
// ... DPEF UIBU JT DPNQJMFE PUIFSXJTF ...
^
1C@ FMTF >G<PN@ DN JKODJI<G.
BJOC OC@ NDIBG@ @SKM@NNDJI <I? OC@ >J?@ =GJ>F <=JQ@ <M@ >JHKDG@? JIGT RC@I OC@ -EFCVH
>JHKDG@M NRDO>C DN @I<=G@?.
4@ C<Q@ =@@I <??DIB NO<O@H@ION DIOJ OC@ KMJBM<HN, RCD>C KMDIO@? H@NN<B@N GDF@ "<??DIB",
"NP=OM<>ODIB", @O>. OJ OC@ JPOKPO. 0P>C H@NN<B@N (<F< >A9E <I? >A9 H@NN<B@N) <M@ C@GKAPG DI
ADI?DIB @MMJMN =T QDNP<GDUDIB OC@ NO@KN OC<O <M@ O<F@I =T OC@ KMJBM<H.
/@H@H=@M OC@ CJOBSZ4FBSDI() API>ODJI AMJH OC@ 1@HKG<O@N >C<KO@M. 1C@ AJGGJRDIB Q@MNDJI
JA OC@ API>ODJI DN DIO@IODJI<GGT DI>JMM@>O:
JNQPSU TUE.TUEJP;
// 8"3/*/(! 5IJT BMHPSJUIN JT XSPOH
TJ[F@U CJOBSZ4FBSDI(DPOTU JOU<> WBMVFT, JO JOU WBMVF)
\
JG (WBMVFT.MFOHUI == 0) \
SFUVSO TJ[F@U.NBY;
^
JNNVUBCMF NJE1PJOU = WBMVFT.MFOHUI / 2;
JG (WBMVF == WBMVFT<NJE1PJOU>) \
SFUVSO NJE1PJOU;
^ FMTF JG (WBMVF < WBMVFT<NJE1PJOU>) \
CA@6;F;A@3> CA?B;>3F;A@
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
455
SFUVSO CJOBSZ4FBSDI(WBMVFT<0 .. NJE1PJOU>, WBMVF);
^ FMTF \
SFUVSO CJOBSZ4FBSDI(WBMVFT<NJE1PJOU + 1 .. $>, WBMVF);
^
^
WPJE NBJO()
\
BVUP OVNCFST = < -100, 0, 1, 2, 7, 10, 42, 365, 1000 >;
BVUP JOEFY = CJOBSZ4FBSDI(OVNCFST, 42);
XSJUFMO("*OEFY: ", JOEFY);
^
AGOCJPBC OC@ DI?@S JA 42 DN 6, OC@ KMJBM<H DI>JMM@>OGT M@KJMON 1:
*OEFY: 1
,I@ R<T JA GJ><ODIB OC@ =PB DI OC@ KMJBM<H DN OJ DIN@MO GDI@N OC<O RJPG? KMDIO H@NN<B@N OJ OC@
JPOKPO:
TJ[F@U CJOBSZ4FBSDI(DPOTU JOU<> WBMVFT, JO JOU WBMVF)
\
XSJUFGMO("TFBSDIJOH %T BNPOH %T", WBMVF, WBMVFT);
JG (WBMVFT.MFOHUI == 0) \
XSJUFGMO("%T OPU GPVOE", WBMVF);
SFUVSO TJ[F@U.NBY;
^
JNNVUBCMF NJE1PJOU = WBMVFT.MFOHUI / 2;
XSJUFGMO("DPOTJEFSJOH JOEFY %T", NJE1PJOU);
JG (WBMVF == WBMVFT<NJE1PJOU>) \
XSJUFGMO("GPVOE %T BU JOEFY %T", WBMVF, NJE1PJOU);
SFUVSO NJE1PJOU;
^ FMTF JG (WBMVF < WBMVFT<NJE1PJOU>) \
XSJUFGMO("NVTU CF JO UIF GJSTU IBMG");
SFUVSO CJOBSZ4FBSDI(WBMVFT<0 .. NJE1PJOU>, WBMVF);
^ FMTF \
XSJUFGMO("NVTU CF JO UIF TFDPOE IBMG");
SFUVSO CJOBSZ4FBSDI(WBMVFT<NJE1PJOU + 1 .. $>, WBMVF);
^
^
1C@ JPOKPO JA OC@ KMJBM<H IJR DI>GP?@N NO@KN OC<O OC@ KMJBM<H O<F@N:
TFBSDIJOH 42 BNPOH <-100, 0, 1, 2, 7, 10, 42, 365, 1000>
DPOTJEFSJOH JOEFY 4
NVTU CF JO UIF TFDPOE IBMG
TFBSDIJOH 42 BNPOH <10, 42, 365, 1000>
DPOTJEFSJOH JOEFY 2
NVTU CF JO UIF GJSTU IBMG
TFBSDIJOH 42 BNPOH <10, 42>
DPOTJEFSJOH JOEFY 1
GPVOE 42 BU JOEFY 1
*OEFY: 1
CA@6;F;A@3> CA?B;>3F;A@
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
456
)@O'N <NNPH@ OC<O OC@ KM@QDJPN JPOKPO ?J@N DI?@@? C@GK OC@ KMJBM<HH@M GJ><O@ OC@ =PB. &O DN
J=QDJPN OC<O OC@ XSJUFGMO() @SKM@NNDJIN <M@ IJO I@@?@? <ITHJM@ JI>@ OC@ =PB C<N =@@I
GJ><O@? <I? ADS@?. %JR@Q@M, M@HJQDIB OCJN@ GDI@N ><I <GNJ =@ N@@I <N R<NO@APG, =@><PN@ OC@T
HDBCO =@ PN@APG <B<DI DI OC@ APOPM@.
&INO@<? JA =@DIB M@HJQ@? <GOJB@OC@M, OC@ GDI@N ><I =@ H<MF@? <N EFCVH DINO@<?:
EFCVH XSJUFGMO("%T OPU GPVOE", WBMVF);
0P>C GDI@N <M@ DI>GP?@? DI OC@ KMJBM<H JIGT RC@I OC@ -EFCVH >JHKDG@M NRDO>C DN @I<=G@?:
ENE EFOFNF.E -PGEFOFNF -X -EFCVH
EFCVH(tag) 71.1.1
&A OC@M@ <M@ H<IT EFCVH F@TRJM?N DI OC@ KMJBM<H, KJNND=GT DI PIM@G<O@? K<MON, OC@ JPOKPO
H<T =@>JH@ OJJ >MJR?@?. 1J <QJD? OC<O, OC@ EFCVH NO<O@H@ION ><I =@ BDQ@I I<H@N (O<BN) OJ
=@ DI>GP?@? DI OC@ KMJBM<H N@G@>ODQ@GT:
EFCVH(CJOBSZ4FBSDI) XSJUFGMO("%T OPU GPVOE", WBMVF);
1C@ O<BB@? EFCVH NO<O@H@ION <M@ @I<=G@? =T OC@ -EFCVH=tag >JHKDG@M NRDO>C:
ENE EFOFNF.E -PGEFOFNF -X -EFCVH=CJOBSZ4FBSDI
EFCVH =GJ>FN ><I C<Q@ O<BN <N R@GG:
EFCVH(CJOBSZ4FBSDI)
\
// ...
^
&O DN KJNND=G@ OJ @I<=G@ HJM@ OC<I JI@ EFCVH O<B <O < ODH@:
$ ENE EFOFNF.E -PGEFOFNF -X -EFCVH=CJOBSZ4FBSDI -EFCVH=TUBDL$POUBJOFS
&I OC<O ><N@ =JOC OC@ CJOBSZ4FBSDI <I? OC@ TUBDL$POUBJOFS ?@=PB NO<O@H@ION <I? =GJ>FN
RJPG? =@ DI>GP?@?.
EFCVH(level) 71.1.2
0JH@ODH@N DO DN HJM@ PN@APG OJ <NNJ>D<O@ EFCVH NO<O@H@ION =T IPH@MD><G G@Q@GN. &I>M@<NDIB
G@Q@GN ><I KMJQD?@ HJM@ ?@O<DG@? DIAJMH<ODJI:
EFCVH JNQPSU TUE.TUEJP;
WPJE NZ'VODUJPO(TUSJOH GJMF/BNF, JOU<> WBMVFT)
\
EFCVH(1) XSJUFMO("FOUFSFE NZ'VODUJPO");
EFCVH(2)
\
XSJUFMO("UIF BSHVNFOUT:");
XSJUFMO(" GJMF OBNF: ", GJMF/BNF);
GPSFBDI (J, WBMVF; WBMVFT) \
XSJUFGMO(" %4T: %T", J, WBMVF);
^
CA@6;F;A@3> CA?B;>3F;A@
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
457
^
// ... UIF JNQMFNFOUBUJPO PG UIF GVODUJPO ...
^
WPJE NBJO()
\
NZ'VODUJPO("EFOFNF.UYU", < 10, 4, 100 >);
^
1C@ EFCVH @SKM@NNDJIN <I? =GJ>FN OC<O <M@ GJR@M OC<I JM @LP<G OJ OC@ NK@>DAD@? G@Q@G RJPG? =@
>JHKDG@?:
$ ENE EFOFNF.E -PGEFOFNF -X -EFCVH=1
$ ./EFOFNF
FOUFSFE NZ'VODUJPO
1C@ AJGGJRDIB >JHKDG<ODJI RJPG? KMJQD?@ HJM@ DIAJMH<ODJI:
$ ENE EFOFNF.E -PGEFOFNF -X -EFCVH=2
$ ./EFOFNF
FOUFSFE NZ'VODUJPO
UIF BSHVNFOUT:
GJMF OBNF: EFOFNF.UYU
0: 10
1: 4
2: 100
WFSTJPO(tag) and WFSTJPO(level)
71.2
WFSTJPO DN NDHDG<M OJ EFCVH <I? DN PN@? DI OC@ N<H@ R<T:
WFSTJPO(UFTU3FMFBTF) /* ... BO FYQSFTTJPO ... */;
WFSTJPO(TDIPPM3FMFBTF) \
/* ... FYQSFTTJPOT UIBU BSF SFMBUFE UP UIF WFSTJPO PG
* UIJT QSPHSBN UIBU JT QSFTVNBCMZ TIJQQFE UP TDIPPMT ... */
^ FMTF \
// ... DPEF DPNQJMFE PUIFSXJTF ...
^
WFSTJPO(1) B7BSJBCMF = 5;
WFSTJPO(2) \
// ... B GFBUVSF PG WFSTJPO 2 ...
^
1C@ FMTF >G<PN@ DN JKODJI<G.
AGOCJPBC WFSTJPO RJMFN @NN@IOD<GGT OC@ N<H@ <N EFCVH, C<QDIB N@K<M<O@ F@TRJM?N C@GKN
?DNODIBPDNC OC@DM PIM@G<O@? PN@N.
AN RDOC EFCVH, HJM@ OC<I JI@ WFSTJPO ><I =@ @I<=G@?:
$ ENE EFOFNF.E -PGEFOFNF -X -WFSTJPO=SFDPSE -WFSTJPO=QSFDJTF@DBMDVMBUJPO
1C@M@ <M@ H<IT KM@?@ADI@? WFSTJPO O<BN, OC@ >JHKG@O@ GDNO JA RCD>C DN <Q<DG<=G@ <O OC@
JI?DODJI<G JHKDG<ODJI NK@>DAD><ODJI. 1C@ AJGGJRDIB NCJMO GDNO DN EPNO < N<HKGDIB:
CA@6;F;A@3> CA?B;>3F;A@
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
458
1SFEFGJOFE WFSTJPO UBHT
5IF DPNQJMFS%JHJUBM.BST (/6 -%$ 4%$
5IF
PQFSBUJOH
TZTUFN
8JOEPXT 8JO32 8JO64 MJOVY 049 1PTJY 'SFF#4% 0QFO#4% /FU#4%
%SBHPO'MZ#4% #4% 4PMBSJT "*9 )BJLV 4LZ04 4ZT73 4ZT74 )VSE
$16
FOEJBOOFTT
-JUUMF&OEJBO #JH&OEJBO
&OBCMFE
DPNQJMFS
TXJUDIFT
%@$PWFSBHF %@%EPD %@*OMJOF"TN@986 %@*OMJOF"TN@986@64 %@-164 %@1*$
%@932 %@)BSE'MPBU %@4PGU'MPBU %@4*.% %@7FSTJPO2 %@/P#PVOET$IFDLT
VOJUUFTU BTTFSU
$16
BSDIJUFDUVSF
986 986@64
1MBUGPSN "OESPJE $ZHXJO .JO(8 "3. "3.@5IVNC "3.@4PGU "3.@4PGU'1 "3.@)BSE'1
"3.64 11$ 11$@4PGU'1 11$@)BSE'1 11$64 *"64 .*14 .*1432 .*1464
.*14@032 .*14@/32 .*14@064 .*14@/64 .*14@&"#* .*14@/P'MPBU
.*14@4PGU'MPBU .*14@)BSE'MPBU 41"3$ 41"3$@781MVT 41"3$@4PGU'1
41"3$@)BSE'1 41"3$64 4390 43909 )11" )11"64 4) 4)64 "MQIB
"MQIB@4PGU'1 "MQIB@)BSE'1
... ...
&I <??DODJI, OC@M@ <M@ OC@ AJGGJRDIB ORJ NK@>D<G WFSTJPO O<BN:
t OPOF: 1CDN O<B DN I@Q@M ?@ADI@?; DO DN PN@APG AJM ?DN<=GDIB >J?@ =GJ>FN.
t BMM: 1CDN O<B DN <GR<TN ?@ADI@?; DO DN PN@APG AJM @I<=GDIB >J?@ =GJ>FN.
AN <I @S<HKG@ JA CJR KM@?@ADI@? WFSTJPO O<BN <M@ PN@?, OC@ AJGGJRDIB DN <I @S>@MKO
(AJMH<OO@? ?DAA@M@IOGT C@M@) AMJH OC@ TUE.BTDJJ HJ?PG@, RCD>C DN AJM ?@O@MHDIDIB OC@
I@RGDI@ >C<M<>O@M N@LP@I>@ AJM OC@ NTNO@H (TUBUJD BTTFSU RDGG =@ @SKG<DI@? G<O@M =@GJR):
WFSTJPO(8JOEPXT) \
JNNVUBCMF OFXMJOF = "=S=O";
^ FMTF WFSTJPO(1PTJY) \
JNNVUBCMF OFXMJOF = "=O";
^ FMTF \
TUBUJD BTTFSU(0, "6OTVQQPSUFE 04");
^
Assigning identifiers to EFCVH and WFSTJPO
71.3
0DHDG<M OJ Q<MD<=G@N, EFCVH <I? WFSTJPO ><I =@ <NNDBI@? D?@IODAD@MN. 2IGDF@ Q<MD<=G@N, OCDN
<NNDBIH@IO ?J@N IJO >C<IB@ <IT Q<GP@, DO <>ODQ<O@N OC@ NK@>DAD@? D?@IODAD@M 3E I7>>.
JNQPSU TUE.TUEJP;
EFCVH(FWFSZUIJOH)
\
EFCVH = CJOBSZ4FBSDI;
EFCVH = TUBDL$POUBJOFS;
WFSTJPO = UFTU3FMFBTF;
WFSTJPO = TDIPPM3FMFBTF;
^
WPJE NBJO()
\
EFCVH(CJOBSZ4FBSDI) XSJUFMO("CJOBSZ4FBSDI JT BDUJWF");
CA@6;F;A@3> CA?B;>3F;A@
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
459
EFCVH(TUBDL$POUBJOFS) XSJUFMO("TUBDL$POUBJOFS JT BDUJWF");
WFSTJPO(UFTU3FMFBTF) XSJUFMO("UFTU3FMFBTF JT BDUJWF");
WFSTJPO(TDIPPM3FMFBTF) XSJUFMO("TDIPPM3FMFBTF JT BDUJWF");
^
1C@ <NNDBIH@ION DIND?@ OC@ EFCVH(FWFSZUIJOH) =GJ>F <=JQ@ <>ODQ<O@N <GG JA OC@ NK@>DAD@?
D?@IODAD@MN:
$ ENE EFOFNF.E -PGEFOFNF -X -EFCVH=FWFSZUIJOH
$ ./EFOFNF
CJOBSZ4FBSDI JT BDUJWF
TUBDL$POUBJOFS JT BDUJWF
UFTU3FMFBTF JT BDUJWF
TDIPPM3FMFBTF JT BDUJWF
TUBUJD JG
71.4
TUBUJD JG DN OC@ >JHKDG@ ODH@ @LPDQ<G@IO JA OC@ JG NO<O@H@IO.
'PNO GDF@ OC@ JG NO<O@H@IO, TUBUJD JG O<F@N < GJBD><G @SKM@NNDJI <I? @Q<GP<O@N DO. 2IGDF@ OC@
JG NO<O@H@IO, TUBUJD JG DN IJO <=JPO @S@>PODJI AGJR; M<OC@M, DO ?@O@MHDI@N RC@OC@M < KD@>@ JA
>J?@ NCJPG? =@ DI>GP?@? DI OC@ KMJBM<H JM IJO.
1C@ GJBD><G @SKM@NNDJI HPNO =@ @Q<GP<=G@ <O >JHKDG@ ODH@. &A OC@ GJBD><G @SKM@NNDJI @Q<GP<O@N
OJ USVF, OC@ >J?@ DIND?@ OC@ TUBUJD JG B@ON >JHKDG@?. &A OC@ >JI?DODJI DN GBMTF, OC@ >J?@ DN
IJO DI>GP?@? DI OC@ KMJBM<H <N DA DO C<N I@Q@M =@@I RMDOO@I. 1C@ GJBD><G @SKM@NNDJIN >JHHJIGT
O<F@ <?Q<IO<B@ JA OC@ JT @SKM@NNDJI <I? @@USBJUT.
TUBUJD JG ><I <KK@<M <O HJ?PG@ N>JK@ JM DIND?@ ?@ADIDODJIN JA TUSVDU, DMBTT, O@HKG<O@, @O>.
,KODJI<GGT, OC@M@ H<T =@ FMTF >G<PN@N <N R@GG.
)@O'N PN@ TUBUJD JG RDOC < NDHKG@ O@HKG<O@, H<FDIB PN@ JA OC@ JT @SKM@NNDJI. 4@ RDGG N@@
JOC@M @S<HKG@N JA TUBUJD JG DI OC@ I@SO >C<KO@M:
JNQPSU TUE.TUEJP;
TUSVDU .Z5ZQF(5)
\
TUBUJD JG (JT (5 == GMPBU)) \
BMJBT 3FTVMU5ZQF = EPVCMF;
^ FMTF TUBUJD JG (JT (5 == EPVCMF)) \
BMJBT 3FTVMU5ZQF = SFBM;
^ FMTF \
TUBUJD BTTFSU(GBMTF, 5.TUSJOHPG _ " JT OPU TVQQPSUFE");
^
3FTVMU5ZQF EP8PSL()
\
XSJUFGMO("5IF SFUVSO UZQF GPS %T JT %T.",
5.TUSJOHPG, 3FTVMU5ZQF.TUSJOHPG);
3FTVMU5ZQF SFTVMU;
// ...
SFUVSO SFTVMU;
^
^
WPJE NBJO()
\
BVUP G = .Z5ZQF!GMPBU();
CA@6;F;A@3> CA?B;>3F;A@
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
460
G.EP8PSL();
BVUP E = .Z5ZQF!EPVCMF();
E.EP8PSL();
^
A>>JM?DIB OJ OC@ >J?@, .Z5ZQF ><I =@ PN@? JIGT RDOC ORJ OTK@N: GMPBU JM EPVCMF. 1C@ M@OPMI
OTK@ JA EP8PSL() DN >CJN@I ?@K@I?DIB JI RC@OC@M OC@ O@HKG<O@ DN DINO<IOD<O@? AJM GMPBU JM
EPVCMF:
5IF SFUVSO UZQF GPS GMPBU JT EPVCMF.
5IF SFUVSO UZQF GPS EPVCMF JT SFBM.
+JO@ OC<O JI@ HPNO RMDO@ FMTF TUBUJD JG RC@I >C<DIDIB TUBUJD JG >G<PN@N. ,OC@MRDN@,
RMDODIB FMTF JG RJPG? M@NPGO DI DIN@MODIB OC<O JG >JI?DODJI<G DIOJ OC@ >J?@, RCD>C RJPG?
I<OPM<GGT =@ @S@>PO@? <O MPI ODH@.
TUBUJD BTTFSU
71.5
AGOCJPBC DO DN IJO < >JI?DODJI<G >JHKDG<ODJI A@<OPM@, & C<Q@ ?@>D?@? OJ DIOMJ?P>@ TUBUJD
BTTFSU C@M@.
TUBUJD BTTFSU DN OC@ >JHKDG@ ODH@ @LPDQ<G@IO JA BTTFSU. &A OC@ >JI?DODJI<G @SKM@NNDJI DN
GBMTF, OC@ >JHKDG<ODJI B@ON <=JMO@? ?P@ OJ OC<O <NN@MODJI A<DGPM@.
0DHDG<M OJ TUBUJD JG, TUBUJD BTTFSU ><I <KK@<M DI <IT N>JK@ DI OC@ KMJBM<H.
4@ C<Q@ N@@I <I @S<HKG@ JA TUBUJD BTTFSU DI OC@ KMJBM<H <=JQ@: 1C@M@, >JHKDG<ODJI B@ON
<=JMO@? DA 5 DN <IT OTK@ JOC@M OC<I GMPBU JM EPVCMF:
BVUP J = .Z5ZQF!JOU();
1C@ >JHKDG<ODJI DN <=JMO@? =T OC@ H@NN<B@ OC<O R<N BDQ@I OJ TUBUJD BTTFSU:
&SSPS: TUBUJD BTTFSU "JOU JT OPU TVQQPSUFE"
AN <IJOC@M @S<HKG@, G@O'N <NNPH@ OC<O < NK@>DAD> <GBJMDOCH ><I RJMF JIGT RDOC OTK@N OC<O <M@
< HPGODKG@ JA < >@MO<DI NDU@. 0P>C < >JI?DODJI ><I =@ @INPM@? <O >JHKDG@ ODH@ =T < TUBUJD
BTTFSU:
5 NZ"MHPSJUIN(5)(5 WBMVF)
\
// 5IJT BMHPSJUIN SFRVJSFT UIBU 5 JT B NVMUJQMF PG 4
TUBUJD BTTFSU((5.TJ[FPG % 4) == 0);
// ...
^
&A OC@ API>ODJI R<N ><GG@? RDOC < DIBS, OC@ >JHKDG<ODJI RJPG? =@ <=JMO@? =T OC@ AJGGJRDIB
@MMJM H@NN<B@:
&SSPS: TUBUJD BTTFSU (1-6 == 0-6) JT GBMTF
0P>C < O@NO KM@Q@ION OC@ API>ODJI AMJH RJMFDIB RDOC <I DI>JHK<OD=G@ OTK@, KJO@IOD<GGT
KMJ?P>DIB DI>JMM@>O M@NPGON.
TUBUJD BTTFSU ><I =@ PN@? RDOC <IT GJBD><G @SKM@NNDJI OC<O DN @Q<GP<=G@ <O >JHKDG@ ODH@.
CA@6;F;A@3> CA?B;>3F;A@
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
461
Type traits
71.6
1C@ @@USBJUT F@TRJM? <I? OC@ TUE.USBJUT HJ?PG@ KMJQD?@ DIAJMH<ODJI <=JPO OTK@N <I?
@SKM@NNDJIN <O >JHKDG@ ODH@.
0JH@ DIAJMH<ODJI OC<O DN >JGG@>O@? =T OC@ >JHKDG@M DN H<?@ <Q<DG<=G@ OJ OC@ KMJBM<H =T
@@USBJUT. &ON NTIO<S DI>GP?@N < OM<DON =7KIAD6 <I? B3D3?7F7DE OC<O <M@ M@G@Q<IO OJ OC<O
F@TRJM?:
@@USBJUT(keyword, parameters)
=7KIAD6 NK@>DAD@N OC@ DIAJMH<ODJI OC<O DN =@DIB LP@MD@?. 1C@ B3D3?7F7DE <M@ @DOC@M OTK@N JM
@SKM@NNDJIN, H@<IDIBN JA RCD>C <M@ ?@O@MHDI@? =T OC@ NK@>DAD> F@TRJM?.
1C@ DIAJMH<ODJI OC<O ><I =@ B<OC@M@? =T @@USBJUT DN @NK@>D<GGT PN@APG DI O@HKG<O@N. #JM
@S<HKG@, OC@ JT"SJUINFUJD F@TRJM? ><I ?@O@MHDI@ RC@OC@M < K<MOD>PG<M O@HKG<O@ K<M<H@O@M
5 DN <I <MDOCH@OD> OTK@:
TUBUJD JG (@@USBJUT(JT"SJUINFUJD, 5)) \
// ... BO BSJUINFUJD UZQF ...
^ FMTF \
// ... OPU BO BSJUINFUJD UZQF ...
^
-G@<N@ M@A@M OJ OC@ @@USBJUT ?J>PH@IO<ODJI OJ N@@ <GG JA OC@ <Q<DG<=G@ F@TRJM?N <I? OC@DM
K<M<H@O@MN.
0DHDG<MGT, OC@ TUE.USBJUT HJ?PG@ KMJQD?@N DIAJMH<ODJI <O >JHKDG@ ODH@ =T O@HKG<O@N.
#JM @S<HKG@, TUE.USBJUT.JT4PNF$IBS M@OPMIN USVF DA DON O@HKG<O@ K<M<H@O@M DN < >C<M<>O@M
OTK@:
JNQPSU TUE.USBJUT;
// ...
TUBUJD JG (JT4PNF$IBS!5) \
// ... DIBS, XDIBS, PS EDIBS ...
^ FMTF \
// ... OPU B DIBSBDUFS UZQF ...
^
-G@<N@ M@A@M OJ OC@ TUE.USBJUT ?J>PH@IO<ODJI AJM HJM@ DIAJMH<ODJI.
Summary
71.7
t J?@ OC<O DN ?@ADI@? <N EFCVH DN DI>GP?@? OJ OC@ KMJBM<H JIGT DA OC@ -EFCVH >JHKDG@M
NRDO>C DN PN@?.
t J?@ OC<O DN ?@ADI@? <N WFSTJPO DN DI>GP?@? OJ OC@ KMJBM<H JIGT DA < >JMM@NKJI?DIB -
WFSTJPO >JHKDG@M NRDO>C DN PN@?.
t TUBUJD JG DN NDHDG<M OJ <I JG NO<O@H@IO OC<O DN @S@>PO@? <O >JHKDG@ ODH@. &O DIOMJ?P>@N
>J?@ OJ OC@ KMJBM<H ?@K@I?DIB JI >@MO<DI >JHKDG@-ODH@ >JI?DODJIN.
t TUBUJD BTTFSU Q<GD?@N <NNPHKODJIN <=JPO >J?@ <O >JHKDG@ ODH@.
t @@USBJUT <I? TUE.USBJUT KMJQD?@ DIAJMH<ODJI <=JPO OTK@N <O >JHKDG@ ODH@.
CA@6;F;A@3> CA?B;>3F;A@
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
462
JT Expression 72
1C@ JT 7JBD7EE;A@ DN PIM@G<O@? OJ OC@ JT AB7D3FAD OC<O R@ C<Q@ N@@I DI 1C@ OVMM 3<GP@ <I?
OC@ JT ,K@M<OJM >C<KO@M, =JOC NTIO<>OD><GGT <I? N@H<IOD><GGT:
B JT C // JT PQFSBUPS, XIJDI XF IBWF TFFO CFGPSF
JT (/* ... */) // JT FYQSFTTJPO
1C@ JT @SKM@NNDJI DN @Q<GP<O@? <O >JHKDG@ ODH@. &O KMJ?P>@N <I JOU Q<GP@, @DOC@M 0 JM 1
?@K@I?DIB JI OC@ @SKM@NNDJI NK@>DAD@? DI K<M@IOC@N@N. AGOCJPBC OC@ @SKM@NNDJI OC<O DO O<F@N
DN IJO < GJBD><G @SKM@NNDJI, OC@ JT @SKM@NNDJI DON@GA DN PN@? <N < >JHKDG@ ODH@ GJBD><G
@SKM@NNDJI. &O DN @NK@>D<GGT PN@APG DI TUBUJD JG >JI?DODJI<GN <I? O@HKG<O@ >JINOM<DION.
1C@ >JI?DODJI OC<O DO O<F@N DN <GR<TN <=JPO OTK@N, RCD>C HPNO =@ RMDOO@I DI JI@ JA N@Q@M<G
NTIO<S@N.
JT (T)
72.1
!@O@MHDI@N RC@OC@M 5 DN Q<GD? <N < OTK@.
&O DN ?DAAD>PGO OJ >JH@ PK RDOC @S<HKG@N AJM OCDN PN@ <O OCDN KJDIO. 4@ RDGG O<F@ <?Q<IO<B@ JA DO
DI G<O@M >C<KO@MN RDOC O@HKG<O@ K<M<H@O@MN.
TUBUJD JG (JT (JOU)) \
XSJUFMO("WBMJE");
^ FMTF \
XSJUFMO("JOWBMJE");
^
JOU <=JQ@ DN < Q<GD? OTK@:
WBMJE
AN <IJOC@M @S<HKG@, =@><PN@ WPJE DN IJO Q<GD? <N OC@ F@T OTK@ JA <I <NNJ>D<ODQ@ <MM<T, OC@
FMTF =GJ>F RJPG? =@ @I<=G@? =@GJR:
TUBUJD JG (JT (TUSJOH<WPJE>)) \
XSJUFMO("WBMJE");
^ FMTF \
XSJUFMO("JOWBMJE");
^
1C@ JPOKPO:
JOWBMJE
JT (T Alias)
72.2
4JMFN DI OC@ N<H@ R<T <N OC@ KM@QDJPN NTIO<S. A??DODJI<GGT, ?@ADI@N "MJBT <N <I <GD<N JA 5:
TUBUJD JG (JT (JOU /FX"MJBT)) \
XSJUFMO("WBMJE");
/FX"MJBT WBS = 42; // JOU BOE /FX"MJBT BSF UIF TBNF
;E EJBD7EE;A@
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
463
^ FMTF \
XSJUFMO("JOWBMJE");
^
0P>C <GD<N@N <M@ PN@APG @NK@>D<GGT DI HJM@ >JHKG@S JT @SKM@NNDJIN <N R@ RDGG N@@ =@GJR.
JT (T : OtherT)
72.3
!@O@MHDI@N RC@OC@M 5 ><I <POJH<OD><GGT =@ >JIQ@MO@? OJ 0UIFS5.
&O DN PN@? AJM ?@O@>ODIB <POJH<OD> OTK@ >JIQ@MNDJIN RCD>C R@ C<Q@ N@@I DI OC@ 1TK@
JIQ@MNDJIN >C<KO@M, <N R@GG <N M@G<ODJINCDKN GDF@ "OCDN OTK@ DN JA OC<O OTK@", RCD>C R@ C<Q@
N@@I DI OC@ &IC@MDO<I>@ >C<KO@M.
JNQPSU TUE.TUEJP;
JOUFSGBDF $MPDL
\
WPJE UFMM5JNF();
^
DMBTT "MBSN$MPDL : $MPDL
\
PWFSSJEF WPJE UFMM5JNF()
\
XSJUFMO("10:00");
^
^
WPJE NZ'VODUJPO(5)(5 QBSBNFUFS)
\
TUBUJD JG (JT (5 : $MPDL)) \
// *G XF BSF IFSF UIFO 5 DBO CF VTFE BT B $MPDL
XSJUFMO("5IJT JT B $MPDL; XF DBO UFMM UIF UJNF");
QBSBNFUFS.UFMM5JNF();
^ FMTF \
XSJUFMO("5IJT JT OPU B $MPDL");
^
^
WPJE NBJO()
\
BVUP WBS = OFX "MBSN$MPDL;
NZ'VODUJPO(WBS);
NZ'VODUJPO(42);
^
4C@I OC@ NZ'VODUJPO() O@HKG<O@ DN DINO<IOD<O@? AJM < OTK@ OC<O ><I =@ PN@? GDF@ < $MPDL,
OC@I OC@ UFMM5JNF() H@H=@M API>ODJI DN ><GG@? JI DON K<M<H@O@M. ,OC@MRDN@, OC@ FMTF >G<PN@
B@ON >JHKDG@?:
5IJT JT B $MPDL; XF DBO UFMM UIF UJNF l GPS "MBSN$MPDL
10:00 l GPS "MBSN$MPDL
5IJT JT OPU B $MPDL l GPS JOU
JT (T Alias : OtherT)
72.4
4JMFN DI OC@ N<H@ R<T <N OC@ KM@QDJPN NTIO<S. A??DODJI<GGT, ?@ADI@N "MJBT <N <I <GD<N JA 5.
;E EJBD7EE;A@
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
464
JT (T == Specifier)
72.5
!@O@MHDI@N RC@OC@M 5 ;E F:7 E3?7 FKB7 <N 4QFDJGJFS JM RC@OC@M 5 ?3F5:7E F:3F EB75;8;7D.
1C@N@ ORJ ?DAA@M@IO PN@N <M@ @SKG<DI@? DI OC@ I@SO N@>ODJIN.
Whether the same type 72.5.1
4C@I R@ >C<IB@ OC@ KM@QDJPN @S<HKG@ OJ PN@ == DINO@<? JA :, OC@ >JI?DODJI RJPG? IJO =@
N<ODNAD@? AJM "MBSN$MPDL:
TUBUJD JG (JT (5 == $MPDL)) \
XSJUFMO("5IJT JT B $MPDL; XF DBO UFMM UIF UJNF");
QBSBNFUFS.UFMM5JNF();
^ FMTF \
XSJUFMO("5IJT JT OPU B $MPDL");
^
AGOCJPBC "MBSN$MPDL ;E 3 $MPDL, DO DN IJO @S<>OGT OC@ N<H@ OTK@ <N $MPDL. #JM OC<O M@<NJI,
IJR OC@ >JI?DODJI DN DIQ<GD? AJM =JOC "MBSN$MPDL <I? JOU:
5IJT JT OPU B $MPDL
5IJT JT OPU B $MPDL
Whether matches the same specifier 72.5.2
4C@I 4QFDJGJFS DN JI@ JA OC@ AJGGJRDIB F@TRJM?N, OCDN PN@ JA JT ?@O@MHDI@N RC@OC@M OC@
OTK@ H<O>C@N OC<O NK@>DAD@M (R@ RDGG N@@ NJH@ JA OC@N@ F@TRJM?N DI G<O@M >C<KO@MN):
t TUSVDU
t VOJPO
t DMBTT
t JOUFSGBDF
t FOVN
t GVODUJPO
t EFMFHBUF
t DPOTU
t JNNVUBCMF
t TIBSFE
WPJE NZ'VODUJPO(5)(5 QBSBNFUFS)
\
TUBUJD JG (JT (5 == DMBTT)) \
XSJUFMO("5IJT JT B DMBTT UZQF");
^ FMTF TUBUJD JG (JT (5 == FOVN)) \
XSJUFMO("5IJT JT BO FOVN UZQF");
^ FMTF TUBUJD JG (JT (5 == DPOTU)) \
XSJUFMO("5IJT JT B DPOTU UZQF");
^ FMTF \
XSJUFMO("5IJT JT TPNF PUIFS UZQF");
^
^
#PI>ODJI O@HKG<O@N ><I O<F@ <?Q<IO<B@ JA NP>C DIAJMH<ODJI OJ =@C<Q@ ?DAA@M@IOGT ?@K@I?DIB
JI OC@ OTK@ OC<O OC@ O@HKG<O@ DN DINO<IOD<O@? RDOC. 1C@ AJGGJRDIB >J?@ ?@HJINOM<O@N CJR
?DAA@M@IO =GJ>FN JA OC@ O@HKG<O@ <=JQ@ B@O >JHKDG@? AJM ?DAA@M@IO OTK@N:
;E EJBD7EE;A@
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
465
BVUP WBS = OFX "MBSN$MPDL;
NZ'VODUJPO(WBS);
// (FOVN 8FFL%BZT XJMM CF EFGJOFE CFMPX GPS BOPUIFS FYBNQMF)
NZ'VODUJPO(8FFL%BZT..POEBZ);
DPOTU EPVCMF OVNCFS = 1.2;
NZ'VODUJPO(OVNCFS);
NZ'VODUJPO(42);
1C@ JPOKPO:
5IJT JT B DMBTT UZQF
5IJT JT BO FOVN UZQF
5IJT JT B DPOTU UZQF
5IJT JT TPNF PUIFS UZQF
JT (T identifier == Specifier)
72.6
4JMFN DI OC@ N<H@ R<T <N OC@ KM@QDJPN NTIO<S. JEFOUJGJFS DN @DOC@M <I <GD<N JA OC@ OTK@; JM
NJH@ JOC@M DIAJMH<ODJI ?@K@I?DIB JI 4QFDJGJFS:
4QFDJGJFS 5IF NFBOJOH PG JEFOUJGJFS
TUSVDU BMJBT PG UIF UZQF UIBU TBUJTGJFE UIF DPOEJUJPO
VOJPO BMJBT PG UIF UZQF UIBU TBUJTGJFE UIF DPOEJUJPO
DMBTT BMJBT PG UIF UZQF UIBU TBUJTGJFE UIF DPOEJUJPO
JOUFSGBDF BMJBT PG UIF UZQF UIBU TBUJTGJFE UIF DPOEJUJPO
TVQFS B tuple DPOTJTUJOH PG UIF CBTF DMBTTFT BOE UIF JOUFSGBDFT
FOVN UIF BDUVBM JNQMFNFOUBUJPO UZQF PG UIF FOVN
GVODUJPO B tuple DPOTJTUJOH PG UIF GVODUJPO QBSBNFUFST
EFMFHBUF UIF UZQF PG UIF EFMFHBUF
SFUVSO UIF SFUVSO UZQF PG UIF SFHVMBS GVODUJPO, UIF EFMFHBUF, PS UIF
GVODUJPO QPJOUFS
@@QBSBNFUFST B tuple DPOTJTUJOH PG UIF QBSBNFUFST PG UIF SFHVMBS GVODUJPO,
UIF EFMFHBUF, PS UIF GVODUJPO QPJOUFS
DPOTU BMJBT PG UIF UZQF UIBU TBUJTGJFE UIF DPOEJUJPO
JNNVUBCMF BMJBT PG UIF UZQF UIBU TBUJTGJFE UIF DPOEJUJPO
TIBSFE BMJBT PG UIF UZQF UIBU TBUJTGJFE UIF DPOEJUJPO
)@O'N ADMNO ?@ADI@ Q<MDJPN OTK@N =@AJM@ @SK@MDH@IODIB RDOC OCDN NTIO<S:
TUSVDU 1PJOU
\
// ...
^
JOUFSGBDF $MPDL
\
// ...
^
DMBTT "MBSN$MPDL : $MPDL
\
// ...
^
;E EJBD7EE;A@
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
466
FOVN 8FFL%BZT \
.POEBZ, 5VFTEBZ, 8FEOFTEBZ, 5IVSTEBZ, 'SJEBZ,
4BUVSEBZ, 4VOEBZ
^
DIBS GPP(EPVCMF E, JOU J, $MPDL D)
\
SFUVSO 'B';
^
1C@ AJGGJRDIB API>ODJI O@HKG<O@ PN@N ?DAA@M@IO NK@>DAD@MN RDOC OCDN NTIO<S JA OC@ JT
@SKM@NNDJI:
WPJE NZ'VODUJPO(5)(5 QBSBNFUFS)
\
TUBUJD JG (JT (5 -PDBM"MJBT == TUSVDU)) \
XSJUFGMO("=O--- TUSVDU ---");
// -PDBM"MJBT JT UIF TBNF BT 5. 'QBSBNFUFS' JT UIF
// TUSVDU PCKFDU UIBU IBT CFFO QBTTFE UP UIJT
// GVODUJPO.
XSJUFGMO("$POTUSVDUJOH B OFX %T PCKFDU CZ DPQZJOH JU.",
-PDBM"MJBT.TUSJOHPG);
-PDBM"MJBT UIF$PQZ = QBSBNFUFS;
^
TUBUJD JG (JT (5 CBTF5ZQFT == TVQFS)) \
XSJUFMO("=O--- TVQFS ---");
// 5IF 'CBTF5ZQFT' UVQMF DPOUBJOT BMM PG UIF CBTF
// UZQFT PG 5. 'QBSBNFUFS' JT UIF DMBTT WBSJBCMF UIBU
// IBT CFFO QBTTFE UP UIJT GVODUJPO.
XSJUFGMO("DMBTT %T IBT %T CBTF UZQFT.",
5.TUSJOHPG, CBTF5ZQFT.MFOHUI);
XSJUFMO(""MM PG UIF CBTFT: ", CBTF5ZQFT.TUSJOHPG);
XSJUFMO("5IF UPQNPTU CBTF: ", CBTF5ZQFT<0>.TUSJOHPG);
^
TUBUJD JG (JT (5 *NQM5 == FOVN)) \
XSJUFMO("=O--- FOVN ---");
// '*NQM5' JT UIF BDUVBM JNQMFNFOUBUJPO UZQF PG UIJT
// FOVN UZQF. 'QBSBNFUFS' JT UIF FOVN WBMVF UIBU IBT
// CFFO QBTTFE UP UIJT GVODUJPO.
XSJUFGMO("5IF JNQMFNFOUBUJPO UZQF PG FOVN %T JT %T",
5.TUSJOHPG, *NQM5.TUSJOHPG);
^
TUBUJD JG (JT (5 3FUVSO5 == SFUVSO)) \
XSJUFMO("=O--- SFUVSO ---");
// '3FUVSO5' JT UIF SFUVSO UZQF PG UIF GVODUJPO
// QPJOUFS UIBU IBT CFFO QBTTFE UP UIJT GVODUJPO.
XSJUFGMO("5IJT JT B GVODUJPO XJUI B SFUVSO UZQF PG %T:",
3FUVSO5.TUSJOHPG);
XSJUFMO(" ", 5.TUSJOHPG);
XSJUF("DBMMJOH JU... ");
// /PUF: 'VODUJPO QPJOUFST DBO CF DBMMFE MJLF
// GVODUJPOT
3FUVSO5 SFTVMU = QBSBNFUFS(1.5, 42, OFX "MBSN$MPDL);
XSJUFGMO("BOE UIF SFTVMU JT '%T'", SFTVMU);
^
^
)@O'N IJR ><GG OC<O API>ODJI O@HKG<O@ RDOC Q<MDJPN OTK@N OC<O R@ C<Q@ ?@ADI@? <=JQ@:
;E EJBD7EE;A@
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
467
// $BMMJOH XJUI B TUSVDU PCKFDU
NZ'VODUJPO(1PJOU());
// $BMMJOH XJUI B DMBTT SFGFSFODF
NZ'VODUJPO(OFX "MBSN$MPDL);
// $BMMJOH XJUI BO FOVN WBMVF
NZ'VODUJPO(8FFL%BZT..POEBZ);
// $BMMJOH XJUI B GVODUJPO QPJOUFS
NZ'VODUJPO(&GPP);
1C@ JPOKPO:
--- TUSVDU ---
$POTUSVDUJOH B OFX 1PJOU PCKFDU CZ DPQZJOH JU.
--- TVQFS ---
DMBTT "MBSN$MPDL IBT 2 CBTF UZQFT.
"MM PG UIF CBTFT: (JO 0CKFDU, JO $MPDL)
5IF UPQNPTU CBTF: 0CKFDU
--- FOVN ---
5IF JNQMFNFOUBUJPO UZQF PG FOVN 8FFL%BZT JT JOU
--- SFUVSO ---
5IJT JT B GVODUJPO XJUI B SFUVSO UZQF PG DIBS:
DIBS GVODUJPO(EPVCMF E, JOU J, $MPDL D)
DBMMJOH JU... BOE UIF SFTVMU JT 'B'
JT (T : Specifier, TemplateParamList)
JT (T == Specifier, TemplateParamList)
JT (T identifier : Specifier, TemplateParamList)
JT (T identifier == Specifier, TemplateParamList)
72.7
1C@N@ NTIO<S@N <GGJR AJM HJM@ >JHKG@S ><N@N.
JEFOUJGJFS, 4QFDJGJFS, :, <I? == <GG C<Q@ OC@ N<H@ H@<IDIBN <N ?@N>MD=@? <=JQ@.
5FNQMBUF1BSBN-JTU DN =JOC < K<MO JA OC@ >JI?DODJI OC<O I@@?N OJ =@ N<ODNAD@? <I? < A<>DGDOT OJ
?@ADI@ <??DODJI<G <GD<N@N DA OC@ >JI?DODJI DN DI?@@? N<ODNAD@?. &O RJMFN DI OC@ N<H@ R<T <N
O@HKG<O@ OTK@ ?@?P>ODJI.
AN < NDHKG@ @S<HKG@, G@O'N <NNPH@ OC<O <I JT @SKM@NNDJI I@@?N OJ H<O>C <NNJ>D<ODQ@ <MM<TN
OC<O C<Q@ F@TN JA OTK@ TUSJOH:
TUBUJD JG (JT (5 == 7BMVF<,FZ>, // (1)
7BMVF, // (2)
,FZ : TUSJOH)) \ // (3)
1C<O >JI?DODJI ><I =@ @SKG<DI@? DI OCM@@ K<MON RC@M@ OC@ G<NO ORJ <M@ K<MON JA OC@
5FNQMBUF1BSBN-JTU:
1. &A 5 H<O>C@N OC@ NTIO<S JA 7BMVF<,FZ>
2. &A 7BMVF DN < OTK@
3. &A ,FZ DN TUSJOH (M@H@H=@M OC@ O@HKG<O@ NK@>D<GDU<ODJI NTIO<S)
;E EJBD7EE;A@
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
468
%<QDIB 7BMVF<,FZ> <N OC@ 4QFDJGJFS M@LPDM@N OC<O 5 DN <I <NNJ>D<ODQ@ <MM<T. )@<QDIB 7BMVF
3E ;E H@<IN OC<O DO ><I =@ <IT OTK@. A??DODJI<GGT, OC@ F@T OTK@ JA OC@ <NNJ>D<ODQ@ <MM<T HPNO =@
TUSJOH. AN < M@NPGO, OC@ KM@QDJPN JT @SKM@NNDJI H@<IN "DA 5 DN <I <NNJ>D<ODQ@ <MM<T RC@M@ OC@
F@T OTK@ DN TUSJOH."
1C@ AJGGJRDIB KMJBM<H O@NON OC<O JT @SKM@NNDJI RDOC AJPM ?DAA@M@IO OTK@N:
JNQPSU TUE.TUEJP;
WPJE NZ'VODUJPO(5)(5 QBSBNFUFS)
\
XSJUFGMO("=O--- $BMMFE XJUI %T ---", 5.TUSJOHPG);
TUBUJD JG (JT (5 == 7BMVF<,FZ>,
7BMVF,
,FZ : TUSJOH)) \
XSJUFMO(":FT, UIF DPOEJUJPO IBT CFFO TBUJTGJFE.");
XSJUFMO("5IF WBMVF UZQF: ", 7BMVF.TUSJOHPG);
XSJUFMO("5IF LFZ UZQF : ", ,FZ.TUSJOHPG);
^ FMTF \
XSJUFMO("/P, UIF DPOEJUJPO IBT OPU CFFO TBUJTGJFE.");
^
^
WPJE NBJO()
\
JOU OVNCFS;
NZ'VODUJPO(OVNCFS);
JOU<TUSJOH> JOU5BCMF;
NZ'VODUJPO(JOU5BCMF);
EPVCMF<TUSJOH> EPVCMF5BCMF;
NZ'VODUJPO(EPVCMF5BCMF);
EDIBS<MPOH> EDIBS5BCMF;
NZ'VODUJPO(EDIBS5BCMF);
^
1C@ >JI?DODJI DN N<ODNAD@? JIGT DA OC@ F@T OTK@ DN TUSJOH:
--- $BMMFE XJUI JOU ---
/P, UIF DPOEJUJPO IBT OPU CFFO TBUJTGJFE.
--- $BMMFE XJUI JOU<TUSJOH> ---
:FT, UIF DPOEJUJPO IBT CFFO TBUJTGJFE.
5IF WBMVF UZQF: JOU
5IF LFZ UZQF : TUSJOH
--- $BMMFE XJUI EPVCMF<TUSJOH> ---
:FT, UIF DPOEJUJPO IBT CFFO TBUJTGJFE.
5IF WBMVF UZQF: EPVCMF
5IF LFZ UZQF : TUSJOH
--- $BMMFE XJUI EDIBS<MPOH> ---
/P, UIF DPOEJUJPO IBT OPU CFFO TBUJTGJFE.
;E EJBD7EE;A@
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
469
Function Pointers, Delegates, and Lambdas 73
#PI>ODJI KJDIO@MN <M@ AJM NOJMDIB <??M@NN@N JA API>ODJIN DI JM?@M OJ @S@>PO@ OCJN@ API>ODJIN <O
< G<O@M ODH@. #PI>ODJI KJDIO@MN <M@ NDHDG<M OJ OC@DM >JPIO@MK<MON DI OC@ KMJBM<HHDIB
G<IBP<B@.
!@G@B<O@N NOJM@ =JOC < API>ODJI KJDIO@M <I? OC@ >JIO@SO OJ @S@>PO@ OC<O API>ODJI KJDIO@M DI.
1C@ NOJM@? >JIO@SO ><I @DOC@M =@ OC@ N>JK@ OC<O OC@ API>ODJI @S@>PODJI RDGG O<F@ KG<>@ JM <
TUSVDU JM DMBTT J=E@>O.
!@G@B<O@N @I<=G@ 5>AEGD7E <N R@GG, < >JI>@KO OC<O DN NPKKJMO@? =T HJNO API>ODJI<G
KMJBM<HHDIB G<IBP<B@N.
Function pointers
73.1
4@ C<Q@ N@@I DI OC@ KM@QDJPN >C<KO@M OC<O DO DN KJNND=G@ OJ O<F@ <??M@NN@N JA API>ODJIN RDOC
OC@ & JK@M<OJM. &I JI@ JA OC@ @S<HKG@N, R@ K<NN@? NP>C <I <??M@NN OJ < API>ODJI O@HKG<O@.
1<FDIB <?Q<IO<B@ JA OC@ A<>O OC<O O@HKG<O@ OTK@ K<M<H@O@MN ><I H<O>C <IT OTK@, G@O'N K<NN <
API>ODJI KJDIO@M OJ < O@HKG<O@ OJ J=N@MQ@ DON OTK@ =T KMDIODIB DON .TUSJOHPG KMJK@MOT:
JNQPSU TUE.TUEJP;
JOU NZ'VODUJPO(DIBS D, EPVCMF E)
\
SFUVSO 42;
^
WPJE NBJO()
\
NZ5FNQMBUF(&NZ'VODUJPO); // 5BLJOH UIF GVODUJPO'T BEESFTT BOE
// QBTTJOH JU BT B QBSBNFUFS
^
WPJE NZ5FNQMBUF(5)(5 QBSBNFUFS)
\
XSJUFMO("UZQF : ", 5.TUSJOHPG);
XSJUFMO("WBMVF: ", QBSBNFUFS);
^
1C@ JPOKPO JA OC@ KMJBM<H M@Q@<GN OC@ OTK@ <I? OC@ <??M@NN JA NZ'VODUJPO():
UZQF : JOU GVODUJPO(DIBS D, EPVCMF E)
WBMVF: 406948
Definition 73.1.1
0DHDG<M OJ M@BPG<M KJDIO@MN, @<>C API>ODJI KJDIO@M OTK@ ><I KJDIO @S<>OGT OJ < K<MOD>PG<M OTK@
JA API>ODJI; OC@ K<M<H@O@M GDNO <I? OC@ M@OPMI OTK@ JA OC@ API>ODJI KJDIO@M <I? OC@ API>ODJI
HPNO H<O>C. #PI>ODJI KJDIO@MN <M@ ?@ADI@? =T OC@ GVODUJPO F@TRJM? =@OR@@I OC@ M@OPMI OTK@
<I? OC@ K<M<H@O@M GDNO JA OC<O K<MOD>PG<M OTK@:
return_type GVODUJPO(parameters) QUS;
1C@ I<H@N JA OC@ K<M<H@O@MN (D <I? E DI OC@ JPOKPO <=JQ@) <M@ JKODJI<G. B@><PN@
NZ'VODUJPO() O<F@N < DIBS <I? < EPVCMF <I? M@OPMIN <I JOU, OC@ OTK@ JA < API>ODJI KJDIO@M
OC<O ><I KJDIO <O NZ'VODUJPO() HPNO =@ ?@ADI@? <>>JM?DIBGT:
FG@5F;A@ &A;@F7DE, D7>793F7E, 3@6 "3?463E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
470
JOU GVODUJPO(DIBS, EPVCMF) QUS = &NZ'VODUJPO;
1C@ GDI@ <=JQ@ ?@ADI@N QUS <N < API>ODJI KJDIO@M O<FDIB ORJ K<M<H@O@MN (DIBS <I? EPVCMF)
<I? M@OPMIDIB JOU. &ON Q<GP@ DN OC@ <??M@NN JA NZ'VODUJPO().
#PI>ODJI KJDIO@M NTIO<S DN M@G<ODQ@GT C<M?@M OJ M@<?; DO DN >JHHJI OJ H<F@ >J?@ HJM@
M@<?<=G@ =T <I BMJBT:
BMJBT $BMDVMBUJPO'VOD = JOU GVODUJPO(DIBS, EPVCMF);
1C<O <GD<N H<F@N OC@ >J?@ @<ND@M OJ M@<?:
$BMDVMBUJPO'VOD QUS = &NZ'VODUJPO;
AN RDOC <IT OTK@, BVUP ><I =@ PN@? <N R@GG:
BVUP QUS = &NZ'VODUJPO;
Calling a function pointer 73.1.2
#PI>ODJI KJDIO@MN ><I =@ ><GG@? @S<>OGT GDF@ API>ODJIN:
JOU SFTVMU = QUS('B', 5.67);
BTTFSU(SFTVMU == 42);
1C@ ><GG QUS('B', 5.67) <=JQ@ DN OC@ @LPDQ<G@IO JA ><GGDIB OC@ <>OP<G API>ODJI =T
NZ'VODUJPO('B', 5.67).
When to use 73.1.3
B@><PN@ API>ODJI KJDIO@MN NOJM@ RC<O API>ODJI OJ ><GG <I? OC@T <M@ ><GG@? @S<>OGT GDF@ OC@
API>ODJIN OC<O OC@T KJDIO <O, API>ODJI KJDIO@MN @AA@>ODQ@GT NOJM@ OC@ =@C<QDJM JA OC@ KMJBM<H
AJM G<O@M.
1C@M@ <M@ H<IT JOC@M A@<OPM@N JA ! OC<O <M@ <=JPO KMJBM<H =@C<QDJM. #JM @S<HKG@, OC@
<KKMJKMD<O@ API>ODJI OJ ><GG OJ ><G>PG<O@ OC@ R<B@N JA <I &NQMPZFF ><I =@ ?@O@MHDI@? =T OC@
Q<GP@ JA <I FOVN H@H=@M:
GJOBM TXJUDI (FNQMPZFF.UZQF) \
DBTF &NQMPZFF5ZQF.GVMM5JNF:
GVMM5JNF&NQMPZFF8BHFT();
CSFBL;
DBTF &NQMPZFF5ZQF.IPVSMZ:
IPVSMZ&NQMPZFF8BHFT();
CSFBL;
^
2IAJMOPI<O@GT, OC<O H@OCJ? DN M@G<ODQ@GT C<M?@M OJ H<DIO<DI =@><PN@ DO J=QDJPNGT C<N OJ
NPKKJMO <GG FIJRI @HKGJT@@ OTK@N. &A < I@R OTK@ JA @HKGJT@@ DN <??@? OJ OC@ KMJBM<H, OC@I
<GG NP>C TXJUDI NO<O@H@ION HPNO =@ GJ><O@? NJ OC<O < I@R DBTF >G<PN@ DN <??@? AJM OC@ I@R
@HKGJT@@ OTK@.
A HJM@ >JHHJI <GO@MI<ODQ@ JA DHKG@H@IODIB =@C<QDJM ?DAA@M@I>@N DN KJGTHJMKCDNH. AI
&NQMPZFF DIO@MA<>@ ><I =@ ?@ADI@? <I? ?DAA@M@IO R<B@ ><G>PG<ODJIN ><I =@ C<I?G@? =T
?DAA@M@IO DHKG@H@IO<ODJIN JA OC<O DIO@MA<>@:
FG@5F;A@ &A;@F7DE, D7>793F7E, 3@6 "3?463E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
471
JOUFSGBDF &NQMPZFF
\
EPVCMF XBHFT();
^
DMBTT 'VMM5JNF&NQMPZFF : &NQMPZFF
\
EPVCMF XBHFT()
\
EPVCMF SFTVMU;
// ...
SFUVSO SFTVMU;
^
^
DMBTT )PVSMZ&NQMPZFF : &NQMPZFF
\
EPVCMF XBHFT()
\
EPVCMF SFTVMU;
// ...
SFUVSO SFTVMU;
^
^
// ...
EPVCMF SFTVMU = FNQMPZFF.XBHFT();
#PI>ODJI KJDIO@MN <M@ T@O <IJOC@M <GO@MI<ODQ@ AJM DHKG@H@IODIB ?DAA@M@IO =@C<QDJM. 1C@T <M@
HJM@ >JHHJI DI KMJBM<HHDIB G<IBP<B@N OC<O ?J IJO NPKKJMO J=E@>O JMD@IO@? KMJBM<HHDIB.
Function pointer as a parameter 73.1.4
)@O'N ?@NDBI < API>ODJI OC<O O<F@N <I <MM<T <I? M@OPMIN <IJOC@M <MM<T. 1CDN API>ODJI RDGG ADGO@M
JPO @G@H@ION OC<O <M@ G@NN OC<I JM @LP<G OJ U@MJ, <I? HPGODKGT OC@ JOC@MN =T O@I:
JOU<> GJMUFS"OE$POWFSU(DPOTU JOU<> OVNCFST)
\
JOU<> SFTVMU;
GPSFBDI (F; OVNCFST) \
JG (F > 0) \ // GJMUFSJOH,
JNNVUBCMF OFX/VNCFS = F * 10; // BOE DPOWFSTJPO
SFTVMU _= OFX/VNCFS;
^
^
SFUVSO SFTVMU;
^
1C@ AJGGJRDIB KMJBM<H ?@HJINOM<O@N DON =@C<QDJM RDOC M<I?JHGT B@I@M<O@? Q<GP@N:
JNQPSU TUE.TUEJP;
JNQPSU TUE.SBOEPN;
WPJE NBJO()
\
JOU<> OVNCFST;
// 3BOEPN OVNCFST
GPSFBDI (J; 0 .. 10) \
OVNCFST _= VOJGPSN(0, 10) - 5;
^
XSJUFMO("JOQVU : ", OVNCFST);
FG@5F;A@ &A;@F7DE, D7>793F7E, 3@6 "3?463E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
472
XSJUFMO("PVUQVU: ", GJMUFS"OE$POWFSU(OVNCFST));
^
1C@ JPOKPO >JIO<DIN IPH=@MN OC<O <M@ O@I ODH@N OC@ JMDBDI<G IPH=@MN, RCD>C R@M@ BM@<O@M
OC<I U@MJ OJ =@BDI RDOC. 1C@ JMDBDI<G IPH=@MN OC<O C<Q@ =@@I N@G@>O@? <M@ CDBCGDBCO@?:
JOQVU : <-2, 2, -2, 3, -2, 2, -1, -4, 0, 0>
PVUQVU: <20, 30, 20>
GJMUFS"OE$POWFSU() DN AJM < Q@MT NK@>DAD> O<NF: &O <GR<TN N@G@>ON IPH=@MN OC<O <M@ BM@<O@M
OC<I U@MJ <I? <GR<TN HPGODKGD@N OC@H =T O@I. &O >JPG? =@ HJM@ PN@APG DA OC@ =@C<QDJMN JA
ADGO@MDIB <I? >JIQ@MNDJI R@M@ K<M<H@O@MDU@?.
+JODIB OC<O ADGO@MDIB DN < AJMH JA >JIQ@MNDJI <N R@GG (AMJH JOU OJ CPPM), GJMUFS"OE$POWFSU()
K@MAJMHN ORJ >JIQ@MNDJIN:
t OVNCFS > 0, RCD>C KMJ?P>@N CPPM =T >JIND?@MDIB <I JOU Q<GP@.
t OVNCFS * 10, RCD>C KMJ?P>@N JOU AMJH <I JOU Q<GP@.
)@O'N ?@ADI@ >JIQ@ID@IO <GD<N@N AJM API>ODJI KJDIO@MN OC<O RJPG? H<O>C OC@ ORJ >JIQ@MNDJIN
<=JQ@:
BMJBT 1SFEJDBUF = CPPM GVODUJPO(JOU); // NBLFT CPPM GSPN JOU
BMJBT $POWFSUPS = JOU GVODUJPO(JOU); // NBLFT JOU GSPN JOU
1SFEJDBUF DN OC@ OTK@ JA API>ODJIN OC<O O<F@ JOU <I? M@OPMI CPPM, <I? $POWFSUPS DN OC@ OTK@
JA API>ODJIN OC<O O<F@ JOU <I? M@OPMI JOU.
&A R@ KMJQD?@ NP>C API>ODJI KJDIO@MN <N K<M<H@O@MN, R@ ><I C<Q@ GJMUFS"OE$POWFSU() PN@
OCJN@ API>ODJI KJDIO@MN ?PMDIB DON RJMF:
JOU<> GJMUFS"OE$POWFSU(DPOTU JOU<> OVNCFST,
1SFEJDBUF QSFEJDBUF,
$POWFSUPS DPOWFSUPS)
\
JOU<> SFTVMU;
GPSFBDI (OVNCFS; OVNCFST) \
JG (QSFEJDBUF(OVNCFS)) \
JNNVUBCMF OFX/VNCFS = DPOWFSUPS(OVNCFS);
SFTVMU _= OFX/VNCFS;
^
^
SFUVSO SFTVMU;
^
GJMUFS"OE$POWFSU() DN IJR <I <GBJMDOCH OC<O DN DI?@K@I?@IO JA OC@ <>OP<G ADGO@MDIB <I?
>JIQ@MNDJI JK@M<ODJIN. 4C@I ?@NDM@?, DON @<MGD@M =@C<QDJM ><I =@ <>CD@Q@? =T OC@ AJGGJRDIB
ORJ NDHKG@ API>ODJIN:
CPPM JT(SFBUFS5IBO;FSP(JOU OVNCFS)
\
SFUVSO OVNCFS > 0;
^
JOU UFO5JNFT(JOU OVNCFS)
\
SFUVSO OVNCFS * 10;
^
FG@5F;A@ &A;@F7DE, D7>793F7E, 3@6 "3?463E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
473
// ...
XSJUFMO("PVUQVU: ", GJMUFS"OE$POWFSU(OVNCFST,
&JT(SFBUFS5IBO;FSP,
&UFO5JNFT));
1CDN ?@NDBI <GGJRN ><GGDIB GJMUFS"OE$POWFSU() RDOC H<IT ?DAA@M@IO ADGO@MDIB <I? >JIQ@MNDJI
=@C<QDJMN. #JM @S<HKG@, OC@ AJGGJRDIB ORJ API>ODJIN RJPG? H<F@ GJMUFS"OE$POWFSU()
KMJ?P>@ F:7 @793F;H7E A8 F:7 7H7@ @G?47DE:
CPPM JT&WFO(JOU OVNCFS)
\
SFUVSO (OVNCFS % 2) == 0;
^
JOU OFHBUJWF0G(JOU OVNCFS)
\
SFUVSO -OVNCFS;
^
// ...
XSJUFMO("PVUQVU: ", GJMUFS"OE$POWFSU(OVNCFST,
&JT&WFO,
&OFHBUJWF0G));
1C@ JPOKPO:
JOQVU : <3, -3, 2, 1, -5, 1, 2, 3, 4, -4>
PVUQVU: <-2, -2, -4, 4>
AN N@@I DI OC@N@ @S<HKG@N, NJH@ODH@N NP>C API>ODJIN <M@ NJ OMDQD<G OC<O ?@ADIDIB OC@H <N
KMJK@M API>ODJIN RDOC I<H@, M@OPMI OTK@, K<M<H@O@M GDNO, <I? >PMGT =M<>F@ON DN PII@>@NN<MDGT
RJM?T.
AN R@ RDGG N@@ =@GJR, OC@ => NTIO<S JA <IJITHJPN API>ODJIN H<F@N OC@ >J?@ HJM@ >JI>DN@ <I?
HJM@ M@<?<=G@. 1C@ AJGGJRDIB GDI@ C<N <IJITHJPN API>ODJIN OC<O <M@ OC@ @LPDQ<G@ION JA
JT&WFO() <I? OFHBUJWF0G(), RDOCJPO KMJK@M API>ODJI ?@ADIDODJIN:
XSJUFMO("PVUQVU: ", GJMUFS"OE$POWFSU(OVNCFST,
OVNCFS => (OVNCFS % 2) == 0,
OVNCFS => -OVNCFS));
Function pointer as a member 73.1.5
#PI>ODJI KJDIO@MN ><I =@ NOJM@? <N H@H=@MN JA NOMP>ON <I? >G<NN@N <N R@GG. 1J N@@ OCDN, G@O'N
?@NDBI < DMBTT OC<O O<F@N OC@ KM@?D><O@ <I? >JIQ@MOJM <N >JINOMP>OJM K<M<H@O@MN DI JM?@M OJ
PN@ OC@H G<O@M JI:
DMBTT /VNCFS)BOEMFS
\
1SFEJDBUF QSFEJDBUF;
$POWFSUPS DPOWFSUPS;
UIJT(1SFEJDBUF QSFEJDBUF, $POWFSUPS DPOWFSUPS)
\
UIJT.QSFEJDBUF = QSFEJDBUF;
UIJT.DPOWFSUPS = DPOWFSUPS;
^
JOU<> IBOEMF(DPOTU JOU<> OVNCFST)
\
FG@5F;A@ &A;@F7DE, D7>793F7E, 3@6 "3?463E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
474
JOU<> SFTVMU;
GPSFBDI (OVNCFS; OVNCFST) \
JG (QSFEJDBUF(OVNCFS)) \
JNNVUBCMF OFX/VNCFS = DPOWFSUPS(OVNCFS);
SFTVMU _= OFX/VNCFS;
^
^
SFUVSO SFTVMU;
^
^
AI J=E@>O JA OC<O OTK@ ><I =@ PN@? NDHDG<MGT OJ GJMUFS"OE$POWFSU():
BVUP IBOEMFS = OFX /VNCFS)BOEMFS(&JT&WFO, &OFHBUJWF0G);
XSJUFMO("SFTVMU: ", IBOEMFS.IBOEMF(OVNCFST));
Anonymous functions
73.2
1C@ >J?@ ><I =@ HJM@ M@<?<=G@ <I? >JI>DN@ RC@I NCJMO API>ODJIN <M@ ?@ADI@? RDOCJPO KMJK@M
API>ODJI ?@ADIDODJIN.
AIJITHJPN API>ODJIN, RCD>C <M@ <GNJ FIJRN <N 8G@5F;A@ >;F7D3>E JM >3?463E, <GGJR ?@ADIDIB
API>ODJIN DIND?@ JA @SKM@NNDJIN. AIJITHJPN API>ODJIN ><I =@ PN@? <O <IT KJDIO RC@M@ <
API>ODJI KJDIO@M ><I =@ PN@?.
4@ RDGG B@O OJ OC@DM NCJMO@M => NTIO<S G<O@M =@GJR. )@O'N ADMNO N@@ OC@DM APGG NTIO<S, RCD>C DN
PNP<GGT OJJ RJM?T @NK@>D<GGT RC@I DO <KK@<MN DIND?@ JA JOC@M @SKM@NNDJIN:
GVODUJPO return_type(parameters) \ /* PQFSBUJPOT */ ^
#JM @S<HKG@, <I J=E@>O JA /VNCFS)BOEMFS OC<O KMJ?P>@N 7 F;?7E F:7 @G?47DE F:3F 3D7 9D73F7D
F:3@ 2 ><I =@ >JINOMP>O@? =T <IJITHJPN API>ODJIN <N DI OC@ AJGGJRDIB >J?@:
OFX /VNCFS)BOEMFS(GVODUJPO CPPM(JOU OVNCFS) \ SFUVSO OVNCFS > 2; ^,
GVODUJPO JOU(JOU OVNCFS) \ SFUVSO OVNCFS * 7; ^);
1RJ <?Q<IO<B@N JA OC@ >J?@ <=JQ@ DN OC<O OC@ API>ODJIN <M@ IJO ?@ADI@? <N KMJK@M API>ODJIN
<I? OC<O OC@DM DHKG@H@IO<ODJIN <M@ QDND=G@ MDBCO RC@M@ OC@ /VNCFS)BOEMFS J=E@>O DN
>JINOMP>O@?.
+JO@ OC<O OC@ <IJITHJPN API>ODJI NTIO<S DN Q@MT NDHDG<M OJ M@BPG<M API>ODJI NTIO<S. AGOCJPBC
OCDN >JINDNO@I>T DN Q<GP<=G@, OCDN APGG NTIO<S JA <IJITHJPN API>ODJIN H<F@N >J?@ OJJ RJM?T.
#JM OC<O M@<NJI, OC@M@ <M@ Q<MDJPN NCJMO@M R<TN JA ?@ADIDIB <IJITHJPN API>ODJIN.
Shorter syntax 73.2.1
4C@I OC@ M@OPMI OTK@ ><I =@ ?@?P>@? AMJH OC@ SFUVSO NO<O@H@IO DIND?@ OC@ <IJITHJPN
API>ODJI, OC@I OC@ M@OPMI OTK@ I@@? IJO =@ NK@>DAD@? (1C@ KG<>@ RC@M@ OC@ M@OPMI OTK@ RJPG?
IJMH<GGT <KK@<M DN CDBCGDBCO@? =T >J?@ >JHH@ION.):
OFX /VNCFS)BOEMFS(GVODUJPO /**/(JOU OVNCFS) \ SFUVSO OVNCFS > 2; ^,
GVODUJPO /**/(JOU OVNCFS) \ SFUVSO OVNCFS * 7; ^);
FG@5F;A@ &A;@F7DE, D7>793F7E, 3@6 "3?463E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
475
#PMOC@M, RC@I OC@ <IJITHJPN API>ODJI ?J@N IJO O<F@ K<M<H@O@MN, DON K<M<H@O@M GDNO I@@? IJO
=@ KMJQD?@?. )@O'N >JIND?@M < API>ODJI OC<O O<F@N < API>ODJI KJDIO@M, < API>ODJI KJDIO@M OC<O
O<F@N @AF:;@9 <I? M@OPMIN EPVCMF:
WPJE GPP(EPVCMF GVODUJPO() GVOD)
\
// ...
^
AIJITHJPN API>ODJIN OC<O <M@ K<NN@? OJ OC<O API>ODJI I@@? IJO C<Q@ OC@ @HKOT K<M<H@O@M
GDNO. 1C@M@AJM@, <GG OCM@@ JA OC@ AJGGJRDIB <IJITHJPN API>ODJI NTIO<S@N <M@ @LPDQ<G@IO:
GPP(GVODUJPO EPVCMF() \ SFUVSO 42.42; ^);
GPP(GVODUJPO () \ SFUVSO 42.42; ^);
GPP(GVODUJPO \ SFUVSO 42.42; ^);
1C@ ADMNO JI@ DN RMDOO@I DI OC@ APGG NTIO<S. 1C@ N@>JI? JI@ JHDON OC@ M@OPMI OTK@, O<FDIB
<?Q<IO<B@ JA OC@ M@OPMI OTK@ ?@?P>ODJI. 1C@ OCDM? JI@ JHDON OC@ PII@>@NN<MT K<M<H@O@M GDNO.
"Q@I APMOC@M, OC@ F@TRJM? GVODUJPO I@@? IJO =@ KMJQD?@? @DOC@M. &I OC<O ><N@ DO DN G@AO OJ OC@
>JHKDG@M OJ ?@O@MHDI@ RC@OC@M DO DN <I <IJITHJPN API>ODJI JM <I <IJITHJPN ?@G@B<O@.
2IG@NN DO PN@N < Q<MD<=G@ AMJH JI@ JA OC@ @I>GJNDIB N>JK@N, DO DN < API>ODJI:
GPP(\ SFUVSO 42.42; ^);
*JNO <IJITHJPN API>ODJIN ><I =@ ?@ADI@? @Q@I NCJMO@M =T OC@ >3?463 EK@F3J.
Lambda syntax instead of a single SFUVSO statement 73.2.2
&I HJNO ><N@N @Q@I OC@ NCJMO@NO NTIO<S <=JQ@ DN PII@>@NN<MDGT >GPOO@M@?. 1C@ >PMGT =M<>F@ON
OC<O <M@ EPNO DIND?@ OC@ API>ODJI K<M<H@O@M GDNO H<F@ OC@ >J?@ C<M?@M OJ M@<? <I? < SFUVSO
NO<O@H@IO <N R@GG <N DON N@HD>JGJI DIND?@ < API>ODJI <MBPH@IO GJJFN JPO JA KG<>@.
)@O'N NO<MO RDOC OC@ APGG NTIO<S JA <I <IJITHJPN API>ODJI OC<O C<N < NDIBG@ SFUVSO NO<O@H@IO:
GVODUJPO return_type(parameters) \ SFUVSO expression; ^
4@ C<Q@ <GM@<?T N@@I OC<O OC@ GVODUJPO F@TRJM? DN IJO I@>@NN<MT <I? OC@ M@OPMI OTK@ ><I =@
?@?P>@?:
(parameters) \ SFUVSO expression; ^
1C@ @LPDQ<G@IO JA OC<O ?@ADIDODJI DN OC@ AJGGJRDIB => NTIO<S, RC@M@ OC@ => >C<M<>O@MN M@KG<>@
OC@ >PMGT =M<>F@ON, OC@ SFUVSO F@TRJM?, <I? OC@ N@HD>JGJI:
(parameters) => expression
#PMOC@M, RC@I OC@M@ DN < NDIBG@ K<M<H@O@M, OC@ K<M@IOC@N@N <MJPI? OC@ K<M<H@O@M GDNO ><I =@
JHDOO@? <N R@GG:
single_parameter => expression
,I OC@ JOC@M C<I?, OJ <QJD? BM<HH<M <H=DBPDOD@N, OC@ K<M<H@O@M GDNO HPNO NODGG =@ RMDOO@I <N
@HKOT K<M@IOC@N@N RC@I OC@M@ DN IJ K<M<H@O@M <O <GG:
() => expression
FG@5F;A@ &A;@F7DE, D7>793F7E, 3@6 "3?463E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
476
)@O'N PN@ OC@ G<H=?< NTIO<S DI < KM@?D><O@ K<NN@? OJ TUE.BMHPSJUIN.GJMUFS. GJMUFS() O<F@N
< KM@?D><O@ <N DON O@HKG<O@ K<M<H@O@M <I? < M<IB@ <N DON API>ODJI K<M<H@O@M. &O <KKGD@N OC@
KM@?D><O@ OJ @<>C @G@H@IO JA OC@ M<IB@ <I? M@OPMIN OC@ JI@N OC<O N<ODNAT OC@ KM@?D><O@. ,I@ JA
N@Q@M<G R<TN JA NK@>DATDIB OC@ KM@?D><O@ DN OC@ G<H=?< NTIO<S.
($AF7: ,7 I;>> E77 D3@97E ;@ 3 >3F7D 5:3BF7D. AF F:;E BA;@F, ;F E:AG>6 47 EG88;5;7@F FA =@AI F:3F
D E>;57E 3D7 D3@97E.)
1C@ AJGGJRDIB G<H=?< DN < KM@?D><O@ OC<O H<O>C@N @G@H@ION OC<O <M@ BM@<O@M OC<I 10:
JNQPSU TUE.TUEJP;
JNQPSU TUE.BMHPSJUIN;
WPJE NBJO()
\
JOU<> OVNCFST = < 20, 1, 10, 300, -2 >;
XSJUFMO(OVNCFST.GJMUFS!(OVNCFS => OVNCFS > 10));
^
1C@ JPOKPO >JIO<DIN JIGT OC@ @G@H@ION OC<O N<ODNAT OC@ KM@?D><O@:
<20, 300>
#JM >JHK<MDNJI, G@O'N RMDO@ OC@ N<H@ G<H=?< DI OC@ GJIB@NO NTIO<S. 1C@ >PMGT =M<>F@ON OC<O
?@ADI@ OC@ =J?T JA OC@ <IJITHJPN API>ODJI <M@ CDBCGDBCO@?:
XSJUFMO(OVNCFST.GJMUFS!(GVODUJPO CPPM(JOU OVNCFS) \
SFUVSO OVNCFS > 10;
^));
AN <IJOC@M @S<HKG@, OCDN ODH@ G@O'N ?@ADI@ <I <IJITHJPN API>ODJI OC<O O<F@N ORJ K<M<H@O@MN.
1C@ AJGGJRDIB <GBJMDOCH O<F@N ORJ NGD>@N <I? K<NN@N OC@DM >JMM@NKJI?DIB @G@H@ION JI@ =T JI@
OJ < GVODUJPO OC<O DON@GA O<F@N ORJ K<M<H@O@MN. &O OC@I >JGG@>ON <I? M@OPMIN OC@ M@NPGON <N
<IJOC@M NGD>@:
JOU<> CJOBSZ"MHPSJUIN(JOU GVODUJPO(JOU, JOU) GVOD,
DPOTU JOU<> TMJDF1,
DPOTU JOU<> TMJDF2)
\
FOGPSDF(TMJDF1.MFOHUI == TMJDF2.MFOHUI);
JOU<> SFTVMUT;
GPSFBDI (J; 0 .. TMJDF1.MFOHUI) \
SFTVMUT _= GVOD(TMJDF1<J>, TMJDF2<J>);
^
SFUVSO SFTVMUT;
^
0DI>@ OC@ GVODUJPO K<M<H@O@M <=JQ@ O<F@N ORJ K<M<H@O@MN, G<H=?<N OC<O ><I =@ K<NN@? OJ
CJOBSZ"MHPSJUIN() HPNO O<F@ ORJ K<M<H@O@MN <N R@GG:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
XSJUFMO(CJOBSZ"MHPSJUIN((B, C) => (B * 10) + C,
< 1, 2, 3 >,
< 4, 5, 6 >));
^
FG@5F;A@ &A;@F7DE, D7>793F7E, 3@6 "3?463E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
477
1C@ JPOKPO >JIO<DIN O@I ODH@N OC@ @G@H@ION JA OC@ ADMNO <MM<T KGPN OC@ @G@H@ION JA OC@ N@>JI?
<MM<T (@.B. 14 DN 10 * 1 + 4):
<14, 25, 36>
Delegates
73.3
A ?@G@B<O@ DN < >JH=DI<ODJI JA < API>ODJI KJDIO@M <I? OC@ >JIO@SO OC<O DO NCJPG? =@ @S@>PO@?
DI. !@G@B<O@N <GNJ NPKKJMO 5>AEGD7E DI !. GJNPM@N <M@ < A@<OPM@ NPKKJMO@? =T H<IT API>ODJI<G
KMJBM<HHDIB G<IBP<B@N.
AN R@ C<Q@ N@@I DI OC@ )DA@ODH@N <I? #PI?<H@IO<G ,K@M<ODJIN >C<KO@M, OC@ GDA@ODH@ JA <
Q<MD<=G@ @I?N PKJI G@<QDIB OC@ N>JK@ OC<O DO DN ?@ADI@? DI:
\
JOU JODSFNFOU = 10;
// ...
^ // j UIF MJGF PG 'JODSFNFOU' FOET IFSF
1C<O DN RCT OC@ <??M@NN JA NP>C < GJ><G Q<MD<=G@ ><IIJO =@ M@OPMI@? AMJH < API>ODJI.
)@O'N DH<BDI@ OC<O JODSFNFOU DN < GJ><G Q<MD<=G@ JA < API>ODJI OC<O DON@GA M@OPMIN < GVODUJPO.
)@O'N H<F@ DO NJ OC<O OC@ M@OPMI@? G<H=?< C<KK@IN OJ PN@ OC<O GJ><G Q<MD<=G@:
BMJBT $BMDVMBUPS = JOU GVODUJPO(JOU);
$BMDVMBUPS NBLF$BMDVMBUPS()
\
JOU JODSFNFOU = 10;
SFUVSO WBMVF => JODSFNFOU + WBMVF; // j DPNQJMBUJPO &3303
^
1C<O >J?@ DN DI @MMJM =@><PN@ OC@ M@OPMI@? G<H=?< H<F@N PN@ JA < GJ><G Q<MD<=G@ OC<O DN <=JPO
OJ BJ JPO JA N>JK@. &A OC@ >J?@ R@M@ <GGJR@? OJ >JHKDG@, OC@ G<H=?< RJPG? =@ OMTDIB OJ <>>@NN
JODSFNFOU, RCJN@ GDA@ C<N <GM@<?T @I?@?.
#JM OC<O >J?@ OJ =@ >JHKDG@? <I? RJMF >JMM@>OGT, OC@ GDA@ODH@ JA JODSFNFOU HPNO <O G@<NO =@
<N GJIB <N OC@ GDA@ODH@ JA OC@ G<H=?< OC<O PN@N DO. !@G@B<O@N @SO@I? OC@ GDA@ODH@ JA OC@ >JIO@SO
JA < G<H=?< NJ OC<O OC@ GJ><G NO<O@ OC<O OC@ API>ODJI PN@N M@H<DIN Q<GD?.
EFMFHBUF NTIO<S DN NDHDG<M OJ GVODUJPO NTIO<S, OC@ JIGT ?DAA@M@I>@ =@DIB OC@ F@TRJM?. 1C<O
>C<IB@ DN NPAAD>D@IO OJ H<F@ OC@ KM@QDJPN >J?@ >JHKDG@:
BMJBT $BMDVMBUPS = JOU EFMFHBUF(JOU);
$BMDVMBUPS NBLF$BMDVMBUPS()
\
JOU JODSFNFOU = 10;
SFUVSO WBMVF => JODSFNFOU + WBMVF;
^
%<QDIB =@@I PN@? =T < ?@G@B<O@, OC@ GJ><G Q<MD<=G@ JODSFNFOU RDGG IJR GDQ@ <N GJIB <N OC<O
?@G@B<O@ GDQ@N. 1C@ Q<MD<=G@ DN <Q<DG<=G@ OJ OC@ ?@G@B<O@ EPNO <N <IT JOC@M Q<MD<=G@ RJPG? =@,
HPO<=G@ <N I@@?@?. 4@ RDGG N@@ @S<HKG@N JA OCDN DI OC@ G<O@M >C<KO@M RC@I PNDIB ?@G@B<O@N
RDOC PQ"QQMZ() H@H=@M API>ODJIN.
1C@ AJGGJRDIB DN < O@NO JA OC@ ?@G@B<O@ <=JQ@:
FG@5F;A@ &A;@F7DE, D7>793F7E, 3@6 "3?463E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
478
BVUP DBMDVMBUPS = NBLF$BMDVMBUPS();
XSJUFMO("5IF SFTVMU PG UIF DBMDVMBUJPO: ", DBMDVMBUPS(3));
+JO@ OC<O NBLF$BMDVMBUPS() M@OPMIN <I <IJITHJPN ?@G@B<O@. 1C@ >J?@ <=JQ@ <NNDBIN OC<O
?@G@B<O@ OJ OC@ Q<MD<=G@ DBMDVMBUPS <I? OC@I ><GGN DO =T DBMDVMBUPS(3). 0DI>@ OC@ ?@G@B<O@
DN DHKG@H@IO@? OJ M@OPMI OC@ NPH JA DON K<M<H@O@M <I? OC@ Q<MD<=G@ JODSFNFOU, OC@ >J?@
JPOKPON OC@ NPH JA 3 <I? 10:
5IF SFTVMU PG UIF DBMDVMBUJPO: 13
Shorter syntax 73.3.1
AN R@ C<Q@ <GM@<?T PN@? DI OC@ KM@QDJPN @S<HKG@, ?@G@B<O@N ><I O<F@ <?Q<IO<B@ JA OC@
NCJMO@M NTIO<S@N <N R@GG. 4C@I I@DOC@M GVODUJPO IJM EFMFHBUF DN NK@>DAD@?, OC@ OTK@ JA OC@
G<H=?< DN ?@>D?@? =T OC@ >JHKDG@M, ?@K@I?DIB JI RC@OC@M OC@ G<H=?< <>>@NN@N GJ><G NO<O@. &A
NJ, OC@I DO DN < EFMFHBUF.
1C@ AJGGJRDIB @S<HKG@ C<N < ?@G@B<O@ OC<O ?J@N IJO O<F@ <IT K<M<H@O@MN:
JOU<> EFMJNJUFE/VNCFST(JOU DPVOU, JOU EFMFHBUF() OVNCFS(FOFSBUPS)
\
JOU<> SFTVMU = < -1 >;
SFTVMU.SFTFSWF(DPVOU + 2);
GPSFBDI (J; 0 .. DPVOU) \
SFTVMU _= OVNCFS(FOFSBUPS();
^
SFTVMU _= -1;
SFUVSO SFTVMU;
^
1C@ API>ODJI EFMJNJUFE/VNCFST() B@I@M<O@N < NGD>@ RC@M@ OC@ ADMNO <I? G<NO @G@H@ION <M@ -1.
&O O<F@N ORJ K<M<H@O@MN OC<O NK@>DAT OC@ JOC@M @G@H@ION OC<O >JH@ =@OR@@I OCJN@ ADMNO <I?
G<NO @G@H@ION.
)@O'N ><GG OC<O API>ODJI RDOC < OMDQD<G ?@G@B<O@ OC<O <GR<TN M@OPMIN OC@ N<H@ Q<GP@. /@H@H=@M
OC<O RC@I OC@M@ DN IJ K<M<H@O@M, OC@ K<M<H@O@M GDNO JA < G<H=?< HPNO =@ NK@>DAD@? <N @HKOT:
XSJUFMO(EFMJNJUFE/VNCFST(3, () => 42));
1C@ JPOKPO:
-1 42 42 42 -1
)@O'N ><GG EFMJNJUFE/VNCFST() OCDN ODH@ RDOC < ?@G@B<O@ OC<O H<F@N PN@ JA < GJ><G Q<MD<=G@:
JOU MBTU/VNCFS;
XSJUFMO(EFMJNJUFE/VNCFST(15, () => MBTU/VNCFS += VOJGPSN(0, 3)));
XSJUFMO("-BTU OVNCFS: ", MBTU/VNCFS);
AGOCJPBC OC<O ?@G@B<O@ KMJ?P>@N < M<I?JH Q<GP@, NDI>@ OC@ Q<GP@ DN <??@? OJ OC@ G<NO JI@,
IJI@ JA OC@ B@I@M<O@? Q<GP@N DN G@NN OC<I DON KM@?@>@NNJM:
-1 0 2 3 4 6 6 8 9 9 9 10 12 14 15 17 -1
-BTU OVNCFS: 17
FG@5F;A@ &A;@F7DE, D7>793F7E, 3@6 "3?463E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
479
An object and a member function as a delegate 73.3.2
4@ C<Q@ N@@I OC<O < ?@G@B<O@ DN IJOCDIB =PO < API>ODJI KJDIO@M <I? OC@ >JIO@SO OC<O DO DN OJ =@
@S@>PO@? DI. &INO@<? JA OCJN@ ORJ, < ?@G@B<O@ ><I <GNJ =@ >JHKJN@? JA < H@H=@M API>ODJI <I?
<I @SDNODIB J=E@>O OC<O OC<O H@H=@M API>ODJI DN OJ =@ ><GG@? JI.
1C@ NTIO<S OC<O ?@ADI@N NP>C < ?@G@B<O@ AMJH <I J=E@>O DN OC@ AJGGJRDIB:
&object.member_function
)@O'N ADMNO J=N@MQ@ OC<O NP>C < NTIO<S DI?@@? ?@ADI@N < EFMFHBUF =T KMDIODIB DON TUSJOH
M@KM@N@IO<ODJI:
JNQPSU TUE.TUEJP;
TUSVDU -PDBUJPO
\
MPOH Y;
MPOH Z;
WPJE NPWF)PSJ[POUBMMZ(MPOH TUFQ) \ Y += TUFQ; ^
WPJE NPWF7FSUJDBMMZ(MPOH TUFQ) \ Z += TUFQ; ^
^
WPJE NBJO()
\
BVUP MPDBUJPO = -PDBUJPO();
XSJUFMO(UZQFPG(&MPDBUJPO.NPWF)PSJ[POUBMMZ).TUSJOHPG);
^
A>>JM?DIB OJ OC@ JPOKPO, OC@ OTK@ JA NPWF)PSJ[POUBMMZ() ><GG@? JI MPDBUJPO DN DI?@@? <
EFMFHBUF:
WPJE EFMFHBUF(MPOH TUFQ)
+JO@ OC<O OC@ & NTIO<S DN JIGT AJM >JINOMP>ODIB OC@ ?@G@B<O@. 1C@ ?@G@B<O@ RDGG =@ ><GG@? G<O@M
=T OC@ API>ODJI ><GG NTIO<S:
// 5IF EFGJOJUJPO PG UIF EFMFHBUF WBSJBCMF:
BVUP EJSFDUJPO'VODUJPO = &MPDBUJPO.NPWF)PSJ[POUBMMZ;
// $BMMJOH UIF EFMFHBUF CZ UIF GVODUJPO DBMM TZOUBY:
EJSFDUJPO'VODUJPO(3);
XSJUFMO(MPDBUJPO);
0DI>@ OC@ EFMFHBUF >JH=DI@N OC@ MPDBUJPO J=E@>O <I? OC@ NPWF)PSJ[POUBMMZ() H@H=@M
API>ODJI, ><GGDIB OC@ ?@G@B<O@ DN OC@ @LPDQ<G@IO JA ><GGDIB NPWF)PSJ[POUBMMZ() JI MPDBUJPO.
1C@ JPOKPO DI?D><O@N OC<O OC@ J=E@>O C<N DI?@@? HJQ@? 3 NO@KN CJMDUJIO<GGT:
-PDBUJPO(3, 0)
#PI>ODJI KJDIO@MN, G<H=?<N, <I? ?@G@B<O@N <M@ @SKM@NNDJIN. 1C@T ><I =@ PN@? DI KG<>@N RC@M@
< Q<GP@ JA OC@DM OTK@ DN @SK@>O@?. #JM @S<HKG@, < NGD>@ JA EFMFHBUF J=E@>ON DN DIDOD<GDU@? =@GJR
AMJH ?@G@B<O@N >JINOMP>O@? AMJH <I J=E@>O <I? Q<MDJPN H@H=@M API>ODJIN. 1C@ EFMFHBUF
@G@H@ION JA OC@ NGD>@ <M@ G<O@M ><GG@? EPNO GDF@ API>ODJIN:
BVUP MPDBUJPO = -PDBUJPO();
WPJE EFMFHBUF(MPOH)<> NPWFNFOUT =
FG@5F;A@ &A;@F7DE, D7>793F7E, 3@6 "3?463E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
480
< &MPDBUJPO.NPWF)PSJ[POUBMMZ,
&MPDBUJPO.NPWF7FSUJDBMMZ,
&MPDBUJPO.NPWF)PSJ[POUBMMZ >;
GPSFBDI (NPWFNFOU; NPWFNFOUT) \
NPWFNFOU(1);
^
XSJUFMO(MPDBUJPO);
A>>JM?DIB OJ OC@ @G@H@ION JA OC@ NGD>@, OC@ GJ><ODJI C<N =@@I >C<IB@? ORD>@ CJMDUJIO<GGT <I?
JI>@ Q@MOD><GGT:
-PDBUJPO(2, 1)
UP4USJOH() with a EFMFHBUF parameter
73.4
4@ C<Q@ ?@ADI@? H<IT UP4USJOH() API>ODJIN PK OJ OCDN KJDIO DI OC@ =JJF OJ M@KM@N@IO J=E@>ON
<N NOMDIBN. 1CJN@ UP4USJOH() ?@ADIDODJIN <GG M@OPMI@? < TUSJOH RDOCJPO O<FDIB <IT
K<M<H@O@MN. AN IJO@? =T OC@ >JHH@IO GDI@N =@GJR, NOMP>ON <I? >G<NN@N OJJF <?Q<IO<B@ JA
UP4USJOH() API>ODJIN JA OC@DM M@NK@>ODQ@ H@H=@MN =T NDHKGT K<NNDIB OCJN@ H@H=@MN OJ
GPSNBU():
JNQPSU TUE.TUEJP;
JNQPSU TUE.TUSJOH;
TUSVDU 1PJOU
\
JOU Y;
JOU Z;
TUSJOH UP4USJOH() DPOTU
\
SFUVSO GPSNBU("(%T,%T)", Y, Z);
^
^
TUSVDU $PMPS
\
VCZUF S;
VCZUF H;
VCZUF C;
TUSJOH UP4USJOH() DPOTU
\
SFUVSO GPSNBU("3(#:%T,%T,%T", S, H, C);
^
^
TUSVDU $PMPSFE1PJOU
\
$PMPS DPMPS;
1PJOU QPJOU;
TUSJOH UP4USJOH() DPOTU
\
// 5BLJOH BEWBOUBHF PG $PMPS.UP4USJOH BOE 1PJOU.UP4USJOH:
SFUVSO GPSNBU("\%T;%T^", DPMPS, QPJOU);
^
^
TUSVDU 1PMZHPO
\
$PMPSFE1PJOU<> QPJOUT;
FG@5F;A@ &A;@F7DE, D7>793F7E, 3@6 "3?463E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
481
TUSJOH UP4USJOH() DPOTU
\
// 5BLJOH BEWBOUBHF PG $PMPSFE1PJOU.UP4USJOH:
SFUVSO GPSNBU("%T", QPJOUT);
^
^
WPJE NBJO()
\
BVUP QPMZHPO = 1PMZHPO(
< $PMPSFE1PJOU($PMPS(10, 10, 10), 1PJOU(1, 1)),
$PMPSFE1PJOU($PMPS(20, 20, 20), 1PJOU(2, 2)),
$PMPSFE1PJOU($PMPS(30, 30, 30), 1PJOU(3, 3)) >);
XSJUFMO(QPMZHPO);
^
&I JM?@M AJM QPMZHPO OJ =@ N@IO OJ OC@ JPOKPO <N < TUSJOH JI OC@ G<NO GDI@ JA OC@ KMJBM<H, <GG
JA OC@ UP4USJOH() API>ODJIN JA 1PMZHPO, $PMPSFE1PJOU, $PMPS, <I? 1PJOU <M@ ><GG@?
DI?DM@>OGT, >M@<ODIB < OJO<G JA 10 NOMDIBN DI OC@ KMJ>@NN. +JO@ OC<O OC@ NOMDIBN OC<O <M@
>JINOMP>O@? <I? M@OPMI@? =T OC@ GJR@M-G@Q@G API>ODJIN <M@ PN@? JIGT JI>@ =T OC@ M@NK@>ODQ@
CDBC@M-G@Q@G API>ODJI OC<O ><GG@? OC@H.
%JR@Q@M, <GOCJPBC < OJO<G JA 10 NOMDIBN B@O >JINOMP>O@?, JIGT OC@ Q@MT G<NO JI@ DN KMDIO@? OJ
OC@ JPOKPO:
<\3(#:10,10,10;(1,1)^, \3(#:20,20,20;(2,2)^, \3(#:30,30,30;(3,3)^>
%JR@Q@M KM<>OD><G, OCDN H@OCJ? H<T ?@BM<?@ OC@ K@MAJMH<I>@ JA OC@ KMJBM<H =@><PN@ JA OC@
H<IT TUSJOH J=E@>ON OC<O <M@ >JINOMP>O@? <I? KMJHKOGT OCMJRI <R<T.
AI JQ@MGJ<? JA UP4USJOH() <QJD?N OCDN K@MAJMH<I>@ DNNP@ =T O<FDIB < EFMFHBUF K<M<H@O@M:
WPJE UP4USJOH(WPJE EFMFHBUF(DPOTU(DIBS)<>) TJOL) DPOTU;
AN N@@I DI DON ?@>G<M<ODJI, OCDN JQ@MGJ<? JA UP4USJOH() ?J@N IJO M@OPMI < TUSJOH. &INO@<?, OC@
>C<M<>O@MN OC<O <M@ BJDIB OJ =@ KMDIO@? <M@ K<NN@? OJ DON EFMFHBUF K<M<H@O@M. &O DN OC@
M@NKJIND=DGDOT JA OC@ EFMFHBUF OJ <KK@I? OCJN@ >C<M<>O@MN OJ OC@ NDIBG@ TUSJOH OC<O DN BJDIB
OJ =@ KMDIO@? OJ OC@ JPOKPO.
$AF7: 6?6 2.063, F:7 5A?B;>7D F:3F ! :3H7 GE76 I:;>7 ID;F;@9 F:;E 5:3BF7D 6A7E @AF EGBBADF
F:;E AH7D>A36 8AD 5>3EE7E.
AGG OC@ KMJBM<HH@M I@@?N OJ ?J ?DAA@M@IOGT DN OJ ><GG TUE.GPSNBU.GPSNBUUFE8SJUF DINO@<? JA
TUE.TUSJOH.GPSNBU <I? K<NN OC@ EFMFHBUF K<M<H@O@M <N DON ADMNO K<M<H@O@M:
JNQPSU TUE.TUEJP;
JNQPSU TUE.GPSNBU;
TUSVDU 1PJOU
\
JOU Y;
JOU Z;
WPJE UP4USJOH(WPJE EFMFHBUF(DPOTU(DIBS)<>) TJOL) DPOTU
\
GPSNBUUFE8SJUF(TJOL, "(%T,%T)", Y, Z);
^
^
TUSVDU $PMPS
\
VCZUF S;
FG@5F;A@ &A;@F7DE, D7>793F7E, 3@6 "3?463E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
482
VCZUF H;
VCZUF C;
WPJE UP4USJOH(WPJE EFMFHBUF(DPOTU(DIBS)<>) TJOL) DPOTU
\
GPSNBUUFE8SJUF(TJOL, "3(#:%T,%T,%T", S, H, C);
^
^
TUSVDU $PMPSFE1PJOU
\
$PMPS DPMPS;
1PJOU QPJOU;
WPJE UP4USJOH(WPJE EFMFHBUF(DPOTU(DIBS)<>) TJOL) DPOTU
\
GPSNBUUFE8SJUF(TJOL, "\%T;%T^", DPMPS, QPJOU);
^
^
TUSVDU 1PMZHPO
\
$PMPSFE1PJOU<> QPJOUT;
WPJE UP4USJOH(WPJE EFMFHBUF(DPOTU(DIBS)<>) TJOL) DPOTU
\
GPSNBUUFE8SJUF(TJOL, "%T", QPJOUT);
^
^
WPJE NBJO()
\
BVUP QPMZHPO = 1PMZHPO(
< $PMPSFE1PJOU($PMPS(10, 10, 10), 1PJOU(1, 1)),
$PMPSFE1PJOU($PMPS(20, 20, 20), 1PJOU(2, 2)),
$PMPSFE1PJOU($PMPS(30, 30, 30), 1PJOU(3, 3)) >);
XSJUFMO(QPMZHPO);
^
1C@ <?Q<IO<B@ JA OCDN KMJBM<H DN OC<O, @Q@I OCJPBC OC@M@ <M@ NODGG < OJO<G JA 10 ><GGN H<?@ OJ
Q<MDJPN UP4USJOH() API>ODJIN, OCJN@ ><GGN >JGG@>ODQ@GT KMJ?P>@ < NDIBG@ TUSJOH, IJO 10.
Summary
73.5
t 1C@ GVODUJPO F@TRJM? DN AJM ?@ADIDIB API>ODJI KJDIO@MN OJ =@ ><GG@? G<O@M EPNO GDF@ <
API>ODJI.
t 1C@ EFMFHBUF F@TRJM? DN AJM ?@ADIDIB ?@G@B<O@N. A ?@G@B<O@ DN OC@ K<DM JA < API>ODJI
KJDIO@M <I? OC@ >JIO@SO OC<O OC<O API>ODJI KJDIO@M OJ =@ @S@>PO@? DI.
t A EFMFHBUF ><I <GNJ =@ >M@<O@? AMJH <I J=E@>O <I? < H@H=@M API>ODJI =T OC@ NTIO<S
&PCKFDU.NFNCFS@GVODUJPO.
t AIJITHJPN API>ODJIN <I? <IJITHJPN ?@G@B<O@N (G<H=?<N) ><I =@ PN@? DI KG<>@N JA
API>ODJI KJDIO@MN <I? ?@G@B<O@N DI @SKM@NNDJIN.
t 1C@M@ <M@ N@Q@M<G NTIO<S@N AJM G<H=?<N, OC@ NCJMO@NO JA RCD>C DN AJM RC@I OC@ @LPDQ<G@IO
>JINDNON JIGT JA < NDIBG@ SFUVSO NO<O@H@IO: QBSBNFUFS => FYQSFTTJPO.
t A HJM@ @AAD>D@IO JQ@MGJ<? JA UP4USJOH() O<F@N < EFMFHBUF.
FG@5F;A@ &A;@F7DE, D7>793F7E, 3@6 "3?463E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
483
GPSFBDI with Structs and Classes 74
AN TJP M@H@H=@M AMJH OC@ GPSFBDI )JJK >C<KO@M, =JOC CJR GPSFBDI RJMFN <I? OC@ OTK@N
<I? IPH=@MN JA GJJK Q<MD<=G@N OC<O DO NPKKJMON ?@K@I? JI OC@ FDI? JA >JGG@>ODJI: #JM NGD>@N,
GPSFBDI KMJQD?@N <>>@NN OJ @G@H@ION RDOC JM RDOCJPO < >JPIO@M; AJM <NNJ>D<ODQ@ <MM<TN, OJ
Q<GP@N RDOC JM RDOCJPO F@TN; AJM IPH=@M M<IB@N, OJ OC@ DI?DQD?P<G Q<GP@N. #JM GD=M<MT OTK@N,
GPSFBDI =@C<Q@N DI < R<T OC<O DN NK@>DAD> OJ OC<O OTK@; @.B. AJM 'JMF, DO KMJQD?@N OC@ GDI@N JA <
ADG@.
&O DN KJNND=G@ OJ ?@ADI@ OC@ =@C<QDJM JA GPSFBDI AJM PN@M-?@ADI@? OTK@N <N R@GG. 1C@M@ <M@ ORJ
H@OCJ?N JA KMJQD?DIB OCDN NPKKJMO:
t !@ADIDIB D3@97 ?7?47D 8G@5F;A@E, RCD>C <GGJRN PNDIB OC@ PN@M-?@ADI@? OTK@ RDOC JOC@M
M<IB@ <GBJMDOCHN <N R@GG
t !@ADIDIB JI@ JM HJM@ PQ"QQMZ H@H=@M API>ODJIN
,A OC@ ORJ H@OCJ?N, PQ"QQMZ C<N KMDJMDOT: &A DO DN ?@ADI@?, OC@ >JHKDG@M PN@N PQ"QQMZ,
JOC@MRDN@ DO >JIND?@MN OC@ M<IB@ H@H=@M API>ODJIN. %JR@Q@M, DI HJNO ><N@N M<IB@ H@H=@M
API>ODJIN <M@ NPAAD>D@IO, @<ND@M, <I? HJM@ PN@APG.
GPSFBDI I@@? IJO =@ NPKKJMO@? AJM @Q@MT OTK@. &O@M<ODIB JQ@M <I J=E@>O H<F@N N@IN@ JIGT DA
OC<O J=E@>O ?@ADI@N OC@ >JI>@KO JA 3 5A>>75F;A@.
#JM @S<HKG@, DO H<T IJO =@ >G@<M RC<O @G@H@ION NCJPG? GPSFBDI KMJQD?@ RC@I DO@M<ODIB JQ@M
< >G<NN OC<O M@KM@N@ION < NOP?@IO, NJ OC@ >G<NN =@OO@M IJO NPKKJMO GPSFBDI <O <GG. ,I OC@ JOC@M
C<I?, < ?@NDBI H<T M@LPDM@ OC<O 4UVEFOU DN < >JGG@>ODJI JA BM<?@N <I? GPSFBDI H<T KMJQD?@
DI?DQD?P<G BM<?@N JA OC@ NOP?@IO.
&O ?@K@I?N JI OC@ ?@NDBI JA OC@ KMJBM<H RC<O OTK@N NCJPG? KMJQD?@ OCDN NPKKJMO <I? CJR.
GPSFBDI support by range member functions
74.1
4@ FIJR OC<O GPSFBDI DN Q@MT NDHDG<M OJ GPS, @S>@KO OC<O DO DN HJM@ PN@APG <I? N<A@M OC<I GPS.
JIND?@M OC@ AJGGJRDIB GJJK:
GPSFBDI (FMFNFOU; NZ0CKFDU) \
// ... FYQSFTTJPOT ...
^
B@CDI? OC@ N>@I@N, OC@ >JHKDG@M M@RMDO@N OC<O GPSFBDI GJJK <N < GPS GJJK, MJPBCGT <I
@LPDQ<G@IO JA OC@ AJGGJRDIB JI@:
GPS ( ; /* XIJMF OPU EPOF */; /* TLJQ UIF GSPOU FMFNFOU */) \
BVUP FMFNFOU = /* UIF GSPOU FMFNFOU */;
// ... FYQSFTTJPOT ...
^
2N@M-?@ADI@? OTK@N OC<O I@@? OJ NPKKJMO GPSFBDI ><I KMJQD?@ OCM@@ H@H=@M API>ODJIN OC<O
>JMM@NKJI? OJ OC@ OCM@@ N@>ODJIN JA OC@ KM@QDJPN >J?@: ?@O@MHDIDIB RC@OC@M OC@ GJJK DN JQ@M,
NFDKKDIB OC@ AMJIO @G@H@IO, <I? KMJQD?DIB <>>@NN OJ OC@ AMJIO @G@H@IO.
1CJN@ OCM@@ H@H=@M API>ODJIN HPNO =@ I<H@? <N FNQUZ, QPQ'SPOU, <I? GSPOU, M@NK@>ODQ@GT.
1C@ >J?@ OC<O DN B@I@M<O@? =T OC@ >JHKDG@M ><GGN OCJN@ API>ODJIN:
8AD735: I;F: (FDG5FE 3@6 C>3EE7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
484
GPS ( ; !NZ0CKFDU.FNQUZ(); NZ0CKFDU.QPQ'SPOU()) \
BVUP FMFNFOU = NZ0CKFDU.GSPOU();
// ... FYQSFTTJPOT ...
^
1C@N@ OCM@@ API>ODJIN HPNO RJMF <>>JM?DIB OJ OC@ AJGGJRDIB @SK@>O<ODJIN:
t .FNQUZ() HPNO M@OPMI USVF DA OC@ GJJK DN JQ@M, GBMTF JOC@MRDN@
t .QPQ'SPOU() HPNO HJQ@ OJ OC@ I@SO @G@H@IO (DI JOC@M RJM?N, NFDK OC@ AMJIO @G@H@IO)
t .GSPOU() HPNO M@OPMI OC@ AMJIO @G@H@IO
AIT OTK@ OC<O ?@ADI@N OCJN@ H@H=@M API>ODJIN ><I =@ PN@? RDOC GPSFBDI.
Example 74.1.1
)@O'N ?@ADI@ < TUSVDU OC<O KMJ?P>@N IPH=@MN RDOCDI < >@MO<DI M<IB@. &I JM?@M OJ =@ >JINDNO@IO
RDOC !'N IPH=@M M<IB@N <I? NGD>@ DI?@S@N, G@O'N C<Q@ OC@ G<NO IPH=@M =@ JPOND?@ JA OC@ Q<GD?
IPH=@MN. 2I?@M OC@N@ M@LPDM@H@ION, OC@ AJGGJRDIB TUSVDU RJPG? RJMF @S<>OGT GDF@ !'N
IPH=@M M<IB@N:
TUSVDU /VNCFS3BOHF
\
JOU CFHJO;
JOU FOE;
JOWBSJBOU()
\
// 5IFSF JT B CVH JG CFHJO JT HSFBUFS UIBO FOE
BTTFSU(CFHJO <= FOE);
^
CPPM FNQUZ() DPOTU
\
// 5IF SBOHF JT DPOTVNFE XIFO CFHJO FRVBMT FOE
SFUVSO CFHJO == FOE;
^
WPJE QPQ'SPOU()
\
// 4LJQQJOH UIF GJSTU FMFNFOU JT BDIJFWFE CZ
// JODSFNFOUJOH UIF CFHJOOJOH PG UIF SBOHF
++CFHJO;
^
JOU GSPOU() DPOTU
\
// 5IF GSPOU FMFNFOU JT UIF POF BU UIF CFHJOOJOH
SFUVSO CFHJO;
^
^
Note: ):7 E387FK A8 F:3F ;?B>7?7@F3F;A@ 67B7@6E EA>7>K A@ 3 E;@9>7 invariant 4>A5=.
A66;F;A@3> 5:75=E 5AG>6 47 36676 FA front 3@6 popFront FA 7@EGD7 F:3F F:AE7 8G@5F;A@E 3D7
@7H7D 53>>76 I:7@ F:7 D3@97 ;E 7?BFK.
,=E@>ON JA OC<O TUSVDU ><I =@ PN@? RDOC GPSFBDI:
GPSFBDI (FMFNFOU; /VNCFS3BOHF(3, 7)) \
XSJUF(FMFNFOU, ' ');
^
8AD735: I;F: (FDG5FE 3@6 C>3EE7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
485
GPSFBDI PN@N OCJN@ OCM@@ API>ODJIN =@CDI? OC@ N>@I@N <I? DO@M<O@N PIODG FNQUZ() M@OPMIN
USVF:
3 4 5 6
TUE.SBOHF.SFUSP to iterate in reverse 74.1.2
1C@ TUE.SBOHF HJ?PG@ >JIO<DIN H<IT M<IB@ <GBJMDOCHN. SFUSP DN JI@ JA OCJN@ <GBJMDOCHN,
RCD>C DO@M<O@N < M<IB@ DI M@Q@MN@ JM?@M. &O M@LPDM@N ORJ <??DODJI<G M<IB@ H@H=@M API>ODJIN:
t .QPQ#BDL() HPNO HJQ@ OJ OC@ @G@H@IO OC<O DN JI@ =@AJM@ OC@ @I? (NFDKN OC@ G<NO @G@H@IO)
t .CBDL() HPNO M@OPMI OC@ G<NO @G@H@IO
%JR@Q@M, <GOCJPBC IJO ?DM@>OGT M@G<O@? OJ M@Q@MN@ DO@M<ODJI, AJM SFUSP OJ >JIND?@M OCJN@
API>ODJIN <O <GG, OC@M@ HPNO =@ JI@ HJM@ API>ODJI ?@ADI@?:
t .TBWF() HPNO M@OPMI < >JKT JA OCDN J=E@>O
4@ RDGG G@<MI HJM@ <=JPO OC@N@ H@H=@M API>ODJIN G<O@M DI OC@ /<IB@N >C<KO@M.
1C@N@ OCM@@ <??DODJI<G H@H=@M API>ODJIN ><I OMDQD<GGT =@ ?@ADI@? AJM /VNCFS3BOHF:
TUSVDU /VNCFS3BOHF
\
// ...
WPJE QPQ#BDL()
\
// 4LJQQJOH UIF MBTU FMFNFOU JT BDIJFWFE CZ
// EFDSFNFOUJOH UIF FOE PG UIF SBOHF.
--FOE;
^
JOU CBDL() DPOTU
\
// "T UIF 'FOE' WBMVF JT PVUTJEF PG UIF SBOHF, UIF
// MBTU FMFNFOU JT POF MFTT UIBO UIBU
SFUVSO FOE - 1;
^
/VNCFS3BOHF TBWF() DPOTU !QSPQFSUZ
\
// 3FUVSOJOH B DPQZ PG UIJT TUSVDU PCKFDU
SFUVSO UIJT;
^
^
,=E@>ON JA OCDN OTK@ ><I IJR =@ PN@? RDOC SFUSP:
JNQPSU TUE.SBOHF;
// ...
GPSFBDI (FMFNFOU; /VNCFS3BOHF(3, 7).SFUSP) \
XSJUF(FMFNFOU, ' ');
^
1C@ JPOKPO JA OC@ KMJBM<H DN IJR DI M@Q@MN@:
6 5 4 3
8AD735: I;F: (FDG5FE 3@6 C>3EE7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
486
GPSFBDI support by the PQ"QQMZ member functions
74.2
1C@ H@H=@M API>ODJIN <=JQ@ <GGJR PNDIB J=E@>ON <N M<IB@N. 1C<O H@OCJ? DN HJM@ NPDO<=G@
RC@I OC@M@ DN JIGT JI@ N@IND=G@ R<T JA DO@M<ODIB JQ@M < M<IB@. #JM @S<HKG@, DO RJPG? =@ @<NT
OJ KMJQD?@ <>>@NN OJ DI?DQD?P<G NOP?@ION JA < 4UVEFOUT OTK@.
,I OC@ JOC@M C<I?, NJH@ODH@N DO H<F@N HJM@ N@IN@ OJ DO@M<O@ JQ@M OC@ N<H@ J=E@>O DI
?DAA@M@IO R<TN. 4@ FIJR OCDN AMJH <NNJ>D<ODQ@ <MM<TN RC@M@ DO DN KJNND=G@ OJ <>>@NN @DOC@M JIGT
OJ OC@ Q<GP@N JM OJ =JOC OC@ F@TN <I? OC@ Q<GP@N:
TUSJOH<TUSJOH> EJDUJPOBSZ; // GSPN &OHMJTI UP 5VSLJTI
// ...
GPSFBDI (JO5VSLJTI; EJDUJPOBSZ) \
// ... POMZ WBMVFT ...
^
GPSFBDI (JO&OHMJTI, JO5VSLJTI; EJDUJPOBSZ) \
// ... LFZT BOE WBMVFT ...
^
PQ"QQMZ <GGJRN PNDIB PN@M-?@ADI@? OTK@N RDOC GPSFBDI DI Q<MDJPN <I? NJH@ODH@N HJM@
>JHKG@S R<TN. B@AJM@ G@<MIDIB CJR OJ ?@ADI@ PQ"QQMZ, R@ HPNO ADMNO PI?@MNO<I? CJR DO DN
><GG@? <POJH<OD><GGT =T GPSFBDI.
1C@ KMJBM<H @S@>PODJI <GO@MI<O@N =@OR@@I OC@ @SKM@NNDJIN DIND?@ OC@ GPSFBDI =GJ>F <I? OC@
@SKM@NNDJIN DIND?@ OC@ PQ"QQMZ() API>ODJI. #DMNO OC@ PQ"QQMZ() H@H=@M API>ODJI B@ON ><GG@?,
<I? OC@I PQ"QQMZ H<F@N <I @SKGD>DO ><GG OJ OC@ GPSFBDI =GJ>F. 1C@T <GO@MI<O@ DI OC<O R<T
PIODG OC@ GJJK @Q@IOP<GGT O@MHDI<O@N. 1CDN KMJ>@NN DN =<N@? JI < 5A@H7@F;A@, RCD>C & RDGG
@SKG<DI NJJI.
)@O'N ADMNO J=N@MQ@ OC@ NOMP>OPM@ JA OC@ GPSFBDI GJJK JI@ HJM@ ODH@:
// 5IF MPPQ UIBU JT XSJUUFO CZ UIF QSPHSBNNFS:
GPSFBDI (/* MPPQ WBSJBCMFT */; NZ0CKFDU) \
// ... FYQSFTTJPOT JOTJEF UIF GPSFBDI CMPDL ...
^
&A OC@M@ DN <I PQ"QQMZ() H@H=@M API>ODJI OC<O H<O>C@N OC@ GJJK Q<MD<=G@N, OC@I OC@ GPSFBDI
=GJ>F =@>JH@N < ?@G@B<O@, RCD>C DN OC@I K<NN@? OJ PQ"QQMZ().
A>>JM?DIBGT, OC@ GJJK <=JQ@ DN >JIQ@MO@? OJ OC@ AJGGJRDIB >J?@ =@CDI? OC@ N>@I@N. 1C@ >PMGT
=M<>F@ON OC<O ?@ADI@ OC@ =J?T JA OC@ ?@G@B<O@ <M@ CDBCGDBCO@?:
// 5IF DPEF UIBU UIF DPNQJMFS HFOFSBUFT CFIJOE UIF TDFOFT:
NZ0CKFDU.PQ"QQMZ(EFMFHBUF JOU(/* MPPQ WBSJBCMFT */) \
// ... FYQSFTTJPOT JOTJEF UIF GPSFBDI CMPDL ...
SFUVSO UFSNJOBUJPO$PEF;
^);
&I JOC@M RJM?N, OC@ GPSFBDI GJJK DN M@KG<>@? =T < EFMFHBUF OC<O DN K<NN@? OJ PQ"QQMZ().
B@AJM@ NCJRDIB <I @S<HKG@, C@M@ <M@ OC@ M@LPDM@H@ION <I? @SK@>O<ODJIN JA OCDN >JIQ@IODJI
OC<O PQ"QQMZ() HPNO J=N@MQ@:
1. 1C@ =J?T JA OC@ GPSFBDI GJJK =@>JH@N OC@ =J?T JA OC@ ?@G@B<O@. PQ"QQMZ HPNO ><GG OCDN
?@G@B<O@ AJM @<>C DO@M<ODJI.
8AD735: I;F: (FDG5FE 3@6 C>3EE7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
487
2. 1C@ GJJK Q<MD<=G@N =@>JH@ OC@ K<M<H@O@MN JA OC@ ?@G@B<O@. PQ"QQMZ() HPNO ?@ADI@ OC@N@
K<M<H@O@MN <N SFG.
3. 1C@ M@OPMI OTK@ JA OC@ ?@G@B<O@ DN JOU. A>>JM?DIBGT, OC@ >JHKDG@M DIE@>ON < SFUVSO
NO<O@H@IO <O OC@ @I? JA OC@ ?@G@B<O@, RCD>C ?@O@MHDI@N RC@OC@M OC@ GJJK C<N =@@I
O@MHDI<O@? =T < CSFBL NO<O@H@IO: &A OC@ M@OPMI Q<GP@ DN U@MJ, OC@ DO@M<ODJI HPNO >JIODIP@,
JOC@MRDN@ DO HPNO O@MHDI<O@.
4. 1C@ <>OP<G DO@M<ODJI C<KK@IN DIND?@ PQ"QQMZ().
5. PQ"QQMZ() HPNO M@OPMI OC@ N<H@ Q<GP@ OC<O DN M@OPMI@? =T OC@ ?@G@B<O@.
1C@ AJGGJRDIB DN < ?@ADIDODJI JA /VNCFS3BOHF OC<O DN DHKG@H@IO@? <>>JM?DIB OJ OCDN
>JIQ@IODJI:
TUSVDU /VNCFS3BOHF
\
JOU CFHJO;
JOU FOE;
// (2) (1)
JOU PQ"QQMZ(JOU EFMFHBUF(SFG JOU) PQFSBUJPOT) DPOTU
\
JOU SFTVMU = 0;
GPS (JOU OVNCFS = CFHJO; OVNCFS != FOE; ++OVNCFS) \ // (4)
SFTVMU = PQFSBUJPOT(OVNCFS); // (1)
JG (SFTVMU) \
CSFBL; // (3)
^
^
SFUVSO SFTVMU; // (5)
^
^
1CDN ?@ADIDODJI JA /VNCFS3BOHF ><I =@ PN@? RDOC GPSFBDI DI @S<>OGT OC@ N<H@ R<T <N =@AJM@:
GPSFBDI (FMFNFOU; /VNCFS3BOHF(3, 7)) \
XSJUF(FMFNFOU, ' ');
^
1C@ JPOKPO DN OC@ N<H@ <N OC@ JI@ KMJ?P>@? =T M<IB@ H@H=@M API>ODJIN:
3 4 5 6
Overloading PQ"QQMZ to iterate in different ways 74.2.1
&O DN KJNND=G@ OJ DO@M<O@ JQ@M OC@ N<H@ J=E@>O DI ?DAA@M@IO R<TN =T ?@ADIDIB JQ@MGJ<?N JA
PQ"QQMZ() OC<O O<F@ ?DAA@M@IO OTK@N JA ?@G@B<O@N. 1C@ >JHKDG@M ><GGN OC@ JQ@MGJ<? OC<O
H<O>C@N OC@ K<MOD>PG<M N@O JA GJJK Q<MD<=G@N.
AN <I @S<HKG@, G@O'N H<F@ DO KJNND=G@ OJ DO@M<O@ JQ@M /VNCFS3BOHF =T ORJ GJJK Q<MD<=G@N <N
R@GG:
GPSFBDI (GJSTU, TFDPOE; /VNCFS3BOHF(0, 15)) \
XSJUFG("%T,%T ", GJSTU, TFDPOE);
^
+JO@ CJR DO DN NDHDG<M OJ OC@ R<T <NNJ>D<ODQ@ <MM<TN <M@ DO@M<O@? JQ@M =T =JOC F@TN <I? Q<GP@N.
8AD735: I;F: (FDG5FE 3@6 C>3EE7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
488
#JM OCDN @S<HKG@, G@O'N M@LPDM@ OC<O RC@I < /VNCFS3BOHF J=E@>O DN DO@M<O@? =T ORJ Q<MD<=G@N, DO
NCJPG? KMJQD?@ ORJ >JIN@>PODQ@ Q<GP@N <I? OC<O DO <M=DOM<MDGT DI>M@H@ION OC@ Q<GP@N =T 5. 0J,
OC@ GJJK <=JQ@ NCJPG? KMJ?P>@ OC@ AJGGJRDIB JPOKPO:
0,1 5,6 10,11
1CDN DN <>CD@Q@? =T <I <??DODJI<G ?@ADIDODJI JA PQ"QQMZ() OC<O O<F@N < ?@G@B<O@, RCD>C O<F@N
ORJ K<M<H@O@MN. PQ"QQMZ() HPNO ><GG OC<O ?@G@B<O@ =T ORJ Q<GP@N:
JOU PQ"QQMZ(JOU EFMFHBUF(SFG JOU, SFG JOU) EH) DPOTU
\
JOU SFTVMU = 0;
GPS (JOU J = CFHJO; (J + 1) < FOE; J += 5) \
JOU GJSTU = J;
JOU TFDPOE = J + 1;
SFTVMU = EH(GJSTU, TFDPOE);
JG (SFTVMU) \
CSFBL;
^
^
SFUVSO SFTVMU;
^
4C@I OC@M@ <M@ ORJ GJJK Q<MD<=G@N, OCDN JQ@MGJ<? JA PQ"QQMZ() B@ON ><GG@?.
1C@M@ H<T =@ <N H<IT JQ@MGJ<?N JA PQ"QQMZ() <N I@@?@?.
&O DN KJNND=G@ <I? NJH@ODH@N I@>@NN<MT OJ BDQ@ CDION OJ OC@ >JHKDG@M JI RC<O JQ@MGJ<? OJ
>CJJN@. 1CDN DN ?JI@ =T NK@>DATDIB OTK@N JA OC@ GJJK Q<MD<=G@N @SKGD>DOGT.
#JM @S<HKG@, G@O'N <NNPH@ OC<O OC@M@ DN < 4DIPPM OTK@ OC<O NPKKJMON DO@M<ODIB JQ@M OC@
O@<>C@MN <I? OC@ NOP?@ION N@K<M<O@GT:
DMBTT 4DIPPM
\
JOU PQ"QQMZ(JOU EFMFHBUF(SFG 4UVEFOU) EH) DPOTU
\
// ...
^
JOU PQ"QQMZ(JOU EFMFHBUF(SFG 5FBDIFS) EH) DPOTU
\
// ...
^
^
1J DI?D><O@ OC@ ?@NDM@? JQ@MGJ<?, OC@ GJJK Q<MD<=G@ HPNO =@ NK@>DAD@?:
GPSFBDI (4UVEFOU TUVEFOU; TDIPPM) \
// ...
^
GPSFBDI (5FBDIFS UFBDIFS; TDIPPM) \
// ...
^
8AD735: I;F: (FDG5FE 3@6 C>3EE7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
489
Loop counter
74.3
1C@ >JIQ@ID@IO GJJK >JPIO@M JA NGD>@N DN IJO <POJH<OD> AJM JOC@M OTK@N. )JJK >JPIO@M ><I =@
<>CD@Q@? AJM PN@M-?@ADI@? OTK@N DI ?DAA@M@IO R<TN ?@K@I?DIB JI RC@OC@M OC@ GPSFBDI NPKKJMO
DN KMJQD?@? =T M<IB@ H@H=@M API>ODJIN JM =T PQ"QQMZ JQ@MGJ<?N.
&A GPSFBDI NPKKJMO DN KMJQD?@? =T M<IB@ H@H=@M API>ODJIN, OC@I < GJJK >JPIO@M ><I =@
<>CD@Q@? NDHKGT =T [JQ <I? TFRVFODF AMJH OC@ TUE.SBOHF HJ?PG@:
JNQPSU TUE.SBOHF;
// ...
GPSFBDI (J, FMFNFOU; [JQ(TFRVFODF!"O", /VNCFS3BOHF(42, 47))) \
XSJUFGMO("%T: %T", J, FMFNFOU);
^
TFRVFODF!"O" DN < M<IB@ OC<O KMJ?P>@N >JIN@>PODQ@ IPH=@MN NO<MODIB AMJH 0. [JQ DN < M<IB@
OC<O DO@M<O@N OCMJPBC OC@ M<IB@N OC<O <M@ BDQ@I OJ DO (TFRVFODF <I? /VNCFS3BOHF DI OCDN ><N@)
DI GJ>FNO@K, H<FDIB OC@ @G@H@ION JA OCJN@ M<IB@N <Q<DG<=G@ <O @<>C DO@M<ODJI <N GJJK Q<MD<=G@N:
0: 42
1: 43
2: 44
3: 45
4: 46
,I OC@ JOC@M C<I?, DA GPSFBDI NPKKJMO DN KMJQD?@? =T PQ"QQMZ(), OC@I OC@ GJJK >JPIO@M HPNO
=@ ?@ADI@? <N < N@K<M<O@ K<M<H@O@M JA OC@ ?@G@B<O@, NPDO<=GT <N OTK@ TJ[F@U. )@O'N N@@ OCDN JI
< TUSVDU OC<O M@KM@N@ION < >JGJM@? KJGTBJI:
FOVN $PMPS \ CMVF, HSFFO, SFE ^
TUSVDU 1PJOU
\
JOU Y;
JOU Z;
^
TUSVDU 1PMZHPO
\
$PMPS DPMPS;
1PJOU<> QPJOUT;
^
AN R@ C<Q@ <GM@<?T N@@I <=JQ@, <I PQ"QQMZ() OC<O KMJQD?@N <>>@NN OJ OC@ KJDION JA OCDN
KJGTBJI ><I =@ DHKG@H@IO@? I;F:AGF < >JPIO@M <N DI OC@ AJGGJRDIB >J?@:
JNQPSU TUE.TUEJP;
// ...
TUSVDU 1PMZHPO
\
// ...
JOU PQ"QQMZ(JOU EFMFHBUF(SFG DPOTU(1PJOU)) EH) DPOTU
\
JOU SFTVMU = 0;
GPSFBDI (QPJOU; QPJOUT) \
SFTVMU = EH(QPJOU);
8AD735: I;F: (FDG5FE 3@6 C>3EE7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
490
JG (SFTVMU) \
CSFBL;
^
^
SFUVSO SFTVMU;
^
^
WPJE NBJO()
\
BVUP QPMZHPO = 1PMZHPO($PMPS.CMVF,
< 1PJOU(0, 0), 1PJOU(1, 1) > );
GPSFBDI (QPJOU; QPMZHPO) \
XSJUFMO(QPJOU);
^
^
+JO@ OC<O OC@ PQ"QQMZ() DN DON@GA DHKG@H@IO@? =T < GPSFBDI GJJK. AN < M@NPGO, OC@ GPSFBDI
DIND?@ NBJO() @I?N PK H<FDIB DI?DM@>O PN@ JA < GPSFBDI JQ@M OC@ QPJOUT H@H=@M.
AGNJ IJO@ OC<O OC@ OTK@ JA OC@ ?@G@B<O@ K<M<H@O@M DN SFG DPOTU(1PJOU). 1CDN H@<IN OC<O OCDN
?@ADIDODJI JA PQ"QQMZ() ?J@N IJO <GGJR HJ?DATDIB OC@ 1PJOU @G@H@ION JA OC@ KJGTBJI. &I JM?@M
OJ <GGJR PN@M >J?@ OJ HJ?DAT OC@ @G@H@ION, =JOC OC@ PQ"QQMZ() API>ODJI DON@GA <I? OC@
?@G@B<O@ K<M<H@O@M HPNO =@ ?@ADI@? RDOCJPO OC@ DPOTU NK@>DAD@M.
1C@ JPOKPO:
DPOTU(1PJOU)(0, 0)
DPOTU(1PJOU)(1, 1)
+<OPM<GGT, OMTDIB OJ PN@ OCDN ?@ADIDODJI JA 1PMZHPO RDOC < GJJK >JPIO@M RJPG? ><PN@ <
>JHKDG<ODJI @MMJM:
GPSFBDI (J, QPJOU; QPMZHPO) \ // j DPNQJMBUJPO &3303
XSJUFGMO("%T: %T", J, QPJOU);
^
1C@ >JHKDG<ODJI @MMJM:
&SSPS: DBOOPU VOJRVFMZ JOGFS GPSFBDI BSHVNFOU UZQFT
#JM OC<O OJ RJMF, <IJOC@M PQ"QQMZ() JQ@MGJ<? OC<O NPKKJMON < >JPIO@M HPNO =@ ?@ADI@?:
JOU PQ"QQMZ(
JOU EFMFHBUF(SFG TJ[F@U, SFG DPOTU(1PJOU)) EH) DPOTU
\
JOU SFTVMU = 0;
GPSFBDI (J, QPJOU; QPJOUT) \
SFTVMU = EH(J, QPJOU);
JG (SFTVMU) \
CSFBL;
^
^
SFUVSO SFTVMU;
^
8AD735: I;F: (FDG5FE 3@6 C>3EE7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
491
1CDN ODH@ OC@ GPSFBDI Q<MD<=G@N <M@ H<O>C@? OJ OC@ I@R PQ"QQMZ() JQ@MGJ<? <I? OC@
KMJBM<H KMDION OC@ ?@NDM@? JPOKPO:
0: DPOTU(1PJOU)(0, 0)
1: DPOTU(1PJOU)(1, 1)
+JO@ OC<O OCDN DHKG@H@IO<ODJI JA PQ"QQMZ() O<F@N <?Q<IO<B@ JA OC@ <POJH<OD> >JPIO@M JQ@M
OC@ QPJOUT H@H=@M. (A>F:AG9: F:7 67>793F7 H3D;34>7 ;E 678;@76 3E ref size_t, F:7 foreach
>AAB ;@E;67 main() 53@@AF ?A6;8K F:7 5AG@F7D H3D;34>7 AH7D points).
4C@I I@@?@?, OC@ GJJK >JPIO@M ><I =@ ?@ADI@? <I? DI>M@H@IO@? @SKGD>DOGT <N R@GG. #JM
@S<HKG@, =@><PN@ OC@ AJGGJRDIB PQ"QQMZ() DN DHKG@H@IO@? =T < XIJMF NO<O@H@IO DO HPNO
?@ADI@ < N@K<M<O@ Q<MD<=G@ AJM OC@ >JPIO@M:
JOU PQ"QQMZ(
JOU EFMFHBUF(SFG TJ[F@U, SFG DPOTU(1PJOU)) EH) DPOTU
\
JOU SFTVMU = 0;
CPPM JT%POF = GBMTF;
TJ[F@U DPVOUFS = 0;
XIJMF (!JT%POF) \
// ...
SFTVMU = EH(DPVOUFS, OFYU&MFNFOU);
JG (SFTVMU) \
CSFBL;
^
++DPVOUFS;
^
SFUVSO SFTVMU;
^
Warning: The collection must not mutate during the iteration
74.4
/@B<M?G@NN JA RC@OC@M OC@ DO@M<ODJI NPKKJMO DN KMJQD?@? =T OC@ M<IB@ H@H=@M API>ODJIN JM =T
PQ"QQMZ() API>ODJIN, OC@ >JGG@>ODJI DON@GA HPNO IJO HPO<O@. +@R @G@H@ION HPNO IJO =@ <??@?
OJ OC@ >JIO<DI@M <I? OC@ @SDNODIB @G@H@ION HPNO IJO =@ M@HJQ@?.
!JDIB JOC@MRDN@ DN PI?@ADI@? =@C<QDJM.
Exercises
74.5
1. !@NDBI < TUSVDU OC<O RJMFN NDHDG<MGT OJ /VNCFS3BOHF, RCD>C <GNJ NPKKJMON NK@>DATDIB OC@
NO@K NDU@. 1C@ NO@K NDU@ ><I =@ OC@ OCDM? H@H=@M:
GPSFBDI (FMFNFOU; /VNCFS3BOHF(0, 10, 2)) \
XSJUF(FMFNFOU, ' ');
^
1C@ @SK@>O@? JPOKPO JA OC@ >J?@ <=JQ@ DN @Q@MT N@>JI? IPH=@M AMJH 0 OJ 10:
0 2 4 6 8
2. &HKG@H@IO OC@ 4DIPPM >G<NN OC<O R<N H@IODJI@? DI OC@ O@SO DI < R<T OC<O DO KMJQD?@N
<>>@NN OJ NOP?@ION JM O@<>C@MN ?@K@I?DIB JI OC@ GPSFBDI Q<MD<=G@.
8AD735: I;F: (FDG5FE 3@6 C>3EE7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
492
... F:7 EA>GF;A@E
8AD735: I;F: (FDG5FE 3@6 C>3EE7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
493
Unions 75
2IDJIN <GGJR HJM@ OC<I JI@ H@H=@M NC<M@ OC@ N<H@ H@HJMT <M@<. 1C@T <M@ < GJR-G@Q@G
A@<OPM@ DIC@MDO@? AMJH OC@ KMJBM<HHDIB G<IBP<B@.
2IDJIN <M@ Q@MT NDHDG<M OJ NOMP>ON RDOC OC@ AJGGJRDIB H<DI ?DAA@M@I>@N:
t 2IDJIN <M@ ?@ADI@? =T OC@ VOJPO F@TRJM?.
t 1C@ H@H=@MN JA < VOJPO <M@ IJO DI?@K@I?@IO; OC@T NC<M@ OC@ N<H@ H@HJMT <M@<.
'PNO GDF@ NOMP>ON, PIDJIN ><I C<Q@ H@H=@M API>ODJIN <N R@GG.
1C@ @S<HKG@N =@GJR RDGG KMJ?P>@ ?DAA@M@IO M@NPGON ?@K@I?DIB JI RC@OC@M OC@T <M@ >JHKDG@?
JI < 32-=DO JM < 64-=DO @IQDMJIH@IO. 1J <QJD? B@OODIB >JIAPNDIB M@NPGON, KG@<N@ PN@ OC@ -N32
>JHKDG@M NRDO>C RC@I >JHKDGDIB OC@ @S<HKG@N DI OCDN >C<KO@M. ,OC@MRDN@, TJPM M@NPGON H<T =@
?DAA@M@IO OC<I HDI@ ?P@ OJ 3>;9@?7@F, RCD>C R@ RDGG N@@ DI < G<O@M >C<KO@M.
+<OPM<GGT, TUSVDU J=E@>ON <M@ <N G<MB@ <N I@>@NN<MT OJ <>>JHJ?<O@ <GG JA OC@DM H@H=@MN:
// /PUF: 1MFBTF DPNQJMF XJUI UIF -N32 DPNQJMFS TXJUDI
TUSVDU 4
\
JOU J;
EPVCMF E;
^
// ...
XSJUFMO(4.TJ[FPG);
0DI>@ JOU DN 4 =TO@N GJIB <I? EPVCMF DN 8 =TO@N GJIB, OC@ NDU@ JA OC<O TUSVDU DN OC@ NPH JA
OC@DM NDU@N:
12
&I >JIOM<NO, OC@ NDU@ JA < VOJPO RDOC OC@ N<H@ H@H=@MN DN JIGT <N G<MB@ <N DON G<MB@NO
H@H=@M:
VOJPO 6
\
JOU J;
EPVCMF E;
^
// ...
XSJUFMO(6.TJ[FPG);
1C@ 4-=TO@ JOU <I? OC@ 8-=TO@ EPVCMF NC<M@ OC@ N<H@ <M@<. AN < M@NPGO, OC@ NDU@ JA OC@ @IODM@
VOJPO DN OC@ N<H@ <N DON G<MB@NO H@H=@M:
8
2IDJIN <M@ IJO < H@HJMT-N<QDIB A@<OPM@. &O DN DHKJNND=G@ OJ ADO HPGODKG@ ?<O< DIOJ OC@ N<H@
H@HJMT GJ><ODJI. 1C@ KPMKJN@ JA < PIDJI DN OJ PN@ OC@ N<H@ <M@< AJM ?DAA@M@IO OTK@ JA ?<O< <O
?DAA@M@IO ODH@N. ,IGT JI@ JA OC@ H@H=@MN ><I =@ PN@? M@GD<=GT <O JI@ ODH@. %JR@Q@M, <GOCJPBC
?JDIB NJ H<T IJO =@ KJMO<=G@ OJ ?DAA@M@IO KG<OAJMHN, VOJPO H@H=@MN ><I =@ PN@? AJM
<>>@NNDIB AM<BH@ION JA JOC@M H@H=@MN.
1C@ AJGGJRDIB ?D<BM<H NCJRN CJR OC@ 8 =TO@N JA OC@ VOJPO <=JQ@ <M@ NC<M@? =T DON H@H=@MN:
*@;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
494
0 1 2 3 4 5 6 7
---+------+------+------+------+------+------+------+------+---
] <-- 4 CZUFT GPS JOU --> ] ]
] <-------------- 8 CZUFT GPS EPVCMF ---------------> ]
---+------+------+------+------+------+------+------+------+---
"DOC@M <GG JA OC@ 8 =TO@N <M@ PN@? AJM OC@ EPVCMF H@H=@M, JM JIGT OC@ ADMNO 4 =TO@N <M@ PN@? AJM
OC@ JOU H@H=@M <I? OC@ JOC@M 4 =TO@N <M@ PIPN@?.
2IDJIN ><I C<Q@ <N H<IT H@H=@MN <N I@@?@?. AGG JA OC@ H@H=@MN RJPG? NC<M@ OC@ N<H@
H@HJMT GJ><ODJI.
1C@ A<>O OC<O OC@ N<H@ H@HJMT GJ><ODJI DN PN@? AJM <GG JA OC@ H@H=@MN ><I C<Q@ NPMKMDNDIB
@AA@>ON. #JM @S<HKG@, G@O'N DIDOD<GDU@ < VOJPO J=E@>O =T DON JOU H@H=@M <I? OC@I <>>@NN DON
EPVCMF H@H=@M:
BVUP V = 6(42); // JOJUJBMJ[JOH UIF JOU NFNCFS
XSJUFMO(V.E); // BDDFTTJOH UIF EPVCMF NFNCFS
&IDOD<GDUDIB OC@ JOU H@H=@M =T OC@ Q<GP@ 42 N@ON EPNO OC@ ADMNO 4 =TO@N, <I? OCDN <AA@>ON OC@
EPVCMF H@H=@M DI <I PIKM@?D>O<=G@ R<T:
2.07508F-322
!@K@I?DIB JI OC@ @I?D<II@NN JA OC@ HD>MJKMJ>@NNJM, OC@ 4 =TO@N H<T =@ <MM<IB@? DI H@HJMT
<N 0V0V0V42, 42V0V0V0, JM DI NJH@ JOC@M JM?@M. #JM OC<O M@<NJI, OC@ Q<GP@ JA OC@ EPVCMF
H@H=@M H<T <KK@<M ?DAA@M@IOGT JI ?DAA@M@IO KG<OAJMHN.
Anonymous unions
75.1
AIJITHJPN PIDJIN NK@>DAT RC<O H@H=@MN JA < PN@M-?@ADI@? OTK@ NC<M@ OC@ N<H@ <M@<:
TUSVDU 4
\
JOU GJSTU;
VOJPO
\
JOU TFDPOE;
JOU UIJSE;
^
^
// ...
XSJUFMO(4.TJ[FPG);
1C@ G<NO ORJ H@H=@MN JA 4 NC<M@ OC@ N<H@ <M@<. 0J, OC@ NDU@ JA OC@ TUSVDU DN < OJO<G JA ORJ
JOUN: 4 =TO@N I@@?@? AJM GJSTU <I? <IJOC@M 4 =TO@N OJ =@ NC<M@? =T TFDPOE <I? UIJSE:
8
Dissecting other members
75.2
2IDJIN ><I =@ PN@? AJM <>>@NNDIB DI?DQD?P<G =TO@N JA Q<MD<=G@N JA JOC@M OTK@N. #JM @S<HKG@,
OC@T H<F@ DO @<NT OJ <>>@NN OC@ 4 =TO@N JA <I &-Q4 <??M@NN DI?DQD?P<GGT.
*@;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
495
1C@ 32-=DO Q<GP@ JA OC@ &-Q4 <??M@NN <I? < ADS@?-G@IBOC <MM<T ><I =@ ?@ADI@? <N OC@ ORJ
H@H=@MN JA < VOJPO:
VOJPO *Q"EESFTT
\
VJOU WBMVF;
VCZUF<4> CZUFT;
^
1C@ H@H=@MN JA OC<O VOJPO RJPG? NC<M@ OC@ N<H@ H@HJMT <M@< <N DI OC@ AJGGJRDIB ADBPM@:
0 1 2 3
---+----------+----------+----------+----------+---
] <---- 32 CJUT PG UIF *1W4 BEESFTT ----> ]
] CZUFT<0> ] CZUFT<1> ] CZUFT<2> ] CZUFT<3> ]
---+----------+----------+----------+----------+---
#JM @S<HKG@, RC@I <I J=E@>O JA OCDN VOJPO DN DIDOD<GDU@? =T 0S>0<80102 (OC@ Q<GP@ OC<O
>JMM@NKJI?N OJ OC@ ?JOO@? AJMH 192.168.1.2), OC@ @G@H@ION JA OC@ CZUFT <MM<T RJPG?
<POJH<OD><GGT C<Q@ OC@ Q<GP@N JA OC@ AJPM J>O@ON:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
BVUP BEESFTT = *Q"EESFTT(0YD0B80102);
XSJUFMO(BEESFTT.CZUFT);
^
4C@I MPI JI < GDOOG@-@I?D<I NTNO@H, OC@ J>O@ON RJPG? <KK@<M DI M@Q@MN@ JA OC@DM ?JOO@? AJMH:
<2, 1, 168, 192>
1C@ M@Q@MN@ JM?@M JA OC@ J>O@ON DN <IJOC@M @S<HKG@ JA CJR <>>@NNDIB ?DAA@M@IO H@H=@MN JA <
VOJPO H<T KMJ?P>@ PIKM@?D>O<=G@ M@NPGON. 1CDN DN =@><PN@ OC@ =@C<QDJM JA < VOJPO DN
BP<M<IO@@? JIGT DA OC<O VOJPO DN PN@? OCMJPBC EPNO JI@ JA DON H@H=@MN. 1C@M@ <M@ IJ
BP<M<IO@@N JI OC@ Q<GP@N JA OC@ H@H=@MN JOC@M OC<I OC@ JI@ OC<O OC@ VOJPO C<N =@@I
DIDOD<GDU@? RDOC.
AGOCJPBC DO DN IJO ?DM@>OGT M@G<O@? OJ OCDN >C<KO@M, CTXBQ AMJH OC@ DPSF.CJUPQ HJ?PG@ DN
PN@APG DI ?@<GDIB RDOC @I?D<II@NN DNNP@N. CTXBQ M@OPMIN DON K<M<H@O@M <AO@M NR<KKDIB DON
=TO@N. AGNJ O<FDIB <?Q<IO<B@ JA OC@ FOEJBO Q<GP@ AMJH OC@ TUE.TZTUFN HJ?PG@, OC@ J>O@ON JA
OC@ KM@QDJPN &-Q4 <??M@NN ><I =@ KMDIO@? DI OC@ @SK@>O@? JM?@M <AO@M NR<KKDIB DON =TO@N:
JNQPSU TUE.TZTUFN;
JNQPSU DPSF.CJUPQ;
// ...
JG (FOEJBO == &OEJBO.MJUUMF&OEJBO) \
BEESFTT.WBMVF = CTXBQ(BEESFTT.WBMVF);
^
1C@ JPOKPO:
<192, 168, 1, 2>
-G@<N@ O<F@ OC@ *Q"EESFTT OTK@ <N < NDHKG@ @S<HKG@; DI B@I@M<G, DO RJPG? =@ =@OO@M OJ
>JIND?@M < ?@?D><O@? I@ORJMFDIB HJ?PG@ AJM IJI-OMDQD<G KMJBM<HN.
*@;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
496
Protocol example
75.3
&I NJH@ KMJOJ>JGN GDF@ 1-/&-, OC@ H@<IDIBN JA >@MO<DI K<MON JA < KMJOJ>JG K<>F@O ?@K@I? JI <
NK@>DAD> Q<GP@ DIND?@ OC@ N<H@ K<>F@O. 2NP<GGT, DO DN < AD@G? DI OC@ C@<?@M JA OC@ K<>F@O OC<O
?@O@MHDI@N OC@ H@<IDIBN JA NP>>@NNDQ@ =TO@N. 2IDJIN ><I =@ PN@? AJM M@KM@N@IODIB NP>C
KMJOJ>JG K<>F@ON.
1C@ AJGGJRDIB ?@NDBI M@KM@N@ION < KMJOJ>JG K<>F@O OC<O C<N ORJ FDI?N:
TUSVDU )PTU
\
// ...
^
TUSVDU 1SPUPDPM"
\
// ...
^
TUSVDU 1SPUPDPM#
\
// ...
^
FOVN 1SPUPDPM5ZQF \ ", # ^
TUSVDU /FUXPSL1BDLFU
\
)PTU TPVSDF;
)PTU EFTUJOBUJPO;
1SPUPDPM5ZQF UZQF;
VOJPO
\
1SPUPDPM" B1BSUT;
1SPUPDPM# C1BSUT;
^
VCZUF<> QBZMPBE;
^
1C@ TUSVDU <=JQ@ ><I H<F@ PN@ JA OC@ UZQF H@H=@M OJ ?@O@MHDI@ RC@OC@M B1BSUT JM
C1BSUT JA OC@ VOJPO OJ =@ PN@?.
When to use
75.4
0C<MDIB OC@ N<H@ H@HJMT <M@< AJM HJM@ OC<I JI@ H@H=@M DN < GJR-G@Q@G M@LPDM@H@IO OC<O DN
@I>JPIO@M@? M<M@GT DI KM<>OD>@.
2IDJIN H<T =@ K<MON JA GD=M<MT A-&N <N R@GG.
*@;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
497
Labels and HPUP 76
)<=@GN <M@ I<H@N BDQ@I OJ GDI@N JA >J?@ DI JM?@M OJ ?DM@>O KMJBM<H AGJR OJ OCJN@ GDI@N G<O@M
JI.
)<=@GN >JINDNO JA OC@ I<H@ <I? OC@ : >C<M<>O@M:
FOE: // j B MBCFM
1C<O G<=@G BDQ@N OC@ I<H@ 7@6 OJ OC@ GDI@ OC<O DO DN ?@ADI@? JI.
Note: !@ D73>;FK, 3 >347> 53@ 3BB73D 47FI77@ EF3F7?7@FE A@ F:7 E3?7 >;@7 FA @3?7 F:7 7J35F
EBAF F:3F ;F 3BB73DE 3F, 4GF F:;E ;E @AF 3 5A??A@ BD35F;57:
BO&YQSFTTJPO(); FOE: BOPUIFS&YQSFTTJPO();
HPUP
76.1
HPUP ?DM@>ON KMJBM<H AGJR OJ OC@ NK@>DAD@? GDI@:
WPJE GPP(CPPM DPOEJUJPO)
\
XSJUFMO("GJSTU");
JG (DPOEJUJPO) \
HPUP FOE;
^
XSJUFMO("TFDPOE");
FOE:
XSJUFMO("UIJSE");
^
4C@I DPOEJUJPO DN USVF, OC@ KMJBM<H AGJR 9A7E FA GDI@ FOE, @AA@>ODQ@GT NFDKKDIB OC@ GDI@ OC<O
KMDION "N@>JI?":
GJSTU
UIJSE
HPUP RJMFN OC@ N<H@ R<T <N DI OC@ <I? ++ KMJBM<HHDIB G<IBP<B@N. B@DIB IJOJMDJPN AJM
H<FDIB DO C<M? OJ PI?@MNO<I? OC@ DIO@IO <I? AGJR JA >J?@, HPUP DN ?DN>JPM<B@? @Q@I DI OCJN@
G<IBP<B@. 0O<O@H@ION GDF@ JG, XIJMF, GPS @O>. NCJPG? =@ PN@? DINO@<?.
#JM @S<HKG@, OC@ KM@QDJPN >J?@ ><I =@ RMDOO@I RDOCJPO HPUP DI < HJM@ EFDG5FGD76 R<T <N
R@GG:
WPJE GPP(CPPM DPOEJUJPO)
\
XSJUFMO("GJSTU");
JG (!DPOEJUJPO) \
XSJUFMO("TFDPOE");
^
XSJUFMO("UIJSE");
^
%JR@Q@M, OC@M@ <M@ ORJ <>>@KO<=G@ PN@N JA HPUP DI , IJI@ JA RCD>C DN I@>@NN<MT DI !.
"347>E 3@6 9AFA
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
498
Finalization area 76.1.1
,I@ JA OC@ Q<GD? PN@N JA HPUP DI DN BJDIB OJ OC@ ADI<GDU<ODJI <M@< RC@M@ OC@ >G@<IPK
JK@M<ODJIN JA < API>ODJI <M@ K@MAJMH@? (@.B. BDQDIB M@NJPM>@N =<>F, PI?JDIB >@MO<DI
JK@M<ODJIN, @O>.):
// --- $ DPEF ---
JOU GPP()
\
// ...
JG (FSSPS) \
HPUP GJOBMMZ;
^
// ...
GJOBMMZ:
// ... DMFBOVQ PQFSBUJPOT ...
SFUVSO FSSPS;
^
1CDN PN@ JA HPUP DN IJO I@>@NN<MT DI ! =@><PN@ OC@M@ <M@ JOC@M R<TN JA H<I<BDIB M@NJPM>@N:
OC@ B<M=<B@ >JGG@>OJM, ?@NOMP>OJMN, OC@ DBUDI <I? GJOBMMZ =GJ>FN, TDPQF() NO<O@H@ION, @O>.
Note: ):;E GE7 A8 goto ;E @AF @757EE3DK ;@ C++ 7;F:7D.
DPOUJOVF and CSFBL for outer loops 76.1.2
1C@ JOC@M Q<GD? PN@ JA HPUP DI DN <=JPO JPO@M GJJKN.
0DI>@ DPOUJOVF <I? CSFBL <AA@>O JIGT OC@ DII@M GJJK, JI@ R<T JA >JIODIPDIB JM =M@<FDIB JPO
JA OC@ JPO@M GJJK DN =T HPUP NO<O@H@ION:
// --- $ DPEF ---
XIJMF (DPOEJUJPO) \
XIJMF (PUIFS$POEJUJPO) \
// BGGFDUT UIF JOOFS MPPQ
DPOUJOVF;
// BGGFDUT UIF JOOFS MPPQ
CSFBL;
// XPSLT MJLF 'DPOUJOVF' GPS UIF PVUFS MPPQ
HPUP DPOUJOVF0VUFS;
// XPSLT MJLF 'CSFBL' GPS UIF PVUFS MPPQ
HPUP CSFBL0VUFS;
^
DPOUJOVF0VUFS:
;
^
CSFBL0VUFS:
1C@ N<H@ O@>CIDLP@ ><I =@ PN@? AJM JPO@M TXJUDI NO<O@H@ION <N R@GG.
1CDN PN@ JA HPUP DN IJO I@@?@? DI ! =@><PN@ ! C<N GJJK G<=@GN, RCD>C R@ RDGG N@@ =@GJR.
Note: ):;E GE7 A8 goto 53@ 47 7@5AG@F7D76 ;@ C++ 3E I7>>.
"347>E 3@6 9AFA
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
499
The problem of skipping constructors 76.1.3
1C@ >JINOMP>OJM DN ><GG@? JI <I J=E@>O @S<>OGT RC@M@ OC<O J=E@>O DN ?@ADI@?. 1CDN DN H<DIGT
=@><PN@ OC@ DIAJMH<ODJI OC<O DN I@@?@? OJ >JINOMP>O <I J=E@>O DN PNP<GGT IJO <Q<DG<=G@ PIODG
OC<O KJDIO. AGNJ, OC@M@ DN IJ I@@? OJ >JINOMP>O <I J=E@>O DA OC<O J=E@>O DN IJO BJDIB OJ =@ PN@?
DI OC@ KMJBM<H <O <GG.
4C@I HPUP NFDKN < GDI@ OC<O <I J=E@>O DN >JINOMP>O@? JI, OC@ KMJBM<H H<T @I? PK PNDIB <I
J=E@>O OC<O C<N IJO =@@I KM@K<M@? T@O:
JG (DPOEJUJPO) \
HPUP B-BCFM; // TLJQT UIF DPOTUSVDUPS
^
BVUP T = 4(42); // DPOTUSVDUT UIF PCKFDU QSPQFSMZ
B-BCFM:
T.CBS(); // #6(: 'T' NBZ OPU CF SFBEZ GPS VTF
Loop labels
76.2
)JJKN ><I C<Q@ G<=@GN <I? HPUP NO<O@H@ION ><I M@A@M OJ OCJN@ G<=@GN:
PVUFS-PPQ:
XIJMF (DPOEJUJPO) \
XIJMF (PUIFS$POEJUJPO) \
// BGGFDUT UIF JOOFS MPPQ
DPOUJOVF;
// BGGFDUT UIF JOOFS MPPQ
CSFBL;
// DPOUJOVFT UIF PVUFS MPPQ
DPOUJOVF PVUFS-PPQ;
// CSFBLT UIF PVUFS MPPQ
CSFBL PVUFS-PPQ;
^
^
TXJUDI NO<O@H@ION ><I C<Q@ G<=@GN <N R@GG. AI DII@M CSFBL NO<O@H@IO ><I M@A@M OJ <I JPO@M
TXJUDI OJ =M@<F JPO JA OC@ JPO@M TXJUDI NO<O@H@IO.
HPUP in DBTF sections
76.3
4@ C<Q@ <GM@<?T N@@I OC@ PN@ JA HPUP DI DBTF N@>ODJIN DI OC@ TXJUDI <I? DBTF >C<KO@M:
t HPUP DBTF ><PN@N OC@ @S@>PODJI OJ >JIODIP@ OJ OC@ I@SO DBTF.
t HPUP EFGBVMU ><PN@N OC@ @S@>PODJI OJ >JIODIP@ OJ OC@ EFGBVMU N@>ODJI.
t HPUP DBTF expression ><PN@N OC@ @S@>PODJI OJ >JIODIP@ OJ OC@ DBTF OC<O H<O>C@N OC<O
@SKM@NNDJI.
Summary
76.4
t 0JH@ JA OC@ PN@N JA HPUP <M@ IJO I@>@NN<MT DI !.
t CSFBL <I? DPOUJOVF ><I NK@>DAT G<=@GN OJ <AA@>O JPO@M GJJKN <I? TXJUDI NO<O@H@ION.
"347>E 3@6 9AFA
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
500
t HPUP DIND?@ DBTF N@>ODJIN ><I H<F@ OC@ KMJBM<H AGJR EPHK OJ JOC@M DBTF <I? EFGBVMU
N@>ODJIN.
"347>E 3@6 9AFA
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
501
Tuples 77
1PKG@N <M@ AJM >JH=DIDIB HPGODKG@ Q<GP@N OJ =@ PN@? <N < NDIBG@ J=E@>O. 1C@T <M@ DHKG@H@IO@?
<N < GD=M<MT A@<OPM@ =T OC@ 5VQMF O@HKG<O@ AMJH OC@ TUE.UZQFDPOT HJ?PG@.
5VQMF H<F@N PN@ JA 5ZQF5VQMF AMJH OC@ TUE.UZQFUVQMF HJ?PG@ AJM NJH@ JA DON JK@M<ODJIN.
1CDN >C<KO@M >JQ@MN JIGT OC@ HJM@ >JHHJI JK@M<ODJIN JA OPKG@N. #JM HJM@ DIAJMH<ODJI JI
OPKG@N <I? O@HKG<O@N N@@ -CDGDKK@ 0DB<P?'N D )7?B>3F7E: A )GFAD;3>.
5VQMF and UVQMF()
77.1
1PKG@N <M@ PNP<GGT >JINOMP>O@? =T OC@ >JIQ@ID@I>@ API>ODJI UVQMF():
JNQPSU TUE.TUEJP;
JNQPSU TUE.UZQFDPOT;
WPJE NBJO()
\
BVUP U = UVQMF(42, "IFMMP");
XSJUFMO(U);
^
1C@ UVQMF ><GG <=JQ@ >JINOMP>ON <I J=E@>O OC<O >JINDNON JA OC@ JOU Q<GP@ 42 <I? OC@ TUSJOH
Q<GP@ "IFMMP". 1C@ JPOKPO JA OC@ KMJBM<H DI>GP?@N OC@ OTK@ JA OC@ OPKG@ J=E@>O <I? DON
H@H=@MN:
5VQMF!(JOU, TUSJOH)(42, "IFMMP")
1C@ OPKG@ OTK@ <=JQ@ DN OC@ @LPDQ<G@IO JA OC@ AJGGJRDIB KN@P?J TUSVDU ?@ADIDODJI <I? GDF@GT
C<Q@ =@@I DHKG@H@IO@? DI @S<>OGT OC@ N<H@ R<T:
// 5IF FRVJWBMFOU PG 5VQMF!(JOU, TUSJOH)
TUSVDU @@5VQMF@JOU@TUSJOH
\
JOU @@NFNCFS@0;
TUSJOH @@NFNCFS@1;
^
1C@ H@H=@MN JA < OPKG@ <M@ IJMH<GGT <>>@NN@? =T OC@DM DI?@S Q<GP@N. 1C<O NTIO<S NPBB@NON
OC<O OPKG@N ><I =@ N@@I <N <MM<TN >JINDNODIB JA ?DAA@M@IO OTK@N JA @G@H@ION:
XSJUFMO(U<0>);
XSJUFMO(U<1>);
1C@ JPOKPO:
42
IFMMP
Member properties 77.1.1
&O DN KJNND=G@ OJ <>>@NN OC@ H@H=@MN =T KMJK@MOD@N DA OC@ OPKG@ DN >JINOMP>O@? ?DM@>OGT =T OC@
5VQMF O@HKG<O@ DINO@<? JA OC@ UVQMF() API>ODJI. 1C@ OTK@ <I? OC@ I<H@ JA @<>C H@H=@M <M@
NK@>DAD@? <N ORJ >JIN@>PODQ@ O@HKG<O@ K<M<H@O@MN:
)GB>7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
502
BVUP U = 5VQMF!(JOU, "OVNCFS",
TUSJOH, "NFTTBHF")(42, "IFMMP");
1C@ ?@ADIDODJI <=JQ@ <GGJRN <>>@NNDIB OC@ H@H=@MN =T .OVNCFS <I? .NFTTBHF KMJK@MOD@N <N
R@GG:
XSJUFMO("CZ JOEFY 0 : ", U<0>);
XSJUFMO("CZ .OVNCFS : ", U.OVNCFS);
XSJUFMO("CZ JOEFY 1 : ", U<1>);
XSJUFMO("CZ .NFTTBHF: ", U.NFTTBHF);
1C@ JPOKPO:
CZ JOEFY 0 : 42
CZ .OVNCFS : 42
CZ JOEFY 1 : IFMMP
CZ .NFTTBHF: IFMMP
Expanding the members as a list of values 77.1.2
1PKG@ H@H=@MN ><I =@ @SK<I?@? <N < GDNO JA Q<GP@N OC<O ><I =@ PN@? @.B. <N <I <MBPH@IO GDNO
RC@I ><GGDIB < API>ODJI. 1C@ H@H=@MN ><I =@ @SK<I?@? @DOC@M =T OC@ .FYQBOE KMJK@MOT JM =T
NGD>DIB:
JNQPSU TUE.TUEJP;
JNQPSU TUE.UZQFDPOT;
WPJE GPP(JOU J, TUSJOH T, EPVCMF E, DIBS D)
\
// ...
^
WPJE CBS(JOU J, EPVCMF E, DIBS D)
\
// ...
^
WPJE NBJO()
\
BVUP U = UVQMF(1, "2", 3.3, '4');
// #PUI PG UIF GPMMPXJOH MJOFT BSF FRVJWBMFOUT PG
// GPP(1, "2", 3.3, '4'):
GPP(U.FYQBOE);
GPP(U<>);
// 5IF FRVJWBMFOU PG CBS(1, 3.3, '4'):
CBS(U<0>, U<$-2..$>);
^
1C@ OPKG@ <=JQ@ >JINDNON JA AJPM Q<GP@N JA JOU, TUSJOH, EPVCMF, <I? DIBS. 0DI>@ OCJN@ OTK@N
H<O>C OC@ K<M<H@O@M GDNO JA GPP(), <I @SK<INDJI JA DON H@H=@MN ><I =@ PN@? <N <MBPH@ION OJ
GPP(). 4C@I ><GGDIB CBS(), < H<O>CDIB <MBPH@IO GDNO DN H<?@ PK JA OC@ ADMNO H@H=@M <I? OC@
G<NO ORJ H@H=@MN JA OC@ OPKG@.
AN GJIB <N OC@ H@H=@MN <M@ >JHK<OD=G@ OJ =@ @G@H@ION JA OC@ N<H@ <MM<T, OC@ @SK<INDJI JA <
OPKG@ ><I =@ PN@? <N OC@ @G@H@IO Q<GP@N JA <I <MM<T GDO@M<G <N R@GG:
JNQPSU TUE.TUEJP;
JNQPSU TUE.UZQFDPOT;
)GB>7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
503
WPJE NBJO()
\
BVUP U = UVQMF(1, 2, 3);
BVUP B = < U.FYQBOE, U<> >;
XSJUFMO(B);
^
1C@ <MM<T GDO@M<G <=JQ@ DN DIDOD<GDU@? =T @SK<I?DIB OC@ N<H@ OPKG@ ORD>@:
<1, 2, 3, 1, 2, 3>
Compile-time GPSFBDI 77.1.3
B@><PN@ OC@DM Q<GP@N ><I =@ @SK<I?@?, OPKG@N ><I =@ PN@? RDOC OC@ GPSFBDI NO<O@H@IO <N
R@GG:
BVUP U = UVQMF(42, "IFMMP", 1.5);
GPSFBDI (J, NFNCFS; U) \
XSJUFGMO("%T: %T", J, NFNCFS);
^
1C@ JPOKPO:
0: 42
1: IFMMP
2: 1.5
1C@ GPSFBDI NO<O@H@IO <=JQ@ H<T BDQ@ < A<GN@ DHKM@NNDJI: &O H<T =@ OCJPBCO JA =@DIB < GJJK
OC<O B@ON @S@>PO@? <O MPI ODH@. 1C<O DN IJO OC@ ><N@. /<OC@M, < GPSFBDI NO<O@H@IO OC<O
JK@M<O@N JI OC@ H@H=@MN JA < OPKG@ DN @SK<INDJIN JA OC@ GJJK =J?T AJM @<>C H@H=@M. 1C@
GPSFBDI NO<O@H@IO <=JQ@ DN OC@ @LPDQ<G@IO JA OC@ AJGGJRDIB >J?@:
\
FOVN TJ[F@U J = 0;
JOU NFNCFS = U<J>;
XSJUFGMO("%T: %T", J, NFNCFS);
^
\
FOVN TJ[F@U J = 1;
TUSJOH NFNCFS = U<J>;
XSJUFGMO("%T: %T", J, NFNCFS);
^
\
FOVN TJ[F@U J = 2;
EPVCMF NFNCFS = U<J>;
XSJUFGMO("%T: %T", J, NFNCFS);
^
1C@ M@<NJI AJM OC@ @SK<INDJI DN OC@ A<>O OC<O RC@I OC@ OPKG@ H@H=@MN <M@ JA ?DAA@M@IO OTK@N,
OC@ GPSFBDI =J?T C<N OJ =@ >JHKDG@? ?DAA@M@IOGT AJM @<>C OTK@.
Returning multiple values from functions 77.1.4
1PKG@N ><I =@ < NDHKG@ NJGPODJI OJ OC@ GDHDO<ODJI JA API>ODJIN C<QDIB OJ M@OPMI < NDIBG@ Q<GP@.
AI @S<HKG@ JA OCDN DN TUE.BMHPSJUIN.GJOE4QMJU. GJOE4QMJU() N@<M>C@N AJM < M<IB@ DIND?@
<IJOC@M M<IB@ <I? KMJ?P>@N < M@NPGO >JINDNODIB JA OCM@@ KD@>@N: OC@ K<MO =@AJM@ OC@ AJPI?
M<IB@, OC@ AJPI? M<IB@, <I? OC@ K<MO <AO@M OC@ AJPI? M<IB@:
)GB>7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
504
JNQPSU TUE.BMHPSJUIN;
// ...
BVUP FOUJSF3BOHF = "IFMMP";
BVUP TFBSDIFE = "MM";
BVUP SFTVMU = GJOE4QMJU(FOUJSF3BOHF, TFBSDIFE);
XSJUFMO("CFGPSF: ", SFTVMU<0>);
XSJUFMO("GPVOE : ", SFTVMU<1>);
XSJUFMO("BGUFS : ", SFTVMU<2>);
1C@ JPOKPO:
CFGPSF: IF
GPVOE : MM
BGUFS : P
AIJOC@M JKODJI AJM M@OPMIDIB HPGODKG@ Q<GP@N AMJH < API>ODJI DN OJ M@OPMI < TUSVDU J=E@>O:
TUSVDU 3FTVMU
\
// ...
^
3FTVMU GPP()
\
// ...
^
5ZQF5VQMF
77.2
5ZQF5VQMF DN ?@ADI@? DI OC@ TUE.UZQFUVQMF HJ?PG@. &O DN PN@? AJM M@KM@N@IODIB < >JI>@KO
OC<O DN IJMH<GGT PN@? =T OC@ >JHKDG@M =PO JOC@MRDN@ IJO <Q<DG<=G@ OJ OC@ KMJBM<HH@M <N <I
@IODOT: A >JHH<-N@K<M<O@? GDNO JA Q<GP@N <I? OTK@N. 1C@ AJGGJRDIB <M@ OCM@@ @S<HKG@N JA NP>C
GDNON:
t #PI>ODJI <MBPH@IO GDNO
t 1@HKG<O@ <MBPH@IO GDNO
t AMM<T GDO@M<G @G@H@IO GDNO
1C@ AJGGJRDIB OCM@@ GDI@N JA >J?@ <M@ @S<HKG@N JA OCJN@ GDNON DI OC@ N<H@ JM?@M:
GPP(1, "IFMMP", 2.5); // GVODUJPO BSHVNFOUT
BVUP P = #BS!(DIBS, MPOH)(); // UFNQMBUF BSHVNFOUT
BVUP B = < 1, 2, 3, 4 >; // BSSBZ MJUFSBM FMFNFOUT
5VQMF O<F@N <?Q<IO<B@ JA 5ZQF5VQMF RC@I @SK<I?DIB DON H@H=@MN.
AGOCJPBC 5ZQF5VQMF DN < Q@MT NDHKG@ >JI>@KO, DO DN JI@ JA OC@ HJM@ >JIAPNDIB A@<OPM@N JA !. A
M@<NJI JA OCDN >JIAPNDJI DN OC@ A<>O OC<O DON I<H@ ?J@N IJO ?@N>MD=@ DON API>ODJI<GDOT
<>>PM<O@GT: &O ><I >JIO<DI IJO JIGT OTK@N =PO Q<GP@N <N R@GG. (AN R@ RDGG N@@ DI OC@ I@SO
>C<KO@M, DO ><I >JIO<DI NTH=JGN <N R@GG.)
1CDN >C<KO@M DI>GP?@N 5ZQF5VQMF @S<HKG@N OC<O >JINDNO JIGT JA OTK@N JM JIGT JA Q<GP@N.
"S<HKG@N JA 5ZQF5VQMFN OC<O >JIO<DI =JOC OTK@N <I? Q<GP@N RDGG <KK@<M DI OC@ I@SO >C<KO@M.
5ZQF5VQMF DN @NK@>D<GGT PN@APG RDOC Q<MD<?D> O@HKG<O@N, RCD>C R@ RDGG N@@ DI OC@ I@SO >C<KO@M
<N R@GG.
)GB>7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
505
5ZQF5VQMF consisting of values 77.2.1
1C@ Q<GP@N OC<O < 5ZQF5VQMF M@KM@N@ION <M@ NK@>DAD@? <N DON O@HKG<O@ <MBPH@ION.
)@O'N DH<BDI@ < API>ODJI OC<O O<F@N OCM@@ K<M<H@O@MN:
JNQPSU TUE.TUEJP;
WPJE GPP(JOU J, TUSJOH T, EPVCMF E)
\
XSJUFGMO("GPP DBMMFE: %T %T %T", J, T, E);
^
1C<O API>ODJI RJPG? IJMH<GGT =@ ><GG@? RDOC OCM@@ <MBPH@ION:
GPP(1, "IFMMP", 2.5);
5ZQF5VQMF ><I >JH=DI@ OCJN@ <MBPH@ION <N < NDIBG@ @IODOT <I? ><I <POJH<OD><GGT =@
@SK<I?@? RC@I ><GGDIB API>ODJIN:
JNQPSU TUE.UZQFUVQMF;
// ...
BMJBT BSHVNFOUT = 5ZQF5VQMF!(1, "IFMMP", 2.5);
GPP(BSHVNFOUT);
AGOCJPBC DO GJJFN GDF@ OC@ API>ODJI DN IJR =@DIB ><GG@? RDOC < NDIBG@ <MBPH@IO, OC@ GPP() ><GG
<=JQ@ DN OC@ @LPDQ<G@IO JA OC@ KM@QDJPN JI@. AN < M@NPGO, =JOC ><GGN KMJ?P>@ OC@ N<H@ JPOKPO:
GPP DBMMFE: 1 IFMMP 2.5
AGNJ IJO@ OC<O BSHVNFOUT DN IJO ?@ADI@? <N < Q<MD<=G@, @.B. RDOC BVUP. /<OC@M, DO DN <I BMJBT JA
< NK@>DAD> 5ZQF5VQMF DINO<I>@. AGOCJPBC DO DN KJNND=G@ OJ ?@ADI@ Q<MD<=G@N JA 5ZQF5VQMFN <N
R@GG, OC@ @S<HKG@N DI OCDN >C<KO@M RDGG PN@ OC@H JIGT <N <GD<N@N.
AN R@ C<Q@ N@@I <=JQ@ RDOC 5VQMF, RC@I OC@ Q<GP@N <M@ >JHK<OD=G@ OJ =@ @G@H@ION JA OC@
N<H@ <MM<T, < 5ZQF5VQMF ><I =@ PN@? OJ DIDOD<GDU@ <I <MM<T GDO@M<G <N R@GG:
BMJBT FMFNFOUT = 5ZQF5VQMF!(1, 2, 3, 4);
BVUP BSS = < FMFNFOUT >;
BTTFSU(BSS == < 1, 2, 3, 4 >);
Indexing and slicing 77.2.2
0<H@ RDOC 5VQMF, OC@ H@H=@MN JA < 5ZQF5VQMF ><I =@ <>>@NN@? =T DI?@S@N <I? NGD>@N:
BMJBT BSHVNFOUT = 5ZQF5VQMF!(1, "IFMMP", 2.5);
BTTFSU(BSHVNFOUT<0> == 1);
BTTFSU(BSHVNFOUT<1> == "IFMMP");
BTTFSU(BSHVNFOUT<2> == 2.5);
)@O'N <NNPH@ OC@M@ DN < API>ODJI RDOC K<M<H@O@MN H<O>CDIB OC@ G<NO ORJ H@H=@MN JA OC@
5ZQF5VQMF <=JQ@. 1C<O API>ODJI ><I =@ ><GG@? RDOC < NGD>@ JA EPNO OC@ G<NO ORJ H@H=@MN JA OC@
5ZQF5VQMF:
WPJE CBS(TUSJOH T, EPVCMF E)
\
// ...
^
)GB>7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
506
// ...
CBS(BSHVNFOUT<$-2 .. $>);
5ZQF5VQMF consisting of types 77.2.3
*@H=@MN JA < 5ZQF5VQMF ><I >JINDNO JA OTK@N. &I JOC@M RJM?N, IJO < NK@>DAD> Q<GP@ JA <
NK@>DAD> OTK@ =PO < OTK@ GDF@ JOU DON@GA. A 5ZQF5VQMF >JINDNODIB JA OTK@N ><I M@KM@N@IO
O@HKG<O@ <MBPH@ION.
)@O'N PN@ < 5ZQF5VQMF RDOC < TUSVDU O@HKG<O@ OC<O C<N ORJ K<M<H@O@MN. 1C@ ADMNO K<M<H@O@M
JA OCDN O@HKG<O@ ?@O@MHDI@N OC@ @G@H@IO OTK@ JA < H@H=@M <MM<T <I? OC@ N@>JI? K<M<H@O@M
?@O@MHDI@N OC@ M@OPMI Q<GP@ JA < H@H=@M API>ODJI:
JNQPSU TUE.DPOW;
TUSVDU 4(&MFNFOU5, 3FTVMU5)
\
&MFNFOU5<> BSS;
3FTVMU5 MFOHUI()
\
SFUVSO UP!3FTVMU5(BSS.MFOHUI);
^
^
WPJE NBJO()
\
BVUP T = 4!(EPVCMF, JOU)(< 1, 2, 3 >);
BVUP M = T.MFOHUI();
^
&I OC@ >J?@ <=JQ@, R@ N@@ OC<O OC@ O@HKG<O@ DN DINO<IOD<O@? RDOC (EPVCMF, JOU). A 5ZQF5VQMF
><I M@KM@N@IO OC@ N<H@ <MBPH@IO GDNO <N R@GG:
JNQPSU TUE.UZQFUVQMF;
// ...
BMJBT 5ZQFT = 5ZQF5VQMF!(EPVCMF, JOU);
BVUP T = 4!5ZQFT(< 1, 2, 3 >);
AGOCJPBC DO <KK@<MN OJ =@ < NDIBG@ O@HKG<O@ <MBPH@IO, 5ZQFT B@ON @SK<I?@? <POJH<OD><GGT
<I? OC@ O@HKG<O@ DINO<IOD<ODJI =@>JH@N 4!(EPVCMF, JOU) <N =@AJM@.
5ZQF5VQMF DN @NK@>D<GGT PN@APG DI H3D;36;5 F7?B>3F7E. 4@ RDGG N@@ @S<HKG@N JA OCDN DI OC@ I@SO
>C<KO@M.
GPSFBDI with 5ZQF5VQMF 77.2.4
0<H@ RDOC 5VQMF, OC@ GPSFBDI NO<O@H@IO JK@M<ODIB JI < 5ZQF5VQMF DN IJO < MPI ODH@ GJJK.
/<OC@M, DO DN OC@ @SK<INDJIN JA OC@ GJJK =J?T AJM @<>C H@H=@M.
)@O'N N@@ <I @S<HKG@ JA OCDN RDOC < PIDO O@NO RMDOO@I AJM OC@ 4 NOMP>O OC<O R<N ?@ADI@? <=JQ@.
1C@ AJGGJRDIB >J?@ O@NON 4 AJM @G@H@IO OTK@N JOU, MPOH, <I? GMPBU (3FTVMU5 DN <GR<TN
TJ[F@U DI OCDN @S<HKG@):
VOJUUFTU
\
BMJBT 5ZQFT = 5ZQF5VQMF!(JOU, MPOH, GMPBU);
)GB>7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
507
GPSFBDI (5ZQF; 5ZQFT) \
BVUP T = 4!(5ZQF, TJ[F@U)(< 5ZQF.JOJU, 5ZQF.JOJU >);
BTTFSU(T.MFOHUI() == 2);
^
^
1C@ GPSFBDI Q<MD<=G@ 5ZQF >JMM@NKJI?N OJ JOU, MPOH, <I? GMPBU, DI OC<O JM?@M. AN < M@NPGO,
OC@ GPSFBDI NO<O@H@IO B@ON >JHKDG@? <N OC@ @LPDQ<G@IO JA OC@ >J?@ =@GJR:
\
BVUP T = 4!(JOU, TJ[F@U)(< JOU.JOJU, JOU.JOJU >);
BTTFSU(T.MFOHUI() == 2);
^
\
BVUP T = 4!(MPOH, TJ[F@U)(< MPOH.JOJU, MPOH.JOJU >);
BTTFSU(T.MFOHUI() == 2);
^
\
BVUP T = 4!(GMPBU, TJ[F@U)(< GMPBU.JOJU, GMPBU.JOJU >);
BTTFSU(T.MFOHUI() == 2);
^
.UVQMFPG property
77.3
.UVQMFPG M@KM@N@ION OC@ H@H=@MN JA < OTK@ JM <I J=E@>O. 4C@I <KKGD@? OJ < PN@M-?@ADI@?
OTK@, .UVQMFPG KMJQD?@N <>>@NN OJ OC@ ?@ADIDODJIN JA OC@ H@H=@MN JA OC<O OTK@:
JNQPSU TUE.TUEJP;
TUSVDU 4
\
JOU OVNCFS;
TUSJOH NFTTBHF;
EPVCMF WBMVF;
^
WPJE NBJO()
\
GPSFBDI (J, .FNCFS5ZQF; UZQFPG(4.UVQMFPG)) \
XSJUFGMO(".FNCFS %T:", J);
XSJUFGMO(" UZQF: %T", .FNCFS5ZQF.TUSJOHPG);
TUSJOH OBNF = 4.UVQMFPG<J>.TUSJOHPG;
XSJUFGMO(" OBNF: %T", OBNF);
^
^
4.UVQMFPG <KK@<MN DI ORJ KG<>@N DI OC@ KMJBM<H. #DMNO, OC@ OTK@N JA OC@ @G@H@ION <M@
J=O<DI@? =T <KKGTDIB UZQFPG OJ .UVQMFPG NJ OC<O @<>C OTK@ <KK@<MN <N OC@ .FNCFS5ZQF
Q<MD<=G@. 0@>JI?, OC@ I<H@ JA OC@ H@H=@M DN J=O<DI@? =T 4.UVQMFPG<J>.TUSJOHPG.
.FNCFS 0:
UZQF: JOU
OBNF: OVNCFS
.FNCFS 1:
UZQF: TUSJOH
OBNF: NFTTBHF
.FNCFS 2:
UZQF: EPVCMF
OBNF: WBMVF
)GB>7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
508
.UVQMFPG ><I =@ <KKGD@? OJ <I J=E@>O <N R@GG. &I OC<O ><N@, DO KMJ?P>@N < OPKG@ >JINDNODIB JA
OC@ Q<GP@N JA OC@ H@H=@MN JA OC@ J=E@>O:
BVUP PCKFDU = 4(42, "IFMMP", 1.5);
GPSFBDI (J, NFNCFS; PCKFDU.UVQMFPG) \
XSJUFGMO(".FNCFS %T:", J);
XSJUFGMO(" UZQF : %T", UZQFPG(NFNCFS).TUSJOHPG);
XSJUFGMO(" WBMVF: %T", NFNCFS);
^
1C@ GPSFBDI Q<MD<=G@ NFNCFS M@KM@N@ION @<>C H@H=@M JA OC@ J=E@>O:
.FNCFS 0:
UZQF : JOU
WBMVF: 42
.FNCFS 1:
UZQF : TUSJOH
WBMVF: IFMMP
.FNCFS 2:
UZQF : EPVCMF
WBMVF: 1.5
%@M@, <I DHKJMO<IO KJDIO OJ H<F@ DN OC<O OC@ OPKG@ OC<O .UVQMFPG M@OPMIN >JINDNON JA OC@
H@H=@MN JA OC@ J=E@>O OC@HN@GQ@N, IJO OC@DM >JKD@N. &I JOC@M RJM?N, OC@ OPKG@ H@H=@MN <M@
M@A@M@I>@N OJ OC@ <>OP<G J=E@>O H@H=@MN.
Summary
77.4
t UVQMF() >JH=DI@N ?DAA@M@IO OTK@N JA Q<GP@N NDHDG<M OJ < TUSVDU J=E@>O.
t "SKGD>DO PN@ JA 5VQMF <GGJRN <>>@NNDIB OC@ H@H=@MN =T KMJK@MOD@N.
t 1C@ H@H=@MN ><I =@ @SK<I?@? <N < Q<GP@ GDNO =T .FYQBOE JM =T NGD>DIB.
t GPSFBDI RDOC < OPKG@ DN IJO < MPI ODH@ GJJK; M<OC@M, < >J?@ @SK<INDJI.
t 5ZQF5VQMF M@KM@N@ION >JI>@KON GDF@ API>ODJI <MBPH@IO GDNO, O@HKG<O@ <MBPH@IO GDNO, <MM<T
GDO@M<G @G@H@IO GDNO, @O>.
t 5ZQF5VQMF ><I >JINDNO JA Q<GP@N <I? OTK@N.
t 1PKG@N NPKKJMO DI?@SDIB <I? NGD>DIB.
t .UVQMFPG KMJQD?@N DIAJMH<ODJI <=JPO OC@ H@H=@MN JA OTK@N <I? J=E@>ON.
)GB>7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
509
More Templates 78
4@ C<Q@ N@@I OC@ KJR@M <I? >JIQ@ID@I>@ JA O@HKG<O@N DI OC@ 1@HKG<O@N >C<KO@M. A NDIBG@
O@HKG<O@? ?@ADIDODJI JA <I <GBJMDOCH JM < ?<O< NOMP>OPM@ DN NPAAD>D@IO OJ PN@ OC<O ?@ADIDODJI AJM
HPGODKG@ OTK@N.
1C<O >C<KO@M >JQ@M@? JIGT OC@ HJNO >JHHJI PN@N JA O@HKG<O@N: API>ODJI, TUSVDU, <I? DMBTT
O@HKG<O@N <I? OC@DM PN@N RDOC FKB7 O@HKG<O@ K<M<H@O@MN. &I OCDN >C<KO@M R@ RDGG N@@
O@HKG<O@N DI HJM@ ?@O<DG. B@AJM@ BJDIB APMOC@M, & M@>JHH@I? OC<O TJP M@QD@R <O G@<NO OC@
NPHH<MT N@>ODJI JA OC<O >C<KO@M.
The shortcut syntax
78.1
&I <??DODJI OJ =@DIB KJR@MAPG, ! O@HKG<O@N <M@ @<NT OJ ?@ADI@ <I? PN@ <I? OC@T <M@ Q@MT
M@<?<=G@. !@ADIDIB < API>ODJI, TUSVDU, JM DMBTT O@HKG<O@ DN <N NDHKG@ <N KMJQD?DIB < O@HKG<O@
K<M<H@O@M GDNO:
5 UXJDF(5)(5 WBMVF)
\
SFUVSO 2 * WBMVF;
^
DMBTT 'SBDUJPO(5)
\
5 OVNFSBUPS;
5 EFOPNJOBUPS;
// ...
^
1@HKG<O@ ?@ADIDODJIN GDF@ OC@ JI@N <=JQ@ <M@ O<FDIB <?Q<IO<B@ JA !'N NCJMO>PO O@HKG<O@
NTIO<S.
&I OC@DM APGG NTIO<S, O@HKG<O@N <M@ ?@ADI@? =T OC@ UFNQMBUF F@TRJM?. 1C@ @LPDQ<G@ION JA OC@
ORJ O@HKG<O@ ?@ADIDODJIN <=JQ@ <M@ OC@ AJGGJRDIB:
UFNQMBUF UXJDF(5)
\
5 UXJDF(5 WBMVF)
\
SFUVSO 2 * WBMVF;
^
^
UFNQMBUF 'SBDUJPO(5)
\
DMBTT 'SBDUJPO
\
5 OVNFSBUPS;
5 EFOPNJOBUPS;
// ...
^
^
AGOCJPBC HJNO O@HKG<O@N <M@ ?@ADI@? =T OC@ NCJMO>PO NTIO<S, OC@ >JHKDG@M <GR<TN PN@N OC@ APGG
NTIO<S. 4@ ><I DH<BDI@ OC@ >JHKDG@M <KKGTDIB OC@ AJGGJRDIB NO@KN OJ >JIQ@MO < NCJMO>PO
NTIO<S OJ DON APGG AJMH =@CDI? OC@ N>@I@N:
1. 4M<K OC@ ?@ADIDODJI =T < O@HKG<O@ =GJ>F.
2. $DQ@ OC@ N<H@ I<H@ OJ OC<O =GJ>F.
#AD7 )7?B>3F7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
510
3. *JQ@ OC@ O@HKG<O@ K<M<H@O@M GDNO OJ OC@ O@HKG<O@ =GJ>F.
1C@ APGG NTIO<S OC<O DN <MMDQ@? <AO@M OCJN@ NO@KN DN ><GG@? <I 7BA@K?AGE F7?B>3F7, RCD>C OC@
KMJBM<HH@M ><I ?@ADI@ @SKGD>DOGT <N R@GG. 4@ RDGG N@@ @KJITHJPN O@HKG<O@N G<O@M =@GJR.
Template name space 78.1.1
&O DN KJNND=G@ OJ C<Q@ HJM@ OC<I JI@ ?@ADIDODJI DIND?@ < O@HKG<O@ =GJ>F. 1C@ AJGGJRDIB O@HKG<O@
>JIO<DIN =JOC < API>ODJI <I? < TUSVDU ?@ADIDODJI:
UFNQMBUF .Z5FNQMBUF(5)
\
5 GPP(5 WBMVF)
\
SFUVSO WBMVF / 3;
^
TUSVDU 4
\
5 NFNCFS;
^
^
&INO<IOD<ODIB OC@ O@HKG<O@ AJM < NK@>DAD> OTK@ DINO<IOD<O@N <GG JA OC@ ?@ADIDODJIN DIND?@ OC@
=GJ>F. 1C@ AJGGJRDIB >J?@ DINO<IOD<O@N OC@ O@HKG<O@ AJM JOU <I? EPVCMF:
BVUP SFTVMU = .Z5FNQMBUF!JOU.GPP(42);
XSJUFMO(SFTVMU);
BVUP T = .Z5FNQMBUF!EPVCMF.4(5.6);
XSJUFMO(T.NFNCFS);
A NK@>DAD> DINO<IOD<ODJI JA < O@HKG<O@ DIOMJ?P>@N < @3?7 EB357. 1C@ ?@ADIDODJIN OC<O <M@ DIND?@
<I DINO<IOD<ODJI ><I =@ PN@? =T OC<O I<H@. %JR@Q@M, DA OC@N@ I<H@N <M@ OJJ GJIB, DO DN <GR<TN
KJNND=G@ OJ PN@ <GD<N@N <N R@ C<Q@ N@@I DI OC@ BMJBT >C<KO@M:
BMJBT .Z4USVDU = .Z5FNQMBUF!EDIBS.4;
// ...
BVUP P = .Z4USVDU('B');
XSJUFMO(P.NFNCFS);
Eponymous templates 78.1.2
"KJITHJPN O@HKG<O@N <M@ UFNQMBUF =GJ>FN OC<O >JIO<DI < ?@ADIDODJI OC<O C<N OC@ N<H@ I<H@
<N OC<O =GJ>F. &A A<>O, @<>C NCJMO>PO O@HKG<O@ NTIO<S DN OC@ NCJMO>PO JA <I @KJITHJPN
O@HKG<O@.
AN <I @S<HKG@, DH<BDI@ OC<O < KMJBM<H I@@?N OJ LP<GDAT OTK@N OC<O <M@ G<MB@M OC<I 20 =TO@N
<N FAA >3D97. 0P>C < LP<GDAD><ODJI ><I =@ <>CD@Q@? =T < >JINO<IO CPPM Q<GP@ DIND?@ < O@HKG<O@
=GJ>F:
UFNQMBUF JT5PP-BSHF(5)
\
FOVN JT5PP-BSHF = 5.TJ[FPG > 20;
^
+JO@ CJR OC@ I<H@N JA =JOC OC@ O@HKG<O@ =GJ>F <I? DON JIGT ?@ADIDODJI <M@ OC@ N<H@. 1CDN
@KJITHJPN O@HKG<O@ DN PN@? =T OC@ NCJMO>PO NTIO<S DINO@<? JA OC@ APGG
JT5PP-BSHF!JOU.JT5PP-BSHF:
#AD7 )7?B>3F7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
511
XSJUFMO(JT5PP-BSHF!JOU);
1C@ CDBCGDBCO@? K<MO <=JQ@ DN OC@ N<H@ <N OC@ CPPM Q<GP@ DIND?@ OC@ =GJ>F. 0DI>@ OC@ NDU@ JA
JOU DN G@NN OC<I 20, OC@ JPOKPO JA OC@ >J?@ RJPG? =@ GBMTF.
1C<O @KJITHJPN O@HKG<O@ ><I =@ ?@ADI@? =T OC@ NCJMO>PO NTIO<S <N R@GG:
FOVN JT5PP-BSHF(5) = 5.TJ[FPG > 20;
Template types
78.2
Function, class, and struct templates 78.2.1
4@ C<Q@ <GM@<?T >JQ@M@? API>ODJI, DMBTT, <I? TUSVDU O@HKG<O@N DI OC@ 1@HKG<O@N >C<KO@M
<I? R@ C<Q@ N@@I H<IT @S<HKG@N JA OC@H NDI>@ OC@I.
Union templates 78.2.2
2IDJI O@HKG<O@N <M@ NDHDG<M OJ NOMP>O O@HKG<O@N. 1C@ NCJMO>PO NTIO<S DN <Q<DG<=G@ AJM OC@H <N
R@GG.
AN <I @S<HKG@, G@O'N ?@NDBI < HJM@ B@I@M<G Q@MNDJI JA OC@ *Q"ESFTT VOJPO OC<O R@ C<Q@ N@@I
DI OC@ 2IDJIN >C<KO@M. 1C@M@, OC@ Q<GP@ JA OC@ &-Q4 <??M@NN R<N F@KO <N < VJOU H@H=@M DI
OC<O @<MGD@M Q@MNDJI JA *Q"ESFTT, <I? OC@ @G@H@IO OTK@ JA OC@ N@BH@IO <MM<T R<N VCZUF:
VOJPO *Q"EESFTT
\
VJOU WBMVF;
VCZUF<4> CZUFT;
^
1C@ CZUFT <MM<T R<N <I @<NT <>>@NN OJ OC@ AJPM N@BH@ION JA OC@ &-Q4 <??M@NN.
1C@ N<H@ >JI>@KO ><I =@ DHKG@H@IO@? DI < HJM@ B@I@M<G R<T <N OC@ AJGGJRDIB VOJPO
O@HKG<O@:
VOJPO 4FHNFOUFE7BMVF("DUVBM5, 4FHNFOU5)
\
"DUVBM5 WBMVF;
4FHNFOU5</* OVNCFS PG TFHNFOUT */> TFHNFOUT;
^
1C<O O@HKG<O@ RJPG? <GGJR NK@>DATDIB OC@ OTK@N JA OC@ Q<GP@ <I? DON N@BH@ION AM@@GT.
1C@ IPH=@M JA N@BH@ION OC<O <M@ I@@?@? ?@K@I?N JI OC@ OTK@N JA OC@ <>OP<G Q<GP@ <I? OC@
N@BH@ION. 0DI>@ <I &-Q4 <??M@NN C<N AJPM VCZUF N@BH@ION, OC<O Q<GP@ R<N C<M?->J?@? <N 4 DI
OC@ @<MGD@M ?@ADIDODJI JA *Q"EESFTT. #JM OC@ 4FHNFOUFE7BMVF O@HKG<O@, OC@ IPH=@M JA
N@BH@ION HPNO =@ >JHKPO@? <O >JHKDG@ ODH@ RC@I OC@ O@HKG<O@ DN DINO<IOD<O@? AJM OC@ ORJ
NK@>DAD> OTK@N.
1C@ AJGGJRDIB @KJITHJPN O@HKG<O@ O<F@N <?Q<IO<B@ JA OC@ .TJ[FPG KMJK@MOD@N JA OC@ ORJ
OTK@N OJ ><G>PG<O@ OC@ IPH=@M JA N@BH@ION I@@?@?:
UFNQMBUF TFHNFOU$PVOU("DUVBM5, 4FHNFOU5)
\
FOVN TFHNFOU$PVOU = (("DUVBM5.TJ[FPG + (4FHNFOU5.TJ[FPG - 1))
/ 4FHNFOU5.TJ[FPG);
^
#AD7 )7?B>3F7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
512
1C@ NCJMO>PO NTIO<S H<T =@ HJM@ M@<?<=G@:
FOVN TFHNFOU$PVOU("DUVBM5, 4FHNFOU5) =
(("DUVBM5.TJ[FPG + (4FHNFOU5.TJ[FPG - 1))
/ 4FHNFOU5.TJ[FPG);
Note: ):7 7JBD7EE;A@ SegmentT.sizeof - 1 ;E 8AD I:7@ F:7 E;L7E A8 F:7 FKB7E 53@@AF 47
6;H;676 7H7@>K. FAD 7J3?B>7, I:7@ F:7 35FG3> FKB7 ;E 5 4KF7E 3@6 F:7 E79?7@F FKB7 ;E 2 4KF7E,
7H7@ F:AG9: 3 FAF3> A8 3 E79?7@FE 3D7 @77676, F:7 D7EG>F A8 F:7 ;@F797D 6;H;E;A@ 5/2 IAG>6
;@5ADD75F>K 47 2.
1C@ ?@ADIDODJI JA OC@ PIDJI O@HKG<O@ DN IJR >JHKG@O@:
VOJPO 4FHNFOUFE7BMVF("DUVBM5, 4FHNFOU5)
\
"DUVBM5 WBMVF;
4FHNFOU5<TFHNFOU$PVOU!("DUVBM5, 4FHNFOU5)> TFHNFOUT;
^
&INO<IOD<ODJI JA OC@ O@HKG<O@ AJM VJOU <I? VCZUF RJPG? =@ OC@ @LPDQ<G@IO JA OC@ @<MGD@M
?@ADIDODJI JA *Q"EESFTT:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
BVUP BEESFTT = 4FHNFOUFE7BMVF!(VJOU, VCZUF)(0YD0B80102);
GPSFBDI (PDUFU; BEESFTT.TFHNFOUT) \
XSJUF(PDUFU, ' ');
^
^
1C@ JPOKPO JA OC@ KMJBM<H DN OC@ N<H@ <N OC@ JI@ DI OC@ 2IDJIN >C<KO@M:
2 1 168 192
1J ?@HJINOM<O@ OC@ AG@SD=DGDOT JA OCDN O@HKG<O@, G@O'N DH<BDI@ OC<O DO DN M@LPDM@? OJ <>>@NN OC@
K<MON JA OC@ &-Q4 <??M@NN <N ORJ VTIPSU Q<GP@N. &O RJPG? =@ <N @<NT <N KMJQD?DIB VTIPSU <N
OC@ N@BH@IO OTK@:
BVUP BEESFTT = 4FHNFOUFE7BMVF!(VJOU, VTIPSU)(0YD0B80102);
AGOCJPBC PIPNP<G AJM <I &-Q4 <??M@NN, OC@ JPOKPO JA OC@ KMJBM<H RJPG? >JINDNO JA ORJ VTIPSU
N@BH@IO Q<GP@N:
258 49320
Interface templates 78.2.3
&IO@MA<>@ O@HKG<O@N KMJQD?@ AG@SD=DGDOT JI OC@ OTK@N OC<O <M@ PN@? JI <I DIO@MA<>@ (<N R@GG <N
Q<GP@N NP>C <N NDU@N JA ADS@?-G@IBOC <MM<TN <I? JOC@M A@<OPM@N JA <I DIO@MA<>@).
)@O'N ?@ADI@ <I DIO@MA<>@ AJM >JGJM@? J=E@>ON RC@M@ OC@ OTK@ JA OC@ >JGJM DN ?@O@MHDI@? =T <
O@HKG<O@ K<M<H@O@M:
JOUFSGBDF $PMPSFE0CKFDU($PMPS5)
\
#AD7 )7?B>3F7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
513
WPJE QBJOU($PMPS5 DPMPS);
^
1C<O DIO@MA<>@ O@HKG<O@ M@LPDM@N OC<O DON NP=OTK@N HPNO ?@ADI@ OC@ QBJOU() API>ODJI =PO DO
G@<Q@N OC@ OTK@ JA OC@ >JGJM AG@SD=G@.
A >G<NN OC<O M@KM@N@ION < AM<H@ JI < R@= K<B@ H<T >CJJN@ OJ PN@ < >JGJM OTK@ OC<O DN
M@KM@N@IO@? =T DON M@?, BM@@I, <I? =GP@ >JHKJI@ION:
TUSVDU 3(#
\
VCZUF SFE;
VCZUF HSFFO;
VCZUF CMVF;
^
DMBTT 1BHF'SBNF : $PMPSFE0CKFDU!3(#
\
WPJE QBJOU(3(# DPMPS)
\
// ...
^
^
,I OC@ JOC@M C<I?, < >G<NN OC<O PN@N OC@ AM@LP@I>T JA GDBCO ><I >CJJN@ < >JHKG@O@GT ?DAA@M@IO
OTK@ OJ M@KM@N@IO >JGJM:
BMJBT 'SFRVFODZ = EPVCMF;
DMBTT #VMC : $PMPSFE0CKFDU!'SFRVFODZ
\
WPJE QBJOU('SFRVFODZ DPMPS)
\
// ...
^
^
%JR@Q@M, <N @SKG<DI@? DI OC@ 1@HKG<O@N >C<KO@M, "@Q@MT ?DAA@M@IO DINO<IOD<ODJI JA < O@HKG<O@
DN < ?DAA@M@IO OTK@". A>>JM?DIBGT, OC@ DIO@MA<>@N $PMPSFE0CKFDU!3(# <I?
$PMPSFE0CKFDU!'SFRVFODZ <M@ PIM@G<O@? DIO@MA<>@N, <I? 1BHF'SBNF <I? #VMC <M@ PIM@G<O@?
>G<NN@N.
Kinds of template parameters
78.3
1C@ O@HKG<O@ K<M<H@O@MN OC<O R@ C<Q@ N@@I NJ A<M C<Q@ <GG =@@I FKB7 K<M<H@O@MN. 0J A<M,
K<M<H@O@MN GDF@ 5 <I? $PMPS5 <GG M@KM@N@IO@? OTK@N. #JM @S<HKG@, 5 H@<IO JOU, EPVCMF,
4UVEFOU, @O>. ?@K@I?DIB JI OC@ DINO<IOD<ODJI JA OC@ O@HKG<O@.
1C@M@ <M@ JOC@M FDI?N JA O@HKG<O@ K<M<H@O@MN: Q<GP@, UIJT, BMJBT, <I? OPKG@.
Type template parameters 78.3.1
1CDN N@>ODJI DN JIGT AJM >JHKG@O@I@NN. AGG JA OC@ O@HKG<O@N OC<O R@ N@@I NJ A<M C<? OTK@
K<M<H@O@MN.
Value template parameters 78.3.2
3<GP@ O@HKG<O@ K<M<H@O@MN <GGJR AG@SD=DGDOT JI >@MO<DI Q<GP@N PN@? DI OC@ O@HKG<O@
DHKG@H@IO<ODJI.
#AD7 )7?B>3F7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
514
0DI>@ O@HKG<O@N <M@ < >JHKDG@-ODH@ A@<OPM@, OC@ Q<GP@N AJM OC@ Q<GP@ O@HKG<O@ K<M<H@O@MN
HPNO =@ FIJRI <O >JHKDG@ ODH@; Q<GP@N OC<O HPNO =@ ><G>PG<O@? <O MPI ODH@ ><IIJO =@ PN@?.
1J N@@ OC@ <?Q<IO<B@ JA Q<GP@ O@HKG<O@ K<M<H@O@MN, G@O'N NO<MO RDOC < N@O JA NOMP>ON
M@KM@N@IODIB B@JH@OMD> NC<K@N:
TUSVDU 5SJBOHMF
\
1PJOU<3> DPSOFST;
// ...
^
TUSVDU 3FDUBOHMF
\
1PJOU<4> DPSOFST;
// ...
^
TUSVDU 1FOUBHPO
\
1PJOU<5> DPSOFST;
// ...
^
)@O'N <NNPH@ OC<O JOC@M H@H=@M Q<MD<=G@N <I? H@H=@M API>ODJIN JA OCJN@ OTK@N <M@ @S<>OGT
OC@ N<H@ <I? OC<O OC@ JIGT ?DAA@M@I>@ DN OC@ H3>G7 OC<O ?@O@MHDI@N OC@ IPH=@M JA >JMI@MN.
3<GP@ O@HKG<O@ K<M<H@O@MN C@GK DI NP>C ><N@N. 1C@ AJGGJRDIB NOMP>O O@HKG<O@ DN NPAAD>D@IO OJ
M@KM@N@IO <GG JA OC@ OTK@N <=JQ@ <I? HJM@:
TUSVDU 1PMZHPO(TJ[F@U /)
\
1PJOU</> DPSOFST;
// ...
^
1C@ JIGT O@HKG<O@ K<M<H@O@M JA OC<O NOMP>O O@HKG<O@ DN < Q<GP@ I<H@? / JA OTK@ TJ[F@U. 1C@
Q<GP@ / ><I =@ PN@? <N < >JHKDG@-ODH@ >JINO<IO <ITRC@M@ DIND?@ OC@ O@HKG<O@.
1C<O O@HKG<O@ DN AG@SD=G@ @IJPBC OJ M@KM@N@IO NC<K@N JA <IT ND?@N:
BVUP DFOUBHPO = 1PMZHPO!100();
1C@ AJGGJRDIB <GD<N@N >JMM@NKJI? OJ OC@ @<MGD@M NOMP>O ?@ADIDODJIN:
BMJBT 5SJBOHMF = 1PMZHPO!3;
BMJBT 3FDUBOHMF = 1PMZHPO!4;
BMJBT 1FOUBHPO = 1PMZHPO!5;
// ...
BVUP USJBOHMF = 5SJBOHMF();
BVUP SFDUBOHMF = 3FDUBOHMF();
BVUP QFOUBHPO = 1FOUBHPO();
AN GJIB <N OC@ Q<GP@ DN FIJRI <O >JHKDG@ ODH@, < Q<GP@ O@HKG<O@ K<M<H@O@M ><I =@ JA <IT
<MDOCH@OD> JM NOMDIB OTK@.
1C@ AJGGJRDIB @S<HKG@ PN@N < TUSJOH O@HKG<O@ K<M<H@O@M OJ M@KM@N@IO <I 5*) O<B OJ
KMJ?P>@ < NDHKG@ 5*) JPOKPO:
t #DMNO OC@ O<B =@OR@@I OC@ < > >C<M<>O@MN: <UBH>
t 1C@I OC@ Q<GP@
#AD7 )7?B>3F7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
515
t #DI<GGT OC@ O<B =@OR@@I OC@ </ > >C<M<>O@MN: </UBH>
#JM @S<HKG@, <I 5*) O<B M@KM@N@IODIB >A53F;A@ 42 RJPG? =@ KMDIO@? <N
<MPDBUJPO>42</MPDBUJPO>.
DMBTT 9NM&MFNFOU(TUSJOH UBH)
\
EPVCMF WBMVF;
UIJT(EPVCMF WBMVF)
\
UIJT.WBMVF = WBMVF;
^
PWFSSJEF TUSJOH UP4USJOH() DPOTU
\
SFUVSO GPSNBU("<%T>%T</%T>", UBH, WBMVF, UBH);
^
^
+JO@ OC<O OC@ O@HKG<O@ K<M<H@O@M DN IJO <=JPO < OTK@ OC<O DN PN@? DI OC@ DHKG@H@IO<ODJI JA
OC@ O@HKG<O@, M<OC@M DO DN <=JPO < TUSJOH H3>G7. 1C<O Q<GP@ ><I =@ PN@? <ITRC@M@ DIND?@ OC@
O@HKG<O@ <N < TUSJOH.
1C@ 5*) @G@H@ION OC<O < KMJBM<H I@@?N ><I =@ ?@ADI@? <N <GD<N@N <N DI OC@ AJGGJRDIB >J?@:
BMJBT -PDBUJPO = 9NM&MFNFOU!"MPDBUJPO";
BMJBT 5FNQFSBUVSF = 9NM&MFNFOU!"UFNQFSBUVSF";
BMJBT 8FJHIU = 9NM&MFNFOU!"XFJHIU";
WPJE NBJO()
\
0CKFDU<> FMFNFOUT;
FMFNFOUT _= OFX -PDBUJPO(1);
FMFNFOUT _= OFX 5FNQFSBUVSF(23);
FMFNFOUT _= OFX 8FJHIU(78);
XSJUFMO(FMFNFOUT);
^
1C@ JPOKPO:
<<MPDBUJPO>1</MPDBUJPO>, <UFNQFSBUVSF>23</UFNQFSBUVSF>, <XFJHIU>78</XFJHIU>>
3<GP@ O@HKG<O@ K<M<H@O@MN ><I C<Q@ ?@A<PGO Q<GP@N <N R@GG. #JM @S<HKG@, OC@ AJGGJRDIB NOMP>O
O@HKG<O@ M@KM@N@ION KJDION DI < HPGOD-?DH@INDJI<G NK<>@ RC@M@ OC@ ?@A<PGO IPH=@M JA
?DH@INDJIN DN 3:
TUSVDU 1PJOU(5, TJ[F@U EJNFOTJPO = 3)
\
5<EJNFOTJPO> DPPSEJOBUFT;
^
1C<O O@HKG<O@ ><I =@ PN@? RDOCJPO NK@>DATDIB OC@ EJNFOTJPO O@HKG<O@ K<M<H@O@M:
1PJOU!EPVCMF DFOUFS; // B QPJOU JO 3-EJNFOTJPOBM TQBDF
1C@ IPH=@M JA ?DH@INDJIN ><I NODGG =@ NK@>DAD@? RC@I I@@?@?:
1PJOU!(JOU, 2) QPJOU; // B QPJOU PO B TVSGBDF
#AD7 )7?B>3F7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
516
UIJT template parameters for member function templates 78.3.3
*@H=@M API>ODJIN ><I =@ O@HKG<O@N <N R@GG. 1C@DM O@HKG<O@ K<M<H@O@MN C<Q@ OC@ N<H@
H@<IDIBN <N JOC@M O@HKG<O@N.
%JR@Q@M, PIGDF@ JOC@M O@HKG<O@N, H@H=@M API>ODJI O@HKG<O@ K<M<H@O@MN ><I <GNJ =@ this
B3D3?7F7DE. &I OC<O ><N@, OC@ D?@IODAD@M OC<O >JH@N <AO@M OC@ UIJT F@TRJM? M@KM@N@ION OC@
@S<>O OTK@ JA OC@ UIJT M@A@M@I>@ JA OC@ J=E@>O. (this D787D7@57 H@<IN OC@ J=E@>O DON@GA, <N DN
>JHHJIGT RMDOO@I DI >JINOMP>OJMN <N UIJT.NFNCFS = WBMVF.)
TUSVDU .Z4USVDU(5)
\
WPJE GPP(UIJT 0XO5ZQF)() DPOTU
\
XSJUFMO("5ZQF PG UIJT PCKFDU: ", 0XO5ZQF.TUSJOHPG);
^
^
1C@ 0XO5ZQF O@HKG<O@ K<M<H@O@M DN OC@ <>OP<G OTK@ JA OC@ J=E@>O OC<O OC@ H@H=@M API>ODJI DN
><GG@? JI:
BVUP N = .Z4USVDU!JOU();
BVUP D = DPOTU(.Z4USVDU!JOU)();
BVUP J = JNNVUBCMF(.Z4USVDU!JOU)();
N.GPP();
D.GPP();
J.GPP();
1C@ JPOKPO:
5ZQF PG UIJT PCKFDU: .Z4USVDU!JOU
5ZQF PG UIJT PCKFDU: DPOTU(.Z4USVDU!JOU)
5ZQF PG UIJT PCKFDU: JNNVUBCMF(.Z4USVDU!JOU)
AN TJP ><I N@@, OC@ OTK@ DI>GP?@N OC@ >JMM@NKJI?DIB OTK@ JA 5 <N R@GG <N OC@ OTK@ LP<GDAD@MN
GDF@ DPOTU <I? JNNVUBCMF.
1C@ TUSVDU (JM DMBTT) I@@? IJO =@ < O@HKG<O@. UIJT O@HKG<O@ K<M<H@O@MN ><I <KK@<M JI
H@H=@M API>ODJI O@HKG<O@N JA IJI-O@HKG<O@? OTK@N <N R@GG.
BMJBT template parameters 78.3.4
BMJBT O@HKG<O@ K<M<H@O@MN ><I >JMM@NKJI? OJ <IT NTH=JG JM @SKM@NNDJI OC<O DN PN@? DI OC@
KMJBM<H. 1C@ JIGT >JINOM<DIO JI NP>C < O@HKG<O@ <MBPH@IO DN OC<O OC@ <MBPH@IO HPNO =@
>JHK<OD=G@ RDOC DON PN@ DIND?@ OC@ O@HKG<O@.
GJMUFS() <I? NBQ() PN@ BMJBT O@HKG<O@ K<M<H@O@MN OJ ?@O@MHDI@ OC@ JK@M<ODJIN OC<O OC@T
@S@>PO@.
)@O'N N@@ < NDHKG@ @S<HKG@ JI < TUSVDU O@HKG<O@ OC<O DN AJM HJ?DATDIB <I @SDNODIB Q<MD<=G@.
1C@ TUSVDU O@HKG<O@ O<F@N OC@ Q<MD<=G@ <N <I BMJBT K<M<H@O@M:
TUSVDU .Z4USVDU(BMJBT WBSJBCMF)
\
WPJE TFU(JOU WBMVF)
\
WBSJBCMF = WBMVF;
^
^
#AD7 )7?B>3F7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
517
1C@ H@H=@M API>ODJI NDHKGT <NNDBIN DON K<M<H@O@M OJ OC@ Q<MD<=G@ OC<O OC@ TUSVDU O@HKG<O@ DN
DINO<IOD<O@? RDOC. 1C<O Q<MD<=G@ HPNO =@ NK@>DAD@? ?PMDIB OC@ DINO<IOD<ODJI JA OC@ O@HKG<O@:
JOU Y = 1;
JOU Z = 2;
BVUP PCKFDU = .Z4USVDU!Y();
PCKFDU.TFU(10);
XSJUFMO("Y: ", Y, ", Z: ", Z);
&I OC<O DINO<IOD<ODJI, OC@ WBSJBCMF O@HKG<O@ K<M<H@O@M >JMM@NKJI?N OJ OC@ Q<MD<=G@ Y:
Y: 10, Z: 2
JIQ@MN@GT, .Z4USVDU!Z DINO<IOD<ODJI JA OC@ O@HKG<O@ RJPG? <NNJ>D<O@ WBSJBCMF RDOC Z.
)@O'N IJR C<Q@ <I BMJBT K<M<H@O@M OC<O M@KM@N@ION < ><GG<=G@ @IODOT, NDHDG<M OJ GJMUFS() <I?
NBQ():
WPJE DBMMFS(BMJBT GVOD)()
\
XSJUF("DBMMJOH: ");
GVOD();
^
AN N@@I =T OC@ () K<M@IOC@N@N, DBMMFS() PN@N DON O@HKG<O@ K<M<H@O@M <N < API>ODJI.
A??DODJI<GGT, NDI>@ OC@ K<M@IOC@N@N <M@ @HKOT, DO HPNO =@ G@B<G OJ ><GG OC@ API>ODJI RDOCJPO
NK@>DATDIB <IT <MBPH@ION.
)@O'N C<Q@ OC@ AJGGJRDIB ORJ API>ODJIN OC<O H<O>C OC<O ?@N>MDKODJI. 1C@T ><I =JOC M@KM@N@IO
GVOD =@><PN@ OC@T ><I =@ ><GG@? <N GVOD() DI OC@ O@HKG<O@:
WPJE GPP()
\
XSJUFMO("GPP DBMMFE.");
^
WPJE CBS()
\
XSJUFMO("CBS DBMMFE.");
^
1CJN@ API>ODJIN ><I =@ PN@? <N OC@ BMJBT K<M<H@O@M JA DBMMFS():
DBMMFS!GPP();
DBMMFS!CBS();
1C@ JPOKPO:
DBMMJOH: GPP DBMMFE.
DBMMJOH: CBS DBMMFE.
AN GJIB <N DO H<O>C@N OC@ R<T DO DN PN@? DI OC@ O@HKG<O@, <IT NTH=JG ><I =@ PN@? <N <I BMJBT
K<M<H@O@M. AN < >JPIO@M @S<HKG@, PNDIB <I JOU Q<MD<=G@ RDOC DBMMFS() RJPG? ><PN@ <
>JHKDG<ODJI @MMJM:
JOU WBSJBCMF;
DBMMFS!WBSJBCMF(); // j DPNQJMBUJPO &3303
1C@ >JHKDG<ODJI @MMJM DI?D><O@N OC<O OC@ Q<MD<=G@ ?J@N IJO H<O>C DON PN@ DI OC@ O@HKG<O@:
#AD7 )7?B>3F7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
518
&SSPS: GVODUJPO FYQFDUFE CFGPSF (), OPU WBSJBCMF PG UZQF JOU
AGOCJPBC OC@ HDNO<F@ DN RDOC OC@ DBMMFS!WBSJBCMF DINO<IOD<ODJI, OC@ >JHKDG<ODJI @MMJM
I@>@NN<MDGT KJDION <O GVOD() DIND?@ OC@ DBMMFS() O@HKG<O@ =@><PN@ AMJH OC@ KJDIO JA QD@R JA
OC@ >JHKDG@M OC@ @MMJM DN RDOC OMTDIB OJ ><GG WBSJBCMF <N < API>ODJI. ,I@ R<T JA ?@<GDIB RDOC
OCDN DNNP@ DN OJ PN@ F7?B>3F7 5A@EFD3;@FE, RCD>C R@ RDGG N@@ =@GJR.
&A OC@ Q<MD<=G@ NPKKJMON OC@ API>ODJI ><GG NTIO<S K@MC<KN =@><PN@ DO C<N <I PQ$BMM() JQ@MGJ<?
JM DO DN < API>ODJI GDO@M<G, DO RJPG? NODGG RJMF RDOC OC@ DBMMFS() O@HKG<O@. 1C@ AJGGJRDIB
@S<HKG@ ?@HJINOM<O@N =JOC JA OCJN@ ><N@N:
DMBTT $
\
WPJE PQ$BMM()
\
XSJUFMO("$.PQ$BMM DBMMFE.");
^
^
// ...
BVUP P = OFX $();
DBMMFS!P();
DBMMFS!(\ XSJUFMO("'VODUJPO MJUFSBM DBMMFE."); ^)();
1C@ JPOKPO:
DBMMJOH: $.PQ$BMM DBMMFE.
DBMMJOH: 'VODUJPO MJUFSBM DBMMFE.
BMJBT K<M<H@O@MN ><I =@ NK@>D<GDU@? <N R@GG. %JR@Q@M, OC@T C<Q@ < ?DAA@M@IO NK@>D<GDU<ODJI
NTIO<S. 1C@ NK@>D<GDU@? OTK@ HPNO =@ NK@>DAD@? =@OR@@I OC@ BMJBT F@TRJM? <I? OC@ I<H@ JA
OC@ K<M<H@O@M:
JNQPSU TUE.TUEJP;
WPJE GPP(BMJBT WBSJBCMF)()
\
XSJUFGMO("5IF HFOFSBM EFGJOJUJPO JT VTJOH '%T' PG UZQF %T.",
WBSJBCMF.TUSJOHPG, UZQFPG(WBSJBCMF).TUSJOHPG);
^
WPJE GPP(BMJBT JOU J)()
\
XSJUFGMO("5IF JOU TQFDJBMJ[BUJPO JT VTJOH '%T'.",
J.TUSJOHPG);
^
WPJE GPP(BMJBT EPVCMF E)()
\
XSJUFGMO("5IF EPVCMF TQFDJBMJ[BUJPO JT VTJOH '%T'.",
E.TUSJOHPG);
^
WPJE NBJO()
\
TUSJOH OBNF;
GPP!OBNF();
JOU DPVOU;
GPP!DPVOU();
EPVCMF MFOHUI;
#AD7 )7?B>3F7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
519
GPP!MFOHUI();
^
AGNJ IJO@ OC<O BMJBT K<M<H@O@MN H<F@ OC@ I<H@N JA OC@ <>OP<G Q<MD<=G@N <Q<DG<=G@ DIND?@ OC@
O@HKG<O@:
5IF HFOFSBM EFGJOJUJPO JT VTJOH 'OBNF' PG UZQF TUSJOH.
5IF JOU TQFDJBMJ[BUJPO JT VTJOH 'DPVOU'.
5IF EPVCMF TQFDJBMJ[BUJPO JT VTJOH 'MFOHUI'.
Tuple template parameters 78.3.5
4@ C<Q@ N@@I DI OC@ 3<MD<=G@ +PH=@M JA -<M<H@O@MN >C<KO@M OC<O Q<MD<?D> API>ODJIN ><I O<F@
<IT IPH=@M <I? <IT OTK@ JA K<M<H@O@MN. #JM @S<HKG@, XSJUFMO() ><I =@ ><GG@? RDOC <IT
IPH=@M JA K<M<H@O@MN JA <IT OTK@.
1@HKG<O@N ><I =@ Q<MD<?D> <N R@GG. A O@HKG<O@ K<M<H@O@M OC<O >JINDNON JA < I<H@ AJGGJR@? =T
... <GGJRN <IT IPH=@M <I? OTK@N JA K<M<H@O@MN <O OC<O K<M<H@O@M'N KJNDODJI. 0P>C
K<M<H@O@MN <KK@<M <N < OPKG@ DIND?@ OC@ O@HKG<O@, RCD>C ><I =@ PN@? GDF@ < 5ZQF5VQMF.
)@O'N N@@ <I @S<HKG@ JA OCDN RDOC < O@HKG<O@ OC<O NDHKGT KMDION DIAJMH<ODJI <=JPO @Q@MT
O@HKG<O@ <MBPH@IO OC<O DO DN DINO<IOD<O@? RDOC:
WPJE JOGP(5...)(5 BSHT)
\
// ...
^
1C@ O@HKG<O@ K<M<H@O@M 5... H<F@N JOGP < H3D;36;5 F7?B>3F7. BJOC 5 <I? BSHT <M@ OPKG@N:
t 5 M@KM@N@ION OC@ OTK@N JA OC@ <MBPH@ION.
t BSHT M@KM@N@ION OC@ <MBPH@ION OC@HN@GQ@N.
1C@ AJGGJRDIB @S<HKG@ DINO<IOD<O@N OC<O API>ODJI O@HKG<O@ RDOC OCM@@ Q<GP@N JA OCM@@ ?DAA@M@IO
OTK@N:
JNQPSU TUE.TUEJP;
// ...
WPJE NBJO()
\
JOGP(1, "BCD", 2.3);
^
1C@ AJGGJRDIB DHKG@H@IO<ODJI NDHKGT KMDION DIAJMH<ODJI <=JPO OC@ <MBPH@ION =T DO@M<ODIB
JQ@M OC@H DI < GPSFBDI GJJK:
WPJE JOGP(5...)(5 BSHT)
\
// 'BSHT' JT CFJOH VTFE MJLF B UVQMF:
GPSFBDI (J, BSH; BSHT) \
XSJUFGMO("%T: %T BSHVNFOU %T",
J, UZQFPG(BSH).TUSJOHPG, BSH);
^
^
1C@ JPOKPO:
#AD7 )7?B>3F7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
520
0: JOU BSHVNFOU 1
1: TUSJOH BSHVNFOU BCD
2: EPVCMF BSHVNFOU 2.3
+JO@ OC<O DINO@<? JA J=O<DIDIB OC@ OTK@ JA @<>C <MBPH@IO =T UZQFPG(BSH), R@ >JPG? C<Q@
PN@? 5<J> <N R@GG.
4@ FIJR OC<O O@HKG<O@ <MBPH@ION ><I =@ ?@?P>@? AJM API>ODJI O@HKG<O@N. 1C<O'N RCT OC@
>JHKDG@M ?@?P>@N OC@ OTK@N <N JOU, TUSJOH, <I? EPVCMF DI OC@ KM@QDJPN KMJBM<H.
%JR@Q@M, DO DN <GNJ KJNND=G@ OJ NK@>DAT O@HKG<O@ K<M<H@O@MN @SKGD>DOGT. #JM @S<HKG@,
TUE.DPOW.UP O<F@N OC@ ?@NODI<ODJI OTK@ <N <I @SKGD>DO O@HKG<O@ K<M<H@O@M:
UP!TUSJOH(42);
4C@I O@HKG<O@ K<M<H@O@MN <M@ @SKGD>DOGT NK@>DAD@?, OC@T ><I =@ < HDSOPM@ JA Q<GP@, OTK@, <I?
JOC@M FDI?N. 1C<O AG@SD=DGDOT H<F@N DO I@>@NN<MT OJ =@ <=G@ OJ ?@O@MHDI@ RC@OC@M @<>C
O@HKG<O@ K<M<H@O@M DN < OTK@ JM IJO, NJ OC<O OC@ =J?T JA OC@ O@HKG<O@ ><I =@ >J?@?
<>>JM?DIBGT. 1C<O DN <>CD@Q@? =T OM@<ODIB OC@ <MBPH@ION <N < 5ZQF5VQMF.
)@O'N N@@ <I @S<HKG@ JA OCDN DI < API>ODJI O@HKG<O@ OC<O KMJ?P>@N TUSVDU ?@ADIDODJIN <N NJPM>@
>J?@ DI O@SO AJMH. )@O'N C<Q@ OCDN API>ODJI M@OPMI OC@ KMJ?P>@? NJPM>@ >J?@ <N TUSJOH. 1CDN
API>ODJI ><I ADMNO O<F@ OC@ I<H@ JA OC@ TUSVDU AJGGJR@? =T OC@ OTK@N <I? I<H@N JA OC@
H@H=@MN NK@>DAD@? <N K<DMN:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
XSJUFMO(TUSVDU%FGJOJUJPO!("4UVEFOU",
TUSJOH, "OBNF",
JOU, "JE",
JOU<>, "HSBEFT")());
^
1C<O TUSVDU%FGJOJUJPO DINO<IOD<ODJI DN @SK@>O@? OJ KMJ?P>@ OC@ AJGGJRDIB TUSJOH:
TUSVDU 4UVEFOU
\
TUSJOH OBNF;
JOU JE;
JOU<> HSBEFT;
^
Note: FG@5F;A@E F:3F BDA6G57 EAGD57 5A67 3D7 GE78G> I;F: F:7 mixin =7KIAD6, I:;5: I7 I;>>
E77 ;@ 3 >3F7D 5:3BF7D.
1C@ AJGGJRDIB DN <I DHKG@H@IO<ODJI OC<O KMJ?P>@N OC@ ?@NDM@? JPOKPO. +JO@ CJR OC@ API>ODJI
O@HKG<O@ H<F@N PN@ JA OC@ JT @SKM@NNDJI. /@H@H=@M OC<O OC@ @SKM@NNDJI JT (BSH) KMJ?P>@N
USVF RC@I BSH DN < Q<GD? OTK@:
JNQPSU TUE.TUSJOH;
TUSJOH TUSVDU%FGJOJUJPO(TUSJOH OBNF, .FNCFST...)()
\
/* &OTVSF UIBU NFNCFST BSF TQFDJGJFE BT QBJST: GJSTU UIF
* UZQF UIFO UIF OBNF. */
TUBUJD BTTFSU((.FNCFST.MFOHUI % 2) == 0,
#AD7 )7?B>3F7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
521
".FNCFST NVTU CF TQFDJGJFE BT QBJST.");
/* 5IF GJSTU QBSU PG UIF TUSVDU EFGJOJUJPO. */
TUSJOH SFTVMU = "TUSVDU " _ OBNF _ "=O\=O";
GPSFBDI (J, BSH; .FNCFST) \
TUBUJD JG (J % 2) \
/* 5IF PEE OVNCFSFE BSHVNFOUT TIPVME CF UIF OBNFT
* PG NFNCFST. *OTUFBE PG EFBMJOH XJUI UIF OBNFT
* IFSF, XF VTF UIFN BT .FNCFST<J+1> JO UIF 'FMTF'
* DMBVTF CFMPX.
*
* -FU'T BU MFBTU FOTVSF UIBU UIF NFNCFS OBNF JT
* TQFDJGJFE BT B TUSJOH. */
TUBUJD BTTFSU (JT (UZQFPG(BSH) == TUSJOH),
".FNCFS OBNF " _ BSH.TUSJOHPG _
" JT OPU B TUSJOH.");
^ FMTF \
/* *O UIJT DBTF 'BSH' JT UIF UZQF PG UIF
* NFNCFS. &OTVSF UIBU JU JT JOEFFE B UZQF. */
TUBUJD BTTFSU (JT (BSH),
BSH.TUSJOHPG _ " JT OPU B UZQF.");
/* 1SPEVDF UIF NFNCFS EFGJOJUJPO GSPN JUT UZQF BOE
* JUT OBNF.
*
* /PUF: 8F DPVME IBWF XSJUUFO 'BSH' CFMPX JOTUFBE
* PG .FNCFST<J>. */
SFTVMU _= GPSNBU(" %T %T;=O",
.FNCFST<J>.TUSJOHPG, .FNCFST<J+1>);
^
^
/* 5IF DMPTJOH CSBDLFU PG UIF TUSVDU EFGJOJUJPO. */
SFTVMU _= "^";
SFUVSO SFTVMU;
^
Template specializations
78.4
4@ C<Q@ N@@I O@HKG<O@ NK@>D<GDU<ODJIN DI OC@ 1@HKG<O@N >C<KO@M. )DF@ OTK@ K<M<H@O@MN, JOC@M
FDI?N JA O@HKG<O@ K<M<H@O@MN ><I =@ NK@>D<GDU@? <N R@GG. 1C@ AJGGJRDIB DN =JOC OC@ B@I@M<G
?@ADIDODJI JA < O@HKG<O@ <I? DON NK@>D<GDU<ODJI AJM 0:
WPJE GPP(JOU WBMVF)()
\
// ... HFOFSBM EFGJOJUJPO ...
^
WPJE GPP(JOU WBMVF : 0)()
\
// ... TQFDJBM EFGJOJUJPO GPS [FSP ...
^
4@ RDGG O<F@ <?Q<IO<B@ JA O@HKG<O@ NK@>D<GDU<ODJIN DI OC@ ?7F3 BDA9D3??;@9 N@>ODJI =@GJR.
Meta programming
78.5
AN OC@T <M@ <=JPO >J?@ B@I@M<ODJI, O@HKG<O@N <M@ <HJIB OC@ CDBC@M G@Q@G A@<OPM@N JA !. A
O@HKG<O@ DN DI?@@? >J?@ OC<O B@I@M<O@N >J?@. 4MDODIB >J?@ OC<O B@I@M<O@N >J?@ DN ><GG@? ?7F3
BDA9D3??;@9.
#AD7 )7?B>3F7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
522
!P@ OJ O@HKG<O@N =@DIB >JHKDG@-ODH@ A@<OPM@N, NJH@ JK@M<ODJIN OC<O <M@ IJMH<GGT @S@>PO@? <O
MPIODH@ ><I =@ HJQ@? OJ >JHKDG@ ODH@ <N O@HKG<O@ DINO<IOD<ODJIN.
(Note: CA?B;>7 F;?7 8G@5F;A@ 7J75GF;A@ (1#") ;E 3@AF:7D 873FGD7 F:3F 35:;7H7E F:7 E3?7
9A3>. ,7 I;>> E77 C)FE ;@ 3 >3F7D 5:3BF7D.)
EJ75GF;@9 O@HKG<O@N <O >JHKDG@ ODH@ DN >JHHJIGT =<N@? JI M@>PMNDQ@ O@HKG<O@ DINO<IOD<ODJIN.
1J N@@ <I @S<HKG@ JA OCDN, G@O'N ADMNO >JIND?@M < M@BPG<M API>ODJI OC<O ><G>PG<O@N OC@ NPH JA
IPH=@MN AMJH 0 OJ < NK@>DAD> Q<GP@. #JM @S<HKG@, RC@I DON <MBPH@IO DN 4, OCDN AP>ODJI NCJPG?
M@OPMI OC@ M@NPGO JA 0+1+2+3+4:
JOU TVN(JOU MBTU)
\
JOU SFTVMU = 0;
GPSFBDI (WBMVF; 0 .. MBTU + 1) \
SFTVMU += WBMVF;
^
SFUVSO SFTVMU;
^
1C<O DN <I DO@M<ODQ@ DHKG@H@IO<ODJI JA OC@ API>ODJI. 1C@ N<H@ API>ODJI ><I =@ DHKG@H@IO@? =T
M@>PMNDJI <N R@GG:
JOU TVN(JOU MBTU)
\
SFUVSO (MBTU == 0
MBTU
: MBTU + TVN(MBTU - 1));
^
1C@ M@>PMNDQ@ API>ODJI M@OPMIN OC@ NPH JA OC@ G<NO Q<GP@ <I? OC@ KM@QDJPN NPH. AN TJP ><I
N@@, OC@ API>ODJI O@MHDI<O@N OC@ M@>PMNDJI =T OM@<ODIB OC@ Q<GP@ 0 NK@>D<GGT.
#PI>ODJIN <M@ IJMH<GGT MPI-ODH@ A@<OPM@N. AN PNP<G, TVN() ><I =@ @S@>PO@? <O MPI ODH@:
XSJUFMO(TVN(4));
4C@I OC@ M@NPGO DN I@@?@? <O >JHKDG@ ODH@, JI@ R<T JA <>CD@QDIB OC@ N<H@ ><G>PG<ODJI DN =T
?@ADIDIB < API>ODJI O@HKG<O@. &I OCDN ><N@, OC@ K<M<H@O@M HPNO =@ < O@HKG<O@ K<M<H@O@M, IJO <
API>ODJI K<M<H@O@M:
// 8"3/*/(: 5IJT DPEF JT JODPSSFDU.
JOU TVN(JOU MBTU)()
\
SFUVSO (MBTU == 0
MBTU
: MBTU + TVN!(MBTU - 1)());
^
1C<O API>ODJI O@HKG<O@ DINO<IOD<O@N DON@GA =T MBTU - 1 <I? OMD@N OJ ><G>PG<O@ OC@ NPH <B<DI =T
M@>PMNDJI. %JR@Q@M, OC<O >J?@ DN DI>JMM@>O.
AN OC@ O@MI<MT JK@M<OJM RJPG? =@ >JHKDG@? OJ =@ @S@>PO@? <O MPI ODH@, OC@M@ DN IJ >JI?DODJI
>C@>F OC<O O@MHDI<O@N OC@ M@>PMNDJI <O >JHKDG@ ODH@:
XSJUFMO(TVN!4()); // j DPNQJMBUJPO &3303
#AD7 )7?B>3F7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
523
1C@ >JHKDG@M ?@O@>ON OC<O OC@ O@HKG<O@ DINO<I>@N RJPG? M@>PMN@ DIADIDO@GT <I? NOJKN <O <I
<M=DOM<MT IPH=@M JA M@>PMNDJIN:
&SSPS: UFNQMBUF JOTUBODF EFOFNF.TVN!(-296) SFDVSTJWF FYQBOTJPO
JIND?@MDIB OC@ ?DAA@M@I>@ =@OR@@I OC@ O@HKG<O@ <MBPH@IO 4 <I? -296, OC@ >JHKDG@M M@NOMD>ON
O@HKG<O@ @SK<INDJI <O 300 =T ?@A<PGO.
&I H@O< KMJBM<HHDIB, M@>PMNDJI DN O@MHDI<O@? =T < O@HKG<O@ NK@>D<GDU<ODJI. 1C@ AJGGJRDIB
NK@>D<GDU<ODJI AJM 0 KMJ?P>@N OC@ @SK@>O@? M@NPGO:
// 5IF HFOFSBM EFGJOJUJPO
JOU TVN(JOU MBTU)()
\
SFUVSO MBTU + TVN!(MBTU - 1)();
^
// 5IF TQFDJBM EFGJOJUJPO GPS [FSP
JOU TVN(JOU MBTU : 0)()
\
SFUVSO 0;
^
1C@ AJGGJRDIB DN < KMJBM<H OC<O O@NON TVN():
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
XSJUFMO(TVN!4());
^
+JR OC@ KMJBM<H >JHKDG@N NP>>@NNAPGGT <I? KMJ?P>@N OC@ M@NPGO JA 4+3+2+1+0:
10
AI DHKJMO<IO KJDIO OJ H<F@ C@M@ DN OC<O OC@ API>ODJI TVN!4() DN @S@>PO@? @IODM@GT <O >JHKDG@
ODH@. 1C@ >JHKDG@? >J?@ DN OC@ @LPDQ<G@IO JA ><GGDIB XSJUFMO() RDOC GDO@M<G 10:
XSJUFMO(10); // UIF FRVJWBMFOU PG XSJUFMO(TVN!4())
AN < M@NPGO, OC@ >JHKDG@? >J?@ DN <N A<NO <I? NDHKG@ <N ><I =@. AGOCJPBC OC@ Q<GP@ 10 DN NODGG
><G>PG<O@? <N OC@ M@NPGO JA 4+3+2+1+0, OC@ @IODM@ ><G>PG<ODJI C<KK@IN <O >JHKDG@ ODH@.
1C@ KM@QDJPN @S<HKG@ ?@HJINOM<O@N JI@ JA OC@ =@I@ADON JA H@O< KMJBM<HHDIB: HJQDIB
JK@M<ODJIN AMJH MPI ODH@ OJ >JHKDG@ ODH@. 1#" J=QD<O@N NJH@ JA OC@ D?DJHN JA H@O<
KMJBM<HHDIB DI !.
Compile-time polymorphism
78.6
&I J=E@>O JMD@IO@? KMJBM<HHDIB (,,-), KJGTHJMKCDNH DN <>CD@Q@? =T DIC@MDO<I>@. #JM
@S<HKG@, DA < API>ODJI O<F@N <I DIO@MA<>@, DO <>>@KON J=E@>ON JA <IT >G<NN OC<O DIC@MDON OC<O
DIO@MA<>@.
)@O'N M@><GG <I @<MGD@M @S<HKG@ AMJH < KM@QDJPN >C<KO@M:
JNQPSU TUE.TUEJP;
JOUFSGBDF 4PVOE&NJUUFS
#AD7 )7?B>3F7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
524
\
TUSJOH FNJU4PVOE();
^
DMBTT 7JPMJO : 4PVOE&NJUUFS
\
TUSJOH FNJU4PVOE()
\
SFUVSO "z{{";
^
^
DMBTT #FMM : 4PVOE&NJUUFS
\
TUSJOH FNJU4PVOE()
\
SFUVSO "EJOH";
^
^
WPJE VTF4PVOE&NJUUJOH0CKFDU(4PVOE&NJUUFS PCKFDU)
\
// ... TPNF PQFSBUJPOT ...
XSJUFMO(PCKFDU.FNJU4PVOE());
// ... NPSF PQFSBUJPOT ...
^
WPJE NBJO()
\
VTF4PVOE&NJUUJOH0CKFDU(OFX 7JPMJO);
VTF4PVOE&NJUUJOH0CKFDU(OFX #FMM);
^
VTF4PVOE&NJUUJOH0CKFDU() DN =@I@ADODIB AMJH KJGTHJMKCDNH. &O O<F@N < 4PVOE&NJUUFS NJ
OC<O DO ><I =@ PN@? RDOC <IT OTK@ OC<O DN ?@MDQ@? AMJH OC<O DIO@MA<>@.
0DI>@ IAD=;@9 I;F: 3@K FKB7 DN DIC@M@IO OJ O@HKG<O@N, OC@T ><I =@ N@@I <N KMJQD?DIB < FDI? JA
KJGTHJMKCDNH <N R@GG. B@DIB < >JHKDG@-ODH@ A@<OPM@, OC@ KJGTHJMKCDNH OC<O O@HKG<O@N
KMJQD?@ DN ><GG@? 5A?B;>7-F;?7 BA>K?ADB:;E?. JIQ@MN@GT, ,,-'N KJGTHJMKCDNH DN ><GG@? DG@-
F;?7 BA>K?ADB:;E?.
&I M@<GDOT, I@DOC@M FDI? JA KJGTHJMKCDNH <GGJRN =@DIB PN@? RDOC 3@K FKB7 =@><PN@ OC@ OTK@N
HPNO N<ODNAT >@MO<DI M@LPDM@H@ION.
/PI-ODH@ KJGTHJMKCDNH M@LPDM@N OC<O OC@ OTK@ DHKG@H@ION < >@MO<DI DIO@MA<>@.
JHKDG@-ODH@ KJGTHJMKCDNH M@LPDM@N OC<O OC@ OTK@ DN >JHK<OD=G@ RDOC CJR DO DN PN@? =T OC@
O@HKG<O@. AN GJIB <N OC@ >J?@ >JHKDG@N, OC@ O@HKG<O@ <MBPH@IO ><I =@ PN@? RDOC OC<O
O@HKG<O@. (Note: %BF;A@3>>K, F:7 3D9G?7@F ?GEF E3F;E8K F7?B>3F7 5A@EFD3;@FE 3E I7>>. ,7 I;>>
E77 F7?B>3F7 5A@EFD3;@FE >3F7D 47>AI.)
#JM @S<HKG@, DA VTF4PVOE&NJUUJOH0CKFDU() R@M@ DHKG@H@IO@? <N < API>ODJI O@HKG<O@
DINO@<? JA < API>ODJI, DO >JPG? =@ PN@? RDOC <IT OTK@ OC<O NPKKJMO@? OC@ PCKFDU.FNJU4PVOE()
><GG:
WPJE VTF4PVOE&NJUUJOH0CKFDU(5)(5 PCKFDU)
\
// ... TPNF PQFSBUJPOT ...
XSJUFMO(PCKFDU.FNJU4PVOE());
// ... NPSF PQFSBUJPOT ...
^
DMBTT $BS
\
TUSJOH FNJU4PVOE()
#AD7 )7?B>3F7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
525
\
SFUVSO "IPOL IPOL";
^
^
// ...
VTF4PVOE&NJUUJOH0CKFDU(OFX 7JPMJO);
VTF4PVOE&NJUUJOH0CKFDU(OFX #FMM);
VTF4PVOE&NJUUJOH0CKFDU(OFX $BS);
+JO@ OC<O <GOCJPBC $BS C<N IJ DIC@MDO<I>@ M@G<ODJINCDK RDOC <IT JOC@M OTK@, OC@ >J?@
>JHKDG@N NP>>@NNAPGGT, <I? OC@ FNJU4PVOE() H@H=@M API>ODJI JA @<>C OTK@ B@ON ><GG@?.
Code bloat
78.7
1C@ >J?@ B@I@M<O@? =T OC@ >JHKDG@M DN ?DAA@M@IO AJM @Q@MT ?DAA@M@IO <MBPH@IO JA < OTK@
K<M<H@O@M, JA < Q<GP@ K<M<H@O@M, @O>.
1C@ M@<NJI AJM OC<O ><I =@ N@@I =T >JIND?@MDIB JOU <I? EPVCMF <N OTK@ O@HKG<O@ <MBPH@ION.
"<>C OTK@ RJPG? C<Q@ OJ =@ KMJ>@NN@? =T ?DAA@M@IO FDI?N JA -2 M@BDNO@MN. #JM OC<O M@<NJI,
OC@ N<H@ O@HKG<O@ I@@?N OJ =@ >JHKDG@? ?DAA@M@IOGT AJM ?DAA@M@IO O@HKG<O@ <MBPH@ION. &I
JOC@M RJM?N, OC@ >JHKDG@M I@@?N OJ B@I@M<O@ ?DAA@M@IO >J?@ AJM @<>C DINO<IOD<ODJI JA <
O@HKG<O@.
#JM @S<HKG@, DA VTF4PVOE&NJUUJOH0CKFDU() R@M@ DHKG@H@IO@? <N < O@HKG<O@, DO RJPG? =@
>JHKDG@? <N H<IT ODH@N <N OC@ IPH=@M JA ?DAA@M@IO DINO<IOD<ODJIN JA DO.
B@><PN@ DO M@NPGON DI G<MB@M KMJBM<H NDU@, OCDN @AA@>O DN ><GG@? 5A67 4>A3F. AGOCJPBC OCDN DN IJO
< KMJ=G@H DI HJNO KMJBM<HN, DO DN <I @AA@>O JA O@HKG<O@N OC<O HPNO =@ FIJRI.
JIQ@MN@GT, IJI-O@HKG<O@? Q@MNDJI JA VTF4PVOE&NJUUJOH0CKFDU() RJPG? IJO C<Q@ <IT >J?@
M@K@ODODJI. 1C@ >JHKDG@M RJPG? >JHKDG@ OC<O API>ODJI EPNO JI>@ <I? @S@>PO@ OC@ N<H@ >J?@ AJM
<GG OTK@N JA OC@ 4PVOE&NJUUFS DIO@MA<>@. &I MPI-ODH@ KJGTHJMKCDNH, C<QDIB OC@ N<H@ >J?@
=@C<Q@ ?DAA@M@IOGT AJM ?DAA@M@IO OTK@N DN <>CD@Q@? =T API>ODJI KJDIO@MN JI OC@ =<>FBMJPI?.
AGOCJPBC API>ODJI KJDIO@MN C<Q@ < NH<GG >JNO <O MPI ODH@, OC<O >JNO DN IJO NDBIDAD><IO DI HJNO
KMJBM<HN.
0DI>@ =JOC >J?@ =GJ<O <I? MPI-ODH@ KJGTHJMKCDNH C<Q@ @AA@>ON JI KMJBM<H K@MAJMH<I>@, DO
><IIJO =@ FIJRI =@AJM@C<I? RC@OC@M MPI-ODH@ KJGTHJMKCDNH JM >JHKDG@-ODH@ KJGTHJMKCDNH
RJPG? =@ < =@OO@M <KKMJ<>C AJM < NK@>DAD> KMJBM<H.
Template constraints
78.8
1C@ A<>O OC<O O@HKG<O@N ><I =@ DINO<IOD<O@? RDOC <IT <MBPH@IO T@O IJO @Q@MT <MBPH@IO DN
>JHK<OD=G@ RDOC @Q@MT O@HKG<O@ =MDIBN <I DI>JIQ@ID@I>@. &A < O@HKG<O@ <MBPH@IO DN IJO
>JHK<OD=G@ RDOC < K<MOD>PG<M O@HKG<O@, OC@ DI>JHK<OD=DGDOT DN I@>@NN<MDGT ?@O@>O@? ?PMDIB OC@
>JHKDG<ODJI JA OC@ O@HKG<O@ >J?@ AJM OC<O <MBPH@IO. AN < M@NPGO, OC@ >JHKDG<ODJI @MMJM KJDION
<O < GDI@ DIND?@ OC@ O@HKG<O@ DHKG@H@IO<ODJI.
)@O'N N@@ OCDN =T PNDIB VTF4PVOE&NJUUJOH0CKFDU() RDOC < OTK@ OC<O ?J@N IJO NPKKJMO OC@
PCKFDU.FNJU4PVOE() ><GG:
DMBTT $VQ
\
// ... EPFT OPU IBWF FNJU4PVOE() ...
^
#AD7 )7?B>3F7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
526
// ...
VTF4PVOE&NJUUJOH0CKFDU(OFX $VQ); // j JODPNQBUJCMF UZQF
AGOCJPBC <MBP<=GT OC@ @MMJM DN RDOC OC@ >J?@ OC<O PN@N OC@ O@HKG<O@ RDOC <I DI>JHK<OD=G@
OTK@, OC@ >JHKDG<ODJI @MMJM KJDION <O < GDI@ DIND?@ OC@ O@HKG<O@:
WPJE VTF4PVOE&NJUUJOH0CKFDU(5)(5 PCKFDU)
\
// ... TPNF PQFSBUJPOT ...
XSJUFMO(PCKFDU.FNJU4PVOE()); // j DPNQJMBUJPO &3303
// ... NPSF PQFSBUJPOT ...
^
AI PI?@NDM@? >JIN@LP@I>@ DN OC<O RC@I OC@ O@HKG<O@ DN < K<MO JA < OCDM?-K<MOT GD=M<MT HJ?PG@,
OC@ >JHKDG<ODJI @MMJM RJPG? <KK@<M OJ =@ < KMJ=G@H RDOC OC@ GD=M<MT DON@GA.
+JO@ OC<O OCDN DNNP@ ?J@N IJO @SDNO AJM DIO@MA<>@N: A API>ODJI OC<O O<F@N <I DIO@MA<>@ ><I JIGT
=@ ><GG@? RDOC < OTK@ OC<O DHKG@H@ION OC<O DIO@MA<>@. AOO@HKODIB OJ ><GG NP>C < API>ODJI RDOC
<IT JOC@M OTK@ DN < >JHKDG<ODJI @MMJM <O OC@ ><GG@M.
1@HKG<O@ >JIOM<DION <M@ AJM ?DN<GGJRDIB DI>JMM@>O DINO<IOD<ODJIN JA O@HKG<O@N. 1C@T <M@
?@ADI@? <N GJBD><G @SKM@NNDJIN JA <I JG >JI?DODJI MDBCO =@AJM@ OC@ O@HKG<O@ =J?T:
WPJE GPP(5)()
JG (/* ... DPOTUSBJOUT ... */)
\
// ...
^
A O@HKG<O@ ?@ADIDODJI DN >JIND?@M@? =T OC@ >JHKDG@M JIGT DA DON >JINOM<DION @Q<GP<O@ OJ USVF AJM
< NK@>DAD> DINO<IOD<ODJI JA OC@ O@HKG<O@. ,OC@MRDN@, OC@ O@HKG<O@ ?@ADIDODJI DN DBIJM@? AJM OC<O
PN@.
)@O'N N@@ <I @S<HKG@ JA OCDN RDOC < O@HKG<O@ OC<O ><G>PG<O@N OC@ A<>OJMD<G JA < IPH=@M <O
>JHKDG@ ODH@:
JNQPSU TUE.TUEJP;
VMPOH GBDUPSJBM(VMPOH OVNCFS)()
\
SFUVSO OVNCFS * GBDUPSJBM!(OVNCFS - 1)();
^
VMPOH GBDUPSJBM(VMPOH OVNCFS : 0)()
\
SFUVSO 1;
^
WPJE NBJO()
\
XSJUFGMO("19! == %26T", GBDUPSJBM!19());
XSJUFGMO("20! == %26T", GBDUPSJBM!20());
XSJUFGMO("21! == %26T", GBDUPSJBM!21());
XSJUFMO();
XSJUFGMO("(VMPOH.NBY : %T)", VMPOH.NBY);
XSJUFGMO("(BDUVBM 21!: 51090942171709440000)");
^
1C@ KMJBM<H <=JQ@ ><G>PG<O@N OC@ A<>OJMD<GN JA 19, 20, <I? 21. (Note: ):7 E3?7 53>5G>3F;A@E
5AG>6 47 B7D8AD?76 3F 5A?B;>7 F;?7 4K C)FE 3E I7>>.)
#AD7 )7?B>3F7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
527
%JR@Q@M, NDI>@ OC@ A<>OJMD<G JA 21 ><IIJO =@ M@KM@N@IO@? =T VMPOH OC@ KMJBM<H KMJ?P>@N <I
DI>JMM@>O M@NPGO:
19! == 121645100408832000
20! == 2432902008176640000
21! == 14197454024290336768 l JODPSSFDU SFTVMU
(VMPOH.NBY : 18446744073709551615)
(BDUVBM 21!: 51090942171709440000)
A O@HKG<O@ >JINOM<DIO ><I KM@Q@IO PNDIB GBDUPSJBM RDOC DI>JMM@>O Q<GP@N:
VMPOH GBDUPSJBM(VMPOH OVNCFS)()
JG (OVNCFS <= 20)
\
SFUVSO OVNCFS * GBDUPSJBM!(OVNCFS - 1)();
^
+JR OC@ >JHKDG@M RDGG >JIND?@M OC@ O@HKG<O@ JIGT AJM Q<GP@N OC<O N<ODNAT OC<O >JI?DODJI <I?
M@E@>O OC@ JOC@MN:
XSJUFGMO("21! == %26T", GBDUPSJBM!21()); // j DPNQJMBUJPO &3303
1C@ >JHKDG<ODJI @MMJM DI?D><O@N OC<O OC@M@ DN IJ O@HKG<O@ OC<O H<O>C@N OC@ ><GG
GBDUPSJBM!21():
&SSPS: UFNQMBUF EFOFNF.GBDUPSJBM EPFT OPU NBUDI BOZ GVODUJPO
UFNQMBUF EFDMBSBUJPO. $BOEJEBUFT BSF:
...
0DI>@ O@HKG<O@N <M@ < >JHKDG@-ODH@ A@<OPM@, O@HKG<O@ >JINOM<DION HPNO =@ @Q<GP<=G@ <O
>JHKDG@ ODH@. 1C@ JT @SKM@NNDJI OC<O R@ C<Q@ N@@I DI OC@ JT "SKM@NNDJI >C<KO@M DN >JHHJIGT
PN@? DI O@HKG<O@ >JINOM<DION. 4@ RDGG PN@ OC@ JT @SKM@NNDJI DI OC@ AJGGJRDIB @S<HKG@N <N R@GG.
Tuple parameter of single element 78.8.1
0JH@ODH@N OC@ NDIBG@ K<M<H@O@M JA < O@HKG<O@ I@@?N OJ =@ JI@ JA OTK@, Q<GP@, JM BMJBT FDI?N.
1C<O ><I =@ <>CD@Q@? =T < OPKG@ K<M<H@O@M JA G@IBOC JI@:
UFNQMBUF NZ5FNQMBUF(5...)
JG (5.MFOHUI == 1)
\
TUBUJD JG (JT (5<0>)) \
// 5IF TJOHMF QBSBNFUFS JT B UZQF
FOVN CPPM NZ5FNQMBUF = /* ... */;
^ FMTF \
// 5IF TJOHMF QBSBNFUFS JT TPNF PUIFS LJOE
FOVN CPPM NZ5FNQMBUF = /* ... */;
^
^
0JH@ JA OC@ O@HKG<O@N JA OC@ TUE.USBJUT HJ?PG@ O<F@ <?Q<IO<B@ JA OCDN D?DJH. 4@ RDGG N@@
TUE.USBJUT DI < G<O@M >C<KO@M.
#AD7 )7?B>3F7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
528
Named constraints 78.8.2
0JH@ODH@N OC@ >JINOM<DION <M@ >JHKG@S, H<FDIB DO C<M? OJ PI?@MNO<I? OC@ M@LPDM@H@ION JA
O@HKG<O@ K<M<H@O@MN. 1CDN >JHKG@SDOT ><I =@ C<I?G@? =T <I D?DJH OC<O @AA@>ODQ@GT BDQ@N
I<H@N OJ >JINOM<DION. 1CDN D?DJH >JH=DI@N AJPM A@<OPM@N JA !: <IJITHJPN API>ODJIN, UZQFPG,
OC@ JT @SKM@NNDJI, <I? @KJITHJPN O@HKG<O@N.
)@O'N N@@ OCDN JI < API>ODJI O@HKG<O@ OC<O C<N < OTK@ K<M<H@O@M. 1C@ O@HKG<O@ PN@N DON
API>ODJI K<M<H@O@M DI NK@>DAD> R<TN:
WPJE VTF(5)(5 PCKFDU)
\
// ...
PCKFDU.QSFQBSF();
// ...
PCKFDU.GMZ(42);
// ...
PCKFDU.MBOE();
// ...
^
AN DN J=QDJPN AMJH OC@ DHKG@H@IO<ODJI JA OC@ O@HKG<O@, OC@ OTK@N OC<O OCDN API>ODJI ><I RJMF
RDOC HPNO NPKKJMO OCM@@ NK@>DAD> API>ODJI ><GGN JI OC@ J=E@>O: QSFQBSF(), GMZ(42), <I?
MBOE().
,I@ R<T JA NK@>DATDIB < O@HKG<O@ >JINOM<DIO AJM OC<O OTK@ DN =T OC@ JT <I? UZQFPG @SKM@NNDJIN
AJM @<>C API>ODJI ><GG DIND?@ OC@ O@HKG<O@:
WPJE VTF(5)(5 PCKFDU)
JG (JT (UZQFPG(PCKFDU.QSFQBSF())) &&
JT (UZQFPG(PCKFDU.GMZ(1))) &&
JT (UZQFPG(PCKFDU.MBOE())))
\
// ...
^
& RDGG @SKG<DI OC<O NTIO<S =@GJR. #JM IJR, <>>@KO OC@ RCJG@ >JINOMP>O JA
JT (UZQFPG(PCKFDU.QSFQBSF())) OJ H@<I I:7F:7D F:7 FKB7 EGBBADFE F:7 .prepare() 53>>.
AGOCJPBC NP>C >JINOM<DION <>CD@Q@ OC@ ?@NDM@? BJ<G, NJH@ODH@N OC@T <M@ OJJ >JHKG@S OJ =@
M@<?<=G@. &INO@<?, DO DN KJNND=G@ OJ BDQ@ < HJM@ ?@N>MDKODQ@ I<H@ OJ OC@ RCJG@ >JINOM<DIO:
WPJE VTF(5)(5 PCKFDU)
JG (DBO'MZ"OE-BOE!5)
\
// ...
^
1C<O >JINOM<DIO DN HJM@ M@<?<=G@ =@><PN@ DO DN IJR HJM@ >G@<M OC<O OC@ O@HKG<O@ DN ?@NDBI@?
OJ RJMF RDOC OTK@N OC<O 53@ 8>K 3@6 >3@6.
0P>C >JINOM<DION <M@ <>CD@Q@? =T <I D?DJH OC<O DN DHKG@H@IO@? NDHDG<M OJ OC@ AJGGJRDIB
@KJITHJPN O@HKG<O@:
UFNQMBUF DBO'MZ"OE-BOE(5)
\
FOVN DBO'MZ"OE-BOE = JT (UZQFPG(
\
5 PCKFDU;
PCKFDU.QSFQBSF(); // TIPVME CF QSFQBSBCMF GPS GMJHIU
PCKFDU.GMZ(1); // TIPVME CF GMZBCMF GPS B DFSUBJO EJTUBODF
PCKFDU.MBOE(); // TIPVME CF MBOEBCMF
#AD7 )7?B>3F7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
529
^()));
^
1C@ ! A@<OPM@N OC<O O<F@ K<MO DI OC<O D?DJH <I? CJR OC@T DIO@M<>O RDOC @<>C JOC@M <M@
@SKG<DI@? =@GJR:
UFNQMBUF DBO'MZ"OE-BOE(5)
\
// (6) (5) (4)
FOVN DBO'MZ"OE-BOE = JT (UZQFPG(
\ // (1)
5 PCKFDU; // (2)
PCKFDU.QSFQBSF();
PCKFDU.GMZ(1);
PCKFDU.MBOE();
// (3)
^()));
^
1. Anonymous function: 4@ C<Q@ N@@I <IJITHJPN API>ODJIN DI OC@ #PI>ODJI -JDIO@MN,
!@G@B<O@N, <I? )<H=?<N >C<KO@M. 1C@ CDBCGDBCO@? >PMGT =M<>F@ON <=JQ@ ?@ADI@ <I
<IJITHJPN API>ODJI.
2. Function block: 1C@ API>ODJI =GJ>F PN@N OC@ OTK@ <N DO DN NPKKJN@? OJ =@ PN@? DI OC@
<>OP<G O@HKG<O@. #DMNO <I J=E@>O JA OC<O OTK@ DN ?@ADI@? <I? OC@I OC<O J=E@>O DN PN@? DI
NK@>DAD> R<TN. (1CDN >J?@ I@Q@M B@ON @S@>PO@?; N@@ =@GJR.)
3. Evaluation of the function: 1C@ @HKOT K<M@IOC@N@N <O OC@ @I? JA <I <IJITHJPN
API>ODJI IJMH<GGT @S@>PO@ OC<O API>ODJI. %JR@Q@M, NDI>@ OC<O ><GG NTIO<S DN RDOCDI <
UZQFPG, DO DN I@Q@M @S@>PO@?.
4. The UZQFPG expression: UZQFPG KMJ?P>@N OC@ OTK@ JA <I @SKM@NNDJI.
AI DHKJMO<IO A<>O <=JPO UZQFPG DN OC<O DO I@Q@M @S@>PO@N OC@ @SKM@NNDJI. /<OC@M, DO
KMJ?P>@N OC@ OTK@ JA OC@ @SKM@NNDJI ;8 OC<O @SKM@NNDJI RJPG? =@ @S@>PO@?:
JOU J = 42;
UZQFPG(++J) K; // TBNF BT 'JOU K;'
BTTFSU(J == 42); // ++J IBT OPU CFFO FYFDVUFE
AN OC@ KM@QDJPN BTTFSU KMJQ@N, OC@ @SKM@NNDJI ++J C<N IJO =@@I @S@>PO@?. UZQFPG
C<N H@M@GT KMJ?P>@? OC@ OTK@ JA OC<O @SKM@NNDJI <N JOU.
&A OC@ @SKM@NNDJI OC<O UZQFPG M@>@DQ@N DN IJO Q<GD?, UZQFPG KMJ?P>@N IJ OTK@ <O <GG
(IJO @Q@I WPJE). 0J, DA OC@ <IJITHJPN API>ODJI DIND?@ DBO'MZ"OE-BOE ><I =@
>JHKDG@? NP>>@NNAPGGT AJM 5, UZQFPG KMJ?P>@N < Q<GD? OTK@. ,OC@MRDN@, DO KMJ?P>@N IJ
OTK@ <O <GG.
5. The JT expression: 4@ C<Q@ N@@I H<IT ?DAA@M@IO PN@N JA OC@ JT @SKM@NNDJI DI OC@ JT
"SKM@NNDJI >C<KO@M. 1C@ JT (Type) NTIO<S KMJ?P>@N USVF DA 5ZQF DN Q<GD?:
JOU J;
XSJUFMO(JT (UZQFPG(J))); // USVF
XSJUFMO(JT (UZQFPG(OPOFYJTUFOU4ZNCPM))); // GBMTF
AGOCJPBC OC@ N@>JI? UZQFPG <=JQ@ M@>@DQ@N < IJI@SDNO@IO NTH=JG, OC@ >JHKDG@M ?J@N
IJO @HDO < >JHKDG<ODJI @MMJM. /<OC@M, OC@ @AA@>O DN OC<O OC@ UZQFPG @SKM@NNDJI ?J@N IJO
KMJ?P>@ <IT OTK@, NJ OC@ JT @SKM@NNDJI KMJ?P>@N GBMTF:
USVF
GBMTF
#AD7 )7?B>3F7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
530
6. Eponymous template: AN ?@N>MD=@? <=JQ@, NDI>@ OC@ DBO'MZ"OE-BOE O@HKG<O@ >JIO<DIN <
?@ADIDODJI =T OC@ N<H@ I<H@, OC@ O@HKG<O@ DINO<IOD<ODJI DN OC<O ?@ADIDODJI DON@GA.
&I OC@ @I?, VTF() B<DIN < HJM@ ?@N>MDKODQ@ >JINOM<DIO:
WPJE VTF(5)(5 PCKFDU)
JG (DBO'MZ"OE-BOE!5)
\
// ...
^
)@O'N OMT OJ PN@ OC<O O@HKG<O@ RDOC ORJ OTK@N, JI@ OC<O N<ODNAD@N OC@ >JINOM<DIO <I? JI@ OC<O
?J@N IJO N<ODNAT OC@ >JINOM<DIO:
// " UZQF UIBU EPFT NBUDI UIF UFNQMBUF'T PQFSBUJPOT
DMBTT .PEFM"JSQMBOF
\
WPJE QSFQBSF()
\^
WPJE GMZ(JOU EJTUBODF)
\^
WPJE MBOE()
\^
^
// " UZQF UIBU EPFT OPU NBUDI UIF UFNQMBUF'T PQFSBUJPOT
DMBTT 1JHFPO
\
WPJE GMZ(JOU EJTUBODF)
\^
^
// ...
VTF(OFX .PEFM"JSQMBOF); // j DPNQJMFT
VTF(OFX 1JHFPO); // j DPNQJMBUJPO &3303
+<H@? JM IJO, NDI>@ OC@ O@HKG<O@ C<N < >JINOM<DIO, OC@ >JHKDG<ODJI @MMJM KJDION <O OC@ GDI@
RC@M@ OC@ O@HKG<O@ DN PN@? M<OC@M OC<I RC@M@ DO DN DHKG@H@IO@?.
Summary
78.9
1C@ @<MGD@M O@HKG<O@ >C<KO@M C<? OC@ AJGGJRDIB M@HDI?@MN:
t 1@HKG<O@N ?@ADI@ OC@ >J?@ <N < K<OO@MI, AJM OC@ >JHKDG@M OJ B@I@M<O@ DINO<I>@N JA DO
<>>JM?DIB OJ OC@ <>OP<G PN@N DI OC@ KMJBM<H.
t 1@HKG<O@N <M@ < >JHKDG@-ODH@ A@<OPM@.
t 0K@>DATDIB O@HKG<O@ K<M<H@O@M GDNON DN NPAAD>D@IO OJ H<F@ API>ODJI, NOMP>O, <I? >G<NN
?@ADIDODJIN O@HKG<O@N.
t 1@HKG<O@ <MBPH@ION ><I =@ NK@>DAD@? @SKGD>DOGT <AO@M <I @S>G<H<ODJI H<MF. 1C@ K<M@IO@N@N
<M@ IJO I@>@NN<MT RC@I OC@M@ DN JIGT JI@ OJF@I DIND?@ OC@ K<M@IO@N@N.
t "<>C ?DAA@M@IO DINO<IOD<ODJI JA < O@HKG<O@ DN < ?DAA@M@IO OTK@.
t 1@HKG<O@ <MBPH@ION ><I JIGT =@ ?@?P>@? AJM API>ODJI O@HKG<O@N.
t 1@HKG<O@N ><I =@ NK@>D<GDU@? AJM OC@ OTK@ OC<O DN <AO@M OC@ : >C<M<>O@M.
t !@A<PGO O@HKG<O@ <MBPH@ION <M@ NK@>DAD@? <AO@M OC@ = >C<M<>O@M.
1CDN >C<KO@M <??@? OC@ AJGGJRDIB >JI>@KON:
t 1@HKG<O@N ><I =@ ?@ADI@? =T OC@ APGG NTIO<S JM OC@ NCJMO>PO NTIO<S.
#AD7 )7?B>3F7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
531
t 1C@ N>JK@ JA OC@ O@HKG<O@ DN < I<H@ NK<>@.
t A O@HKG<O@ OC<O >JIO<DIN < ?@ADIDODJI RDOC OC@ N<H@ I<H@ <N OC@ O@HKG<O@ DN ><GG@? <I
@KJITHJPN O@HKG<O@. 1C@ O@HKG<O@ M@KM@N@ION OC<O ?@ADIDODJI.
t 1@HKG<O@N ><I =@ JA API>ODJIN, >G<NN@N, NOMP>ON, PIDJIN, <I? DIO@MA<>@N, <I? @Q@MT O@HKG<O@
=J?T ><I >JIO<DI <IT IPH=@M JA ?@ADIDODJIN.
t 1@HKG<O@ K<M<H@O@MN ><I =@ JA OTK@, Q<GP@, UIJT, BMJBT, <I? OPKG@ FDI?N.
t 1@HKG<O@N ><I =@ NK@>D<GDU@? AJM K<MOD>PG<M <MBPH@ION.
t *@O< KMJBM<HHDIB DN < R<T JA @S@>PODIB JK@M<ODJIN <O >JHKDG@ ODH@.
t 1@HKG<O@N @I<=G@ 5A?B;>7-F;?7 BA>K?ADB:;E?.
t 0@K<M<O@ >J?@ B@I@M<ODJI AJM ?DAA@M@IO DINO<IOD<ODJIN ><I ><PN@ 5A67 4>A3F.
t 1@HKG<O@ >JINOM<DION GDHDO OC@ PN@N JA O@HKG<O@N AJM NK@>DAD> O@HKG<O@ <MBPH@ION. 1C@T
C@GK HJQ@ >JHKDG<ODJI @MMJMN AMJH OC@ DHKG@H@IO<ODJIN JA O@HKG<O@N OJ RC@M@ OC@
O@HKG<O@N <M@ <>OP<GGT PN@? DI>JMM@>OGT.
t &O DN HJM@ M@<?<=G@ OJ BDQ@ I<H@N OJ O@HKG<O@ >JINOM<DION.
#AD7 )7?B>3F7E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
532
More Functions 79
#PI>ODJIN C<Q@ =@@I >JQ@M@? DI OC@ AJGGJRDIB >C<KO@MN NJ A<M DI OC@ =JJF:
t #PI>ODJIN
t #PI>ODJI -<M<H@O@MN
t #PI>ODJI ,Q@MGJ<?DIB
t #PI>ODJI -JDIO@MN, !@G@B<O@N, <I? )<H=?<N
1CDN >C<KO@M RDGG >JQ@M HJM@ A@<OPM@N JA API>ODJIN.
Return type attributes
79.1
#PI>ODJIN ><I =@ H<MF@? <N BVUP, SFG, JOPVU, <I? BVUP SFG. 1C@N@ <OOMD=PO@N <M@ <=JPO
M@OPMI OTK@N JA API>ODJIN.
BVUP functions 79.1.1
1C@ M@OPMI OTK@N JA BVUP API>ODJIN I@@? IJO =@ NK@>DAD@?:
BVUP BEE(JOU GJSTU, EPVCMF TFDPOE)
\
EPVCMF SFTVMU = GJSTU + TFDPOE;
SFUVSO SFTVMU;
^
1C@ M@OPMI OTK@ DN ?@?P>@? =T OC@ >JHKDG@M AMJH OC@ SFUVSO @SKM@NNDJI. 0DI>@ OC@ OTK@ JA
SFTVMU DN EPVCMF, OC@ M@OPMI OTK@ JA BEE() DN EPVCMF.
SFG functions 79.1.2
+JMH<GGT, OC@ @SKM@NNDJI OC<O DN M@OPMI@? AMJH < API>ODJI DN >JKD@? OJ OC@ ><GG@M'N >JIO@SO. SFG
NK@>DAD@N OC<O OC@ @SKM@NNDJI NCJPG? =@ M@OPMI@? =T-M@A@M@I>@ DINO@<?.
#JM @S<HKG@, OC@ AJGGJRDIB API>ODJI M@OPMIN OC@ BM@<O@M JA DON ORJ K<M<H@O@MN:
JOU HSFBUFS(JOU GJSTU, JOU TFDPOE)
\
SFUVSO (GJSTU > TFDPOE) GJSTU : TFDPOE;
^
+JMH<GGT, =JOC OC@ K<M<H@O@MN <I? OC@ M@OPMI Q<GP@ JA OC<O API>ODJI <M@ >JKD@?:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
JOU B = 1;
JOU C = 2;
JOU SFTVMU = HSFBUFS(B, C);
SFTVMU += 10; // j OFJUIFS B OPS C DIBOHFT
XSJUFGMO("B: %T, C: %T, SFTVMU: %T", B, C, SFTVMU);
^
B@><PN@ OC@ M@OPMI Q<GP@ JA HSFBUFS() DN >JKD@? OJ SFTVMU, <??DIB OJ SFTVMU <AA@>ON JIGT
OC<O Q<MD<=G@; I@DOC@M B IJM C >C<IB@N:
B: 1, C: 2, SFTVMU: 12
#AD7 FG@5F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
533
SFG K<M<H@O@MN <M@ K<NN@? =T M@A@M@I>@N DINO@<? JA =@DIB >JKD@?. 1C@ N<H@ F@TRJM? C<N OC@
N<H@ @AA@>O JI M@OPMI Q<GP@N:
SFG JOU HSFBUFS(SFG JOU GJSTU, SFG JOU TFDPOE)
\
SFUVSO (GJSTU > TFDPOE) GJSTU : TFDPOE;
^
1CDN ODH@, OC@ M@OPMI@? M@A@M@I>@ RJPG? =@ <I <GD<N OJ JI@ JA OC@ <MBPH@ION <I? HPO<ODIB OC@
M@OPMI@? M@A@M@I>@ RJPG? HJ?DAT @DOC@M B JM C:
JOU B = 1;
JOU C = 2;
HSFBUFS(B, C) += 10; // j FJUIFS B PS C DIBOHFT
XSJUFGMO("B: %T, C: %T", B, C);
+JO@ CJR M@OPMI@? M@A@M@I>@ DN DI>M@H@IO@? ?DM@>OGT. AN < M@NPGO, OC@ BM@<O@M JA OC@ ORJ
<MBPH@ION >C<IB@N:
B: 1, C: 12
Local reference requires a pointer: AI DHKJMO<IO KJDIO DN OC<O <GOCJPBC OC@ M@OPMI OTK@ DN
H<MF@? <N SFG, B <I? C RJPG? NODGG IJO >C<IB@ DA OC@ M@OPMI Q<GP@ R@M@ <NNDBI@? OJ < GJ><G
Q<MD<=G@:
JOU SFTVMU = HSFBUFS(B, C);
SFTVMU += 10; // j POMZ SFTVMU DIBOHFT
AGOCJPBC HSFBUFS() M@OPMIN < M@A@M@I>@ OJ B JM C, OC<O M@A@M@I>@ B@ON >JKD@? OJ OC@ GJ><G
Q<MD<=G@ SFTVMU, <I? <B<DI I@DOC@M B IJM C >C<IB@N:
B: 1, C: 2, SFTVMU: 12
#JM SFTVMU =@ < M@A@M@I>@ OJ B JM C, DO C<N OJ =@ ?@ADI@? <N < KJDIO@M:
JOU * SFTVMU = &HSFBUFS(B, C);
*SFTVMU += 10;
XSJUFGMO("B: %T, C: %T, SFTVMU: %T", B, C, *SFTVMU);
1CDN ODH@ SFTVMU RJPG? =@ < M@A@M@I>@ OJ @DOC@M B JM C <I? OC@ HPO<ODJI OCMJPBC DO RJPG?
<AA@>O OC@ <>OP<G Q<MD<=G@:
B: 1, C: 12, SFTVMU: 12
It is not possible to return a reference to a local variable: 1C@ SFG M@OPMI Q<GP@ DN <I
<GD<N OJ JI@ JA OC@ <MBPH@ION OC<O NO<MO OC@DM GDQ@N @Q@I =@AJM@ OC@ API>ODJI DN ><GG@?. 1C<O
H@<IN, M@B<M?G@NN JA RC@OC@M < M@A@M@I>@ OJ B JM C DN M@OPMI@?, OC@ M@OPMI@? M@A@M@I>@ M@A@MN
OJ < Q<MD<=G@ OC<O DN NODGG <GDQ@.
JIQ@MN@GT, DO DN IJO KJNND=G@ OJ M@OPMI < M@A@M@I>@ OJ < Q<MD<=G@ OC<O DN IJO BJDIB OJ =@ <GDQ@
PKJI G@<QDIB OC@ API>ODJI:
SFG TUSJOH QBSFOUIFTJ[FE(TUSJOH QISBTF)
\
TUSJOH SFTVMU = '(' _ QISBTF _ ')';
SFUVSO SFTVMU; // j DPNQJMBUJPO &3303
^ // j UIF MJGFUJNF PG SFTVMU FOET IFSF
#AD7 FG@5F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
534
1C@ GDA@ODH@ JA GJ><G SFTVMU @I?N PKJI G@<QDIB OC@ API>ODJI. #JM OC<O M@<NJI, DO DN IJO KJNND=G@
OJ M@OPMI < M@A@M@I>@ OJ OC<O Q<MD<=G@:
&SSPS: FTDBQJOH SFGFSFODF UP MPDBM WBSJBCMF SFTVMU
BVUP SFG functions 79.1.3
BVUP SFG C@GKN RDOC API>ODJIN GDF@ QBSFOUIFTJ[FE() <=JQ@. 0DHDG<M OJ BVUP, OC@ M@OPMI OTK@
JA <I BVUP SFG API>ODJI DN ?@?P>@? =T OC@ >JHKDG@M. A??DODJI<GGT, DA OC@ M@OPMI@? @SKM@NNDJI
><I =@ < M@A@M@I>@, OC<O Q<MD<=G@ DN M@OPMI@? =T M@A@M@I>@ <N JKKJN@? OJ =@DIB >JKD@?.
QBSFOUIFTJ[FE() ><I =@ >JHKDG@? DA OC@ M@OPMI OTK@ DN BVUP SFG:
BVUP SFG TUSJOH QBSFOUIFTJ[FE(TUSJOH QISBTF)
\
TUSJOH SFTVMU = '(' _ QISBTF _ ')';
SFUVSO SFTVMU; // j DPNQJMFT
^
1C@ Q@MT ADMNO SFUVSO NO<O@H@IO JA OC@ API>ODJI ?@O@MHDI@N RC@OC@M OC@ API>ODJI M@OPMIN <
>JKT JM < M@A@M@I>@.
BVUP SFG DN HJM@ PN@APG DI API>ODJI O@HKG<O@N RC@M@ O@HKG<O@ K<M<H@O@MN H<T =@ M@A@M@I>@N
JM >JKD@N ?@K@I?DIB JI >JIO@SO.
JOPVU functions 79.1.4
1C@ JOPVU F@TRJM? <KK@<MN AJM K<M<H@O@M <I? M@OPMI OTK@N JA API>ODJIN. &O RJMFN GDF@ <
O@HKG<O@ AJM ?GF34>7, DPOTU, <I? JNNVUBCMF.
)@O'N M@RMDO@ OC@ KM@QDJPN API>ODJI <N O<FDIB TUSJOH (D.@. JNNVUBCMF(DIBS)<>) <I? M@OPMIDIB
TUSJOH:
TUSJOH QBSFOUIFTJ[FE(TUSJOH QISBTF)
\
SFUVSO '(' _ QISBTF _ ')';
^
// ...
XSJUFMO(QBSFOUIFTJ[FE("IFMMP"));
AN @SK@>O@?, OC@ >J?@ RJMFN RDOC OC<O TUSJOH <MBPH@IO:
(IFMMP)
%JR@Q@M, <N DO RJMFN JIGT RDOC JNNVUBCMF NOMDIBN, OC@ API>ODJI ><I =@ N@@I <N =@DIB G@NN
PN@APG OC<I DO >JPG? C<Q@ =@@I:
DIBS<> N; // IBT NVUBCMF FMFNFOUT
N _= "IFMMP";
XSJUFMO(QBSFOUIFTJ[FE(N)); // j DPNQJMBUJPO &3303
&SSPS: GVODUJPO EFOFNF.QBSFOUIFTJ[FE (TUSJOH QISBTF)
JT OPU DBMMBCMF VTJOH BSHVNFOU UZQFT (DIBS<>)
1C@ N<H@ GDHDO<ODJI <KKGD@N OJ DPOTU(DIBS)<> NOMDIBN <N R@GG.
#AD7 FG@5F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
535
,I@ NJGPODJI AJM OCDN PN<=DGDOT DNNP@ DN OJ JQ@MGJ<? OC@ API>ODJI AJM ?GF34>7 <I? DPOTU NOMDIBN:
DIBS<> QBSFOUIFTJ[FE(DIBS<> QISBTF)
\
SFUVSO '(' _ QISBTF _ ')';
^
DPOTU(DIBS)<> QBSFOUIFTJ[FE(DPOTU(DIBS)<> QISBTF)
\
SFUVSO '(' _ QISBTF _ ')';
^
1C<O ?@NDBI RJPG? =@ G@NN OC<I D?@<G ?P@ OJ OC@ J=QDJPN >J?@ ?PKGD><ODJIN. AIJOC@M NJGPODJI
RJPG? =@ OJ ?@ADI@ OC@ API>ODJI <N < O@HKG<O@:
5 QBSFOUIFTJ[FE(5)(5 QISBTF)
\
SFUVSO '(' _ QISBTF _ ')';
^
AGOCJPBC OC<O RJPG? RJMF, OCDN ODH@ DO H<T =@ N@@I <N =@DIB OJJ AG@SD=G@ <I? KJO@IOD<GGT
M@LPDMDIB O@HKG<O@ >JINOM<DION.
JOPVU DN Q@MT NDHDG<M OJ OC@ O@HKG<O@ NJGPODJI. 1C@ ?DAA@M@I>@ DN OC<O IJO OC@ @IODM@ OTK@ =PO
EPNO OC@ HPO<=DGDOT <OOMD=PO@ DN ?@?P>@? AMJH OC@ K<M<H@O@M:
JOPVU(DIBS)<> QBSFOUIFTJ[FE(JOPVU(DIBS)<> QISBTF)
\
SFUVSO '(' _ QISBTF _ ')';
^
JOPVU OM<INA@MN OC@ ?@?P>@? HPO<=DGDOT <OOMD=PO@ OJ OC@ M@OPMI OTK@.
4C@I OC@ API>ODJI DN ><GG@? RDOC DIBS<>, DO B@ON >JHKDG@? <N DA JOPVU DN IJO NK@>DAD@? <O <GG.
,I OC@ JOC@M C<I?, RC@I ><GG@? RDOC JNNVUBCMF(DIBS)<> JM DPOTU(DIBS)<>, JOPVU H@<IN
JNNVUBCMF JM DPOTU, M@NK@>ODQ@GT.
1C@ AJGGJRDIB >J?@ ?@HJINOM<O@N OCDN =T KMDIODIB OC@ OTK@ JA OC@ M@OPMI@? @SKM@NNDJI:
DIBS<> N;
XSJUFMO(UZQFPG(QBSFOUIFTJ[FE(N)).TUSJOHPG);
DPOTU(DIBS)<> D;
XSJUFMO(UZQFPG(QBSFOUIFTJ[FE(D)).TUSJOHPG);
JNNVUBCMF(DIBS)<> J;
XSJUFMO(UZQFPG(QBSFOUIFTJ[FE(J)).TUSJOHPG);
1C@ JPOKPO:
DIBS<>
DPOTU(DIBS)<>
TUSJOH
Behavioral attributes
79.2
QVSF <I? OPUISPX <M@ <=JPO =@C<QDJMN JA API>ODJIN.
#AD7 FG@5F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
536
QVSF functions 79.2.1
AN R@ C<Q@ N@@I DI OC@ #PI>ODJIN >C<KO@M, API>ODJIN ><I KMJ?P>@ M@OPMI Q<GP@N <I? ND?@
@AA@>ON. 4C@I KJNND=G@, M@OPMI Q<GP@N NCJPG? =@ KM@A@MM@? JQ@M ND?@ @AA@>ON =@><PN@ API>ODJIN
OC<O ?J IJO C<Q@ ND?@ @AA@>ON <M@ @<ND@M OJ H<F@ N@IN@ JA, RCD>C DI OPMI C@GKN RDOC KMJBM<H
>JMM@>OI@NN <I? H<DIO<DI<=DGDOT.
A NDHDG<M >JI>@KO DN OC@ KPMDOT JA < API>ODJI. -PMDOT DN ?@ADI@? ?DAA@M@IOGT DI ! AMJH HJNO JOC@M
KMJBM<HHDIB G<IBP<B@N: &I !, < API>ODJI OC<O ?J@N IJO <>>@NN ?GF34>7 BGJ=<G JM TUBUJD NO<O@
DN KPM@. (0DI>@ DIKPO <I? JPOKPO NOM@<HN <M@ >JIND?@M@? <N HPO<=G@ BGJ=<G NO<O@, KPM@
API>ODJIN ><IIJO K@MAJMH DIKPO JM JPOKPO JK@M<ODJIN @DOC@M.)
&I JOC@M RJM?N, < API>ODJI DN KPM@ DA DO KMJ?P>@N DON M@OPMI Q<GP@ <I? ND?@ @AA@>ON JIGT =T
<>>@NNDIB DON K<M<H@O@MN, GJ><G Q<MD<=G@N, <I? ;??GF34>7 BGJ=<G NO<O@.
AI DHKJMO<IO <NK@>O JA KPMDOT DI ! DN OC<O KPM@ API>ODJIN ><I HPO<O@ OC@DM K<M<H@O@MN.
A??DODJI<GGT, OC@ AJGGJRDIB JK@M<ODJIN OC<O HPO<O@ OC@ BGJ=<G NO<O@ JA OC@ KMJBM<H <M@
@SKGD>DOGT <GGJR@? DI KPM@ API>ODJIN:
t AGGJ><O@ H@HJMT RDOC OC@ OFX @SKM@NNDJI
t 1@MHDI<O@ OC@ KMJBM<H
t A>>@NN OC@ AGJ<ODIB KJDIO KMJ>@NNDIB AG<BN
t 1CMJR @S>@KODJIN
1C@ QVSF F@TRJM? NK@>DAD@N OC<O < API>ODJI NCJPG? =@C<Q@ <>>JM?DIB OJ OCJN@ >JI?DODJIN <I?
OC@ >JHKDG@M BP<M<IO@@N OC<O DO ?J@N NJ.
+<OPM<GGT, NDI>@ DHKPM@ API>ODJIN ?J IJO KMJQD?@ OC@ N<H@ BP<M<IO@@N, < KPM@ API>ODJI ><IIJO
><GG DHKPM@ API>ODJIN.
1C@ AJGGJRDIB KMJBM<H ?@HJINOM<O@N NJH@ JA OC@ JK@M<ODJIN OC<O < KPM@ API>ODJI ><I <I?
><IIJO K@MAJMH:
JNQPSU TUE.TUEJP;
JNQPSU TUE.FYDFQUJPO;
JOU NVUBCMF(MPCBM;
DPOTU JOU DPOTU(MPCBM;
JNNVUBCMF JOU JNNVUBCMF(MPCBM;
WPJE JNQVSF'VODUJPO()
\^
JOU QVSF'VODUJPO(SFG JOU J, JOU<> TMJDF) QVSF
\
// $BO UISPX FYDFQUJPOT:
FOGPSDF(TMJDF.MFOHUI >= 1);
// $BO NVUBUF JUT QBSBNFUFST:
J = 42;
TMJDF<0> = 43;
// $BO BDDFTT JNNVUBCMF HMPCBM TUBUF:
J = DPOTU(MPCBM;
J = JNNVUBCMF(MPCBM;
// $BO VTF UIF OFX FYQSFTTJPO:
BVUP Q = OFX JOU;
// $BOOPU BDDFTT NVUBCMF HMPCBM TUBUF:
J = NVUBCMF(MPCBM; // j DPNQJMBUJPO &3303
// $BOOPU QFSGPSN JOQVU BOE PVUQVU PQFSBUJPOT:
XSJUFMO(J); // j DPNQJMBUJPO &3303
#AD7 FG@5F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
537
TUBUJD JOU NVUBCMF4UBUJD;
// $BOOPU BDDFTT NVUBCMF TUBUJD TUBUF:
J = NVUBCMF4UBUJD; // j DPNQJMBUJPO &3303
// $BOOPU DBMM JNQVSF GVODUJPOT:
JNQVSF'VODUJPO(); // j DPNQJMBUJPO &3303
SFUVSO 0;
^
WPJE NBJO()
\
JOU J;
JOU<> TMJDF = < 1 >;
QVSF'VODUJPO(J, TMJDF);
^
AGOCJPBC OC@T <M@ <GGJR@? OJ, NJH@ KPM@ API>ODJIN ?J IJO HPO<O@ OC@DM K<M<H@O@MN. #JGGJRDIB
AMJH OC@ MPG@N JA KPMDOT, OC@ JIGT J=N@MQ<=G@ @AA@>O JA NP>C < API>ODJI RJPG? =@ DON M@OPMI
Q<GP@. #PMOC@M, NDI>@ OC@ API>ODJI ><IIJO <>>@NN <IT HPO<=G@ BGJ=<G NO<O@, OC@ M@OPMI Q<GP@
RJPG? =@ OC@ N<H@ AJM < BDQ@I N@O JA <MBPH@ION, M@B<M?G@NN JA RC@I <I? CJR H<IT ODH@N OC@
API>ODJI DN ><GG@? ?PMDIB OC@ @S@>PODJI JA OC@ KMJBM<H. 1CDN A<>O BDQ@N =JOC OC@ >JHKDG@M <I?
OC@ KMJBM<HH@M JKODHDU<ODJI JKKJMOPIDOD@N. #JM @S<HKG@, DINO@<? JA ><GGDIB OC@ API>ODJI <
N@>JI? ODH@ AJM < BDQ@I N@O JA <MBPH@ION, DON M@OPMI Q<GP@ AMJH OC@ ADMNO ><GG ><I =@ ><>C@?
<I? PN@? DINO@<? JA <>OP<GGT ><GGDIB OC@ API>ODJI <B<DI.
0DI>@ OC@ @S<>O >J?@ OC<O B@ON B@I@M<O@? AJM < O@HKG<O@ DINO<IOD<ODJI ?@K@I?N JI OC@ <>OP<G
O@HKG<O@ <MBPH@ION, RC@OC@M OC@ B@I@M<O@? >J?@ DN KPM@ ?@K@I?N JI OC@ <MBPH@ION <N R@GG.
#JM OC<O M@<NJI, OC@ KPMDOT JA < O@HKG<O@ DN DIA@MM@? =T OC@ >JHKDG@M AMJH OC@ B@I@M<O@? >J?@.
(1C@ QVSF F@TRJM? ><I NODGG =@ NK@>DAD@? =T OC@ KMJBM<HH@M.)
AN < NDHKG@ @S<HKG@, NDI>@ OC@ AJGGJRDIB API>ODJI O@HKG<O@ RJPG? =@ DHKPM@ RC@I / DN U@MJ,
DO RJPG? IJO =@ KJNND=G@ OJ ><GG UFNQM!0() AMJH < KPM@ API>ODJI:
JNQPSU TUE.TUEJP;
// 5IJT UFNQMBUF JT JNQVSF XIFO / JT [FSP
WPJE UFNQM(TJ[F@U /)()
\
TUBUJD JG (/ == 0) \
// 1SJOUT XIFO / JT [FSP:
XSJUFMO("[FSP");
^
^
WPJE GPP() QVSF
\
UFNQM!0(); // j DPNQJMBUJPO &3303
^
WPJE NBJO()
\
GPP();
^
1C@ >JHKDG@M DIA@MN OC<O OC@ 0 DINO<IOD<ODJI JA OC@ O@HKG<O@ DN DHKPM@ <I? M@E@>ON ><GGDIB DO
AMJH OC@ KPM@ API>ODJI GPP():
&SSPS: QVSF GVODUJPO 'EFOFNF.GPP' DBOOPU DBMM JNQVSF GVODUJPO
'EFOFNF.UFNQM!0.UFNQM'
#AD7 FG@5F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
538
%JR@Q@M, NDI>@ OC@ DINO<IOD<ODJI JA OC@ O@HKG<O@ AJM Q<GP@N JOC@M OC<I U@MJ DN KPM@, OC@
KMJBM<H ><I =@ >JHKDG@? AJM NP>C Q<GP@N:
WPJE GPP() QVSF
\
UFNQM!1(); // j DPNQJMFT
^
4@ C<Q@ N@@I @<MGD@M <=JQ@ OC<O DIKPO <I? JPOKPO API>ODJIN GDF@ XSJUFMO() ><IIJO =@ PN@? DI
KPM@ API>ODJIN =@><PN@ OC@T <>>@NN BGJ=<G NO<O@. 0JH@ODH@N NP>C GDHDO<ODJIN <M@ OJJ
M@NOMD>ODQ@ @.B. RC@I I@@?DIB OJ KMDIO < H@NN<B@ O@HKJM<MDGT ?PMDIB ?@=PBBDIB. #JM OC<O
M@<NJI, OC@ KPMDOT MPG@N <M@ M@G<S@? AJM >J?@ OC<O DN H<MF@? <N EFCVH:
JNQPSU TUE.TUEJP;
EFCVH TJ[F@U GPP$PVOUFS;
WPJE GPP(JOU J) QVSF
\
EFCVH ++GPP$PVOUFS;
JG (J == 0) \
EFCVH XSJUFMO("J JT [FSP");
J = 42;
^
// ...
^
WPJE NBJO()
\
GPSFBDI (J; 0..100) \
JG ((J % 10) == 0) \
GPP(J);
^
^
EFCVH XSJUFGMO("GPP JT DBMMFE %T UJNFT", GPP$PVOUFS);
^
1C@ KPM@ API>ODJI <=JQ@ HPO<O@N OC@ BGJ=<G NO<O@ JA OC@ KMJBM<H =T HJ?DATDIB < BGJ=<G
Q<MD<=G@ <I? KMDIODIB < H@NN<B@. !@NKDO@ OCJN@ DHKPM@ JK@M<ODJIN, DO NODGG ><I =@ >JHKDG@?
=@><PN@ OCJN@ JK@M<ODJIN <M@ H<MF@? <N EFCVH.
Note: '7?7?47D F:3F F:AE7 EF3F7?7@FE 3D7 ;@5>G676 ;@ F:7 BDA9D3? A@>K ;8 F:7 BDA9D3? ;E
5A?B;>76 I;F: F:7 -debug 5A??3@6 >;@7 EI;F5:.
*@H=@M API>ODJIN ><I =@ H<MF@? <N QVSF <N R@GG. 0P=>G<NN@N ><I JQ@MMD?@ DHKPM@ API>ODJIN
<N QVSF =PO OC@ M@Q@MN@ DN IJO <GGJR@?:
JOUFSGBDF *GBDF
\
WPJE GPP() QVSF; // 4VCDMBTTFT NVTU EFGJOF GPP BT QVSF.
WPJE CBS(); // 4VCDMBTTFT NBZ EFGJOF CBS BT QVSF.
^
DMBTT 4fOfG : *GBDF
\
WPJE GPP() QVSF // 3FRVJSFE UP CF QVSF
\
// ...
^
WPJE CBS() QVSF // QVSF BMUIPVHI OPU SFRVJSFE
#AD7 FG@5F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
539
\
// ...
^
^
!@G@B<O@N <I? <IJITHJPN API>ODJIN ><I =@ KPM@ <N R@GG. 0DHDG<M OJ O@HKG<O@N, RC@OC@M <
API>ODJI JM ?@G@B<O@ GDO@M<G DN KPM@ DN DIA@MM@? =T OC@ >JHKDG@M:
JNQPSU TUE.TUEJP;
WPJE GPP(JOU EFMFHBUF(EPVCMF) QVSF EH)
\
JOU J = EH(1.5);
^
WPJE NBJO()
\
GPP(B => 42); // j DPNQJMFT
GPP((B) \ // j DPNQJMBUJPO &3303
XSJUFMO("IFMMP");
SFUVSO 42;
^);
^
GPP() <=JQ@ M@LPDM@N OC<O DON K<M<H@O@M =@ < KPM@ ?@G@B<O@. 1C@ >JHKDG@M DIA@MN OC<O OC@
G<H=?< B => 42 DN KPM@ <I? <GGJRN DO <N <I <MBPH@IO AJM GPP(). %JR@Q@M, NDI>@ OC@ JOC@M
?@G@B<O@ DN DHKPM@ DO ><IIJO =@ K<NN@? OJ GPP():
&SSPS: GVODUJPO EFOFNF.GPP (JOU EFMFHBUF(EPVCMF) QVSF EH)
JT OPU DBMMBCMF VTJOH BSHVNFOU UZQFT (WPJE)
OPUISPX functions 79.2.2
4@ C<Q@ N@@I OC@ @S>@KODJI H@>C<IDNH JA ! DI OC@ "S>@KODJIN >C<KO@M. &O DN BJJ? KM<>OD>@ AJM
API>ODJIN OJ ?J>PH@IO OC@ OTK@N JA @S>@KODJIN OC<O OC@T H<T OCMJR PI?@M NK@>DAD> @MMJM
>JI?DODJIN. AN < B@I@M<G MPG@, ><GG@MN ><I <NNPH@ OC<O <IT API>ODJI ><I OCMJR @S>@KODJIN OC<O
<M@ ?@MDQ@? AMJH &YDFQUJPO. ('7?7?47D F:3F ;F ;E @AF D75A??7@676 FA 53F5: Error @AD ;FE
43E7 5>3EE Throwable.)
0JH@ODH@N DO DN HJM@ DHKJMO<IO OJ FIJR OC<O < API>ODJI ?J@N IJO @HDO <IT @S>@KODJI <O <GG.
0JH@ <GBJMDOCHN ><I O<F@ <?Q<IO<B@ JA OC@ A<>O OC<O >@MO<DI JA OC@DM NO@KN ><IIJO =@
DIO@MMPKO@? =T <I @S>@KODJI.
OPUISPX BP<M<IO@@N OC<O < API>ODJI ?J@N IJO @HDO <IT @S>@KODJI:
JOU BEE(JOU MIT, JOU SIT) OPUISPX
\
// ...
^
0P>C < API>ODJI ><I I@DOC@M OCMJR <I @S>@KODJI DON@GA IJM ><I ><GG < API>ODJI OC<O H<T OCMJR
<I @S>@KODJI:
JOU BEE(JOU MIT, JOU SIT) OPUISPX
\
XSJUFMO("BEEJOH"); // j DPNQJMBUJPO &3303
SFUVSO MIT + SIT;
^
#AD7 FG@5F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
540
1C@ >JHKDG@M M@E@>ON OC@ >J?@ =@><PN@ BEE() QDJG<O@N OC@ IJ-OCMJR BP<M<IO@@:
&SSPS: GVODUJPO 'EFOFNF.BEE' JT OPUISPX ZFU NBZ UISPX
1C@ M@<NJI DN OC<O XSJUFMO DN IJO (<I? ><IIJO =@) < OPUISPX API>ODJI.
1C@ >JHKDG@M ><I DIA@M OC<O < API>ODJI ><I I@Q@M @HDO <I @S>@KODJI. 1C@ AJGGJRDIB
DHKG@H@IO<ODJI JA BEE() DN OPUISPX =@><PN@ DO DN J=QDJPN OJ OC@ >JHKDG@M OC<O OC@ USZ-DBUDI
=GJ>F KM@Q@ION <IT @S>@KODJI AMJH @N><KDIB OC@ API>ODJI:
JOU BEE(JOU MIT, JOU SIT) OPUISPX
\
JOU SFTVMU;
USZ \
XSJUFMO("BEEJOH"); // j DPNQJMFT
SFTVMU = MIT + SIT;
^ DBUDI (&YDFQUJPO FSSPS) \ // DBUDIFT BMM FYDFQUJPOT
// ...
^
SFUVSO SFTVMU;
^
AN DI KPMDOT, OC@ >JHKDG@M <POJH<OD><GGT ?@?P>@N RC@OC@M < O@HKG<O@, ?@G@B<O@, JM <IJITHJPN
API>ODJI DN OPUISPX.
Code safety attributes
79.3
!TBGF, !USVTUFE, <I? !TZTUFN <M@ <=JPO OC@ >J?@ N<A@OT OC<O < API>ODJI KMJQD?@N. AN DI
KPMDOT, OC@ >JHKDG@M <POJH<OD><GGT ?@?P>@N OC@ N<A@OT G@Q@G JA O@HKG<O@N, ?@G@B<O@N, <I?
<IJITHJPN API>ODJIN.
!TBGF functions 79.3.1
A >G<NN JA KMJBM<HHDIB @MMJMN DIQJGQ@ 5ADDGBF;@9 ?<O< <O PIM@G<O@? GJ><ODJIN DI H@HJMT =T
RMDODIB <O OCJN@ GJ><ODJIN PIDIO@IODJI<GGT. 0P>C @MMJMN <M@ HJNOGT ?P@ OJ HDNO<F@N H<?@ DI
PNDIB KJDIO@MN <I? <KKGTDIB OTK@ ><NON.
!TBGF API>ODJIN BP<M<IO@@ OC<O OC@T ?J IJO >JIO<DI <IT JK@M<ODJI OC<O H<T >JMMPKO H@HJMT.
1C@ >JHKDG@M ?J@N IJO <GGJR OC@ AJGGJRDIB JK@M<ODJIN DI !TBGF API>ODJIN:
t -JDIO@MN H<T IJO =@ >JIQ@MO@? OJ JOC@M KJDIO@M OTK@N JOC@M OC<I WPJE*.
t A IJI-KJDIO@M @SKM@NNDJI H<T IJO =@ >JIQ@MO@? OJ < KJDIO@M Q<GP@.
t -JDIO@MN H<T IJO =@ HPO<O@?.
t 2IDJIN OC<O C<Q@ KJDIO@M JM M@A@M@I>@ H@H=@MN H<T IJO =@ PN@?.
t #PI>ODJIN H<MF@? <N !TZTUFN H<T IJO =@ ><GG@?.
t "S>@KODJIN OC<O <M@ IJO ?@N>@I?@? AMJH &YDFQUJPO H<T IJO =@ ><PBCO.
t !@>;@7 3EE7?4>7D H<T IJO =@ PN@?.
t #GF34>7 Q<MD<=G@N H<T IJO =@ ><NO@? OJ JNNVUBCMF.
t JNNVUBCMF Q<MD<=G@N H<T IJO =@ ><NO@? OJ ?GF34>7.
t 1CM@<?-GJ><G Q<MD<=G@N H<T IJO =@ ><NO@? OJ TIBSFE.
t TIBSFE Q<MD<=G@N H<T IJO =@ ><NO@? OJ OCM@<?-GJ><G.
t A??M@NN@N JA API>ODJI-GJ><G Q<MD<=G@N H<T IJO =@ O<F@I.
t @@HTIBSFE Q<MD<=G@N H<T IJO =@ <>>@NN@?.
#AD7 FG@5F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
541
!USVTUFE functions 79.3.2
0JH@ API>ODJIN H<T <>OP<GGT =@ N<A@ =PO ><IIJO =@ H<MF@? <N !TBGF AJM Q<MDJPN M@<NJIN. #JM
@S<HKG@, < API>ODJI H<T C<Q@ OJ ><GG < GD=M<MT RMDOO@I DI , RC@M@ IJ G<IBP<B@ NPKKJMO @SDNON
AJM N<A@OT DI OC<O G<IBP<B@.
0JH@ JOC@M API>ODJIN H<T <>OP<GGT K@MAJMH JK@M<ODJIN OC<O <M@ IJO <GGJR@? DI !TBGF >J?@,
=PO H<T =@ R@GG O@NO@? <I? FDGEF76 OJ =@ >JMM@>O.
!USVTUFE DN <I <OOMD=PO@ OC<O >JHHPID><O@N OJ OC@ >JHKDG@M OC<O 3>F:AG9: F:7 8G@5F;A@
53@@AF 47 ?3D=76 3E @safe, 5A@E;67D ;F E387. 1C@ >JHKDG@M OMPNON OC@ KMJBM<HH@M <I? OM@<ON
!USVTUFE >J?@ <N DA DO DN N<A@. #JM @S<HKG@, DO <GGJRN !TBGF >J?@ OJ ><GG !USVTUFE >J?@.
!TZTUFN functions 79.3.3
AIT API>ODJI OC<O DN IJO H<MF@? <N !TBGF JM !USVTUFE DN >JIND?@M@? !TZTUFN, RCD>C DN OC@
?@A<PGO N<A@OT <OOMD=PO@.
Compile time function execution (CTFE)
79.4
&I H<IT KMJBM<HHDIB G<IBP<B@N, >JHKPO<ODJIN OC<O <M@ K@MAJMH@? <O >JHKDG@ ODH@ <M@ Q@MT
GDHDO@?. 0P>C >JHKPO<ODJIN <M@ PNP<GGT <N NDHKG@ <N ><G>PG<ODIB OC@ G@IBOC JA < ADS@?-G@IBOC
<MM<T JM NDHKG@ <MDOCH@OD> JK@M<ODJIN:
XSJUFMO(1 + 2);
1C@ 1 + 2 @SKM@NNDJI <=JQ@ DN >JHKDG@? <N DA DO C<N =@@I RMDOO@I <N 3; OC@M@ DN IJ
>JHKPO<ODJI <O MPIODH@.
! C<N 1#", RCD>C <GGJRN <IT API>ODJI OJ =@ @S@>PO@? <O >JHKDG@ ODH@ <N GJIB <N DO DN
KJNND=G@ OJ ?J NJ.
)@O'N >JIND?@M OC@ AJGGJRDIB KMJBM<H OC<O KMDION < H@IP OJ OC@ JPOKPO:
JNQPSU TUE.TUEJP;
JNQPSU TUE.TUSJOH;
JNQPSU TUE.SBOHF;
TUSJOH NFOV-JOFT(TUSJOH<> DIPJDFT)
\
TUSJOH SFTVMU;
GPSFBDI (J, DIPJDF; DIPJDFT) \
SFTVMU _= GPSNBU(" %T. %T=O", J + 1, DIPJDF);
^
SFUVSO SFTVMU;
^
TUSJOH NFOV(TUSJOH UJUMF,
TUSJOH<> DIPJDFT,
TJ[F@U XJEUI)
\
SFUVSO GPSNBU("%T=O%T=O%T",
UJUMF.DFOUFS(XJEUI),
'='.SFQFBU(XJEUI), // IPSJ[POUBM MJOF
NFOV-JOFT(DIPJDFT));
^
WPJE NBJO()
\
FOVN ESJOLT =
#AD7 FG@5F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
542
NFOV("%SJOLT",
< "$PGGFF", "5FB", ")PU DIPDPMBUF" >, 20);
XSJUFMO(ESJOLT);
^
AGOCJPBC OC@ N<H@ M@NPGO ><I =@ <>CD@Q@? DI ?DAA@M@IO R<TN, OC@ KMJBM<H <=JQ@ K@MAJMHN
IJI-OMDQD<G JK@M<ODJIN OJ KMJ?P>@ OC@ AJGGJRDIB TUSJOH:
%SJOLT
====================
1. $PGGFF
2. 5FB
3. )PU DIPDPMBUF
/@H@H=@M OC<O OC@ DIDOD<G Q<GP@ JA FOVN >JINO<ION GDF@ ESJOLT HPNO =@ FIJRI <O >JHKDG@
ODH@. 1C<O A<>O DN NPAAD>D@IO AJM NFOV() OJ =@ @S@>PO@? <O >JHKDG@ ODH@. 1C@ Q<GP@ OC<O DO
M@OPMIN <O >JHKDG@ ODH@ DN PN@? <N OC@ DIDOD<G Q<GP@ JA ESJOLT. AN < M@NPGO, OC@ KMJBM<H DN
>JHKDG@? <N DA OC<O Q<GP@ DN RMDOO@I @SKGD>DOGT DI OC@ KMJBM<H:
// 5IF FRVJWBMFOU PG UIF DPEF BCPWF:
FOVN ESJOLT = " %SJOLT =O"
"=====================O"
" 1. $PGGFF=O"
" 2. 5FB=O"
" 3. )PU DIPDPMBUF=O";
#JM < API>ODJI OJ =@ @S@>PO@? <O >JHKDG@ ODH@, DO HPNO <KK@<M DI <I @SKM@NNDJI OC<O DI A<>O DN
I@@?@? <O >JHKDG@ ODH@:
t &IDOD<GDUDIB < TUBUJD Q<MD<=G@
t &IDOD<GDUDIB <I FOVN Q<MD<=G@
t <G>PG<ODIB OC@ G@IBOC JA < ADS@?-G@IBOC <MM<T
t <G>PG<ODIB < O@HKG<O@ H3>G7 <MBPH@IO
G@<MGT, DO RJPG? IJO =@ KJNND=G@ OJ @S@>PO@ @Q@MT API>ODJI <O >JHKDG@ ODH@. #JM @S<HKG@, <
API>ODJI OC<O <>>@NN@N < BGJ=<G Q<MD<=G@ ><IIJO =@ @S@>PO@? <O >JHKDG@ ODH@ =@><PN@ OC@
BGJ=<G Q<MD<=G@ ?J@N IJO NO<MO DON GDA@ PIODG MPI ODH@. 0DHDG<MGT, NDI>@ TUEPVU DN <Q<DG<=G@ JIGT <O
MPI ODH@, API>ODJIN OC<O KMDIO ><IIJO =@ @S@>PO@? <O >JHKDG@ ODH@.
The @@DUGF variable 79.4.1
&O DN < KJR@MAPG <NK@>O JA 1#" OC<O OC@ N<H@ API>ODJI DN PN@? AJM =JOC >JHKDG@ ODH@ <I? MPI
ODH@ ?@K@I?DIB JI RC@I DON M@NPGO DN I@@?@?. AGOCJPBC OC@ API>ODJI I@@? IJO =@ RMDOO@I DI
<IT NK@>D<G R<T AJM 1#", NJH@ JK@M<ODJIN DI OC@ API>ODJI H<T H<F@ N@IN@ JIGT <O >JHKDG@
ODH@ JM MPI ODH@. 1C@ NK@>D<G Q<MD<=G@ @@DUGF ><I =@ PN@? OJ ?DAA@M@IOD<O@ OC@ >J?@ OC<O <M@
JIGT AJM >JHKDG@ ODH@ JM JIGT AJM MPI ODH@. 1C@ Q<GP@ JA OCDN Q<MD<=G@ DN USVF RC@I OC@
API>ODJI DN =@DIB @S@>PO@? AJM 1#", GBMTF JOC@MRDN@:
JNQPSU TUE.TUEJP;
TJ[F@U DPVOUFS;
JOU GPP()
\
JG (!@@DUGF) \
// 5IJT DPEF JT GPS FYFDVUJPO BU SVO UJNF
++DPVOUFS;
#AD7 FG@5F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
543
^
SFUVSO 42;
^
WPJE NBJO()
\
FOVN J = GPP();
BVUP K = GPP();
XSJUFGMO("GPP JT DBMMFE %T UJNFT.", DPVOUFS);
^
AN DPVOUFS GDQ@N JIGT <O MPI ODH@, DO ><IIJO =@ DI>M@H@IO@? <O >JHKDG@ ODH@. #JM OC<O M@<NJI,
OC@ >J?@ <=JQ@ <OO@HKON OJ DI>M@H@IO DO JIGT AJM MPI-ODH@ @S@>PODJI. 0DI>@ OC@ Q<GP@ JA J DN
?@O@MHDI@? <O >JHKDG@ ODH@ <I? OC@ Q<GP@ JA K DN ?@O@MHDI@? <O MPI ODH@, GPP() DN M@KJMO@? OJ
C<Q@ =@@I ><GG@? EPNO JI>@ ?PMDIB OC@ @S@>PODJI JA OC@ KMJBM<H:
GPP JT DBMMFE 1 UJNFT.
Summary
79.5
t 1C@ M@OPMI OTK@ JA <I BVUP API>ODJI DN ?@?P>@? <POJH<OD><GGT.
t 1C@ M@OPMI Q<GP@ JA < SFG API>ODJI DN < M@A@M@I>@ OJ <I @SDNODIB Q<MD<=G@.
t 1C@ M@OPMI Q<GP@ JA <I BVUP SFG API>ODJI DN < M@A@M@I>@ DA KJNND=G@, < >JKT JOC@MRDN@.
t JOPVU ><MMD@N OC@ ?GF34>7, DPOTU, JM JNNVUBCMF <OOMD=PO@ JA OC@ K<M<H@O@M OJ OC@ M@OPMI
OTK@.
t A QVSF API>ODJI ><IIJO <>>@NN ?GF34>7 BGJ=<G JM NO<OD> NO<O@. 1C@ >JHKDG@M DIA@MN OC@
KPMDOT JA O@HKG<O@N, ?@G@B<O@N <I? <IJITHJPN API>ODJIN.
t OPUISPX API>ODJIN H<T IJO @HDO @S>@KODJIN. 1C@ >JHKDG@M DIA@MN RC@OC@M < O@HKG<O@,
?@G@B<O@, JM <IJITHJPN API>ODJI DN IJ-OCMJR.
t !TBGF API>ODJIN ><IIJO >JMMPKO H@HJMT.
t !USVTUFE API>ODJIN <M@ DI?@@? N<A@ =PO ><IIJO =@ NK@>DAD@? <N NP>C; OC@T <M@ >JIND?@M@?
!TBGF =JOC =T OC@ KMJBM<HH@M <I? OC@ >JHKDG@M.
t !TZTUFN API>ODJIN ><I PN@ @Q@MT ! A@<OPM@. !TZTUFN DN OC@ ?@A<PGO N<A@OT <OOMD=PO@.
t 1C@ >JHKDG@M DIA@MN OC@ N<A@OT <OOMD=PO@N JA O@HKG<O@N, ?@G@B<O@N, <I? <IJITHJPN
API>ODJIN.
t #PI>ODJIN ><I =@ @S@>PO@? <O >JHKDG@ ODH@ <N R@GG (1#"). 1CDN ><I =@ ?DAA@M@IOD<O@? =T
OC@ Q<GP@ JA OC@ NK@>D<G Q<MD<=G@ @@DUGF.
#AD7 FG@5F;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
544
Mixins 80
*DSDIN <M@ AJM ?;J;@9 ;@ B@I@M<O@? >J?@ DIOJ OC@ NJPM>@ >J?@. 1C@ HDS@? DI >J?@ H<T =@
B@I@M<O@? <N < O@HKG<O@ DINO<I>@ JM < TUSJOH.
Template mixins
80.1
4@ C<Q@ N@@I DI OC@ 1@HKG<O@N <I? *JM@ 1@HKG<O@N >C<KO@MN OC<O O@HKG<O@N ?@ADI@ >J?@ <N <
K<OO@MI, AJM OC@ >JHKDG@M OJ B@I@M<O@ <>OP<G DINO<I>@N AMJH OC<O K<OO@MI. 1@HKG<O@N ><I
B@I@M<O@ API>ODJIN, NOMP>ON, PIDJIN, >G<NN@N, DIO@MA<>@N, <I? <IT JOC@M G@B<G ! >J?@.
1@HKG<O@ HDSDIN DIN@MO DINO<IOD<ODJIN JA O@HKG<O@N DIOJ OC@ >J?@ =T OC@ NJYJO F@TRJM?:
NJYJO a_template!(template_parameters)
1C@ DINO<IOD<ODJI JA OC@ O@HKG<O@ AJM OC@ NK@>DAD> N@O JA O@HKG<O@ K<M<H@O@MN <M@ DIN@MO@? DIOJ
OC@ NJPM>@ >J?@ MDBCO RC@M@ OC@ NJYJO F@TRJM? <KK@<MN.
#JM @S<HKG@, G@O'N C<Q@ < O@HKG<O@ OC<O ?@ADI@N =JOC <I <MM<T JA @?B@N <I? < K<DM JA API>ODJIN
OC<O JK@M<O@ JI OCJN@ @?B@N:
UFNQMBUF &EHF"SSBZ'FBUVSF(5, TJ[F@U DPVOU)
\
5<DPVOU> FEHFT;
WPJE TFU&EHF(TJ[F@U JOEFY, 5 FEHF)
\
FEHFT<JOEFY> = FEHF;
^
WPJE QSJOU&EHFT()
\
XSJUFMO("5IF FEHFT:");
GPSFBDI (J, FEHF; FEHFT) \
XSJUFG("%T:%T ", J, FEHF);
^
XSJUFMO();
^
^
1C<O O@HKG<O@ G@<Q@N OC@ OTK@ <I? IPH=@M JA <MM<T @G@H@ION AG@SD=G@. 1C@ DINO<IOD<ODJI JA OC<O
O@HKG<O@ AJM JOU <I? 2 RJPG? =@ HDS@? DI =T OC@ AJGGJRDIB NTIO<S:
NJYJO &EHF"SSBZ'FBUVSF!(JOU, 2);
#JM @S<HKG@, OC@ NJYJO <=JQ@ ><I DIN@MO OC@ ORJ-@G@H@IO JOU <MM<T <I? OC@ ORJ API>ODJIN
OC<O <M@ B@I@M<O@? =T OC@ O@HKG<O@ MDBCO DIND?@ < TUSVDU ?@ADIDODJI:
TUSVDU -JOF
\
NJYJO &EHF"SSBZ'FBUVSF!(JOU, 2);
^
AN < M@NPGO, -JOF @I?N PK ?@ADIDIB < H@H=@M <MM<T <I? ORJ H@H=@M API>ODJIN:
JNQPSU TUE.TUEJP;
WPJE NBJO()
#;J;@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
545
\
BVUP MJOF = -JOF();
MJOF.TFU&EHF(0, 100);
MJOF.TFU&EHF(1, 200);
MJOF.QSJOU&EHFT();
^
1C@ JPOKPO:
5IF FEHFT:
0:100 1:200
AIJOC@M DINO<IOD<ODJI JA OC@ N<H@ O@HKG<O@ ><I =@ PN@? @.B. DIND?@ < API>ODJI:
TUSVDU 1PJOU
\
JOU Y;
JOU Z;
^
WPJE NBJO()
\
NJYJO &EHF"SSBZ'FBUVSF!(1PJOU, 5);
TFU&EHF(3, 1PJOU(3, 3));
QSJOU&EHFT();
^
1C<O NJYJO DIN@MON <I <MM<T <I? ORJ GJ><G API>ODJIN DIND?@ NBJO(). 1C@ JPOKPO:
5IF FEHFT:
0:1PJOU(0, 0) 1:1PJOU(0, 0) 2:1PJOU(0, 0) 3:1PJOU(3, 3) 4:1PJOU(0, 0)
String mixins
80.2
AIJOC@M KJR@MAPG A@<OPM@ JA ! DN =@DIB <=G@ OJ DIN@MO >J?@ <N TUSJOH <N GJIB <N OC<O NOMDIB DN
FIJRI <O >JHKDG@ ODH@. 1C@ NTIO<S JA NOMDIB HDSDIN M@LPDM@N OC@ PN@ JA K<M@IOC@N@N:
NJYJO (compile_time_generated_string)
#JM @S<HKG@, OC@ :7>>A IAD>6 KMJBM<H ><I =@ RMDOO@I RDOC < NJYJO <N R@GG:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
NJYJO (AXSJUFMO("IFMMP XPSME");A);
^
1C@ NOMDIB B@ON DIN@MO@? <N >J?@ <I? OC@ KMJBM<H KMJ?P>@N OC@ AJGGJRDIB JPOKPO:
IFMMP XPSME
4@ ><I BJ APMOC@M <I? DIN@MO <GG JA OC@ KMJBM<H <N < NOMDIB HDSDI:
NJYJO (
AJNQPSU TUE.TUEJP; WPJE NBJO() \ XSJUFMO("IFMMP XPSME"); ^A
);
#;J;@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
546
,=QDJPNGT, OC@M@ DN IJ I@@? AJM HDSDIN DI OC@N@ @S<HKG@N, <N OC@ NOMDIBN >JPG? C<Q@ =@@I
RMDOO@I <N >J?@ <N R@GG.
1C@ KJR@M JA NOMDIB HDSDIN >JH@N AMJH OC@ A<>O OC<O OC@ >J?@ ><I =@ B@I@M<O@? <O >JHKDG@
ODH@. 1C@ AJGGJRDIB @S<HKG@ O<F@N <?Q<IO<B@ JA 1#" OJ B@I@M<O@ NO<O@H@ION <O >JHKDG@
ODH@:
JNQPSU TUE.TUEJP;
TUSJOH QSJOU4UBUFNFOU(TUSJOH NFTTBHF)
\
SFUVSO AXSJUFMO$(1"3"/5&;@"$)"A _ NFTTBHF _ A"$(1"3"/5&;@,"1");A;
^
WPJE NBJO()
\
NJYJO (QSJOU4UBUFNFOU("IFMMP XPSME"));
NJYJO (QSJOU4UBUFNFOU("IJ XPSME"));
^
1C@ JPOKPO:
IFMMP XPSME
IJ XPSME
+JO@ OC<O OC@ "XSJUFMO" @SKM@NNDJIN <M@ IJO @S@>PO@? DIND?@ QSJOU4UBUFNFOU(). /<OC@M,
QSJOU4UBUFNFOU() B@I@M<O@N >J?@ OC<O DI>GP?@N XSJUFMO() @SKM@NNDJIN OC<O <M@ @S@>PO@?
DIND?@ NBJO(). 1C@ B@I@M<O@? >J?@ DN OC@ @LPDQ<G@IO JA OC@ AJGGJRDIB:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
XSJUFMO("IFMMP XPSME");
XSJUFMO("IJ XPSME");
^
Mixin name spaces
80.3
&O DN KJNND=G@ OJ <QJD? <I? M@NJGQ@ I<H@ <H=DBPDOD@N DI O@HKG<O@ HDSDIN.
#JM @S<HKG@, OC@M@ <M@ ORJ J Q<MD<=G@N ?@ADI@? DIND?@ NBJO() DI OC@ AJGGJRDIB KMJBM<H: JI@
DN ?@ADI@? @SKGD>DOGT DI NBJO <I? OC@ JOC@M DN HDS@? DI. 4C@I < HDS@?-DI I<H@ DN OC@ N<H@ <N <
I<H@ OC<O DN DI OC@ NPMMJPI?DIB N>JK@, OC@I OC@ I<H@ OC<O DN DI OC@ NPMMJPI?DIB N>JK@ B@ON
PN@?:
JNQPSU TUE.TUEJP;
UFNQMBUF 5FNQM()
\
JOU J;
WPJE QSJOU()
\
XSJUFMO(J); // "MXBZT UIF 'J' UIBU JT EFGJOFE JO 5FNQM
^
^
WPJE NBJO()
\
JOU J;
NJYJO 5FNQM;
#;J;@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
547
J = 42; // 4FUT UIF 'J' UIBU JT EFGJOFE FYQMJDJUMZ JO NBJO
XSJUFMO(J); // 1SJOUT UIF 'J' UIBU JT EFGJOFE FYQMJDJUMZ JO NBJO
QSJOU(); // 1SJOUT UIF 'J' UIBU JT NJYFE JO
^
AN DHKGD@? DI OC@ >JHH@ION <=JQ@, O@HKG<O@ HDSDIN ?@ADI@ < I<H@ NK<>@ AJM OC@DM >JIO@ION
<I? OC@ I<H@N OC<O <KK@M DI OC@ O@HKG<O@ >J?@ <M@ ADMNO GJJF@? PK DI OC<O I<H@ NK<>@. 4@ ><I
N@@ OCDN DI OC@ =@C<QDJM JA QSJOU():
42
0 l QSJOUFE CZ QSJOU()
1C@ >JHKDG@M ><IIJO M@NJGQ@ I<H@ >JIAGD>ON DA OC@ N<H@ I<H@ DN ?@ADI@? =T HJM@ OC<I JI@
O@HKG<O@ HDSDI. )@O'N N@@ OCDN DI < NCJMO KMJBM<H OC<O HDS@N DI OC@ N<H@ O@HKG<O@ DINO<I>@
ORD>@:
UFNQMBUF 5FNQM()
\
JOU J;
^
WPJE NBJO()
\
NJYJO 5FNQM;
NJYJO 5FNQM;
J = 42; // j DPNQJMBUJPO &3303
^
&SSPS: EFOFNF.NBJO.5FNQM!().J BU ... DPOGMJDUT XJUI
EFOFNF.NBJO.5FNQM!().J BU ...
1J KM@Q@IO OCDN, DO DN KJNND=G@ OJ <NNDBI I<H@ NK<>@ D?@IODAD@MN AJM O@HKG<O@ HDSDIN <I? M@A@M
OJ >JIO<DI@? I<H@N =T OCJN@ D?@IODAD@MN:
NJYJO 5FNQM "; // %FGJOFT ".J
NJYJO 5FNQM #; // %FGJOFT #.J
".J = 42; // j OPU BNCJHVPVT BOZNPSF
0OMDIB HDSDIN ?J IJO C<Q@ OC@N@ I<H@ NK<>@ A@<OPM@N. %JR@Q@M, DO DN OMDQD<G OJ PN@ < NOMDIB <N <
O@HKG<O@ HDSDI NDHKGT =T K<NNDIB DO OCMJPBC < NDHKG@ RM<KK@M O@HKG<O@.
)@O'N ADMNO N@@ < NDHDG<M I<H@ >JIAGD>O RDOC NOMDIB HDSDIN:
WPJE NBJO()
\
NJYJO ("JOU J;");
NJYJO ("JOU J;"); // j DPNQJMBUJPO &3303
J = 42;
^
&SSPS: EFDMBSBUJPO EFOFNF.NBJO.J JT BMSFBEZ EFGJOFE
,I@ R<T JA M@NJGQDIB OCDN DNNP@ DN OJ K<NN OC@ TUSJOH OCMJPBC OC@ AJGGJRDIB OMDQD<G O@HKG<O@
OC<O @AA@>ODQ@GT >JIQ@MON < NOMDIB HDSDI OJ < O@HKG<O@ HDSDI:
#;J;@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
548
UFNQMBUF 5FNQMBUJ[F(TUSJOH TUS)
\
NJYJO (TUS);
^
WPJE NBJO()
\
NJYJO 5FNQMBUJ[F!("JOU J;") "; // %FGJOFT ".J
NJYJO 5FNQMBUJ[F!("JOU J;") #; // %FGJOFT #.J
".J = 42; // j OPU BNCJHVPVT BOZNPSF
^
String mixins in operator overloading
80.4
4@ C<Q@ N@@I DI OC@ ,K@M<OJM ,Q@MGJ<?DIB >C<KO@M CJR NJYJO @SKM@NNDJIN C@GK@? RDOC OC@
?@ADIDODJIN JA NJH@ JA OC@ JK@M<OJMN.
&I A<>O, OC@ M@<NJI RCT HJNO JK@M<OJM H@H=@M API>ODJIN <M@ ?@ADI@? <N O@HKG<O@N DN OJ H<F@
OC@ JK@M<OJMN <Q<DG<=G@ <N TUSJOH Q<GP@N NJ OC<O OC@T ><I =@ PN@? AJM >J?@ B@I@M<ODJI. 4@
C<Q@ N@@I @S<HKG@N JA OCDN =JOC DI OC<O >C<KO@M <I? DON @S@M>DN@ NJGPODJIN.
Example
80.5
(Note: (B75;8K;@9 BD76;53F7E 3E EFD;@9E I3E GE76 ?AD7 5A??A@>K 478AD7 F:7 >3?463 EK@F3J
I3E 36676 FA D. A>F:AG9: EFD;@9 BD76;53F7E 3E ;@ F:;E 7J3?B>7 3D7 EF;>> GE76 ;@ &:A4AE, F:7 =>
>3?463 EK@F3J ?3K 47 ?AD7 EG;F34>7 ;@ ?AEF 53E7E.)
)@O'N >JIND?@M OC@ AJGGJRDIB API>ODJI O@HKG<O@ OC<O O<F@N <I <MM<T JA IPH=@MN <I? M@OPMIN
<IJOC@M <MM<T OC<O >JINDNON JA OC@ @G@H@ION OC<O N<ODNAT < NK@>DAD> >JI?DODJI:
JOU<> GJMUFS(TUSJOH QSFEJDBUF)(JO JOU<> OVNCFST)
\
JOU<> SFTVMU;
GPSFBDI (OVNCFS; OVNCFST) \
JG (NJYJO (QSFEJDBUF)) \
SFTVMU _= OVNCFS;
^
^
SFUVSO SFTVMU;
^
1C<O API>ODJI O@HKG<O@ O<F@N OC@ ADGO@MDIB >JI?DODJI <N DON O@HKG<O@ K<M<H@O@M <I? DIN@MON
OC<O >JI?DODJI ?DM@>OGT DIOJ <I JG NO<O@H@IO <N DN.
#JM OC<O >JI?DODJI OJ >CJJN@ IPH=@MN OC<O <M@ @.B. G@NN OC<O 7, OC@ JG >JI?DODJI NCJPG? GJJF
GDF@ OC@ AJGGJRDIB >J?@:
JG (OVNCFS < 7) \
1C@ PN@MN JA GJMUFS() O@HKG<O@ ><I KMJQD?@ OC@ >JI?DODJI <N < TUSJOH:
JOU<> OVNCFST = < 1, 8, 6, -2, 10 >;
JOU<> DIPTFO = GJMUFS!"OVNCFS < 7"(OVNCFST);
&HKJMO<IOGT, OC@ I<H@ PN@? DI OC@ O@HKG<O@ K<M<H@O@M HPNO H<O>C OC@ I<H@ JA OC@ Q<MD<=G@
PN@? DI OC@ DHKG@H@IO<ODJI JA GJMUFS(). 0J, OC@ O@HKG<O@ HPNO ?J>PH@IO RC<O OC<O I<H@
NCJPG? =@ <I? OC@ PN@MN HPNO PN@ OC<O I<H@.
#;J;@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
549
-CJ=JN PN@N I<H@N >JINDNODIB JA NDIBG@ G@OO@MN GDF@ <, =, I, @O>.
#;J;@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
550
Ranges 81
/<IB@N <M@ <I <=NOM<>ODJI JA @G@H@IO <>>@NN. 1CDN <=NOM<>ODJI @I<=G@N OC@ PN@ JA BM@<O
IPH=@M JA <GBJMDOCHN JQ@M BM@<O IPH=@M JA >JIO<DI@M OTK@N. /<IB@N @HKC<NDU@ CJR
>JIO<DI@M @G@H@ION <M@ <>>@NN@?, <N JKKJN@? OJ CJR OC@ >JIO<DI@MN <M@ DHKG@H@IO@?.
/<IB@N <M@ < Q@MT NDHKG@ >JI>@KO OC<O DN =<N@? JI RC@OC@M < OTK@ ?@ADI@N >@MO<DI N@ON JA
H@H=@M API>ODJIN. 4@ C<Q@ <GM@<?T N@@I OCDN >JI>@KO DI OC@ GPSFBDI RDOC 0OMP>ON <I?
G<NN@N >C<KO@M: <IT OTK@ OC<O KMJQD?@N OC@ H@H=@M API>ODJIN FNQUZ, GSPOU, <I? QPQ'SPOU()
><I =@ PN@? RDOC OC@ GPSFBDI GJJK. 1C@ N@O JA OCJN@ OCM@@ H@H=@M API>ODJIN DN OC@
M@LPDM@H@IO JA OC@ M<IB@ OTK@ *OQVU3BOHF.
& RDGG NO<MO DIOMJ?P>DIB M<IB@N RDOC *OQVU3BOHF, OC@ NDHKG@NO JA <GG OC@ M<IB@ OTK@N. 1C@ JOC@M
M<IB@N M@LPDM@ HJM@ H@H=@M API>ODJIN JQ@M *OQVU3BOHF.
B@AJM@ BJDIB APMOC@M, & RJPG? GDF@ OJ KMJQD?@ OC@ ?@ADIDODJIN JA >JIO<DI@MN <I? <GBJMDOCHN.
Container (data structure): JIO<DI@M DN < Q@MT PN@APG >JI>@KO OC<O <KK@<MN DI <GHJNO @Q@MT
KMJBM<H. 3<MD<=G@N <M@ KPO OJB@OC@M AJM < KPMKJN@ <I? <M@ PN@? OJB@OC@M <N @G@H@ION JA <
>JIO<DI@M. !'N >JIO<DI@MN <M@ DON >JM@ A@<OPM@N <MM<TN <I? <NNJ>D<ODQ@ <MM<TN, <I? NK@>D<G
>JIO<DI@M OTK@N OC<O <M@ ?@ADI@? DI OC@ TUE.DPOUBJOFS HJ?PG@. "Q@MT >JIO<DI@M DN
DHKG@H@IO@? <N < NK@>DAD> ?<O< NOMP>OPM@. #JM @S<HKG@, <NNJ>D<ODQ@ <MM<TN <M@ < :3E: F34>7
DHKG@H@IO<ODJI.
"Q@MT ?<O< NOMP>OPM@ NOJM@N DON @G@H@ION <I? KMJQD?@N <>>@NN OJ OC@H DI R<TN OC<O <M@ NK@>D<G
OJ OC<O ?<O< NOMP>OPM@. #JM @S<HKG@, DI OC@ <MM<T ?<O< NOMP>OPM@ OC@ @G@H@ION <M@ NOJM@? ND?@
=T ND?@ <I? <>>@NN@? =T <I @G@H@IO DI?@S; DI OC@ GDIF@? GDNO ?<O< NOMP>OPM@ OC@ @G@H@ION <M@
NOJM@? DI IJ?@N <I? <M@ <>>@NN@? =T BJDIB OCMJPBC OCJN@ IJ?@N JI@ =T JI@; DI < NJMO@? =DI<MT
OM@@ ?<O< NOMP>OPM@, OC@ IJ?@N KMJQD?@ <>>@NN OJ OC@ KM@>@?DIB <I? NP>>@NNDQ@ @G@H@ION
OCMJPBC N@K<M<O@ =M<I>C@N; @O>.
&I OCDN >C<KO@M, & RDGG PN@ OC@ O@MHN 5A@F3;@7D <I? 63F3 EFDG5FGD7 DIO@M>C<IB@<=GT.
Algorithm (function): -MJ>@NNDIB JA ?<O< NOMP>OPM@N AJM NK@>DAD> KPMKJN@N DI NK@>DAD> R<TN DN
><GG@? <I 3>9AD;F:?. #JM @S<HKG@, >;@73D E73D5: DN <I <GBJMDOCH OC<O N@<M>C@N =T DO@M<ODIB
JQ@M < >JIO<DI@M AMJH OC@ =@BDIIDIB OJ OC@ @I?; 4;@3DK E73D5: DN <I <GBJMDOCH OC<O N@<M>C@N
AJM <I @G@H@IO =T @GDHDI<ODIB C<GA JA OC@ ><I?D?<O@N <O @Q@MT NO@K; @O>.
&I OCDN >C<KO@M, & RDGG PN@ OC@ O@MHN 3>9AD;F:? <I? 8G@5F;A@ DIO@M>C<IB@<=GT.
#JM HJNO JA OC@ N<HKG@N =@GJR, & RDGG PN@ JOU <N OC@ @G@H@IO OTK@ <I? JOU<> <N OC@ >JIO<DI@M
OTK@. &I M@<GDOT, M<IB@N <M@ HJM@ KJR@MAPG RC@I PN@? RDOC O@HKG<O@? >JIO<DI@MN <I?
<GBJMDOCHN. &I A<>O, HJNO JA OC@ >JIO<DI@MN <I? <GBJMDOCHN OC<O M<IB@N OD@ OJB@OC@M <M@ <GG
O@HKG<O@N. & RDGG G@<Q@ @S<HKG@N JA O@HKG<O@? M<IB@N OJ OC@ I@SO >C<KO@M.
History
81.1
A Q@MT NP>>@NNAPG GD=M<MT OC<O <=NOM<>ON <GBJMDOCHN <I? ?<O< NOMP>OPM@N AMJH @<>C JOC@M DN OC@
0O<I?<M? 1@HKG<O@ )D=M<MT (01)), RCD>C <GNJ <KK@<MN <N < K<MO JA OC@ ++ NO<I?<M? GD=M<MT.
01) KMJQD?@N OCDN <=NOM<>ODJI RDOC OC@ ;F7D3FAD >JI>@KO, RCD>C DN DHKG@H@IO@? =T ++'N
O@HKG<O@N.
AGOCJPBC OC@T <M@ < Q@MT PN@APG <=NOM<>ODJI, DO@M<OJMN ?J C<Q@ NJH@ R@<FI@NN@N. /<IB@N
R@M@ ?@NDBI@? =T AI?M@D AG@S<I?M@N>P K<MOGT OJ JQ@M>JH@ OC@N@ R@<FI@NN@N. !'N NO<I?<M?
GD=M<MT -CJ=JN O<F@N BM@<O <?Q<IO<B@ JA M<IB@N OC<O <M@ OC@ NP=E@>O JA OCDN >C<KO@M.
'3@97E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
551
AI?M@D AG@S<I?M@N>P DIOMJ?P>@N M<IB@N DI OC@ N@HDI<G K<K@M ,I &O@M<ODJI <I? ?@HJINOM<O@N
CJR OC@T <M@ NPK@MDJM OJ DO@M<OJMN.
Ranges are a part of D
81.2
/<IB@N <M@ <I DIO@BM<G K<MO JA !. !'N NGD>@N C<KK@I OJ =@ DHKG@H@IO<ODJIN JA OC@ HJNO
KJR@MAPG M<IB@ 3BOEPN"DDFTT3BOHF, <I? OC@M@ <M@ H<IT M<IB@ A@<OPM@N DI -CJ=JN. &O DN
@NN@IOD<G OJ PI?@MNO<I? CJR M<IB@N <M@ PN@? DI -CJ=JN.
*<IT -CJ=JN <GBJMDOCHN M@OPMI O@HKJM<MT M<IB@ J=E@>ON. #JM @S<HKG@ GJMUFS(), RCD>C
>CJJN@N @G@H@ION OC<O <M@ BM@<O@M OC<I 10 DI OC@ AJGGJRDIB >J?@, <>OP<GGT M@OPMIN < M<IB@
J=E@>O, IJO <I <MM<T:
JNQPSU TUE.TUEJP;
JNQPSU TUE.BMHPSJUIN;
WPJE NBJO()
\
JOU<> WBMVFT = < 1, 20, 7, 11 >;
XSJUFMO(WBMVFT.GJMUFS!(WBMVF => WBMVF > 10));
^
XSJUFMO PN@N OC<O M<IB@ J=E@>O G<UDGT <I? <>>@NN@N OC@ @G@H@ION <N DO I@@?N OC@H:
<20, 11>
1C<O JPOKPO H<T NPBB@NO OC<O GJMUFS() M@OPMIN <I JOU<> =PO OCDN DN IJO OC@ ><N@. 4@ ><I N@@
OCDN AMJH OC@ A<>O OC<O OC@ AJGGJRDIB <NNDBIH@IO KMJ?P>@N < >JHKDG<ODJI @MMJM:
JOU<> DIPTFO = WBMVFT.GJMUFS!(WBMVF => WBMVF > 10); // j DPNQJMBUJPO &3303
1C@ @MMJM H@NN<B@ >JIO<DIN OC@ OTK@ JA OC@ M<IB@ J=E@>O:
&SSPS: DBOOPU JNQMJDJUMZ DPOWFSU FYQSFTTJPO (GJMUFS(WBMVFT))
PG UZQF 'JMUFS3FTVMU!(@@MBNCEB2, JOU<>) UP JOU<>
Note: ):7 FKB7 ?3K 47 6;887D7@F ;@ F:7 H7DE;A@ A8 &:A4AE F:3F KAG 3D7 GE;@9.
&O DN KJNND=G@ OJ >JIQ@MO OC<O O@HKJM<MT J=E@>O OJ <I <>OP<G <MM<T, <N R@ RDGG N@@ G<O@M DI OC@
>C<KO@M.
Traditional implementations of algorithms
81.3
&I OM<?DODJI<G DHKG@H@IO<ODJIN JA <GBJMDOCHN, OC@ <GBJMDOCHN FIJR CJR OC@ ?<O< NOMP>OPM@N
OC<O OC@T JK@M<O@ JI <M@ DHKG@H@IO@?. #JM @S<HKG@, OC@ AJGGJRDIB API>ODJI OC<O KMDION OC@
@G@H@ION JA < GDIF@? GDNO HPNO FIJR OC<O OC@ IJ?@N JA OC@ GDIF@? GDNO C<Q@ H@H=@MN I<H@?
FMFNFOU <I? OFYU:
TUSVDU /PEF
\
JOU FMFNFOU;
/PEF * OFYU;
^
WPJE QSJOU(DPOTU(/PEF) * MJTU)
\
GPS ( ; MJTU; MJTU = MJTU.OFYU) \
XSJUF(' ', MJTU.FMFNFOU);
'3@97E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
552
^
^
0DHDG<MGT, < API>ODJI OC<O KMDION OC@ @G@H@ION JA <I <MM<T HPNO FIJR OC<O <MM<TN C<Q@ <
MFOHUI KMJK@MOT <I? OC@DM @G@H@ION <M@ <>>@NN@? =T OC@ <> JK@M<OJM:
WPJE QSJOU(DPOTU JOU<> BSSBZ)
\
GPS (JOU J = 0; J != BSSBZ.MFOHUI; ++J) \
XSJUF(' ', BSSBZ<J>);
^
^
Note: ,7 =@AI F:3F foreach ;E ?AD7 GE78G> I:7@ ;F7D3F;@9 AH7D 3DD3KE. AE 3 67?A@EFD3F;A@
A8 :AI FD36;F;A@3> 3>9AD;F:?E 3D7 F;76 FA 63F3 EFDG5FGD7E, >7F'E 3EEG?7 F:3F F:7 GE7 A8 for ;E
<GEF;8;76.
%<QDIB <GBJMDOCHN OD@? OJ ?<O< NOMP>OPM@N H<F@N DO I@>@NN<MT OJ RMDO@ OC@H NK@>D<GGT AJM @<>C
OTK@. #JM @S<HKG@, OC@ API>ODJIN ADI?(), NJMO(), NR<K(), @O>. HPNO =@ RMDOO@I N@K<M<O@GT AJM
<MM<T, GDIF@? GDNO, <NNJ>D<ODQ@ <MM<T, =DI<MT OM@@, C@<K, @O>. AN < M@NPGO, + <GBJMDOCHN OC<O
NPKKJMO * ?<O< NOMP>OPM@N HPNO =@ RMDOO@I +S* ODH@N. (+JO@: &I M@<GDOT, OC@ >JPIO DN G@NN OC<I
+S* =@><PN@ IJO @Q@MT <GBJMDOCH ><I =@ <KKGD@? OJ @Q@MT ?<O< NOMP>OPM@; AJM @S<HKG@,
<NNJ>D<ODQ@ <MM<TN ><IIJO =@ NJMO@?.)
JIQ@MN@GT, =@><PN@ M<IB@N <=NOM<>O <GBJMDOCHN <R<T AMJH ?<O< NOMP>OPM@N, DHKG@H@IODIB
EPNO + <GBJMDOCHN <I? * ?<O< NOMP>OPM@N RJPG? =@ NPAAD>D@IO. A I@RGT DHKG@H@IO@? ?<O<
NOMP>OPM@ ><I RJMF RDOC <GG JA OC@ @SDNODIB <GBJMDOCHN OC<O NPKKJMO OC@ OTK@ JA M<IB@ OC<O OC@
I@R ?<O< NOMP>OPM@ KMJQD?@N, <I? < I@RGT DHKG@H@IO@? <GBJMDOCH ><I RJMF RDOC <GG JA OC@
@SDNODIB ?<O< NOMP>OPM@N OC<O NPKKJMO OC@ M<IB@ OTK@ OC<O OC@ I@R <GBJMDOCH M@LPDM@N.
Phobos ranges
81.4
1C@ M<IB@N DI OCDN >C<KO@M <M@ ?DAA@M@IO AMJH IPH=@M M<IB@N OC<O <M@ RMDOO@I DI OC@ AJMH
CFHJO..FOE. 4@ C<? N@@I CJR IPH=@M M<IB@N <M@ PN@? RDOC OC@ GPSFBDI GJJK <I? RDOC
NGD>@N:
GPSFBDI (WBMVF; 3..7) \ // OVNCFS SBOHF,
// /05 B 1IPCPT SBOHF
JOU<> TMJDF = BSSBZ<5..10>; // OVNCFS SBOHF,
// /05 B 1IPCPT SBOHF
4C@I & RMDO@ D3@97, & H@<I < -CJ=JN M<IB@ DI OCDN >C<KO@M.
/<IB@N AJMH < D3@97 :;7D3D5:K. AO OC@ =JOOJH JA OCDN CD@M<M>CT DN OC@ NDHKG@NO M<IB@
*OQVU3BOHF. 1C@ JOC@M M<IB@N =MDIB HJM@ M@LPDM@H@ION JI OJK JA OC@ M<IB@ OC<O OC@T <M@
=<N@? JI. 1C@ AJGGJRDIB <M@ <GG JA OC@ M<IB@N RDOC OC@DM M@LPDM@H@ION, NJMO@? AMJH OC@
NDHKG@NO OJ OC@ HJM@ ><K<=G@:
t *OQVU3BOHF: M@LPDM@N OC@ FNQUZ, GSPOU <I? QPQ'SPOU() H@H=@M API>ODJIN
t 'PSXBSE3BOHF: <??DODJI<GGT M@LPDM@N OC@ TBWF H@H=@M API>ODJI
t #JEJSFDUJPOBM3BOHF: <??DODJI<GGT M@LPDM@N OC@ CBDL <I? QPQ#BDL() H@H=@M API>ODJIN
t 3BOEPN"DDFTT3BOHF: <??DODJI<GGT M@LPDM@N OC@ <> JK@M<OJM (<I? <IJOC@M KMJK@MOT
?@K@I?DIB JI RC@OC@M OC@ M<IB@ DN ADIDO@ JM DIADIDO@)
1CDN CD@M<M>CT ><I =@ NCJRI <N DI OC@ AJGGJRDIB BM<KC. 3BOEPN"DDFTT3BOHF C<N ADIDO@ <I?
DIADIDO@ Q@MNDJIN:
'3@97E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
553
*OQVU3BOHF
k
'PSXBSE3BOHF
o n
#JEJSFDUJPOBM3BOHF 3BOEPN"DDFTT3BOHF (JOGJOJUF)
k
3BOEPN"DDFTT3BOHF (GJOJUF)
1C@ BM<KC <=JQ@ DN DI OC@ NOTG@ JA >G<NN CD@M<M>CD@N RC@M@ OC@ GJR@NO G@Q@G OTK@ DN <O OC@ OJK.
1CJN@ M<IB@N <M@ <=JPO KMJQD?DIB @G@H@IO <>>@NN. 1C@M@ DN JI@ HJM@ M<IB@, RCD>C DN <=JPO
@G@H@IO AGFBGF:
t 0VUQVU3BOHF: M@LPDM@N NPKKJMO AJM OC@ QVU(SBOHF, FMFNFOU) JK@M<ODJI
1C@N@ ADQ@ M<IB@ OTK@N <M@ NPAAD>D@IO OJ <=NOM<>O <GBJMDOCHN AMJH ?<O< NOMP>OPM@N.
Iterating by shortening the range 81.4.1
+JMH<GGT, DO@M<ODIB JQ@M OC@ @G@H@ION JA < >JIO<DI@M ?J@N IJO >C<IB@ OC@ >JIO<DI@M DON@GA. #JM
@S<HKG@, DO@M<ODIB JQ@M < NGD>@ RDOC GPSFBDI JM GPS ?J@N IJO <AA@>O OC@ NGD>@:
JOU<> TMJDF = < 10, 11, 12 >;
GPS (JOU J = 0; J != TMJDF.MFOHUI; ++J) \
XSJUF(' ', TMJDF<J>);
^
BTTFSU(TMJDF.MFOHUI == 3); // j UIF MFOHUI EPFTO'U DIBOHF
AIJOC@M R<T JA DO@M<ODJI M@LPDM@N < ?DAA@M@IO R<T JA OCDIFDIB: DO@M<ODJI ><I =@ <>CD@Q@? =T
NCJMO@IDIB OC@ M<IB@ AMJH OC@ =@BDIIDIB. &I OCDN H@OCJ?, <GR<TN OC@ ADMNO @G@H@IO DN PN@? AJM
@G@H@IO <>>@NN <I? OC@ ADMNO @G@H@IO DN BABB76 AMJH OC@ =@BDIIDIB DI JM?@M OJ B@O OJ OC@ I@SO
@G@H@IO:
GPS ( ; TMJDF.MFOHUI; TMJDF = TMJDF<1..$>) \
XSJUF(' ', TMJDF<0>); // j BMXBZT UIF GJSTU FMFNFOU
^
!F7D3F;A@ DN <>CD@Q@? =T M@HJQDIB OC@ ADMNO @G@H@IO =T OC@ TMJDF = TMJDF<1..$> @SKM@NNDJI.
1C@ NGD>@ <=JQ@ DN >JHKG@O@GT >JINPH@? =T BJDIB OCMJPBC OC@ AJGGJRDIB NO<B@N:
< 10, 11, 12 >
< 11, 12 >
< 12 >
< >
1C@ DO@M<ODJI >JI>@KO JA -CJ=JN M<IB@N DN =<N@? JI OCDN I@R OCDIFDIB JA NCJMO@IDIB OC@ M<IB@
AMJH OC@ =@BDIIDIB. (#JEJSFDUJPOBM3BOHF <I? ADIDO@ 3BOEPN"DDFTT3BOHF OTK@N ><I =@
NCJMO@I@? AMJH OC@ @I? <N R@GG.)
-G@<N@ IJO@ OC<O OC@ >J?@ <=JQ@ DN EPNO OJ ?@HJINOM<O@ OCDN OTK@ JA DO@M<ODJI; DO NCJPG? IJO =@
>JIND?@M@? IJMH<G OJ DO@M<O@ <N DI OC<O @S<HKG@.
0DI>@ GJNDIB @G@H@ION EPNO OJ DO@M<O@ JQ@M < M<IB@ RJPG? IJO =@ ?@NDM@? DI HJNO ><N@N, <
NPMMJB<O@ M<IB@ H<T =@ >JINPH@? DINO@<?. 1C@ AJGGJRDIB >J?@ PN@N < N@K<M<O@ NGD>@ OJ
KM@N@MQ@ OC@ @G@H@ION JA OC@ JMDBDI<G JI@:
JOU<> TMJDF = < 10, 11, 12 >;
JOU<> TVSSPHBUF = TMJDF;
'3@97E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
554
GPS ( ; TVSSPHBUF.MFOHUI; TVSSPHBUF = TVSSPHBUF<1..$>) \
XSJUF(' ', TVSSPHBUF<0>);
^
BTTFSU(TVSSPHBUF.MFOHUI == 0); // j TVSSPHBUF JT DPOTVNFE
BTTFSU(TMJDF.MFOHUI == 3); // j TMJDF SFNBJOT UIF TBNF
1CDN DN OC@ H@OCJ? @HKGJT@? =T HJNO JA OC@ -CJ=JN M<IB@ API>ODJIN: OC@T M@OPMI NK@>D<G
M<IB@ J=E@>ON OJ =@ >JINPH@? DI JM?@M OJ KM@N@MQ@ OC@ JMDBDI<G >JIO<DI@MN.
*OQVU3BOHF
81.5
1CDN OTK@ JA M<IB@ HJ?@GN OC@ OTK@ JA DO@M<ODJI RC@M@ @G@H@ION <M@ <>>@NN@? DI N@LP@I>@ <N
R@ C<Q@ N@@I DI OC@ QSJOU() API>ODJIN <=JQ@. *JNO <GBJMDOCHN JIGT M@LPDM@ OC<O @G@H@ION <M@
DO@M<O@? DI OC@ AJMR<M? ?DM@>ODJI RDOCJPO I@@?DIB OJ GJJF <O @G@H@ION OC<O C<Q@ <GM@<?T =@@I
DO@M<O@? JQ@M. *OQVU3BOHF HJ?@GN OC@ NO<I?<M? DIKPO NOM@<HN JA KMJBM<HN <N R@GG, RC@M@
@G@H@ION <M@ M@HJQ@? AMJH OC@ NOM@<H <N OC@T <M@ M@<?.
#JM >JHKG@O@I@NN, C@M@ <M@ OC@ OCM@@ API>ODJIN OC<O *OQVU3BOHF M@LPDM@N:
t FNQUZ: NK@>DAD@N RC@OC@M OC@ M<IB@ DN @HKOT; DO HPNO M@OPMI USVF RC@I OC@ M<IB@ DN
>JIND?@M@? OJ =@ @HKOT, <I? GBMTF JOC@MRDN@
t GSPOU: KMJQD?@N <>>@NN OJ OC@ @G@H@IO <O OC@ =@BDIIDIB JA OC@ M<IB@
t QPQ'SPOU(): NCJMO@IN OC@ M<IB@ AMJH OC@ =@BDIIDIB =T M@HJQDIB OC@ ADMNO @G@H@IO
Note: ! ID;F7 empty 3@6 front I;F:AGF B3D7@F:7E7E, 3E F:7K 53@ 47 E77@ 3E BDAB7DF;7E A8 F:7
D3@97; 3@6 popFront() I;F: B3D7@F:7E7E 3E ;F ;E 3 8G@5F;A@ I;F: E;67 78875FE.
%@M@ DN CJR QSJOU() ><I =@ DHKG@H@IO@? =T PNDIB OC@N@ M<IB@ API>ODJIN:
WPJE QSJOU(5)(5 SBOHF)
\
GPS ( ; !SBOHF.FNQUZ; SBOHF.QPQ'SPOU()) \
XSJUF(' ', SBOHF.GSPOU);
^
XSJUFMO();
^
-G@<N@ <GNJ IJO@ OC<O QSJOU() DN IJR < API>ODJI O@HKG<O@ OJ <QJD? GDHDODIB OC@ M<IB@ OTK@
<M=DOM<MDGT. QSJOU() ><I IJR RJMF RDOC <IT OTK@ OC<O KMJQD?@N OC@ OCM@@ *OQVU3BOHF
API>ODJIN.
*OQVU3BOHF example 81.5.1
)@O'N M@?@NDBI OC@ 4DIPPM OTK@ OC<O R@ C<Q@ N@@I =@AJM@, OCDN ODH@ <N <I *OQVU3BOHF. 4@ ><I
DH<BDI@ 4DIPPM <N < 4UVEFOU >JIO<DI@M NJ RC@I ?@NDBI@? <N < M<IB@, DO ><I =@ N@@I <N <
M<IB@ JA 4UVEFOUN.
&I JM?@M OJ F@@K OC@ @S<HKG@ NCJMO, G@O'N ?DNM@B<M? NJH@ DHKJMO<IO ?@NDBI <NK@>ON. )@O'N
t DHKG@H@IO JIGT OC@ H@H=@MN OC<O <M@ M@G<O@? OJ OCDN N@>ODJI
t ?@NDBI <GG OTK@N <N NOMP>ON
t DBIJM@ NK@>DAD@MN <I? LP<GDAD@MN GDF@ QSJWBUF, QVCMJD, <I? DPOTU
t IJO O<F@ <?Q<IO<B@ JA >JIOM<>O KMJBM<HHDIB <I? PIDO O@NODIB
JNQPSU TUE.TUSJOH;
'3@97E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
555
TUSVDU 4UVEFOU
\
TUSJOH OBNF;
JOU OVNCFS;
TUSJOH UP4USJOH() DPOTU
\
SFUVSO GPSNBU("%T(%T)", OBNF, OVNCFS);
^
^
TUSVDU 4DIPPM
\
4UVEFOU<> TUVEFOUT;
^
WPJE NBJO()
\
BVUP TDIPPM = 4DIPPM( < 4UVEFOU("&CSV", 1),
4UVEFOU("%FSZB", 2) ,
4UVEFOU("%BNMB", 3) > );
^
1J H<F@ 4DIPPM =@ <>>@KO@? <N <I *OQVU3BOHF, R@ HPNO ?@ADI@ OC@ OCM@@ *OQVU3BOHF
H@H=@M API>ODJIN.
#JM FNQUZ OJ M@OPMI USVF RC@I OC@ M<IB@ DN @HKOT, R@ ><I PN@ OC@ G@IBOC JA OC@ TUVEFOUT
<MM<T. 4C@I OC@ G@IBOC JA OC<O <MM<T DN 0, OC@ M<IB@ DN >JIND?@M@? @HKOT:
TUSVDU 4DIPPM
\
// ...
!QSPQFSUZ CPPM FNQUZ() DPOTU
\
SFUVSO TUVEFOUT.MFOHUI == 0;
^
^
FNQUZ DN ?@ADI@? <N !QSPQFSUZ OJ =@ <=G@ OJ >J?@ DO RDOCJPO K<M@IOC@N@N, <N DI TDIPPM.FNQUZ.
#JM GSPOU OJ M@OPMI OC@ ADMNO @G@H@IO JA OC@ M<IB@, R@ ><I M@OPMI OC@ ADMNO @G@H@IO JA OC@
<MM<T:
TUSVDU 4DIPPM
\
// ...
!QSPQFSUZ SFG 4UVEFOU GSPOU()
\
SFUVSO TUVEFOUT<0>;
^
^
Note: ! :3H7 GE76 F:7 ref =7KIAD6 FA 47 34>7 FA BDAH;67 3557EE FA F:7 35FG3> 7>7?7@F ;@EF736
A8 3 5ABK A8 ;F. %F:7DI;E7 F:7 7>7?7@FE IAG>6 47 5AB;76 4753GE7 Student ;E 3 EFDG5F.
#JM QPQ'SPOU() OJ NCJMO@I OC@ M<IB@ AMJH OC@ =@BDIIDIB, R@ ><I NCJMO@I OC@ TUVEFOUT <MM<T
AMJH OC@ =@BDIIDIB:
TUSVDU 4DIPPM
\
// ...
WPJE QPQ'SPOU()
'3@97E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
556
\
TUVEFOUT = TUVEFOUT<1 .. $>;
^
^
Note: AE ! :3H7 ?7@F;A@76 34AH7, ;F ;E @AF @AD?3> FA >AE7 F:7 AD;9;@3> 7>7?7@FE 8DA? F:7
5A@F3;@7D <GEF FA ;F7D3F7 AH7D F:7?. ,7 I;>> 366D7EE F:;E ;EEG7 47>AI 4K ;@FDA6G5;@9 3 EB75;3>
D3@97 FKB7.
1C@N@ OCM@@ API>ODJIN <M@ NPAAD>D@IO OJ H<F@ 4DIPPM OJ =@ PN@? <N <I *OQVU3BOHF. AN <I
@S<HKG@, G@O'N <?? OC@ AJGGJRDIB GDI@ <O OC@ @I? JA NBJO() <=JQ@ OJ C<Q@ JPM I@R QSJOU()
API>ODJI O@HKG<O@ OJ PN@ TDIPPM <N < M<IB@:
QSJOU(TDIPPM);
QSJOU() PN@N OC<O J=E@>O <N <I *OQVU3BOHF <I? KMDION DON @G@H@ION OJ OC@ JPOKPO:
&CSV(1) %FSZB(2) %BNMB(3)
4@ C<Q@ <>CD@Q@? JPM BJ<G JA ?@ADIDIB < PN@M OTK@ <N <I *OQVU3BOHF; R@ C<Q@ N@IO DO OJ <I
<GBJMDOCH OC<O JK@M<O@N JI *OQVU3BOHF OTK@N. 4DIPPM DN <>OP<GGT M@<?T OJ =@ PN@? RDOC
<GBJMDOCHN JA -CJ=JN JM <IT JOC@M GD=M<MT OC<O RJMF RDOC *OQVU3BOHF OTK@N. 4@ RDGG N@@
@S<HKG@N JA OCDN =@GJR.
The TUE.BSSBZ module to use slices as ranges 81.5.2
*@M@GT DHKJMODIB OC@ TUE.BSSBZ HJ?PG@ H<F@N OC@ HJNO >JHHJI >JIO<DI@M OTK@ >JIAJMH OJ
OC@ HJNO ><K<=G@ M<IB@ OTK@: NGD>@N ><I N@<HG@NNGT =@ PN@? <N 3BOEPN"DDFTT3BOHF J=E@>ON.
1C@ TUE.BSSBZ HJ?PG@ KMJQD?@N OC@ API>ODJIN FNQUZ, GSPOU, QPQ'SPOU() <I? JOC@M M<IB@
API>ODJIN AJM NGD>@N. AN < M@NPGO, NGD>@N <M@ M@<?T OJ =@ PN@? RDOC <IT M<IB@ API>ODJI, AJM
@S<HKG@ RDOC QSJOU():
JNQPSU TUE.BSSBZ;
// ...
QSJOU(< 1, 2, 3, 4 >);
&O DN IJO I@>@NN<MT OJ DHKJMO TUE.BSSBZ DA OC@ TUE.SBOHF HJ?PG@ C<N <GM@<?T =@@I DHKJMO@?.
0DI>@ DO DN IJO KJNND=G@ OJ M@HJQ@ @G@H@ION AMJH ADS@?-G@IBOC <MM<TN, QPQ'SPOU() ><IIJO =@
?@ADI@? AJM OC@H. #JM OC<O M@<NJI, ADS@?-G@IBOC <MM<TN ><IIJO =@ PN@? <N M<IB@N OC@HN@GQ@N:
WPJE QSJOU(5)(5 SBOHF)
\
GPS ( ; !SBOHF.FNQUZ; SBOHF.QPQ'SPOU()) \ // j DPNQJMBUJPO &3303
XSJUF(' ', SBOHF.GSPOU);
^
XSJUFMO();
^
WPJE NBJO()
\
JOU<4> BSSBZ = < 1, 2, 3, 4 >;
QSJOU(BSSBZ);
^
'3@97E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
557
&O RJPG? =@ =@OO@M DA OC@ >JHKDG<ODJI @MMJM <KK@<M@? JI OC@ GDI@ RC@M@ QSJOU() DN ><GG@?. 1CDN
DN KJNND=G@ =T <??DIB < O@HKG<O@ >JINOM<DIO OJ QSJOU(). 1C@ AJGGJRDIB O@HKG<O@ >JINOM<DIO
O<F@N <?Q<IO<B@ JA JT*OQVU3BOHF, RCD>C R@ RDGG N@@ DI OC@ I@SO >C<KO@M. BT OC@ C@GK JA OC@
O@HKG<O@ >JINOM<DIO, IJR OC@ >JHKDG<ODJI @MMJM DN AJM OC@ GDI@ RC@M@ QSJOU() DN ><GG@?, IJO AJM
< GDI@ RC@M@ QSJOU() DN ?@ADI@?:
WPJE QSJOU(5)(5 SBOHF)
JG (JT*OQVU3BOHF!5) // UFNQMBUF DPOTUSBJOU
\
// ...
^
// ...
QSJOU(BSSBZ); // j DPNQJMBUJPO &3303
1C@ @G@H@ION JA < ADS@?-G@IBOC <MM<T ><I NODGG =@ <>>@NN@? =T M<IB@ API>ODJIN. 4C<O I@@?N OJ
=@ ?JI@ DN OJ PN@ < NGD>@ JA OC@ RCJG@ <MM<T, IJO OC@ <MM<T DON@GA:
QSJOU(BSSBZ<>); // OPX DPNQJMFT
"Q@I OCJPBC NGD>@N ><I =@ PN@? <N M<IB@N, IJO @Q@MT M<IB@ OTK@ ><I =@ PN@? <N <I <MM<T.
4C@I I@>@NN<MT, <GG JA OC@ @G@H@ION ><I =@ >JKD@? JI@ =T JI@ DIOJ <I <MM<T.
TUE.BSSBZ.BSSBZ DN < C@GK@M API>ODJI OJ NDHKGDAT OCDN O<NF; BSSBZ() DO@M<O@N JQ@M *OQVU3BOHF
M<IB@N, >JKD@N OC@ @G@H@ION, <I? M@OPMIN < I@R <MM<T:
JNQPSU TUE.BSSBZ;
// ...
// /PUF: "MTP UBLJOH BEWBOUBHF PG 6'$4
BVUP DPQJFT0G4UVEFOUT = TDIPPM.BSSBZ;
XSJUFMO(DPQJFT0G4UVEFOUT);
1C@ JPOKPO:
<&CSV(1), %FSZB(2), %BNMB(3)>
AGNJ IJO@ OC@ PN@ JA 2#0 DI OC@ >J?@ <=JQ@. 2#0 BJ@N Q@MT R@GG RDOC M<IB@ <GBJMDOCHN =T
H<FDIB >J?@ I<OPM<GGT H<O>C OC@ @S@>PODJI JM?@M JA @SKM@NNDJIN.
Special convenience for strings 81.5.3
B@DIB >C<M<>O@M <MM<TN =T ?@ADIDODJI, NOMDIBN ><I <GNJ =@ PN@? <N M<IB@N EPNO =T DHKJMODIB
TUE.BSSBZ. %JR@Q@M, DIBS <I? XDIBS NOMDIBN ><IIJO =@ PN@? <N 3BOEPN"DDFTT3BOHF.
TUE.BSSBZ KMJQD?@N < NK@>D<G API>ODJI<GDOT RDOC <GG OTK@N JA NOMDIBN: DO@M<ODIB JQ@M NOMDIBN
=@>JH@N DO@M<ODIB JQ@M 2ID>J?@ >J?@ KJDION, IJO JQ@M 21# >J?@ PIDON. AN < M@NPGO, NOMDIBN
<KK@<M <N M<IB@N JA 2ID>J?@ >C<M<>O@MN.
1C@ AJGGJRDIB NOMDIBN >JIO<DI \ <I? ], RCD>C ><IIJO =@ M@KM@N@IO@? =T < NDIBG@ DIBS <I? OC@
9AF:;5 >7FF7D 3:E3 (?), RCD>C ><IIJO =@ M@KM@N@IO@? =T < NDIBG@ XDIBS (IJO@ OC<O OC@N@
>C<M<>O@MN H<T IJO =@ ?DNKG<T@? >JMM@>OGT DI OC@ @IQDMJIH@IO OC<O TJP <M@ M@<?DIB OCDN
>C<KO@M):
JNQPSU TUE.BSSBZ;
// ...
QSJOU("BCD`EFa"D);
'3@97E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
558
QSJOU("BCD`EFa"X);
QSJOU("BCD`EFa"E);
1C@ JPOKPO JA OC@ KMJBM<H DN RC<O R@ RJPG? IJMH<GGT @SK@>O AMJH < D3@97 A8 >7FF7DE:
B C D a E F b
B C D a E F b
B C D a E F b
AN TJP ><I N@@, OC<O JPOKPO ?J@N IJO H<O>C RC<O R@ C<Q@ N@@I DI OC@ C<M<>O@MN <I? 0OMDIBN
>C<KO@MN. 0DI>@ OC@ @G@H@ION JA TUSJOH <I? XTUSJOH <M@ DIBS <I? XDIBS M@NK@>ODQ@GT, JI@
HDBCO @SK@>O OJ N@@ 21# >J?@ PIDON DI OC@ KM@QDJPN JPOKPO.
AN < M@HDI?@M, G@O'N >JIND?@M OC@ AJGGJRDIB API>ODJI OJ N@@ CJR NOMDIBN PN@? <N M<IB@N <M@
?DAA@M@IO AMJH NOMDIBN PN@? <N <MM<TN:
WPJE QSJOU&MFNFOUT(5)(5 TUS)
\
GPS (JOU J = 0; J != TUS.MFOHUI; ++J) \
XSJUF(' ', TUS<J>);
^
XSJUFMO();
^
// ...
QSJOU&MFNFOUT("BCD`EFa"D);
QSJOU&MFNFOUT("BCD`EFa"X);
QSJOU&MFNFOUT("BCD`EFa"E);
&I?@SDIB KMJQD?@N ?DM@>O <>>@NN OJ OC@ @G@H@ION JA OC@ <MM<TN:
B C D { { E F { { { { { {
B C D a E F b {{{ {{{
B C D a E F b
Ranges without actual elements 81.5.4
1C@ @G@H@ION JA OC@ 4DIPPM J=E@>ON R@M@ <>OP<GGT NOJM@? DI OC@ TUVEFOUT H@H=@M NGD>@N. 0J,
4DIPPM.GSPOU M@OPMI@? < M@A@M@I>@ OJ <I @SDNODIB 4UVEFOU J=E@>O.
,I@ JA OC@ KJR@MN JA M<IB@N DN OC@ AG@SD=DGDOT JA IJO <>OP<GGT JRIDIB @G@H@ION. GSPOU I@@? IJO
M@OPMI <I <>OP<G @G@H@IO JA <I <>OP<G >JIO<DI@M. 1C@ M@OPMI@? 7>7?7@F ><I =@ ><G>PG<O@? @<>C
ODH@ RC@I QPQ'SPOU() DN ><GG@?, <I? ><I =@ PN@? <N OC@ Q<GP@ OC<O DN M@OPMI@? =T GSPOU.
4@ C<Q@ <GM@<?T N@@I < M<IB@ RDOCJPO <>OP<G @G@H@ION <=JQ@: 0DI>@ DIBS <I? XDIBS ><IIJO
M@KM@N@IO <GG 2ID>J?@ >C<M<>O@MN, OC@ 2ID>J?@ >C<M<>O@MN OC<O <KK@<M <N M<IB@ @G@H@ION
><IIJO =@ <>OP<G @G@H@ION JA <IT DIBS JM XDIBS <MM<T. &I OC@ ><N@ JA NOMDIBN, GSPOU M@OPMIN <
EDIBS OC<O DN 5A@EFDG5F76 AMJH OC@ >JMM@NKJI?DIB 21# >J?@ PIDON JA <MM<TN:
JNQPSU TUE.BSSBZ;
WPJE NBJO()
\
EDIBS MFUUFS = "a".GSPOU; // 5IF EDIBS UIBU JT SFUVSOFE CZ
// GSPOU JT DPOTUSVDUFE GSPN UIF
// UXP DIBST UIBU SFQSFTFOU a
^
'3@97E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
559
AGOCJPBC OC@ @G@H@IO OTK@ JA OC@ <MM<T DN DIBS, OC@ M@OPMI OTK@ JA GSPOU <=JQ@ DN EDIBS. 1C<O
EDIBS DN IJO <I @G@H@IO JA OC@ <MM<T =PO DN ?@>J?@? <N < 2ID>J?@ >C<M<>O@M AMJH OC@
@G@H@ION JA OC@ <MM<T.
0DHDG<MGT, NJH@ M<IB@N ?J IJO JRI <IT @G@H@ION =PO <M@ PN@? AJM KMJQD?DIB <>>@NN OJ
@G@H@ION JA JOC@M M<IB@N. 1CDN DN < NJGPODJI OJ OC@ KMJ=G@H JA GJNDIB @G@H@ION RCDG@ DO@M<ODIB
JQ@M 4DIPPM J=E@>ON <=JQ@. &I JM?@M OJ KM@N@MQ@ OC@ @G@H@ION JA OC@ <>OP<G 4DIPPM J=E@>ON, <
NK@>D<G *OQVU3BOHF ><I =@ PN@?.
1J N@@ CJR OCDN DN ?JI@, G@O'N ?@ADI@ < I@R NOMP>O I<H@? 4UVEFOU3BOHF <I? HJQ@ <GG JA OC@
M<IB@ H@H=@M API>ODJIN AMJH 4DIPPM OJ OCDN I@R NOMP>O. +JO@ OC<O 4DIPPM DON@GA DN IJO <
M<IB@ <ITHJM@:
TUSVDU 4DIPPM
\
4UVEFOU<> TUVEFOUT;
^
TUSVDU 4UVEFOU3BOHF
\
4UVEFOU<> TUVEFOUT;
UIJT(4DIPPM TDIPPM)
\
UIJT.TUVEFOUT = TDIPPM.TUVEFOUT;
^
!QSPQFSUZ CPPM FNQUZ() DPOTU
\
SFUVSO TUVEFOUT.MFOHUI == 0;
^
!QSPQFSUZ SFG 4UVEFOU GSPOU()
\
SFUVSO TUVEFOUT<0>;
^
WPJE QPQ'SPOU()
\
TUVEFOUT = TUVEFOUT<1 .. $>;
^
^
1C@ I@R M<IB@ NO<MON RDOC < H@H=@M NGD>@ OC<O KMJQD?@N <>>@NN OJ OC@ NOP?@ION JA 4DIPPM <I?
>JINPH@N OC<O H@H=@M NGD>@ DI QPQ'SPOU(). AN < M@NPGO, OC@ <>OP<G NGD>@ DI 4DIPPM DN
KM@N@MQ@?:
BVUP TDIPPM = 4DIPPM( < 4UVEFOU("&CSV", 1),
4UVEFOU("%FSZB", 2) ,
4UVEFOU("%BNMB", 3) > );
QSJOU(4UVEFOU3BOHF(TDIPPM));
// 5IF BDUVBM BSSBZ JT OPX QSFTFSWFE:
BTTFSU(TDIPPM.TUVEFOUT.MFOHUI == 3);
Note: (;@57 3>> ;FE IAD= ;E 6;EB3F5:76 FA ;FE ?7?47D E>;57, StudentRange ?3K @AF 47 E77@ 3E
3 9AA6 7J3?B>7 A8 3 D3@97. !@ 835F, 3EEG?;@9 F:3F students ;E 3@ 3557EE;4>7 ?7?47D A8
School, F:7 GE7D 5A67 5AG>6 :3H7 5D73F76 3 E>;57 A8 School.students 6;D75F>K 3@6 5AG>6 :3H7
GE76 F:3F E>;57 3E 3 D3@97.
'3@97E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
560
Infinite ranges 81.5.5
AIJOC@M =@I@ADO JA IJO NOJMDIB @G@H@ION <N <>OP<G H@H=@MN DN OC@ <=DGDOT OJ >M@<O@ DIADIDO@
M<IB@N.
*<FDIB <I DIADIDO@ M<IB@ DN <N NDHKG@ <N C<QDIB FNQUZ <GR<TN M@OPMI GBMTF. 0DI>@ DO DN
>JINO<IO, FNQUZ I@@? IJO @Q@I =@ < API>ODJI <I? ><I =@ ?@ADI@? <N <I FOVN Q<GP@:
FOVN FNQUZ = GBMTF; // j JOGJOJUF SBOHF
AIJOC@M JKODJI DN OJ PN@ <I DHHPO<=G@ TUBUJD H@H=@M:
TUBUJD JNNVUBCMF FNQUZ = GBMTF; // TBNF BT BCPWF
AN <I @S<HKG@ JA OCDN, G@O'N ?@NDBI < M<IB@ OC<O M@KM@N@ION OC@ #D=JI<>>D N@MD@N. !@NKDO@
C<QDIB JIGT ORJ JOU H@H=@MN, OC@ AJGGJRDIB M<IB@ ><I =@ PN@? <N OC@ DIADIDO@ #D=JI<>>D
N@MD@N:
TUSVDU 'JCPOBDDJ4FSJFT
\
JOU GJSTU = 0;
JOU TFDPOE = 1;
FOVN FNQUZ = GBMTF; // j JOGJOJUF SBOHF
!QSPQFSUZ JOU GSPOU() DPOTU
\
SFUVSO GJSTU;
^
WPJE QPQ'SPOU()
\
JOU UIJSE = GJSTU + TFDPOE;
GJSTU = TFDPOE;
TFDPOE = UIJSE;
^
^
Note: A>F:AG9: ;F ;E ;@8;@;F7, 4753GE7 F:7 ?7?47DE 3D7 A8 FKB7 int, F:7 7>7?7@FE A8 F:;E
F;4A@355; E7D;7E IAG>6 47 IDA@9 47KA@6 int.max.
0DI>@ FNQUZ DN <GR<TN GBMTF AJM 'JCPOBDDJ4FSJFT J=E@>ON, OC@ GPS GJJK DI QSJOU() I@Q@M
O@MHDI<O@N AJM OC@H:
QSJOU('JCPOBDDJ4FSJFT()); // OFWFS UFSNJOBUFT
AI DIADIDO@ M<IB@ DN PN@APG RC@I OC@ M<IB@ I@@? IJO =@ >JINPH@? >JHKG@O@GT MDBCO <R<T. 4@
RDGG N@@ CJR OJ PN@ JIGT NJH@ JA OC@ @G@H@ION JA < 'JCPOBDDJ4FSJFT =@GJR.
Functions that return ranges 81.5.6
"<MGD@M, R@ C<Q@ >M@<O@? < 4UVEFOU3BOHF J=E@>O =T @SKGD>DOGT RMDODIB 4UVEFOU3BOHF(TDIPPM).
&I HJNO ><N@N, < >JIQ@ID@I>@ API>ODJI OC<O M@OPMIN OC@ J=E@>O JA NP>C < M<IB@ DN PN@? DINO@<?.
#JM @S<HKG@, < API>ODJI RDOC OC@ RCJG@ KPMKJN@ JA M@OPMIDIB < 4UVEFOU3BOHF RJPG? NDHKGDAT
OC@ >J?@:
4UVEFOU3BOHF TUVEFOUT0G(SFG 4DIPPM TDIPPM)
\
SFUVSO 4UVEFOU3BOHF(TDIPPM);
^
'3@97E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
561
// ...
// /PUF: "HBJO, UBLJOH BEWBOUBHF PG 6'$4
QSJOU(TDIPPM.TUVEFOUT0G);
1CDN DN < >JIQ@ID@I>@ JQ@M C<QDIB OJ M@H@H=@M <I? NK@GG JPO OC@ I<H@N JA M<IB@ OTK@N
@SKGD>DOGT, RCD>C ><I B@O LPDO@ >JHKGD><O@? DI KM<>OD>@.
4@ ><I N@@ <I @S<HKG@ JA OCDN RDOC OC@ NDHKG@ TUE.SBOHF.UBLF API>ODJI. UBLF() DN < API>ODJI
OC<O KMJQD?@N <>>@NN OJ < NK@>DAD@? IPH=@M JA @G@H@ION JA < M<IB@, AMJH OC@ =@BDIIDIB. &I
M@<GDOT, OCDN API>ODJI<GDOT DN IJO <>CD@Q@? =T OC@ UBLF() API>ODJI DON@GA, =PO =T < NK@>D<G M<IB@
J=E@>O OC<O DO M@OPMIN. 1CDN A<>O I@@? IJO =@ @SKGD>DO RC@I PNDIB UBLF():
JNQPSU TUE.SBOHF;
// ...
BVUP TDIPPM = 4DIPPM( < 4UVEFOU("&CSV", 1),
4UVEFOU("%FSZB", 2) ,
4UVEFOU("%BNMB", 3) > );
QSJOU(TDIPPM.TUVEFOUT0G.UBLF(2));
UBLF() M@OPMIN < O@HKJM<MT M<IB@ J=E@>O <=JQ@, RCD>C KMJQD?@N <>>@NN OJ OC@ ADMNO 2
@G@H@ION JA TDIPPM. &I OPMI, QSJOU() PN@N OC<O J=E@>O <I? KMJ?P>@N OC@ AJGGJRDIB JPOKPO:
&CSV(1) %FSZB(2)
1C@ JK@M<ODJIN <=JQ@ NODGG ?JI'O H<F@ <IT >C<IB@N OJ TDIPPM; DO NODGG C<N 3 @G@H@ION:
QSJOU(TDIPPM.TUVEFOUT0G.UBLF(2));
BTTFSU(TDIPPM.TUVEFOUT.MFOHUI == 3);
1C@ NK@>DAD> OTK@N JA OC@ M<IB@ J=E@>ON OC<O <M@ M@OPMI@? =T API>ODJIN GDF@ UBLF() <M@ IJO
DHKJMO<IO. 1C@N@ OTK@N H<T NJH@ODH@N =@ @SKJN@? DI @MMJM H@NN<B@N, JM R@ ><I KMDIO OC@H
JPMN@GQ@N RDOC OC@ C@GK JA UZQFPG <I? TUSJOHPG:
XSJUFMO(UZQFPG(TDIPPM.TUVEFOUT0G.UBLF(2)).TUSJOHPG);
A>>JM?DIB OJ OC@ JPOKPO, UBLF() M@OPMIN <I DINO<I>@ JA < O@HKG<O@ I<H@? 5BLF:
5BLF!(4UVEFOU3BOHF)
TUE.SBOHF and TUE.BMHPSJUIN modules 81.5.7
A BM@<O =@I@ADO JA ?@ADIDIB JPM OTK@N <N M<IB@N DN =@DIB <=G@ OJ PN@ OC@H IJO JIGT RDOC JPM
JRI API>ODJIN, =PO RDOC -CJ=JN <I? JOC@M GD=M<MD@N <N R@GG.
TUE.SBOHF DI>GP?@N < G<MB@ IPH=@M JA M<IB@ API>ODJIN, NOMP>ON, <I? >G<NN@N. TUE.BMHPSJUIN
DI>GP?@N H<IT <GBJMDOCHN OC<O <M@ >JHHJIGT AJPI? <GNJ DI OC@ NO<I?<M? GD=M<MD@N JA JOC@M
G<IBP<B@N.
1J N@@ <I @S<HKG@ JA CJR JPM OTK@N ><I =@ PN@? RDOC NO<I?<M? HJ?PG@N, G@O'N PN@ 4DIPPM
RDOC OC@ TUE.BMHPSJUIN.TXBQ'SPOU <GBJMDOCH. TXBQ'SPOU() NR<KN OC@ AMJIO @G@H@ION JA ORJ
*OQVU3BOHF M<IB@N. (&O M@LPDM@N OC<O OC@ AMJIO @G@H@ION JA OC@ ORJ M<IB@N <M@ NR<KK<=G@.
AMM<TN N<ODNAT OC<O >JI?DODJI.)
'3@97E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
562
JNQPSU TUE.BMHPSJUIN;
// ...
BVUP UVSLJTI4DIPPM = 4DIPPM( < 4UVEFOU("&CSV", 1),
4UVEFOU("%FSZB", 2) ,
4UVEFOU("%BNMB", 3) > );
BVUP BNFSJDBO4DIPPM = 4DIPPM( < 4UVEFOU(".BSZ", 10),
4UVEFOU("+BOF", 20) > );
TXBQ'SPOU(UVSLJTI4DIPPM.TUVEFOUT0G,
BNFSJDBO4DIPPM.TUVEFOUT0G);
QSJOU(UVSLJTI4DIPPM.TUVEFOUT0G);
QSJOU(BNFSJDBO4DIPPM.TUVEFOUT0G);
1C@ ADMNO @G@H@ION JA OC@ ORJ N>CJJGN <M@ NR<KK@?:
.BSZ(10) %FSZB(2) %BNMB(3)
&CSV(1) +BOF(20)
AN <IJOC@M @S<HKG@, G@O'N IJR GJJF <O OC@ TUE.BMHPSJUIN.GJMUFS <GBJMDOCH. GJMUFS()
M@OPMIN < NK@>D<G M<IB@ OC<O ADGO@MN JPO @G@H@ION OC<O ?J IJO N<ODNAT < NK@>DAD> >JI?DODJI (<
BD76;53F7). 1C@ JK@M<ODJI JA ADGO@MDIB JPO OC@ @G@H@ION JIGT <AA@>ON <>>@NNDIB OC@ @G@H@ION;
OC@ JMDBDI<G M<IB@ DN KM@N@MQ@?.
-M@?D><O@N <M@ @SKM@NNDJIN OC<O HPNO @Q<GP<O@ OJ USVF AJM OC@ @G@H@ION OC<O <M@ >JIND?@M@?
OJ N<ODNAT < >JI?DODJI, <I? GBMTF AJM OC@ @G@H@ION OC<O ?J IJO. 1C@M@ <M@ < IPH=@M JA R<TN JA
NK@>DATDIB OC@ KM@?D><O@ OC<O GJMUFS() NCJPG? PN@. AN R@ C<Q@ N@@I DI @<MGD@M @S<HKG@N, JI@
R<T DN OJ PN@ < G<H=?< @SKM@NNDJI. 1C@ K<M<H@O@M B =@GJR M@KM@N@ION @<>C NOP?@IO:
TDIPPM.TUVEFOUT0G.GJMUFS!(B => B.OVNCFS % 2)
1C@ KM@?D><O@ <=JQ@ N@G@>ON OC@ @G@H@ION JA OC@ M<IB@ TDIPPM.TUVEFOUT0G OC<O C<Q@ J??
IPH=@MN.
)DF@ UBLF(), GJMUFS() M@OPMIN < NK@>D<G M<IB@ J=E@>O <N R@GG. 1C<O M<IB@ J=E@>O DI OPMI ><I
=@ K<NN@? OJ JOC@M M<IB@ API>ODJIN. #JM @S<HKG@, DO ><I =@ K<NN@? OJ QSJOU():
QSJOU(TDIPPM.TUVEFOUT0G.GJMUFS!(B => B.OVNCFS % 2));
1C<O @SKM@NNDJI ><I =@ @SKG<DI@? AMJH MDBCO OJ G@AO: EF3DF I;F: F:7 D3@97 school.studentsOf,
5A@EFDG5F 3 D3@97 A4<75F F:3F I;>> 8;>F7D AGF F:7 7>7?7@FE A8 F:3F ;@;F;3> D3@97, 3@6 B3EE F:7
@7I D3@97 A4<75F FA print().
1C@ JPOKPO >JINDNON JA NOP?@ION RDOC J?? IPH=@MN:
&CSV(1) %BNMB(3)
AN GJIB <N DO M@OPMIN USVF AJM OC@ @G@H@ION OC<O N<ODNAT OC@ >JI?DODJI, OC@ KM@?D><O@ ><I <GNJ
=@ NK@>DAD@? <N < API>ODJI:
JNQPSU TUE.BSSBZ;
// ...
CPPM TUBSUT8JUI%(4UVEFOU TUVEFOU)
\
SFUVSO TUVEFOU.OBNF.GSPOU == '%';
'3@97E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
563
^
QSJOU(TDIPPM.TUVEFOUT0G.GJMUFS!TUBSUT8JUI%);
1C@ KM@?D><O@ API>ODJI <=JQ@ M@OPMIN USVF AJM NOP?@ION C<QDIB I<H@N NO<MODIB RDOC OC@ G@OO@M
!, <I? GBMTF AJM OC@ JOC@MN.
Note: *E;@9 student.name[0] IAG>6 :3H7 ?73@F F:7 8;DEF *)F-8 5A67 G@;F, @AF F:7 8;DEF
>7FF7D. AE ! :3H7 ?7@F;A@76 34AH7, front GE7E name 3E 3 D3@97 3@6 3>I3KE D7FGD@E F:7 8;DEF
*@;5A67 5:3D35F7D.
1CDN ODH@ OC@ NOP?@ION RCJN@ I<H@N NO<MO RDOC ! <M@ N@G@>O@? <I? KMDIO@?:
%FSZB(2) %BNMB(3)
Laziness 81.5.8
AIJOC@M =@I@ADO JA API>ODJIN' M@OPMIDIB M<IB@ J=E@>ON DN OC<O, OCJN@ J=E@>ON ><I =@ PN@? G<UDGT.
1CDN H<T =@ @NN@IOD<G AJM @S@>PODJI NK@@? <I? H@HJMT >JINPHKODJI. A??DODJI<GGT, OC@ A<>O
OC<O DIADIDO@ M<IB@N ><I @SDNO <O <GG DN KJNND=G@ ?P@ OJ G<UT M<IB@N.
)<UT M<IB@N KMJ?P>@ OC@DM @G@H@ION JI@ <O < ODH@ <I? JIGT RC@I I@@?@?. 4@ N@@ <I @S<HKG@
JA OCDN RDOC OC@ 'JCPOBDDJ4FSJFT M<IB@: 1C@ @G@H@ION <M@ ><G>PG<O@? =T QPQ'SPOU() JIGT <N
OC@T <M@ I@@?@?. &A 'JCPOBDDJ4FSJFT R@M@ <I @<B@M M<IB@ <I? OMD@? OJ KMJ?P>@ <GG JA OC@
@G@H@ION PK AMJIO, DO >JPG? I@Q@M @I? JM ADI? MJJH AJM OC@ @G@H@ION OC<O DO KMJ?P>@?.
AIJOC@M KMJ=G@H JA @<B@M M<IB@N DN OC@ A<>O OC<O OC@T RJPG? C<Q@ OJ NK@I? ODH@ <I? NK<>@ AJM
@G@H@ION OC<O H<T C<Q@ I@Q@M BJDIB OJ =@ I@@?@?.
)DF@ HJNO JA OC@ <GBJMDOCHN DI -CJ=JN, UBLF() <I? GJMUFS() =@I@ADO AMJH G<UDI@NN. #JM
@S<HKG@, R@ ><I K<NN 'JCPOBDDJ4FSJFT OJ UBLF() <I? C<Q@ DO B@I@M<O@ ADIDO@ IPH=@M JA
@G@H@ION:
QSJOU('JCPOBDDJ4FSJFT().UBLF(10));
AGOCJPBC 'JCPOBDDJ4FSJFT DN DIADIDO@, OC@ JPOKPO >JIO<DIN JIGT OC@ ADMNO 10 IPH=@MN:
0 1 1 2 3 5 8 13 21 34
'PSXBSE3BOHF
81.6
*OQVU3BOHF HJ?@GN < M<IB@ RC@M@ @G@H@ION <M@ O<F@I JPO JA OC@ M<IB@ <N OC@T <M@ DO@M<O@?
JQ@M.
0JH@ M<IB@N <M@ ><K<=G@ JA N<QDIB OC@DM NO<O@N, <N R@GG <N JK@M<ODIB <N <I *OQVU3BOHF. #JM
@S<HKG@, 'JCPOBDDJ4FSJFT J=E@>ON ><I N<Q@ OC@DM NO<O@N =@><PN@ OC@N@ J=E@>ON ><I AM@@GT =@
>JKD@? <I? OC@ ORJ >JKD@N >JIODIP@ OC@DM GDQ@N DI?@K@I?@IOGT AMJH @<>C JOC@M.
'PSXBSE3BOHF KMJQD?@N OC@ TBWF H@H=@M API>ODJI, RCD>C DN @SK@>O@? OJ M@OPMI < >JKT JA OC@
M<IB@. 1C@ >JKT OC<O TBWF M@OPMIN HPNO JK@M<O@ DI?@K@I?@IOGT AMJH OC@ M<IB@ J=E@>O OC<O DO
R<N >JKD@? AMJH: DO@M<ODIB JQ@M JI@ >JKT HPNO IJO <AA@>O OC@ JOC@M >JKT.
&HKJMODIB TUE.BSSBZ <POJH<OD><GGT H<F@N NGD>@N =@>JH@ 'PSXBSE3BOHF M<IB@N.
&I JM?@M OJ DHKG@H@IO TBWF AJM 'JCPOBDDJ4FSJFT, R@ ><I NDHKGT M@OPMI < >JKT JA OC@ J=E@>O:
'3@97E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
564
TUSVDU 'JCPOBDDJ4FSJFT
\
// ...
!QSPQFSUZ 'JCPOBDDJ4FSJFT TBWF() DPOTU
\
SFUVSO UIJT;
^
^
1C@ M@OPMI@? >JKT DN < N@K<M<O@ M<IB@ OC<O RJPG? >JIODIP@ AMJH OC@ KJDIO RC@M@ DO R<N
>JKD@? AMJH.
4@ ><I ?@HJINOM<O@ OC<O OC@ >JKD@? J=E@>O DN DI?@K@I?@IO AMJH OC@ <>OP<G M<IB@ RDOC OC@
AJGGJRDIB KMJBM<H. 1C@ <GBJMDOCH TUE.SBOHF.QPQ'SPOU/() DI OC@ AJGGJRDIB >J?@ M@HJQ@N <
NK@>DAD@? IPH=@M JA @G@H@ION AMJH OC@ NK@>DAD@? M<IB@:
JNQPSU TUE.SBOHF;
// ...
WPJE SFQPSU(5)(DPOTU EDIBS<> UJUMF, DPOTU SFG 5 SBOHF)
\
XSJUFGMO("%40T: %T", UJUMF, SBOHF.UBLF(5));
^
WPJE NBJO()
\
BVUP SBOHF = 'JCPOBDDJ4FSJFT();
SFQPSU("0SJHJOBM SBOHF", SBOHF);
SBOHF.QPQ'SPOU/(2);
SFQPSU(""GUFS SFNPWJOH UXP FMFNFOUT", SBOHF);
BVUP UIF$PQZ = SBOHF.TBWF;
SFQPSU("5IF DPQZ", UIF$PQZ);
SBOHF.QPQ'SPOU/(3);
SFQPSU(""GUFS SFNPWJOH UISFF NPSF FMFNFOUT", SBOHF);
SFQPSU("5IF DPQZ", UIF$PQZ);
^
1C@ JPOKPO JA OC@ KMJBM<H NCJRN OC<O M@HJQDIB @G@H@ION AMJH OC@ M<IB@ ?J@N IJO <AA@>O DON
N<Q@? >JKT:
0SJHJOBM SBOHF: <0, 1, 1, 2, 3>
"GUFS SFNPWJOH UXP FMFNFOUT: <1, 2, 3, 5, 8>
5IF DPQZ: <1, 2, 3, 5, 8>
"GUFS SFNPWJOH UISFF NPSF FMFNFOUT: <5, 8, 13, 21, 34>
5IF DPQZ: <1, 2, 3, 5, 8>
AGNJ IJO@ OC<O OC@ M<IB@ DN K<NN@? ?DM@>OGT OJ XSJUFGMO DI SFQPSU(). )DF@ JPM QSJOU()
API>ODJI, OC@ JPOKPO API>ODJIN JA OC@ TUEJP HJ?PG@ ><I O<F@ *OQVU3BOHF J=E@>ON. & RDGG PN@
TUEJP'N JPOKPO API>ODJIN AMJH IJR JI.
AI <GBJMDOCH OC<O RJMFN RDOC 'PSXBSE3BOHF DN TUE.SBOHF.DZDMF. DZDMF() DO@M<O@N JQ@M OC@
@G@H@ION JA < M<IB@ M@K@<O@?GT AMJH OC@ =@BDIIDIB OJ OC@ @I?. &I JM?@M OJ =@ <=G@ OJ NO<MO
JQ@M AMJH OC@ =@BDIIDIB DO HPNO =@ <=G@ OJ N<Q@ < >JKT JA OC@ DIDOD<G NO<O@ JA OC@ M<IB@, NJ DO
M@LPDM@N < 'PSXBSE3BOHF.
0DI>@ 'JCPOBDDJ4FSJFT DN IJR < 'PSXBSE3BOHF, R@ ><I OMT DZDMF() RDOC <
'JCPOBDDJ4FSJFT J=E@>O; =PO DI JM?@M OJ <QJD? C<QDIB DZDMF() DO@M<O@ JQ@M <I DIADIDO@ M<IB@,
'3@97E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
565
<I? <N < M@NPGO I@Q@M ADI? OC@ @I? JA DO, R@ HPNO ADMNO H<F@ < ADIDO@ M<IB@ =T K<NNDIB
'JCPOBDDJ4FSJFT OCMJPBC UBLF():
XSJUFMO('JCPOBDDJ4FSJFT().UBLF(5).DZDMF.UBLF(20));
&I JM?@M OJ H<F@ OC@ M@NPGO<IO M<IB@ ADIDO@ <N R@GG, OC@ M<IB@ OC<O DN M@OPMI@? =T DZDMF DN <GNJ
K<NN@? OCMJPBC UBLF(). 1C@ JPOKPO >JINDNON JA F:7 8;DEF FI7@FK 7>7?7@FE A8 5K5>;@9 F:DAG9:
F:7 8;DEF 8;H7 7>7?7@FE A8 FibonacciSeries:
<0, 1, 1, 2, 3, 0, 1, 1, 2, 3, 0, 1, 1, 2, 3, 0, 1, 1, 2, 3>
4@ >JPG? C<Q@ ?@ADI@? DIO@MH@?D<O@ Q<MD<=G@N <N R@GG. 1C@ AJGGJRDIB DN <I @LPDQ<G@IO JA OC@
NDIBG@ GDI@ >J?@ <=JQ@:
BVUP TFSJFT = 'JCPOBDDJ4FSJFT();
BVUP GJSTU1BSU = TFSJFT.UBLF(5);
BVUP DZDMFE5ISPVHI = GJSTU1BSU.DZDMF;
BVUP GJSTU1BSU0G$ZDMFE5ISPVHI = DZDMFE5ISPVHI.UBLF(20);
XSJUFMO(GJSTU1BSU0G$ZDMFE5ISPVHI);
& RJPG? GDF@ OJ KJDIO JPO OC@ DHKJMO<I>@ JA G<UDI@NN JI@ HJM@ ODH@: 1C@ ADMNO AJPM GDI@N <=JQ@
H@M@GT >JINOMP>O M<IB@ J=E@>ON OC<O RDGG @Q@IOP<GGT KMJ?P>@ OC@ @G@H@ION. 1C@ IPH=@MN OC<O
<M@ K<MO JA OC@ M@NPGO <M@ ><G>PG<O@? =T 'JCPOBDDJ4FSJFT.QPQ'SPOU() <N I@@?@?.
Note: A>F:AG9: I7 :3H7 EF3DF76 I;F: FibonacciSeries 3E 3 ForwardRange, I7 :3H7 35FG3>>K
B3EE76 F:7 D7EG>F A8 FibonacciSeries().take(5) FA cycle(). take() ;E 363BF;H7: F:7 D3@97
F:3F ;F D7FGD@E ;E 3 ForwardRange ;8 ;FE B3D3?7F7D ;E 3 ForwardRange. ,7 I;>> E77 :AI F:;E ;E
355A?B>;E:76 I;F: isForwardRange ;@ F:7 @7JF 5:3BF7D.
#JEJSFDUJPOBM3BOHF
81.7
#JEJSFDUJPOBM3BOHF KMJQD?@N ORJ H@H=@M API>ODJIN JQ@M OC@ H@H=@M API>ODJIN JA
'PSXBSE3BOHF. CBDL DN NDHDG<M OJ GSPOU: DO KMJQD?@N <>>@NN OJ OC@ G<NO @G@H@IO JA OC@ M<IB@.
QPQ#BDL() DN NDHDG<M OJ QPQ'SPOU(): DO M@HJQ@N OC@ G<NO @G@H@IO AMJH OC@ M<IB@.
&HKJMODIB TUE.BSSBZ <POJH<OD><GGT H<F@N NGD>@N =@>JH@ #JEJSFDUJPOBM3BOHF M<IB@N.
A BJJ? #JEJSFDUJPOBM3BOHF @S<HKG@ DN OC@ TUE.SBOHF.SFUSP API>ODJI. SFUSP() O<F@N <
#JEJSFDUJPOBM3BOHF <I? OD@N DON GSPOU OJ CBDL, <I? QPQ'SPOU() OJ QPQ#BDL(). AN < M@NPGO,
OC@ JMDBDI<G M<IB@ DN DO@M<O@? JQ@M DI M@Q@MN@ JM?@M:
XSJUFMO(< 1, 2, 3 >.SFUSP);
1C@ JPOKPO:
<3, 2, 1>
)@O'N ?@ADI@ < M<IB@ OC<O =@C<Q@N NDHDG<MGT OJ OC@ NK@>D<G M<IB@ OC<O SFUSP() M@OPMIN.
AGOCJPBC OC@ AJGGJRDIB M<IB@ C<N GDHDO@? API>ODJI<GDOT, DO NCJRN CJR KJR@MAPG M<IB@N <M@:
TUSVDU 3FWFSTFE
\
JOU<> SBOHF;
UIJT(JOU<> SBOHF)
\
'3@97E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
566
UIJT.SBOHF = SBOHF;
^
!QSPQFSUZ CPPM FNQUZ() DPOTU
\
SFUVSO SBOHF.FNQUZ;
^
!QSPQFSUZ JOU GSPOU() DPOTU
\
SFUVSO SBOHF.CBDL; // j SFWFSTF
^
!QSPQFSUZ JOU CBDL() DPOTU
\
SFUVSO SBOHF.GSPOU; // j SFWFSTF
^
WPJE QPQ'SPOU()
\
SBOHF.QPQ#BDL(); // j SFWFSTF
^
WPJE QPQ#BDL()
\
SBOHF.QPQ'SPOU(); // j SFWFSTF
^
^
WPJE NBJO()
\
XSJUFMO(3FWFSTFE(< 1, 2, 3>));
^
1C@ JPOKPO DN OC@ N<H@ <N SFUSP():
<3, 2, 1>
3BOEPN"DDFTT3BOHF
81.8
3BOEPN"DDFTT3BOHF M@KM@N@ION M<IB@N OC<O <GGJR <>>@NNDIB @G@H@ION =T OC@ <> JK@M<OJM. AN
R@ C<Q@ N@@I DI OC@ ,K@M<OJM ,Q@MGJ<?DIB >C<KO@M, <> JK@M<OJM DN ?@ADI@? =T OC@ PQ*OEFY()
H@H=@M API>ODJI.
&HKJMODIB TUE.BSSBZ HJ?PG@ H<F@N NGD>@N =@>JH@ 3BOEPN"DDFTT3BOHF M<IB@N JIGT DA
KJNND=G@. #JM @S<HKG@, NDI>@ 21#-8 <I? 21#-16 @I>J?DIBN ?J IJO <GGJR <>>@NNDIB 2ID>J?@
>C<M<>O@MN =T <I DI?@S, DIBS <I? XDIBS <MM<TN ><IIJO =@ PN@? <N 3BOEPN"DDFTT3BOHF M<IB@N
JA 2ID>J?@ >C<M<>O@MN. ,I OC@ JOC@M C<I?, NDI>@ OC@ >J?@N JA OC@ 21#-32 @I>J?DIB
>JMM@NKJI? JI@-OJ-JI@ OJ 2ID>J?@ >C<M<>O@M >J?@N, EDIBS <MM<TN ><I =@ PN@? <N
3BOEPN"DDFTT3BOHF M<IB@N JA 2ID>J?@ >C<M<>O@MN.
&O DN I<OPM<G OC<O @Q@MT OTK@ RJPG? ?@ADI@ OC@ PQ*OEFY() H@H=@M API>ODJI <>>JM?DIB OJ DON
API>ODJI<GDOT. %JR@Q@M, >JHKPO@M N>D@I>@ C<N <I @SK@>O<ODJI JI DON <GBJMDOCHD> >JHKG@SDOT:
M<I?JH <>>@NN HPNO =@ 3F 5A@EF3@F F;?7. JINO<IO ODH@ <>>@NN H@<IN OC<O OC@ ODH@ NK@IO
RC@I <>>@NNDIB <I @G@H@IO DN DI?@K@I?@IO JA OC@ IPH=@M JA @G@H@ION DI OC@ >JIO<DI@M.
1C@M@AJM@, IJ H<OO@M CJR G<MB@ OC@ M<IB@ DN, @G@H@IO <>>@NN NCJPG? IJO ?@K@I? JI OC@ G@IBOC
JA OC@ M<IB@.
&I JM?@M OJ =@ >JIND?@M@? < 3BOEPN"DDFTT3BOHF, A@7 JA OC@ AJGGJRDIB >JI?DODJIN HPNO <GNJ =@
N<ODNAD@?:
t OJ =@ <I DIADIDO@ 'PSXBSE3BOHF
'3@97E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
567
JM
t OJ =@ < #JEJSFDUJPOBM3BOHF OC<O <GNJ KMJQD?@N OC@ MFOHUI KMJK@MOT
!@K@I?DIB JI OC@ >JI?DODJI OC<O DN N<ODNAD@?, OC@ M<IB@ DN @DOC@M DIADIDO@ JM ADIDO@.
Infinite 3BOEPN"DDFTT3BOHF 81.8.1
1C@ AJGGJRDIB <M@ <GG JA OC@ M@LPDM@H@ION JA < 3BOEPN"DDFTT3BOHF OC<O DN =<N@? JI <I ;@8;@;F7
ForwardRange:
t FNQUZ, GSPOU <I? QPQ'SPOU() OC<O *OQVU3BOHF M@LPDM@N
t TBWF OC<O 'PSXBSE3BOHF M@LPDM@N
t PQ*OEFY() OC<O 3BOEPN"DDFTT3BOHF M@LPDM@N
t OC@ Q<GP@ JA FNQUZ OJ =@ FIJRI <O >JHKDG@ ODH@ <N GBMTF
4@ R@M@ <=G@ OJ ?@ADI@ 'JCPOBDDJ4FSJFT <N < 'PSXBSE3BOHF. %JR@Q@M, PQ*OEFY() ><IIJO =@
DHKG@H@IO@? OJ JK@M<O@ <O >JINO<IO ODH@ AJM 'JCPOBDDJ4FSJFT =@><PN@ <>>@NNDIB <I @G@H@IO
M@LPDM@N <>>@NNDIB <GG JA OC@ KM@QDJPN @G@H@ION ADMNO.
AN <I @S<HKG@ RC@M@ PQ*OEFY() ><I JK@M<O@ <O >JINO<IO ODH@, G@O'N ?@ADI@ <I DIADIDO@ M<IB@
OC<O >JINDNON JA NLP<M@N JA DIO@B@MN. AGOCJPBC OCDN M<IB@ DN DIADIDO@, <>>@NNDIB <IT JI@ JA DON
@G@H@ION ><I C<KK@I <O >JINO<IO ODH@:
DMBTT 4RVBSFT3BOHF
\
JOU GJSTU;
UIJT(JOU GJSTU = 0)
\
UIJT.GJSTU = GJSTU;
^
FOVN FNQUZ = GBMTF;
!QSPQFSUZ JOU GSPOU() DPOTU
\
SFUVSO PQ*OEFY(0);
^
WPJE QPQ'SPOU()
\
++GJSTU;
^
!QSPQFSUZ 4RVBSFT3BOHF TBWF() DPOTU
\
SFUVSO OFX 4RVBSFT3BOHF(GJSTU);
^
JOU PQ*OEFY(TJ[F@U JOEFY) DPOTU
\
/* 5IJT GVODUJPO PQFSBUFT BU DPOTUBOU UJNF */
JNNVUBCMF JOUFHFS7BMVF = GJSTU + DBTU(JOU)JOEFY;
SFUVSO JOUFHFS7BMVF * JOUFHFS7BMVF;
^
^
AGOCJPBC IJ NK<>@ C<N =@@I <GGJ><O@? AJM OC@ @G@H@ION JA OCDN M<IB@, OC@ @G@H@ION ><I =@
<>>@NN@? =T OC@ <> JK@M<OJM:
BVUP TRVBSFT = OFX 4RVBSFT3BOHF();
'3@97E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
568
XSJUFMO(TRVBSFT<5>);
XSJUFMO(TRVBSFT<10>);
1C@ JPOKPO >JIO<DIN OC@ @G@H@ION <O DI?@S@N 5 <I? 10:
25
100
1C@ @G@H@IO RDOC DI?@S 0 NCJPG? <GR<TN M@KM@N@IO OC@ ADMNO @G@H@IO JA OC@ M<IB@. 4@ ><I O<F@
<?Q<IO<B@ JA QPQ'SPOU/() RC@I O@NODIB RC@OC@M OCDN M@<GGT DN OC@ ><N@:
TRVBSFT.QPQ'SPOU/(5);
XSJUFMO(TRVBSFT<0>);
1C@ ADMNO 5 @G@H@ION JA OC@ M<IB@ <M@ 0, 1, 4, 9 <I? 16; OC@ NLP<M@N JA 0, 1, 2, 3 <I? 4. AAO@M
M@HJQDIB OCJN@, OC@ NLP<M@ JA OC@ I@SO Q<GP@ =@>JH@N OC@ ADMNO @G@H@IO JA OC@ M<IB@:
25
B@DIB < 3BOEPN"DDFTT3BOHF (OC@ HJNO API>ODJI<G M<IB@), 4RVBSFT3BOHF ><I <GNJ =@ PN@? <N
JOC@M OTK@N JA M<IB@N. #JM @S<HKG@ <N <I *OQVU3BOHF RC@I K<NNDIB OJ GJMUFS():
CPPM BSF@MBTU5XP%JHJUT4BNF(JOU WBMVF)
\
/* .VTU IBWF BU MFBTU UXP EJHJUT */
JG (WBMVF < 10) \
SFUVSO GBMTF;
^
/* -BTU UXP EJHJUT NVTU CF EJWJTJCMF CZ 11 */
JNNVUBCMF MBTU5XP%JHJUT = WBMVF % 100;
SFUVSO (MBTU5XP%JHJUT % 11) == 0;
^
XSJUFMO(TRVBSFT.UBLF(50).GJMUFS!BSF@MBTU5XP%JHJUT4BNF);
1C@ JPOKPO >JINDNON JA @G@H@ION <HJIB OC@ ADMNO 50, RC@M@ G<NO ORJ ?DBDON <M@ OC@ N<H@:
<100, 144, 400, 900, 1444, 1600>
Finite 3BOEPN"DDFTT3BOHF 81.8.2
1C@ AJGGJRDIB <M@ <GG JA OC@ M@LPDM@H@ION JA < 3BOEPN"DDFTT3BOHF OC<O DN =<N@? JI < 8;@;F7
BidirectionalRange:
t FNQUZ, GSPOU <I? QPQ'SPOU() OC<O *OQVU3BOHF M@LPDM@N
t TBWF OC<O 'PSXBSE3BOHF M@LPDM@N
t CBDL <I? QPQ#BDL() OC<O #JEJSFDUJPOBM3BOHF M@LPDM@N
t PQ*OEFY() OC<O 3BOEPN"DDFTT3BOHF M@LPDM@N
t MFOHUI, RCD>C KMJQD?@N OC@ G@IBOC JA OC@ M<IB@
AN <I @S<HKG@ JA < ADIDO@ 3BOEPN"DDFTT3BOHF, G@O'N ?@ADI@ < M<IB@ OC<O RJMFN NDHDG<MGT OJ
TUE.SBOHF.DIBJO. DIBJO() KM@N@ION OC@ @G@H@ION JA < IPH=@M JA N@K<M<O@ M<IB@N <N DA OC@T
<M@ @G@H@ION JA < NDIBG@ G<MB@M M<IB@. AGOCJPBC DIBJO() RJMFN RDOC <IT OTK@ JA @G@H@IO <I?
<IT OTK@ JA M<IB@, OJ F@@K OC@ @S<HKG@ NCJMO, G@O'N DHKG@H@IO < M<IB@ OC<O RJMFN JIGT RDOC
JOU NGD>@N.
)@O'N I<H@ OCDN M<IB@ 5PHFUIFS <I? @SK@>O OC@ AJGGJRDIB =@C<QDJM AMJH DO:
'3@97E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
569
BVUP SBOHF = 5PHFUIFS(< 1, 2, 3 >, < 101, 102, 103>);
XSJUFMO(SBOHF<4>);
4C@I >JINOMP>O@? RDOC OC@ ORJ N@K<M<O@ <MM<TN <=JQ@, SBOHF NCJPG? KM@N@IO <GG JA OCJN@
@G@H@ION <N < NDIBG@ M<IB@. #JM @S<HKG@, <GOCJPBC I@DOC@M <MM<T C<N <I @G@H@IO <O DI?@S 4,
OC@ @G@H@IO 102 NCJPG? =@ OC@ @G@H@IO OC<O >JMM@NKJI?N OJ DI?@S 4 JA OC@ >JGG@>ODQ@ M<IB@:
102
AN @SK@>O@?, KMDIODIB OC@ @IODM@ M<IB@ NCJPG? >JIO<DI <GG JA OC@ @G@H@ION:
XSJUFMO(SBOHF);
1C@ JPOKPO:
<1, 2, 3, 101, 102, 103>
5PHFUIFS RDGG JK@M<O@ G<UDGT: OC@ @G@H@ION RDGG IJO =@ >JKD@? OJ < I@R G<MB@M <MM<T; OC@T RDGG
=@ <>>@NN@? AMJH OC@ JMDBDI<G NGD>@N.
4@ ><I O<F@ <?Q<IO<B@ JA H3D;36;5 8G@5F;A@E OC<O R<N DIOMJ?P>@? DI OC@ 3<MD<=G@ +PH=@M JA
-<M<H@O@MN >C<KO@M RC@I DIDOD<GDUDIB OC@ M<IB@ =T <IT IPH=@M JA JMDBDI<G NGD>@:
TUSVDU 5PHFUIFS
\
DPOTU(JOU)<><> TMJDFT;
UIJT(DPOTU(JOU)<><> TMJDFT ...)
\
UIJT.TMJDFT = TMJDFT.EVQ;
DMFBS'SPOU();
DMFBS#BDL();
^
// ...
^
+JO@ OC<O OC@ @G@H@IO OTK@ DN DPOTU(JOU), DI?D><ODIB OC<O OCDN TUSVDU RDGG IJO HJ?DAT OC@
@G@H@ION JA OC@ M<IB@N. %JR@Q@M, OC@ NGD>@N RDGG I@>@NN<MDGT =@ HJ?DAD@? =T QPQ'SPOU() OJ
DHKG@H@IO DO@M<ODJI.
1C@ DMFBS'SPOU() <I? DMFBS#BDL() ><GGN OC<O OC@ >JINOMP>OJM H<F@N <M@ OJ M@HJQ@ @HKOT
NGD>@N AMJH OC@ =@BDIIDIB <I? OC@ @I? JA OC@ JMDBDI<G NGD>@N. 0P>C @HKOT NGD>@N ?J IJO >C<IB@
OC@ =@C<QDJM JA 5PHFUIFS <I? M@HJQDIB OC@H PK AMJIO RDGG NDHKGDAT OC@ DHKG@H@IO<ODJI:
TUSVDU 5PHFUIFS
\
// ...
QSJWBUF WPJE DMFBS'SPOU()
\
XIJMF (!TMJDFT.FNQUZ && TMJDFT.GSPOU.FNQUZ) \
TMJDFT.QPQ'SPOU();
^
^
QSJWBUF WPJE DMFBS#BDL()
\
XIJMF (!TMJDFT.FNQUZ && TMJDFT.CBDL.FNQUZ) \
TMJDFT.QPQ#BDL();
'3@97E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
570
^
^
^
4@ RDGG ><GG OCJN@ API>ODJIN G<O@M AMJH QPQ'SPOU() <I? QPQ#BDL() <N R@GG.
0DI>@ DMFBS'SPOU() <I? DMFBS#BDL() M@HJQ@ <GG JA OC@ @HKOT NGD>@N AMJH OC@ =@BDIIDIB <I?
OC@ @I?; NODGG C<QDIB < NGD>@ RJPG? H@<I OC<O OC@ >JGG@>ODQ@ M<IB@ DN IJO T@O @HKOT. &I JOC@M
RJM?N, OC@ M<IB@ NCJPG? =@ >JIND?@M@? @HKOT JIGT DA OC@M@ DN IJ NGD>@ G@AO:
TUSVDU 5PHFUIFS
\
// ...
!QSPQFSUZ CPPM FNQUZ() DPOTU
\
SFUVSO TMJDFT.FNQUZ;
^
^
1C@ ADMNO @G@H@IO JA OC@ ADMNO NGD>@ DN OC@ ADMNO @G@H@IO JA OCDN 5PHFUIFS M<IB@:
TUSVDU 5PHFUIFS
\
// ...
!QSPQFSUZ JOU GSPOU() DPOTU
\
SFUVSO TMJDFT.GSPOU.GSPOU;
^
^
/@HJQDIB OC@ ADMNO @G@H@IO JA OC@ ADMNO NGD>@ M@HJQ@N OC@ ADMNO @G@H@IO JA OCDN M<IB@ <N R@GG.
0DI>@ OCDN JK@M<ODJI H<T G@<Q@ OC@ ADMNO NGD>@ @HKOT, R@ HPNO ><GG DMFBS'SPOU() OJ M@HJQ@
OC<O @HKOT NGD>@ <I? OC@ JI@N OC<O <M@ <AO@M OC<O JI@:
TUSVDU 5PHFUIFS
\
// ...
WPJE QPQ'SPOU()
\
TMJDFT.GSPOU.QPQ'SPOU();
DMFBS'SPOU();
^
^
A >JKT JA OCDN M<IB@ ><I =@ >JINOMP>O@? AMJH < >JKT JA OC@ TMJDFT H@H=@M:
TUSVDU 5PHFUIFS
\
// ...
!QSPQFSUZ 5PHFUIFS TBWF() DPOTU
\
SFUVSO 5PHFUIFS(TMJDFT.EVQ);
^
^
&>73E7 @AF7 F:3F .dup 5AB;7E A@>K E>;57E ;@ F:;E 53E7, @AF F:7 7>7?7@FE F:3F F:7K 5A@F3;@.
1C@ JK@M<ODJIN <O OC@ @I? JA OC@ M<IB@ <M@ NDHDG<M OJ OC@ JI@N <O OC@ =@BDIIDIB:
'3@97E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
571
TUSVDU 5PHFUIFS
\
// ...
!QSPQFSUZ JOU CBDL() DPOTU
\
SFUVSO TMJDFT.CBDL.CBDL;
^
WPJE QPQ#BDL()
\
TMJDFT.CBDL.QPQ#BDL();
DMFBS#BDL();
^
^
1C@ G@IBOC JA OC@ M<IB@ ><I =@ ><G>PG<O@? <N OC@ NPH JA OC@ G@IBOCN JA OC@ NGD>@N:
TUSVDU 5PHFUIFS
\
// ...
!QSPQFSUZ TJ[F@U MFOHUI() DPOTU
\
TJ[F@U UPUBM-FOHUI = 0;
GPSFBDI (TMJDF; TMJDFT) \
UPUBM-FOHUI += TMJDF.MFOHUI;
^
SFUVSO UPUBM-FOHUI;
^
^
AGO@MI<ODQ@GT, OC@ G@IBOC H<T =@ ><G>PG<O@? RDOC G@NN >J?@ =T O<FDIB <?Q<IO<B@ JA
TUE.BMHPSJUIN.SFEVDF. SFEVDF() O<F@N <I JK@M<ODJI <N DON O@HKG<O@ K<M<H@O@M <I? <KKGD@N
OC<O JK@M<ODJI OJ <GG JA OC@ @G@H@ION JA < M<IB@:
JNQPSU TUE.BMHPSJUIN;
// ...
!QSPQFSUZ TJ[F@U MFOHUI() DPOTU
\
SFUVSO SFEVDF!((B, C) => B + C.MFOHUI)(TJ[F@U.JOJU, TMJDFT);
^
1C@ B DI OC@ O@HKG<O@ K<M<H@O@M M@KM@N@ION OC@ >PMM@IO M@NPGO (F:7 EG? DI OCDN ><N@) <I? C
M@KM@N@ION OC@ >PMM@IO @G@H@IO. 1C@ ADMNO API>ODJI K<M<H@O@M DN OC@ DIDOD<G Q<GP@ JA OC@ M@NPGO
(TJ[F@U.JOJU DN 0) <I? OC@ N@>JI? API>ODJI K<M<H@O@M DN OC@ M<IB@ OC<O >JIO<DIN OC@
@G@H@ION.
Note: FGDF:7D, ;@EF736 A8 53>5G>3F;@9 F:7 >7@9F: 7H7DK F;?7 I:7@ length ;E 53>>76, ;F ?3K 47
?73EGD34>K 83EF7D FA ?3;@F3;@ 3 ?7?47D H3D;34>7 B7D:3BE @3?76 length_, I:;5: 3>I3KE
7CG3>E F:7 5ADD75F >7@9F: A8 F:7 5A>>75F;H7 D3@97. ):3F ?7?47D ?3K 47 53>5G>3F76 A@57 ;@ F:7
5A@EFDG5FAD 3@6 36<GEF76 355AD6;@9>K 3E 7>7?7@FE 3D7 D7?AH76 4K popFront() 3@6
popBack().
,I@ R<T JA M@OPMIDIB OC@ @G@H@IO OC<O >JMM@NKJI?N OJ < NK@>DAD> DI?@S DN OJ GJJF <O @Q@MT NGD>@
OJ ?@O@MHDI@ RC@OC@M OC@ @G@H@IO RJPG? =@ <HJIB OC@ @G@H@ION JA OC<O NGD>@:
TUSVDU 5PHFUIFS
\
'3@97E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
572
// ...
JOU PQ*OEFY(TJ[F@U JOEFY) DPOTU
\
/* 4BWF UIF JOEFY GPS UIF FSSPS NFTTBHF */
JNNVUBCMF PSJHJOBM*OEFY = JOEFY;
GPSFBDI (TMJDF; TMJDFT) \
JG (TMJDF.MFOHUI > JOEFY) \
SFUVSO TMJDF<JOEFY>;
^ FMTF \
JOEFY -= TMJDF.MFOHUI;
^
^
UISPX OFX &YDFQUJPO(
GPSNBU("*OWBMJE JOEFY: %T (MFOHUI: %T)",
PSJHJOBM*OEFY, UIJT.MFOHUI));
^
^
Note: ):;E opIndex() 6A7E @AF E3F;E8K F:7 5A@EF3@F F;?7 D7CG;D7?7@F F:3F :3E 477@
?7@F;A@76 34AH7. FAD F:;E ;?B>7?7@F3F;A@ FA 47 3557BF34>K 83EF, F:7 slices ?7?47D ?GEF
@AF 47 FAA >A@9.
1CDN I@R M<IB@ DN IJR M@<?T OJ =@ PN@? RDOC <IT IPH=@M JA JOU NGD>@N. 4DOC OC@ C@GK JA
UBLF() <I? BSSBZ(), R@ ><I @Q@I DI>GP?@ OC@ M<IB@ OTK@N OC<O R@ C<Q@ ?@ADI@? @<MGD@M DI
OCDN >C<KO@M:
BVUP SBOHF = 5PHFUIFS('JCPOBDDJ4FSJFT().UBLF(10).BSSBZ,
< 777, 888 >,
(OFX 4RVBSFT3BOHF()).UBLF(5).BSSBZ);
XSJUFMO(SBOHF.TBWF);
1C@ @G@H@ION JA OC@ OCM@@ NGD>@N <M@ <>>@NN@? <N DA OC@T <M@ @G@H@ION JA < NDIBG@ G<MB@ <MM<T:
<0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 777, 888, 0, 1, 4, 9, 16>
4@ ><I K<NN OCDN M<IB@ OJ JOC@M M<IB@ <GBJMDOCHN. #JM @S<HKG@ OJ SFUSP(), RCD>C M@LPDM@N <
#JEJSFDUJPOBM3BOHF:
XSJUFMO(SBOHF.TBWF.SFUSP);
1C@ JPOKPO:
<16, 9, 4, 1, 0, 888, 777, 34, 21, 13, 8, 5, 3, 2, 1, 1, 0>
,A >JPMN@ TJP NCJPG? PN@ OC@ HJM@ API>ODJI<G TUE.SBOHF.DIBJO DINO@<? JA 5PHFUIFS DI TJPM
KMJBM<HN.
0VUQVU3BOHF
81.9
AGG JA OC@ M<IB@ OTK@N OC<O R@ C<Q@ N@@I NJ A<M <M@ <=JPO @G@H@IO <>>@NN. 0VUQVU3BOHF
M@KM@N@ION NOM@<H@? @G@H@IO JPOKPO, NDHDG<M OJ N@I?DIB >C<M<>O@MN OJ TUEPVU.
& C<Q@ H@IODJI@? @<MGD@M OC<O 0VUQVU3BOHF M@LPDM@N NPKKJMO AJM OC@ QVU(SBOHF, FMFNFOU)
JK@M<ODJI. QVU() DN < API>ODJI ?@ADI@? DI OC@ TUE.SBOHF HJ?PG@. &O ?@O@MHDI@N OC@
'3@97E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
573
><K<=DGDOD@N JA OC@ M<IB@ <I? OC@ @G@H@IO <O >JHKDG@ ODH@ <I? PN@N OC@ HJNO <KKMJKMD<O@
H@OCJ? OJ PN@ OJ AGFBGF OC@ @G@H@ION.
QVU() >JIND?@MN OC@ AJGGJRDIB ><N@N DI OC@ JM?@M OC<O OC@T <M@ GDNO@? =@GJR, <I? <KKGD@N OC@
H@OCJ? AJM OC@ ADMNO H<O>CDIB ><N@. 3 M@KM@N@ION OC@ OTK@ JA OC@ M<IB@; SBOHF, < M<IB@ J=E@>O;
&, OC@ OTK@ JA OC@ @G@H@IO; <I? F <I @G@H@IO JA OC@ M<IB@:
$BTF $POTJEFSFE .FUIPE "QQMJFE
3 IBT B NFNCFS GVODUJPO OBNFE QVU
BOE QVU DBO UBLF BO & BT B QBSBNFUFS
SBOHF.QVU(F);
3 IBT B NFNCFS GVODUJPO OBNFE QVU
BOE QVU DBO UBLF BO &<> BT B QBSBNFUFS
SBOHF.QVU(< F >);
3 JT BO *OQVU3BOHF
BOE F DBO CF BTTJHOFE UP SBOHF.GSPOU
SBOHF.GSPOU = F;
SBOHF.QPQ'SPOU();
& JT BO *OQVU3BOHF
BOE DBO CF DPQJFE UP 3
GPS (; !F.FNQUZ; F.QPQ'SPOU())
QVU(SBOHF, F.GSPOU);
3 DBO UBLF & BT B QBSBNFUFS
(F.H. 3 DPVME CF B EFMFHBUF)
SBOHF(F);
3 DBO UBLF &<> BT B QBSBNFUFS
(F.H. 3 DPVME CF B EFMFHBUF)
SBOHF(< F >);
)@O'N ?@ADI@ < M<IB@ OC<O H<O>C@N OC@ ADMNO ><N@: 1C@ M<IB@ RDGG C<Q@ < H@H=@M API>ODJI
I<H@? QVU(), RCD>C O<F@N < K<M<H@O@M OC<O H<O>C@N OC@ OTK@ JA OC@ JPOKPO M<IB@.
1CDN JPOKPO M<IB@ RDGG =@ PN@? AJM JPOKPOODIB @G@H@ION OJ HPGODKG@ ADG@N, DI>GP?DIB TUEPVU.
4C@I @G@H@ION <M@ JPOKPOO@? RDOC QVU(), OC@T RDGG <GG =@ RMDOO@I OJ <GG JA OCJN@ ADG@N. AN <I
<??DODJI<G API>ODJI<GDOT, G@O'N <?? OC@ <=DGDOT OJ NK@>DAT < ?@GDHDO@M OJ =@ RMDOO@I <AO@M @<>C
@G@H@IO.
TUSVDU .VMUJ'JMF
\
TUSJOH EFMJNJUFS;
'JMF<> GJMFT;
UIJT(TUSJOH EFMJNJUFS, TUSJOH<> GJMF/BNFT ...)
\
UIJT.EFMJNJUFS = EFMJNJUFS;
/* TUEPVU JT BMXBZT JODMVEFE */
UIJT.GJMFT _= TUEPVU;
/* " 'JMF PCKFDU GPS FBDI GJMF OBNF */
GPSFBDI (GJMF/BNF; GJMF/BNFT) \
UIJT.GJMFT _= 'JMF(GJMF/BNF, "X");
^
^
WPJE QVU(5)(5 FMFNFOU)
\
GPSFBDI (GJMF; GJMFT) \
GJMF.XSJUF(FMFNFOU, EFMJNJUFS);
^
^
^
'3@97E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
574
&I JM?@M OJ =@ PN@? <N <I JPOKPO M<IB@ JA <IT OTK@ JA @G@H@ION, QVU() DN <GNJ O@HKG<ODU@? JI
OC@ @G@H@IO OTK@.
AI <GBJMDOCH DI -CJ=JN OC<O PN@N 0VUQVU3BOHF DN TUE.BMHPSJUIN.DPQZ. DPQZ() DN < Q@MT
NDHKG@ <GBJMDOCH, RCD>C >JKD@N OC@ @G@H@ION JA <I *OQVU3BOHF OJ <I 0VUQVU3BOHF.
JNQPSU TUE.BMHPSJUIN;
// ...
BVUP PVUQVU = .VMUJ'JMF("=O", "PVUQVU@0", "PVUQVU@1");
DPQZ(< 1, 2, 3>, PVUQVU);
DPQZ(< "SFE", "CMVF", "HSFFO" >, PVUQVU);
1C<O >J?@ JPOKPON OC@ @G@H@ION JA OC@ DIKPO M<IB@N =JOC OJ TUEPVU <I? OJ ADG@N I<H@?
"JPOKPO;0" <I? "JPOKPO;1":
1
2
3
SFE
CMVF
HSFFO
Using slices as 0VUQVU3BOHF 81.9.1
1C@ TUE.SBOHF HJ?PG@ H<F@N NGD>@N 0VUQVU3BOHF J=E@>ON <N R@GG. (BT >JIOM<NO, TUE.BSSBZ
H<F@N OC@H JIGT DIKPO M<IB@N.) 2IAJMOPI<O@GT, PNDIB NGD>@N <N 0VUQVU3BOHF J=E@>ON C<N <
>JIAPNDIB @AA@>O: NGD>@N GJN@ <I @G@H@IO AJM @<>C QVU() JK@M<ODJI JI OC@H; <I? OC<O @G@H@IO
DN OC@ @G@H@IO OC<O C<N EPNO =@@I JPOKPOO@?!
1C@ M@<NJI AJM OCDN =@C<QDJM DN < >JIN@LP@I>@ JA NGD>@N' IJO C<QDIB < QVU() H@H=@M API>ODJI.
AN < M@NPGO, OC@ OCDM? ><N@ JA OC@ KM@QDJPN O<=G@ DN H<O>C@? AJM NGD>@N <I? OC@ AJGGJRDIB
H@OCJ? DN <KKGD@?:
SBOHF.GSPOU = F;
SBOHF.QPQ'SPOU();
AN OC@ >J?@ <=JQ@ DN @S@>PO@? AJM @<>C QVU(), OC@ AMJIO @G@H@IO JA OC@ NGD>@ DN <NNDBI@? OJ OC@
Q<GP@ JA OC@ AGFBGFF76 @G@H@IO, OJ =@ NP=N@LP@IOGT M@HJQ@? AMJH OC@ NGD>@ RDOC QPQ'SPOU():
JNQPSU TUE.TUEJP;
JNQPSU TUE.SBOHF;
WPJE NBJO()
\
JOU<> TMJDF = < 1, 2, 3 >;
QVU(TMJDF, 100);
XSJUFMO(TMJDF);
^
AN < M@NPGO, <GOCJPBC OC@ NGD>@ DN PN@? <N <I 0VUQVU3BOHF, DO NPMKMDNDIBGT >AE7E @G@H@ION:
<2, 3>
1J <QJD? OCDN, < N@K<M<O@ NGD>@ HPNO =@ PN@? <N <I 0VUQVU3BOHF DINO@<?:
'3@97E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
575
JNQPSU TUE.TUEJP;
JNQPSU TUE.SBOHF;
WPJE NBJO()
\
JOU<> TMJDF = < 1, 2, 3 >;
JOU<> TMJDF2 = TMJDF;
QVU(TMJDF2, 100);
XSJUFMO(TMJDF2);
XSJUFMO(TMJDF);
^
1CDN ODH@ OC@ N@>JI? NGD>@ DN >JINPH@? <I? OC@ JMDBDI<G NGD>@ C<N OC@ @SK@>O@? @G@H@ION:
<2, 3>
<100, 2, 3> l FYQFDUFE SFTVMU
AIJOC@M DHKJMO<IO A<>O DN OC<O OC@ G@IBOC JA OC@ NGD>@ ?J@N IJO BMJR RC@I PN@? <N <I
0VUQVU3BOHF. &O DN OC@ KMJBM<HH@M'N M@NKJIND=DGDOT OJ @INPM@ OC<O OC@M@ DN @IJPBC MJJH DI
OC@ NGD>@:
JOU<> TMJDF = < 1, 2, 3 >;
JOU<> TMJDF2 = TMJDF;
GPSFBDI (J; 0 .. 4) \ // j OP SPPN GPS 4 FMFNFOUT
QVU(TMJDF2, J * 100);
^
4C@I OC@ NGD>@ =@>JH@N >JHKG@O@GT @HKOT =@><PN@ JA OC@ DI?DM@>O QPQ'SPOU() ><GGN, OC@
KMJBM<H O@MHDI<O@N RDOC <I @S>@KODJI:
DPSF.FYDFQUJPO."TTFSU&SSPS!...: "UUFNQUJOH UP GFUDI UIF GSPOU
PG BO FNQUZ BSSBZ PG JOU
TUE.BSSBZ.BQQFOEFS <GGJRN PNDIB NGD>@N <N 3@ OutputRange I:7D7 F:7 7>7?7@FE 3D7
3BB7@676. 1C@ QVU() API>ODJI JA OC@ NK@>D<G M<IB@ J=E@>O OC<O BQQFOEFS() M@OPMIN <>OP<GGT
<KK@I?N OC@ @G@H@ION OJ OC@ JMDBDI<G NGD>@:
JNQPSU TUE.BSSBZ;
// ...
BVUP B = BQQFOEFS(< 1, 2, 3 >);
GPSFBDI (J; 0 .. 4) \
B.QVU(J * 100);
^
&I OC@ >J?@ <=JQ@, BQQFOEFS DN ><GG@? RDOC <I <MM<T <I? M@OPMIN < NK@>D<G M<IB@ J=E@>O. 1C<O
M<IB@ J=E@>O DN DI OPMI PN@? <N <I 0VUQVU3BOHF =T ><GGDIB DON QVU() H@H=@M API>ODJI. 1C@
M@NPGO<IO @G@H@ION <M@ <>>@NN@? =T DON .EBUB KMJK@MOT:
XSJUFMO(B.EBUB);
1C@ JPOKPO:
<1, 2, 3, 0, 100, 200, 300>
'3@97E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
576
Range templates
81.10
AGOCJPBC R@ C<Q@ PN@? HJNOGT JOU M<IB@N DI OCDN >C<KO@M, M<IB@N <I? M<IB@ <GBJMDOCHN <M@
HP>C HJM@ PN@APG RC@I ?@ADI@? <N O@HKG<O@N.
1C@ TUE.SBOHF HJ?PG@ DI>GP?@N H<IT M<IB@ O@HKG<O@N. 4@ RDGG N@@ OC@N@ O@HKG<O@N DI OC@
I@SO >C<KO@M.
Summary
81.11
t /<IB@N <=NOM<>O ?<O< NOMP>OPM@N AMJH <GBJMDOCHN <I? <GGJR OC@H OJ =@ PN@? RDOC
<GBJMDOCHN N@<HG@NNGT.
t /<IB@N <M@ < ! >JI>@KO <I? <M@ OC@ =<NDN AJM H<IT A@<OPM@N JA -CJ=JN.
t *<IT -CJ=JN <GBJMDOCHN M@OPMI G<UT M<IB@ J=E@>ON OJ <>>JHKGDNC OC@DM NK@>D<G O<NFN.
t 2#0 RJMFN R@GG RDOC M<IB@ <GBJMDOCHN.
t 4C@I PN@? <N *OQVU3BOHF J=E@>ON, OC@ @G@H@ION JA NOMDIBN <M@ 2ID>J?@ >C<M<>O@MN.
t *OQVU3BOHF M@LPDM@N FNQUZ, GSPOU <I? QPQ'SPOU().
t 'PSXBSE3BOHF <??DODJI<GGT M@LPDM@N TBWF.
t #JEJSFDUJPOBM3BOHF <??DODJI<GGT M@LPDM@N CBDL <I? QPQ#BDL().
t &IADIDO@ 3BOEPN"DDFTT3BOHF M@LPDM@N PQ*OEFY() JQ@M 'PSXBSE3BOHF.
t #DIDO@ 3BOEPN"DDFTT3BOHF M@LPDM@N PQ*OEFY() <I? MFOHUI JQ@M #JEJSFDUJPOBM3BOHF.
t TUE.BSSBZ.BQQFOEFS M@OPMIN <I 0VUQVU3BOHF OC<O <KK@I?N OJ NGD>@N.
t 0GD>@N <M@ M<IB@N JA ADIDO@ 3BOEPN"DDFTT3BOHF
t #DS@?-G@IBOC <MM<TN <M@ IJO M<IB@N.
'3@97E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
577
More Ranges 82
4@ PN@? HJNOGT JOU M<IB@N DI OC@ KM@QDJPN >C<KO@M. &I KM<>OD>@, >JIO<DI@MN, <GBJMDOCHN, <I?
M<IB@N <M@ <GHJNO <GR<TN DHKG@H@IO@? <N O@HKG<O@N. 1C@ QSJOU() @S<HKG@ DI OC<O >C<KO@M
R<N < O@HKG<O@ <N R@GG:
WPJE QSJOU(5)(5 SBOHF)
\
// ...
^
4C<O G<>FN AMJH OC@ DHKG@H@IO<ODJI JA QSJOU() DN OC<O @Q@I OCJPBC DO M@LPDM@N 5 OJ =@ < FDI?
JA *OQVU3BOHF, DO ?J@N IJO AJMH<GDU@ OC<O M@LPDM@H@IO RDOC < O@HKG<O@ >JINOM<DIO. (4@ C<Q@
N@@I O@HKG<O@ >JINOM<DION DI OC@ *JM@ 1@HKG<O@N >C<KO@M.)
1C@ TUE.SBOHF HJ?PG@ >JIO<DIN O@HKG<O@N OC<O <M@ PN@APG =JOC DI O@HKG<O@ >JINOM<DION <I? DI
TUBUJD JG NO<O@H@ION.
Range kind templates
82.1
1C@ BMJPK JA O@HKG<O@N RDOC I<H@N NO<MODIB RDOC JT ?@O@MHDI@ RC@OC@M < OTK@ N<ODNAD@N OC@
M@LPDM@H@ION JA < >@MO<DI FDI? JA M<IB@. #JM @S<HKG@, JT*OQVU3BOHF!5 <INR@MN OC@ LP@NODJI
"DN 5 <I *OQVU3BOHF?" 1C@ AJGGJRDIB O@HKG<O@N <M@ AJM ?@O@MHDIDIB RC@OC@M < OTK@ DN JA <
NK@>DAD> B@I@M<G M<IB@ FDI?:
t JT*OQVU3BOHF
t JT'PSXBSE3BOHF
t JT#JEJSFDUJPOBM3BOHF
t JT3BOEPN"DDFTT3BOHF
t JT0VUQVU3BOHF
A>>JM?DIBGT, OC@ O@HKG<O@ >JINOM<DIO JA QSJOU() ><I PN@ JT*OQVU3BOHF:
WPJE QSJOU(5)(5 SBOHF)
JG (JT*OQVU3BOHF!5)
\
// ...
^
2IGDF@ OC@ JOC@MN, JT0VUQVU3BOHF O<F@N ORJ O@HKG<O@ K<M<H@O@MN: 1C@ ADMNO JI@ DN < M<IB@
OTK@ <I? OC@ N@>JI? JI@ DN <I @G@H@IO OTK@. &O M@OPMIN USVF DA OC<O M<IB@ OTK@ <GGJRN
JPOKPOODIB OC<O @G@H@IO OTK@. #JM @S<HKG@, OC@ AJGGJRDIB >JINOM<DIO DN AJM M@LPDMDIB OC<O OC@
M<IB@ HPNO =@ <I 0VUQVU3BOHF OC<O <>>@KON EPVCMF @G@H@ION:
WPJE GPP(5)(5 SBOHF)
JG (JT0VUQVU3BOHF!(5, EPVCMF))
\
// ...
^
4C@I PN@? DI >JIEPI>ODJI RDOC TUBUJD JG, OC@N@ >JINOM<DION ><I ?@O@MHDI@ OC@ ><K<=DGDOD@N
JA PN@M-?@ADI@? M<IB@N <N R@GG. #JM @S<HKG@, RC@I < ?@K@I?@IO M<IB@ JA < PN@M-?@ADI@? M<IB@
DN < 'PSXBSE3BOHF, OC@ PN@M-?@ADI@? M<IB@ ><I O<F@ <?Q<IO<B@ JA OC<O A<>O <I? ><I KMJQD?@
OC@ TBWF() API>ODJI <N R@GG.
#AD7 '3@97E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
578
)@O'N N@@ OCDN JI < M<IB@ OC<O KMJ?P>@N OC@ I@B<ODQ@N JA OC@ @G@H@ION JA <I @SDNODIB M<IB@
(HJM@ <>>PM<O@GT, OC@ @G?7D;5 5A?B>7?7@FE JA OC@ @G@H@ION). )@O'N NO<MO RDOC EPNO OC@
*OQVU3BOHF API>ODJIN:
TUSVDU /FHBUJWF(5)
JG (JT*OQVU3BOHF!5)
\
5 SBOHF;
!QSPQFSUZ CPPM FNQUZ()
\
SFUVSO SBOHF.FNQUZ;
^
!QSPQFSUZ BVUP GSPOU()
\
SFUVSO -SBOHF.GSPOU;
^
WPJE QPQ'SPOU()
\
SBOHF.QPQ'SPOU();
^
^
Note: AE I7 I;>> E77 47>AI, F:7 D7FGD@ FKB7 A8 front 53@ 47 EB75;8;76 3E ElementType!T 3E
I7>>.
1C@ JIGT API>ODJI<GDOT JA OCDN M<IB@ DN DI OC@ GSPOU API>ODJI RC@M@ DO KMJ?P>@N OC@ I@B<ODQ@ JA
OC@ AMJIO @G@H@IO JA OC@ JMDBDI<G M<IB@.
AN PNP<G, OC@ AJGGJRDIB DN OC@ >JIQ@ID@I>@ API>ODJI OC<O BJ@N RDOC OC<O M<IB@:
/FHBUJWF!5 OFHBUJWF(5)(5 SBOHF)
\
SFUVSO /FHBUJWF!5(SBOHF);
^
1CDN M<IB@ DN M@<?T OJ =@ PN@? RDOC @.B. 'JCPOBDDJ4FSJFT OC<O R<N ?@ADI@? DI OC@ KM@QDJPN
>C<KO@M:
TUSVDU 'JCPOBDDJ4FSJFT
\
JOU GJSTU = 0;
JOU TFDPOE = 1;
FOVN FNQUZ = GBMTF;
!QSPQFSUZ JOU GSPOU() DPOTU
\
SFUVSO GJSTU;
^
WPJE QPQ'SPOU()
\
JOU UIJSE = GJSTU + TFDPOE;
GJSTU = TFDPOE;
TFDPOE = UIJSE;
^
!QSPQFSUZ 'JCPOBDDJ4FSJFT TBWF() DPOTU
\
SFUVSO UIJT;
^
^
#AD7 '3@97E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
579
// ...
XSJUFMO('JCPOBDDJ4FSJFT().UBLF(5).OFHBUJWF);
1C@ JPOKPO >JIO<DIN OC@ I@B<ODQ@N JA OC@ ADMNO ADQ@ @G@H@ION JA OC@ N@MD@N:
<0, -1, -1, -2, -3>
+<OPM<GGT, =@DIB EPNO <I *OQVU3BOHF, /FHBUJWF ><IIJO =@ PN@? RDOC <GBJMDOCHN GDF@ DZDMF()
OC<O M@LPDM@ < 'PSXBSE3BOHF:
XSJUFMO('JCPOBDDJ4FSJFT()
.UBLF(5)
.OFHBUJWF
.DZDMF // j DPNQJMBUJPO &3303
.UBLF(10));
%JR@Q@M, RC@I OC@ JMDBDI<G M<IB@ DN <GM@<?T < 'PSXBSE3BOHF, OC@M@ DN IJ M@<NJI AJM
/FHBUJWF IJO OJ KMJQD?@ OC@ TBWF() API>ODJI <N R@GG. 1CDN >JI?DODJI ><I =@ ?@O@MHDI@? =T <
TUBUJD JG NO<O@H@IO <I? TBWF() ><I =@ KMJQD?@? DA OC@ JMDBDI<G M<IB@ DN < 'PSXBSE3BOHF. &I
OCDN ><N@ DO DN <N OMDQD<G <N M@OPMIDIB < I@R /FHBUJWF J=E@>O OC<O DN >JINOMP>O@? =T < >JKT JA
OC@ JMDBDI<G M<IB@:
TUSVDU /FHBUJWF(5)
JG (JT*OQVU3BOHF!5)
\
// ...
TUBUJD JG (JT'PSXBSE3BOHF!5)
\
!QSPQFSUZ /FHBUJWF TBWF()
\
SFUVSO /FHBUJWF(SBOHF.TBWF);
^
^
^
1C@ <??DODJI JA OC@ I@R TBWF() API>ODJI H<F@N /FHBUJWF!'JCPOBDDJ4FSJFT < 'PSXBSE3BOHF
<N R@GG <I? OC@ DZDMF() ><GG ><I IJR =@ >JHKDG@?:
XSJUFMO('JCPOBDDJ4FSJFT()
.UBLF(5)
.OFHBUJWF
.DZDMF // j OPX DPNQJMFT
.UBLF(10));
1C@ JPOKPO JA OC@ @IODM@ @SKM@NNDJI ><I =@ ?@N>MD=@? <N F3=7 F:7 8;DEF 8;H7 7>7?7@FE A8 F:7
F;4A@355; E7D;7E, F3=7 F:7;D @793F;H7E, 5K5>7 F:AE7 ;@678;@;F7>K, 3@6 F3=7 F:7 8;DEF F7@ A8 F:AE7
7>7?7@FE:
<0, -1, -1, -2, -3, 0, -1, -1, -2, -3>
4DOC OC@ N<H@ <KKMJ<>C, /FHBUJWF ><I =@ H<?@ < #JEJSFDUJPOBM3BOHF <I? <
3BOEPN"DDFTT3BOHF DA OC@ JMDBDI<G M<IB@ NPKKJMON OCJN@ API>ODJI<GDOD@N:
TUSVDU /FHBUJWF(5)
JG (JT*OQVU3BOHF!5)
\
// ...
#AD7 '3@97E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
580
TUBUJD JG (JT#JEJSFDUJPOBM3BOHF!5)
\
!QSPQFSUZ BVUP CBDL()
\
SFUVSO -SBOHF.CBDL;
^
WPJE QPQ#BDL()
\
SBOHF.QPQ#BDL();
^
^
TUBUJD JG (JT3BOEPN"DDFTT3BOHF!5)
\
BVUP PQ*OEFY(TJ[F@U JOEFY)
\
SFUVSO -SBOHF<JOEFY>;
^
^
^
#JM @S<HKG@, RC@I DO DN PN@? RDOC < NGD>@, OC@ I@B<ODQ@ @G@H@ION ><I =@ <>>@NN@? =T OC@ <>
JK@M<OJM:
BVUP E = < 1.5, 2.75 >;
BVUP O = E.OFHBUJWF;
XSJUFMO(O<1>);
1C@ JPOKPO:
-2.75
&MFNFOU5ZQF and &MFNFOU&ODPEJOH5ZQF
82.2
&MFNFOU5ZQF KMJQD?@N OC@ OTK@N JA OC@ @G@H@ION JA OC@ M<IB@.
#JM @S<HKG@, OC@ AJGGJRDIB O@HKG<O@ >JINOM<DIO DI>GP?@N < M@LPDM@H@IO OC<O DN <=JPO OC@
@G@H@IO OTK@ JA OC@ ADMNO M<IB@:
WPJE GPP(*1, *2, 0)(*1 JOQVU1, *2 JOQVU2, 0 PVUQVU)
JG (JT*OQVU3BOHF!*1 &&
JT'PSXBSE3BOHF!*2 &&
JT0VUQVU3BOHF!(0, &MFNFOU5ZQF!*1))
\
// ...
^
1C@ KM@QDJPN >JINOM<DIO ><I =@ ?@N>MD=@? <N ;8 I1 ;E 3@ InputRange 3@6 I2 ;E 3 ForwardRange
3@6 O ;E 3@ OutputRange F:3F 3557BFE F:7 7>7?7@F FKB7 A8 I1.
0DI>@ NOMDIBN <M@ <GR<TN M<IB@N JA 2ID>J?@ >C<M<>O@MN, M@B<M?G@NN JA OC@DM <>OP<G >C<M<>O@M
OTK@N, OC@T <M@ <GR<TN M<IB@N JA EDIBS, RCD>C H@<IN OC<O @Q@I &MFNFOU5ZQF!TUSJOH <I?
&MFNFOU5ZQF!XTUSJOH <M@ EDIBS. #JM OC<O M@<NJI, RC@I I@@?@? DI < O@HKG<O@, OC@ <>OP<G
21# @I>J?DIB OTK@ JA < NOMDIB M<IB@ ><I =@ J=O<DI@? =T &MFNFOU&ODPEJOH5ZQF.
More range templates
82.3
1C@ TUE.SBOHF HJ?PG@ C<N H<IT HJM@ M<IB@ O@HKG<O@N OC<O ><I =@ PN@? RDOC !'N JOC@M
>JHKDG@-ODH@ A@<OPM@N. 1C@ AJGGJRDIB DN < N<HKGDIB:
#AD7 '3@97E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
581
t JT*OGJOJUF: 4C@OC@M OC@ M<IB@ DN DIADIDO@
t IBT-FOHUI: 4C@OC@M OC@ M<IB@ C<N < MFOHUI KMJK@MOT
t IBT4MJDJOH: 4C@OC@M OC@ M<IB@ NPKKJMON NGD>DIB D.@. RDOC B<Y..Z>
t IBT"TTJHOBCMF&MFNFOUT: 4C@OC@M OC@ M@OPMI OTK@ JA GSPOU DN <NNDBI<=G@
t IBT4XBQQBCMF&MFNFOUT: 4C@OC@M OC@ @G@H@ION JA OC@ M<IB@ <M@ NR<KK<=G@ @.B. RDOC
TUE.BMHPSJUIN.TXBQ
t IBT.PCJMF&MFNFOUT: 4C@OC@M OC@ @G@H@ION JA OC@ M<IB@ <M@ HJQ<=G@ @.B. RDOC
TUE.BMHPSJUIN.NPWF
1CDN DHKGD@N OC<O OC@ M<IB@ C<N NPWF'SPOU(), NPWF#BDL(), JM NPWF"U(), ?@K@I?DIB
JI OC@ <>OP<G FDI? JA OC@ M<IB@. 0DI>@ HJQDIB @G@H@ION DN PNP<GGT A<NO@M OC<I >JKTDIB
OC@H, ?@K@I?DIB JI OC@ M@NPGO JA IBT.PCJMF&MFNFOUT < M<IB@ ><I KMJQD?@ A<NO@M
JK@M<ODJIN =T ><GGDIB NPWF().
t IBT-WBMVF&MFNFOUT: 4C@OC@M OC@ @G@H@ION JA OC@ M<IB@ <M@ >H3>G7E (MJPBCGT H@<IDIB
OC<O OC@ @G@H@ION <M@ IJO >JKD@N JA <>OP<G @G@H@ION IJM <M@ O@HKJM<MT J=E@>ON OC<O <M@
>M@<O@? JI OC@ AGT)
#JM @S<HKG@, IBT-WBMVF&MFNFOUT!'JCPOBDDJ4FSJFT DN GBMTF =@><PN@ OC@ @G@H@ION
JA 'JCPOBDDJ4FSJFT ?J IJO @SDNO <N OC@HN@GQ@N; M<OC@M, OC@T <M@ >JKD@N JA OC@
H@H=@M GJSTU OC<O DN M@OPMI@? =T GSPOU. 0DHDG<MGT,
IBT-WBMVF&MFNFOUT!(/FHBUJWF!(JOU<>)) DN GBMTF =@><PN@ <GOCJPBC OC@ JOU NGD>@
?J@N C<Q@ <>OP<G @G@H@ION, OC@ M<IB@ OC<O DN M@KM@N@IO@? =T /FHBUJWF ?J@N IJO
KMJQD?@ <>>@NN OJ OCJN@ @G@H@ION; M<OC@M, DO M@OPMIN >JKD@N OC<O C<Q@ OC@ I@B<ODQ@
NDBIN JA OC@ @G@H@ION JA OC@ <>OP<G NGD>@. JIQ@MN@GT, IBT-WBMVF&MFNFOUT!(JOU<>) DN
USVF =@><PN@ < NGD>@ KMJQD?@N <>>@NN OJ <>OP<G @G@H@ION JA <I <MM<T.
1C@ AJGGJRDIB @S<HKG@ O<F@N <?Q<IO<B@ JA JT*OGJOJUF OJ KMJQD?@ FNQUZ <N <I FOVN RC@I OC@
JMDBDI<G M<IB@ DN DIADIDO@, H<FDIB DO FIJRI <O >JHKDG@ ODH@ OC<O /FHBUJWF!5 DN DIADIDO@ <N R@GG:
TUSVDU /FHBUJWF(5)
JG (JT*OQVU3BOHF!5)
\
// ...
TUBUJD JG (JT*OGJOJUF!5) \
// /FHBUJWF!5 JT JOGJOJUF BT XFMM
FOVN FNQUZ = GBMTF;
^ FMTF \
!QSPQFSUZ CPPM FNQUZ()
\
SFUVSO SBOHF.FNQUZ;
^
^
// ...
^
TUBUJD BTTFSU ( JT*OGJOJUF!(/FHBUJWF!'JCPOBDDJ4FSJFT));
TUBUJD BTTFSU (!JT*OGJOJUF!(JOU<>));
Run-time polymorphism with JOQVU3BOHF0CKFDU() and
PVUQVU3BOHF0CKFDU()
82.4
B@DIB DHKG@H@IO@? HJNOGT <N O@HKG<O@N, M<IB@N @SCD=DO 5A?B;>7-F;?7 BA>K?ADB:;E?, RCD>C
R@ C<Q@ =@@I O<FDIB <?Q<IO<B@ JA DI OC@ @S<HKG@N JA OCDN >C<KO@M <I? KM@QDJPN >C<KO@MN. (FAD
6;887D7@57E 47FI77@ 5A?B;>7-F;?7 BA>K?ADB:;E? 3@6 DG@-F;?7 BA>K?ADB:;E?, E77 F:7
"CA?B;>7-F;?7 BA>K?ADB:;E?" E75F;A@ ;@ F:7 #AD7 )7?B>3F7E 5:3BF7D.)
#AD7 '3@97E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
582
JHKDG@-ODH@ KJGTHJMKCDNH C<N OJ ?@<G RDOC OC@ A<>O OC<O @Q@MT DINO<IOD<ODJI JA < O@HKG<O@ DN
< ?DAA@M@IO OTK@. #JM @S<HKG@, OC@ M@OPMI OTK@ JA OC@ UBLF() O@HKG<O@ DN ?DM@>OGT M@G<O@? OJ OC@
JMDBDI<G M<IB@:
XSJUFMO(UZQFPG(<11, 22>.OFHBUJWF.UBLF(1)).TUSJOHPG);
XSJUFMO(UZQFPG('JCPOBDDJ4FSJFT().UBLF(1)).TUSJOHPG);
1C@ JPOKPO:
5BLF!(/FHBUJWF!(JOU<>))
5BLF!('JCPOBDDJ4FSJFT)
A I<OPM<G >JIN@LP@I>@ JA OCDN A<>O DN OC<O ?DAA@M@IO M<IB@ OTK@N ><IIJO =@ <NNDBI@? OJ @<>C
JOC@M. 1C@ AJGGJRDIB DN <I @S<HKG@ JA OCDN DI>JHK<OD=DGDOT =@OR@@I ORJ *OQVU3BOHF M<IB@N:
BVUP SBOHF = <11, 22>.OFHBUJWF;
// ... BU B MBUFS QPJOU ...
SBOHF = 'JCPOBDDJ4FSJFT(); // j DPNQJMBUJPO &3303
AN @SK@>O@?, OC@ >JHKDG<ODJI @MMJM DI?D><O@N OC<O 'JCPOBDDJ4FSJFT <I? /FHBUJWF!(JOU<>)
<M@ IJO >JHK<OD=G@:
&SSPS: DBOOPU JNQMJDJUMZ DPOWFSU FYQSFTTJPO ('JCPOBDDJ4FSJFT(0, 1))
PG UZQF 'JCPOBDDJ4FSJFT UP /FHBUJWF!(JOU<>)
%JR@Q@M, <GOCJPBC OC@ <>OP<G OTK@N JA OC@ M<IB@N <M@ ?DAA@M@IO, NDI>@ OC@T =JOC <M@ D3@97E A8
int, OCDN DI>JHK<OD=DGDOT ><I =@ N@@I <N <I PII@>@NN<MT GDHDO<ODJI. #MJH OC@ PN<B@ KJDIO JA
QD@R, NDI>@ =JOC M<IB@N NDHKGT KMJQD?@ JOU @G@H@ION, OC@ <>OP<G H@>C<IDNH OC<O KMJ?P>@N
OCJN@ @G@H@ION NCJPG? IJO =@ DHKJMO<IO.
-CJ=JN C@GKN RDOC OCDN DNNP@ =T JOQVU3BOHF0CKFDU() <I? PVUQVU3BOHF0CKFDU().
JOQVU3BOHF0CKFDU() <GGJRN KM@N@IODIB M<IB@N <N 3 EB75;8;5 =;@6 A8 D3@97 A8 EB75;8;5 FKB7E A8
7>7?7@FE. 4DOC DON C@GK, < M<IB@ ><I =@ PN@? @.B. <N 3@ InputRange A8 int 7>7?7@FE,
M@B<M?G@NN JA OC@ <>OP<G OTK@ JA OC@ M<IB@.
JOQVU3BOHF0CKFDU() DN AG@SD=G@ @IJPBC OJ NPKKJMO <GG JA OC@ IJI-JPOKPO M<IB@N: *OQVU3BOHF,
'PSXBSE3BOHF, #JEJSFDUJPOBM3BOHF, <I? 3BOEPN"DDFTT3BOHF. B@><PN@ JA OC<O AG@SD=DGDOT, OC@
J=E@>O OC<O DO M@OPMIN ><IIJO =@ ?@ADI@? =T BVUP. 1C@ @S<>O FDI? JA M<IB@ OC<O DN M@LPDM@?
HPNO =@ NK@>DAD@? @SKGD>DOGT:
// .FBOJOH "*OQVU3BOHF PG JOUT":
*OQVU3BOHF!JOU SBOHF = <11, 22>.OFHBUJWF.JOQVU3BOHF0CKFDU;
// ... BU B MBUFS QPJOU ...
// 5IF GPMMPXJOH BTTJHONFOU OPX DPNQJMFT
SBOHF = 'JCPOBDDJ4FSJFT().JOQVU3BOHF0CKFDU;
AN <IJOC@M @S<HKG@, RC@I OC@ M<IB@ I@@?N OJ =@ PN@? <N 3 ForwardRange A8 int 7>7?7@FE,
DON OTK@ HPNO =@ NK@>DAD@? @SKGD>DOGT <N 'PSXBSE3BOHF!JOU:
'PSXBSE3BOHF!JOU SBOHF = <11, 22>.OFHBUJWF.JOQVU3BOHF0CKFDU;
BVUP DPQZ = SBOHF.TBWF;
SBOHF = 'JCPOBDDJ4FSJFT().JOQVU3BOHF0CKFDU;
XSJUFMO(SBOHF.TBWF.UBLF(10));
#AD7 '3@97E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
583
1C@ @S<HKG@ ><GGN TBWF() EPNO OJ KMJQ@ OC<O OC@ M<IB@N ><I DI?@@? =@ PN@? <N 'PSXBSE3BOHF
M<IB@N.
0DHDG<MGT, PVUQVU3BOHF0CKFDU() RJMFN RDOC 0VUQVU3BOHF M<IB@N <I? <GGJRN OC@DM PN@ <N 3@
OutputRange F:3F 3557BFE EB75;8;5 FKB7E A8 7>7?7@FE.
Summary
82.5
t 1C@ TUE.SBOHF HJ?PG@ >JIO<DIN H<IT PN@APG M<IB@ O@HKG<O@N.
t 0JH@ JA OCJN@ O@HKG<O@N <GGJR O@HKG<O@N =@ HJM@ ><K<=G@ ?@K@I?DIB JI OC@ ><K<=DGDOD@N
JA JMDBDI<G M<IB@N.
t JOQVU3BOHF0CKFDU() <I? PVUQVU3BOHF0CKFDU() KMJQD?@ MPI-ODH@ KJGTHJMKCDNH,
<GGJRDIB PNDIB ?DAA@M@IO OTK@N JA M<IB@N <N EB75;8;5 =;@6E A8 D3@97E A8 EB75;8;5 FKB7E A8
7>7?7@FE.
#AD7 '3@97E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
584
Parallelism 83
*JNO HJ?@MI HD>MJKMJ>@NNJMN >JINDNO JA HJM@ OC<I JI@ 5AD7, @<>C JA RCD>C ><I JK@M<O@ <N
<I DI?DQD?P<G KMJ>@NNDIB PIDO. 1C@T ><I @S@>PO@ ?DAA@M@IO K<MON JA ?DAA@M@IO KMJBM<HN <O OC@
N<H@ ODH@. 1C@ A@<OPM@N JA OC@ TUE.QBSBMMFMJTN HJ?PG@ H<F@ DO KJNND=G@ AJM KMJBM<HN OJ
O<F@ <?Q<IO<B@ JA <GG JA OC@ >JM@N DI JM?@M OJ MPI A<NO@M.
1CDN >C<KO@M >JQ@MN OC@ AJGGJRDIB M<IB@ <GBJMDOCHN. 1C@N@ <GBJMDOCHN NCJPG? =@ PN@? JIGT
RC@I OC@ JK@M<ODJIN OC<O <M@ OJ =@ @S@>PO@? ;@ B3D3>>7> <M@ OMPGT DI?@K@I?@IO AMJH @<>C
JOC@M. !@ B3D3>>7> H@<IN OC<O JK@M<ODJIN <M@ @S@>PO@? JI HPGODKG@ >JM@N <O OC@ N<H@ ODH@:
t QBSBMMFM: "S@>PO@N OC@ DO@M<ODJIN JA < GPSFBDI GJJK DI K<M<GG@G.
t UBTL: M@<O@N O<NFN OC<O <M@ @S@>PO@? DI K<M<GG@G.
t BTZOD#VG: &O@M<O@N OC@ @G@H@ION JA <I *OQVU3BOHF N@HD-@<B@MGT DI K<M<GG@G.
t NBQ: <GGN API>ODJIN RDOC OC@ @G@H@ION JA <I *OQVU3BOHF N@HD-@<B@MGT DI K<M<GG@G.
t BNBQ: <GGN API>ODJIN RDOC OC@ @G@H@ION JA < 3BOEPN"DDFTT3BOHF APGGT-@<B@MGT DI K<M<GG@G.
t SFEVDF: *<F@N ><G>PG<ODJIN JQ@M OC@ @G@H@ION JA < 3BOEPN"DDFTT3BOHF DI K<M<GG@G.
&I OC@ KMJBM<HN OC<O R@ C<Q@ RMDOO@I NJ A<M R@ C<Q@ =@@I <NNPHDIB OC<O OC@ @SKM@NNDJIN JA <
KMJBM<H <M@ @S@>PO@? DI < >@MO<DI JM?@M, <O G@<NO DI B@I@M<G GDI@-=T-GDI@:
++J;
++K;
&I OC@ >J?@ <=JQ@, R@ @SK@>O OC<O OC@ Q<GP@ JA J DN DI>M@H@IO@? =@AJM@ OC@ Q<GP@ JA K DN
DI>M@H@IO@?. AGOCJPBC OC<O DN N@H<IOD><GGT >JMM@>O, DO DN M<M@GT OC@ ><N@ DI M@<GDOT:
HD>MJKMJ>@NNJMN <I? >JHKDG@MN PN@ JKODHDU<ODJI O@>CIDLP@N OJ C<Q@ NJH@ Q<MD<=G@N M@ND?@ DI
HD>MJKMJ>@NNJM'N M@BDNO@MN OC<O <M@ DI?@K@I?@IO AMJH @<>C JOC@M. 4C@I OC<O DN OC@ ><N@, OC@
HD>MJKMJ>@NNJM RJPG? @S@>PO@ JK@M<ODJIN GDF@ OC@ DI>M@H@ION <=JQ@ DI K<M<GG@G.
AGOCJPBC OC@N@ JKODHDU<ODJIN <M@ @AA@>ODQ@, OC@T ><IIJO =@ <KKGD@? <POJH<OD><GGT OJ G<T@MN
CDBC@M OC<I OC@ Q@MT GJR-G@Q@G JK@M<ODJIN. ,IGT OC@ KMJBM<HH@M ><I ?@O@MHDI@ OC<O >@MO<DI
CDBC-G@Q@G JK@M<ODJIN <M@ DI?@K@I?@IO <I? OC<O OC@T ><I =@ @S@>PO@? DI K<M<GG@G.
&I < GJJK, OC@ @G@H@ION JA < M<IB@ <M@ IJMH<GGT KMJ>@NN@? JI@ <AO@M OC@ JOC@M, JK@M<ODJIN JA
@<>C @G@H@IO AJGGJRDIB OC@ JK@M<ODJIN JA KM@QDJPN @G@H@ION:
BVUP TUVEFOUT =
< 4UVEFOU(1), 4UVEFOU(2), 4UVEFOU(3), 4UVEFOU(4) >;
GPSFBDI (TUVEFOU; TUVEFOUT) \
TUVEFOU.B4MPX0QFSBUJPO();
^
+JMH<GGT, < KMJBM<H RJPG? =@ @S@>PO@? JI JI@ JA OC@ >JM@N JA OC@ HD>MJKMJ>@NNJM, RCD>C C<N
=@@I <NNDBI@? =T OC@ JK@M<ODIB NTNO@H OJ @S@>PO@ OC@ KMJBM<H. AN OC@ GPSFBDI GJJK IJMH<GGT
JK@M<O@N JI @G@H@ION JI@ <AO@M OC@ JOC@M, B4MPX0QFSBUJPO() RJPG? =@ ><GG@? AJM @<>C
NOP?@IO N@LP@IOD<GGT. %JR@Q@M, DI H<IT ><N@N DO DN IJO I@>@NN<MT AJM OC@ JK@M<ODJIN JA
KM@>@?DIB NOP?@ION OJ =@ >JHKG@O@? =@AJM@ NO<MODIB OC@ JK@M<ODJIN JA NP>>@NNDQ@ NOP?@ION. &A
OC@ JK@M<ODJIN JI OC@ 4UVEFOU J=E@>ON R@M@ OMPGT DI?@K@I?@IO, DO RJPG? =@ R<NO@APG OJ DBIJM@
OC@ JOC@M HD>MJKMJ>@NNJM >JM@N, RCD>C HDBCO KJO@IOD<GGT =@ R<DODIB D?G@ JI OC@ NTNO@H.
1J NDHPG<O@ GJIB-G<NODIB JK@M<ODJIN, OC@ AJGGJRDIB @S<HKG@N ><GG 5ISFBE.TMFFQ() AMJH OC@
DPSF.UISFBE HJ?PG@. 5ISFBE.TMFFQ() NPNK@I?N OC@ JK@M<ODJIN AJM OC@ NK@>DAD@? <HJPIO JA
ODH@. ,I@ R<T JA NK@>DATDIB OC@ ?PM<ODJI DN OC@ EVS O@HKG<O@. &ON O@HKG<O@ K<M<H@O@M DN OC@
PIDO JA ODH@: "NTFDT" AJM HDGGDN@>JI?N <I? "TFDPOET" AJM N@>JI?N. 5ISFBE.TMFFQ DN
<?HDOO@?GT <I <MODAD><G H@OCJ? OJ PN@ DI OC@ AJGGJRDIB @S<HKG@N =@><PN@ DO O<F@N ODH@ RDOCJPO
&3D3>>7>;E?
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
585
@Q@M =PNTDIB <IT >JM@. !@NKDO@ =@DIB <I PIM@<GDNOD> OJJG, DO DN NODGG PN@APG DI OCDN >C<KO@M OJ
?@HJINOM<O@ OC@ KJR@M JA K<M<GG@GDNH.
JNQPSU TUE.TUEJP;
JNQPSU DPSF.UISFBE;
TUSVDU 4UVEFOU
\
JOU OVNCFS;
WPJE B4MPX0QFSBUJPO()
\
XSJUFGMO("5IF XPSL PO TUVEFOU %T IBT CFHVO", OVNCFS);
// 8BJU GPS B XIJMF UP TJNVMBUF B MPOH-MBTUJOH PQFSBUJPO
5ISFBE.TMFFQ(1.TFDPOET);
XSJUFGMO("5IF XPSL PO TUVEFOU %T IBT FOEFE", OVNCFS);
^
^
WPJE NBJO()
\
BVUP TUVEFOUT =
< 4UVEFOU(1), 4UVEFOU(2), 4UVEFOU(3), 4UVEFOU(4) >;
GPSFBDI (TUVEFOU; TUVEFOUT) \
TUVEFOU.B4MPX0QFSBUJPO();
^
^
1C@ @S@>PODJI ODH@ JA OC@ KMJBM<H ><I =@ H@<NPM@? DI < >JINJG@ =T UJNF:
$ UJNF ./EFOFNF
5IF XPSL PO TUVEFOU 1 IBT CFHVO
5IF XPSL PO TUVEFOU 1 IBT FOEFE
5IF XPSL PO TUVEFOU 2 IBT CFHVO
5IF XPSL PO TUVEFOU 2 IBT FOEFE
5IF XPSL PO TUVEFOU 3 IBT CFHVO
5IF XPSL PO TUVEFOU 3 IBT FOEFE
5IF XPSL PO TUVEFOU 4 IBT CFHVO
5IF XPSL PO TUVEFOU 4 IBT FOEFE
SFBM 0N4.005T l 4 TFDPOET UPUBM
VTFS 0N0.004T
TZT 0N0.000T
0DI>@ OC@ NOP?@ION <M@ DO@M<O@? JQ@M DI N@LP@I>@ <I? NDI>@ OC@ RJMF JA @<>C NOP?@IO O<F@N 1
N@>JI?, OC@ OJO<G @S@>PODJI ODH@ >JH@N JPO OJ =@ 4 N@>JI?N. %JR@Q@M, DA OC@N@ JK@M<ODJIN
R@M@ @S@>PO@? DI <I @IQDMJIH@IO OC<O C<? 4 >JM@N, OC@T >JPG? =@ JK@M<O@? JI <O OC@ N<H@
ODH@ <I? OC@ OJO<G ODH@ RJPG? =@ M@?P>@? OJ <=JPO 1 N@>JI?.
B@AJM@ N@@DIB CJR OCDN DN ?JI@, G@O'N ADMNO ?@O@MHDI@ OC@ IPH=@M JA >JM@N OC<O <M@ <Q<DG<=G@ JI
OC@ NTNO@H =T TUE.QBSBMMFMJTN.UPUBM$16T:
JNQPSU TUE.TUEJP;
JNQPSU TUE.QBSBMMFMJTN;
WPJE NBJO()
\
&3D3>>7>;E?
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
586
XSJUFGMO("5IFSF BSF %T DPSFT PO UIJT TZTUFN.", UPUBM$16T);
^
1C@ JPOKPO JA OC@ KMJBM<H DI OC@ @IQDMJIH@IO OC<O OCDN >C<KO@M C<N =@@I RMDOO@I DN OC@
AJGGJRDIB:
5IFSF BSF 4 DPSFT PO UIJT TZTUFN.
UBTL1PPM.QBSBMMFM()
83.1
1CDN API>ODJI ><I <GNJ =@ ><GG@? NDHKGT <N QBSBMMFM().
QBSBMMFM() @S@>PO@N OC@ DO@M<ODJIN JA < GPSFBDI GJJK DI K<M<GG@G. *@M@GT DHKJMODIB OC@
TUE.QBSBMMFMJTN HJ?PG@ <I? M@KG<>DIB TUVEFOUT RDOC QBSBMMFM(TUVEFOUT) DI OC@ KMJBM<H
<=JQ@ DN NPAAD>D@IO OJ O<F@ <?Q<IO<B@ JA <GG JA OC@ >JM@N JA OC@ NTNO@H:
JNQPSU TUE.QBSBMMFMJTN;
// ...
GPSFBDI (TUVEFOU; QBSBMMFM(TUVEFOUT)) \
4@ C<Q@ N@@I @<MGD@M DI OC@ GPSFBDI AJM NOMP>ON <I? >G<NN@N >C<KO@M OC<O OC@ @SKM@NNDJIN OC<O
<M@ DI GPSFBDI =GJ>FN <M@ K<NN@? OJ PQ"QQMZ() H@H=@M API>ODJIN <N ?@G@B<O@N. QBSBMMFM()
M@OPMIN < M<IB@ J=E@>O OC<O FIJRN CJR OJ ?DNOMD=PO@ OC@ @S@>PODJI JA OC@ EFMFHBUF OJ <
N@K<M<O@ >JM@ AJM @<>C @G@H@IO.
AN < M@NPGO, K<NNDIB OC@ 4UVEFOU M<IB@ OCMJPBC QBSBMMFM() H<F@N OC@ KMJBM<H <=JQ@ ADIDNC
DI 1 N@>JI? JI < NTNO@H OC<O C<N 4 >JM@N:
$ UJNF ./EFOFNF
5IF XPSL PO TUVEFOU 2 IBT CFHVO
5IF XPSL PO TUVEFOU 1 IBT CFHVO
5IF XPSL PO TUVEFOU 4 IBT CFHVO
5IF XPSL PO TUVEFOU 3 IBT CFHVO
5IF XPSL PO TUVEFOU 1 IBT FOEFE
5IF XPSL PO TUVEFOU 2 IBT FOEFE
5IF XPSL PO TUVEFOU 4 IBT FOEFE
5IF XPSL PO TUVEFOU 3 IBT FOEFE
SFBM 0N1.005T l OPX POMZ 1 TFDPOE
VTFS 0N0.004T
TZT 0N0.004T
Note: ):7 7J75GF;A@ F;?7 A8 F:7 BDA9D3? ?3K 47 6;887D7@F A@ AF:7D EKEF7?E 4GF ;F ;E 7JB75F76
FA 47 DAG9:>K "4 E75A@6E 6;H;676 4K F:7 @G?47D A8 5AD7E".
A AGJR JA @S@>PODJI OCMJPBC >@MO<DI K<MON JA < KMJBM<H DN ><GG@? < < F:D736 A8 7J75GF;A@ JM <
F:D736. -MJBM<HN ><I >JINDNO JA HPGODKG@ OCM@<?N OC<O <M@ =@DIB <>ODQ@GT @S@>PO@? <O OC@ N<H@
ODH@. 1C@ JK@M<ODIB NTNO@H NO<MON <I? @S@>PO@N @<>C OCM@<? JI < >JM@ <I? OC@I NPNK@I?N DO OJ
@S@>PO@ JOC@M OCM@<?N. 1C@ @S@>PODJI JA @<>C OCM@<? H<T DIQJGQ@ H<IT >T>G@N JA NO<MODIB <I?
NPNK@I?DIB.
AGG JA OC@ OCM@<?N JA <GG JA OC@ KMJBM<HN OC<O <M@ <>ODQ@ <O < BDQ@I ODH@ <M@ @S@>PO@? JI OC@
Q@MT >JM@N JA OC@ HD>MJKMJ>@NNJM. 1C@ JK@M<ODIB NTNO@H ?@>D?@N RC@I <I? PI?@M RC<O
>JI?DODJI OJ NO<MO <I? NPNK@I? @<>C OCM@<?. 1C<O DN OC@ M@<NJI RCT OC@ H@NN<B@N OC<O <M@
KMDIO@? =T B4MPX0QFSBUJPO() <M@ DI HDS@? JM?@M DI OC@ JPOKPO <=JQ@. 1CDN PI?@O@MHDIDNOD>
&3D3>>7>;E?
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
587
JM?@M JA OCM@<? @S@>PODJI H<T IJO H<OO@M DA OC@ JK@M<ODJIN JA OC@ 4UVEFOU J=E@>ON <M@ OMPGT
DI?@K@I?@IO AMJH @<>C JOC@M.
&O DN OC@ M@NKJIND=DGDOT JA OC@ KMJBM<HH@M OJ ><GG QBSBMMFM() JIGT RC@I OC@ JK@M<ODJIN DI OC@
GPSFBDI GJJK <M@ DI?@K@I?@IO AJM @<>C DO@M<ODJI. #JM @S<HKG@, DA DO R@M@ DHKJMO<IO OC<O OC@
H@NN<B@N <KK@<M DI < >@MO<DI JM?@M DI OC@ JPOKPO, ><GGDIB QBSBMMFM() NCJPG? =@ >JIND?@M@?
<I @MMJM DI OC@ KMJBM<H <=JQ@. 1C@ KMJBM<HHDIB HJ?@G OC<O NPKKJMON OCM@<?N OC<O ?@K@I?
JI JOC@M OCM@<?N DN ><GG@? 5A@5GDD7@5K. JI>PMM@I>T DN OC@ OJKD> JA OC@ I@SO >C<KO@M.
BT OC@ ODH@ K<M<GG@G GPSFBDI @I?N, <GG JA OC@ JK@M<ODJIN DIND?@ OC@ GJJK C<Q@ =@@I >JHKG@O@?
AJM <GG JA OC@ @G@H@ION. 1C@ KMJBM<H ><I N<A@GT >JIODIP@ <AO@M OC@ GPSFBDI GJJK.
Work unit size 83.1.1
1C@ N@>JI? K<M<H@O@M JA QBSBMMFM() C<N <I JQ@MGJ<?@? H@<IDIB <I? DN DBIJM@? DI NJH@
><N@N:
/* ... */ = QBSBMMFM(range, work_unit_size = 100);
t 4C@I DO@M<ODIB JQ@M 3BOEPN"DDFTT3BOHF M<IB@N:
1C@ ?DNOMD=PODJI JA OCM@<?N OJ >JM@N C<N NJH@ HDIDH<G >JNO. 1CDN >JNO H<T NJH@ODH@N
=@ NDBIDAD><IO @NK@>D<GGT RC@I OC@ JK@M<ODJIN JA OC@ GJJK <M@ >JHKG@O@? DI < Q@MT
NCJMO ODH@. &I NP>C ><N@N, DO H<T =@ A<NO@M OJ C<Q@ @<>C OCM@<? @S@>PO@ HJM@ OC<I JI@
DO@M<ODJI JA OC@ GJJK. 1C@ RJMF PIDO NDU@ ?@O@MHDI@N OC@ IPH=@M JA @G@H@ION OC<O @<>C
OCM@<? NCJPG? @S@>PO@ <O @<>C JA DON DO@M<ODJIN:
GPSFBDI (TUVEFOU; QBSBMMFM(TUVEFOUT, 2)) \
1C@ ?@A<PGO Q<GP@ JA RJMF PIDO NDU@ DN 100 <I? DN NPDO<=G@ AJM HJNO ><N@N.
t 4C@I DO@M<ODIB JQ@M IJI-3BOEPN"DDFTT3BOHF M<IB@N:
QBSBMMFM() ?J@N IJO NO<MO K<M<GG@G @S@>PODJIN PIODG IAD= G@;F E;L7 IPH=@M JA
@G@H@ION JA < IJI-3BOEPN"DDFTT3BOHF C<Q@ =@@I @S@>PO@? N@MD<GGT ADMNO. !P@ OJ OC@
M@G<ODQ@GT CDBC Q<GP@ JA 100, QBSBMMFM() H<T BDQ@ OC@ RMJIB DHKM@NNDJI OC<O DO DN IJO
@AA@>ODQ@ RC@I OMD@? JI NCJMO IJI-3BOEPN"DDFTT3BOHF M<IB@N.
t 4C@I DO@M<ODIB JQ@M OC@ M@NPGO M<IB@N JA BTZOD#VG() JM K<M<GG@G NBQ() (=JOC <M@ @SKG<DI@?
G<O@M DI OCDN >C<KO@M):
4C@I QBSBMMFM() RJMFN JI OC@ M@NPGON JA BTZOD#VG() JM NBQ(), DO DBIJM@N OC@ RJMF
PIDO NDU@ K<M<H@O@M. &INO@<?, QBSBMMFM() M@PN@N OC@ DIO@MI<G =PAA@M JA OC@ M@NPGO
M<IB@.
5BTL
83.2
,K@M<ODJIN OC<O <M@ @S@>PO@? DI K<M<GG@G RDOC JOC@M JK@M<ODJIN JA < KMJBM<H <M@ ><GG@? F3E=E.
1<NFN <M@ M@KM@N@IO@? =T OC@ OTK@ TUE.QBSBMMFMJTN.5BTL.
&I A<>O, QBSBMMFM() >JINOMP>ON < I@R 5BTL J=E@>O AJM @Q@MT RJMF@M OCM@<? <I? NO<MON OC<O
O<NF <POJH<OD><GGT. QBSBMMFM() OC@I R<DON AJM <GG JA OC@ O<NFN OJ =@ >JHKG@O@? =@AJM@ ADI<GGT
@SDODIB OC@ GJJK. QBSBMMFM() DN Q@MT >JIQ@ID@IO <N DO 5A@EFDG5FE, EF3DFE, <I? I3;FE 8AD OC@
O<NFN <POJH<OD><GGT. &ON GDHDO<ODJI DN OC<O QBSBMMFM() ><I JIGT =@ PN@? DI GPSFBDI GJJKN.
4C@I O<NFN ?J IJO >JMM@NKJI? OJ JM ><IIJO =@ M@KM@N@IO@? =T @G@H@ION JA < M<IB@, OC@N@
OCM@@ NO@KN ><I =@ C<I?G@? @SKGD>DOGT =T OC@ KMJBM<HH@M. UBTL() >JINOMP>ON,
FYFDVUF*O/FX5ISFBE() NO<MON, <I? ZJFME'PSDF() R<DON AJM < O<NF J=E@>O. 1C@N@ OCM@@
API>ODJIN <M@ @SKG<DI@? APMOC@M DI OC@ >JHH@ION JA OC@ AJGGJRDIB KMJBM<H.
&3D3>>7>;E?
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
588
1C@ BO0QFSBUJPO() API>ODJI DN NO<MO@? ORD>@ DI OC@ AJGGJRDIB KMJBM<H. &O KMDION OC@ ADMNO
G@OO@M JA JE OJ DI?D><O@ RCD>C O<NF DO DN RJMFDIB AJM.
Note: $AD?3>>K, F:7 5:3D35F7DE F:3F 3D7 BD;@F76 FA AGFBGF EFD73?E >;=7 stdout 6A @AF 3BB73D
A@ F:7 AGFBGF D;9:F 3I3K. ):7K 3D7 ;@EF736 EFAD76 ;@ 3@ AGFBGF 4G887D G@F;> 3 >;@7 A8 AGFBGF ;E
5A?B>7F76. (;@57 write 6A7E @AF AGFBGF 3 @7I->;@7 5:3D35F7D, ;@ AD67D FA A4E7DH7 F:7 B3D3>>7>
7J75GF;A@ A8 F:7 8A>>AI;@9 BDA9D3?, stdout.flush() ;E 53>>76 FA E7@6 F:7 5A@F7@FE A8 F:7
4G887D FA stdout 7H7@ 478AD7 D735:;@9 F:7 7@6 A8 3 >;@7.
JNQPSU TUE.TUEJP;
JNQPSU TUE.QBSBMMFMJTN;
JNQPSU TUE.BSSBZ;
JNQPSU DPSF.UISFBE;
/* 1SJOUT UIF GJSTU MFUUFS PG 'JE' FWFSZ IBMG B TFDPOE. *U
* BSCJUSBSJMZ SFUVSOT UIF WBMVF 1 UP TJNVMBUF GVODUJPOT UIBU
* EP DBMDVMBUJPOT. 5IJT SFTVMU XJMM CF VTFE MBUFS JO NBJO. */
JOU BO0QFSBUJPO(TUSJOH JE, JOU EVSBUJPO)
\
XSJUFGMO("%T XJMM UBLF %T TFDPOET", JE, EVSBUJPO);
GPSFBDI (J; 0 .. (EVSBUJPO * 2)) \
5ISFBE.TMFFQ(500.NTFDT); /* IBMG B TFDPOE */
XSJUF(JE.GSPOU);
TUEPVU.GMVTI();
^
SFUVSO 1;
^
WPJE NBJO()
\
/* $POTUSVDU B UBTL PCKFDU UIBU XJMM FYFDVUF
* BO0QFSBUJPO(). 5IF GVODUJPO QBSBNFUFST UIBU BSF
* TQFDJGJFE IFSF BSF QBTTFE UP UIF UBTL GVODUJPO BT JUT
* GVODUJPO QBSBNFUFST. */
BVUP UIF5BTL = UBTL!BO0QFSBUJPO("UIF5BTL", 5);
/* 4UBSU UIF UBTL PCKFDU */
UIF5BTL.FYFDVUF*O/FX5ISFBE();
/* "T 'UIF5BTL' DPOUJOVFT FYFDVUJOH, 'BO0QFSBUJPO()' JT
* CFJOH DBMMFE BHBJO, UIJT UJNF EJSFDUMZ JO NBJO. */
JNNVUBCMF SFTVMU = BO0QFSBUJPO("NBJO'T DBMM", 3);
/* "U UIJT QPJOU XF BSF TVSF UIBU UIF PQFSBUJPO UIBU IBT
* CFFO TUBSUFE EJSFDUMZ GSPN XJUIJO NBJO IBT CFFO
* DPNQMFUFE, CFDBVTF JU IBT CFFO TUBSUFE CZ B SFHVMBS
* GVODUJPO DBMM, OPU BT B UBTL. */
/* 0O UIF PUIFS IBOE, JU JT OPU DFSUBJO BU UIJT QPJOU
* XIFUIFS 'UIF5BTL' IBT DPNQMFUFE JUT PQFSBUJPOT
* ZFU. ZJFME'PSDF() XBJUT GPS UIF UBTL UP DPNQMFUF JUT
* PQFSBUJPOT; JU SFUVSOT POMZ XIFO UIF UBTL IBT CFFO
* DPNQMFUFE. *UT SFUVSO WBMVF JT UIF SFUVSO WBMVF PG
* UIF UBTL GVODUJPO, J.F. BO0QFSBUJPO(). */
JNNVUBCMF UBTL3FTVMU = UIF5BTL.ZJFME'PSDF();
XSJUFMO();
XSJUFGMO(""MM GJOJTIFE; UIF SFTVMU JT %T.",
SFTVMU + UBTL3FTVMU);
^
1C@ JPOKPO JA OC@ KMJBM<H NCJPG? =@ NDHDG<M OJ OC@ AJGGJRDIB. 1C@ A<>O OC<O OC@ N <I? U G@OO@MN
<M@ KMDIO@? DI HDS@? JM?@M DI?D><O@N OC<O OC@ JK@M<ODJIN <M@ @S@>PO@? DI K<M<GG@G:
&3D3>>7>;E?
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
589
NBJO'T DBMM XJMM UBLF 3 TFDPOET
UIF5BTL XJMM UBLF 5 TFDPOET
NUNUUNNUUNNUUUUU
"MM GJOJTIFE; UIF SFTVMU JT 2.
1C@ O<NF API>ODJI C<N =@@I NK@>DAD@? <N < O@HKG<O@ K<M<H@O@M JA UBTL(). AIJOC@M JQ@MGJ<? JA
UBTL() O<F@N OC@ API>ODJI <N DON ADMNO API>ODJI K<M<H@O@M:
WPJE TPNF'VODUJPO(JOU WBMVF)
\
/* ... */
^
BVUP UIF5BTL = UBTL(&TPNF'VODUJPO, 42);
A G<H=?< API>ODJI JM <I J=E@>O JA < OTK@ OC<O ?@ADI@N OC@ PQ$BMM H@H=@M ><I <GNJ =@ PN@? <N
OC@ O<NF API>ODJI. 1C@ AJGGJRDIB @S<HKG@ NO<MON < O<NF OC<O @S@>PO@N < G<H=?<:
BVUP UIF5BTL = UBTL((JOU WBMVF) \
/* ... */
^, 42);
Exceptions 83.2.1
AN O<NFN <M@ @S@>PO@? JI N@K<M<O@ OCM@<?N, OC@ @S>@KODJIN OC<O OC@T OCMJR ><IIJO =@ ><PBCO
=T OC@ OCM@<? OC<O NO<MO@? OC@H. #JM OC<O M@<NJI, OC@ @S>@KODJIN OC<O <M@ OCMJRI <M@
<POJH<OD><GGT ><PBCO =T OC@ O<NFN OC@HN@GQ@N, OJ =@ M@OCMJRI G<O@M RC@I 5BTL H@H=@M
API>ODJIN GDF@ ZJFME'PSDF() <M@ ><GG@?. 1CDN H<F@N DO KJNND=G@ AJM OC@ H<DI OCM@<? OJ ><O>C
@S>@KODJIN OC<O <M@ OCMJRI =T < O<NF.
JNQPSU TUE.TUEJP;
JNQPSU TUE.QBSBMMFMJTN;
JNQPSU DPSF.UISFBE;
WPJE NBZ5ISPX()
\
XSJUFMO("NBZ5ISPX() JT TUBSUFE");
5ISFBE.TMFFQ(1.TFDPOET);
XSJUFMO("NBZ5ISPX() JT UISPXJOH BO FYDFQUJPO");
UISPX OFX &YDFQUJPO("&SSPS NFTTBHF");
^
WPJE NBJO()
\
BVUP UIF5BTL = UBTL!NBZ5ISPX();
UIF5BTL.FYFDVUF*O/FX5ISFBE();
XSJUFMO("NBJO JT DPOUJOVJOH");
5ISFBE.TMFFQ(3.TFDPOET);
XSJUFMO("NBJO JT XBJUJOH GPS UIF UBTL");
UIF5BTL.ZJFME'PSDF();
^
1C@ JPOKPO JA OC@ KMJBM<H NCJRN OC<O OC@ PI><PBCO @S>@KODJI OC<O C<N =@@I OCMJRI =T OC@
O<NF ?J@N IJO O@MHDI<O@ OC@ @IODM@ KMJBM<H MDBCO <R<T (DO O@MHDI<O@N JIGT OC@ O<NF):
&3D3>>7>;E?
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
590
NBJO JT DPOUJOVJOH
NBZ5ISPX() JT TUBSUFE
NBZ5ISPX() JT UISPXJOH BO FYDFQUJPO l UISPXO
NBJO JT XBJUJOH GPS UIF UBTL
PCKFDU.&YDFQUJPO!EFOFNF.E(10): &SSPS NFTTBHF l UFSNJOBUFE
ZJFME'PSDF() ><I =@ ><GG@? DI < USZ-DBUDI =GJ>F OJ ><O>C OC@ @S>@KODJIN OC<O <M@ OCMJRI =T
OC@ O<NF. +JO@ OC<O OCDN DN ?DAA@M@IO AMJH NDIBG@ OCM@<?N: &I NDIBG@-OCM@<?@? KMJBM<HN GDF@ OC@
N<HKG@N OC<O R@ C<Q@ =@@I RMDODIB PIODG OCDN >C<KO@M, USZ-DBUDI RM<KN OC@ >J?@ OC<O H<T
OCMJR. &I K<M<GG@GDNH, DO RM<KN ZJFME'PSDF():
USZ \
UIF5BTL.ZJFME'PSDF();
^ DBUDI (&YDFQUJPO FYD) \
XSJUFGMO("%FUFDUFE BO FSSPS JO UIF UBTL: '%T'", FYD.NTH);
^
1CDN ODH@ OC@ @S>@KODJI DN ><PBCO =T OC@ H<DI OCM@<? DINO@<? JA O@MHDI<ODIB OC@ KMJBM<H:
NBJO JT DPOUJOVJOH
NBZ5ISPX() JT TUBSUFE
NBZ5ISPX() JT UISPXJOH BO FYDFQUJPO l UISPXO
NBJO JT XBJUJOH GPS UIF UBTL
%FUFDUFE BO FSSPS JO UIF UBTL: '&SSPS NFTTBHF' l DBVHIU
Member functions of 5BTL 83.2.2
t EPOF: 0K@>DAD@N RC@OC@M OC@ O<NF C<N =@@I >JHKG@O@?; M@OCMJRN OC@ @S>@KODJI DA OC@ O<NF
C<N =@@I O@MHDI<O@? RDOC <I @S>@KODJI.
JG (UIF5BTL.EPOF) \
XSJUFMO(":FT, UIF UBTL IBT CFFO DPNQMFUFE");
^ FMTF \
XSJUFMO("/P, UIF UBTL JT TUJMM HPJOH PO");
^
t FYFDVUF*O/FX5ISFBE(): 0O<MON OC@ O<NF DI < I@R OCM@<?.
t FYFDVUF*O/FX5ISFBE(JOU QSJPSJUZ): 0O<MON OC@ O<NF DI < I@R OCM@<? RDOC OC@ NK@>DAD@?
KMDJMDOT. (-MDJMDOT DN <I JK@M<ODIB NTNO@H >JI>@KO OC<O ?@O@MHDI@N @S@>PODJI KMDJMDOD@N JA
OCM@<?N.)
1C@M@ <M@ OCM@@ API>ODJIN OJ R<DO AJM OC@ >JHKG@ODJI JA < O<NF:
t ZJFME'PSDF(): 0O<MON OC@ O<NF DA DO C<N IJO =@@I NO<MO@? T@O; DA DO C<N <GM@<?T =@@I
>JHKG@O@?, M@OPMIN DON M@OPMI Q<GP@; DA DO DN NODGG MPIIDIB, R<DON AJM DON >JHKG@ODJI RDOCJPO
H<FDIB OC@ HD>MJKMJ>@NNJM =PNT; DA <I @S>@KODJI C<N =@@I OCMJRI, M@OCMJRN OC<O
@S>@KODJI.
t TQJO'PSDF(): 4JMFN NDHDG<MGT OJ ZJFME'PSDF(), @S>@KO OC<O DO H<F@N OC@ HD>MJKMJ>@NNJM
=PNT RCDG@ R<DODIB, DI JM?@M OJ ><O>C OC@ >JHKG@ODJI <N @<MGT <N KJNND=G@.
t XPSL'PSDF(): 4JMFN NDHDG<MGT OJ ZJFME'PSDF(), @S>@KO OC<O DO NO<MON < I@R O<NF DI OC@
>PMM@IO OCM@<? RCDG@ R<DODIB AJM OC@ O<NF OJ =@ >JHKG@O@?.
&I HJNO ><N@N ZJFME'PSDF() DN OC@ HJNO NPDO<=G@ API>ODJI OJ ><GG RC@I R<DODIB AJM < O<NF OJ
>JHKG@O@; DO NPNK@I?N OC@ OCM@<? OC<O ><GGN ZJFME'PSDF() PIODG OC@ O<NF DN >JHKG@O@?.
&3D3>>7>;E?
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
591
AGOCJPBC TQJO'PSDF() H<F@N OC@ HD>MJKMJ>@NNJM =PNT RCDG@ R<DODIB, DO DN NPDO<=G@ RC@I OC@
O<NF DN @SK@>O@? OJ =@ >JHKG@O@? DI < Q@MT NCJMO ODH@. XPSL'PSDF() ><I =@ ><GG@? RC@I
NO<MODIB JOC@M O<NFN DN KM@A@MM@? JQ@M NPNK@I?DIB OC@ >PMM@IO OCM@<?.
-G@<N@ N@@ OC@ JIGDI@ ?J>PH@IO<ODJI JA -CJ=JN AJM OC@ JOC@M H@H=@M API>ODJIN JA 5BTL.
UBTL1PPM.BTZOD#VG()
83.3
0DHDG<M OJ OC@ R<T QBSBMMFM() DO@M<O@N GPSFBDI GJJKN DI K<M<GG@G, BTZOD#VG() DO@M<O@N
*OQVU3BOHF M<IB@N DI K<M<GG@G. &O NOJM@N OC@ @G@H@ION DI < =PAA@M <N OC@T <M@ KMJ?P>@? =T OC@
M<IB@, <I? N@MQ@N OC@ @G@H@ION AMJH OC<O =PAA@M OJ DON PN@M.
&I JM?@M OJ <QJD? H<FDIB < KJO@IOD<GGT APGGT-G<UT DIKPO M<IB@ < APGGT-@<B@M M<IB@, DO DO@M<O@N
OC@ @G@H@ION DI I3H7E. ,I>@ DO KM@K<M@N >@MO<DI IPH=@M JA @G@H@ION DI K<M<GG@G, DO R<DON PIODG
OCJN@ @G@H@ION <M@ >JINPH@? =T QPQ'SPOU() =@AJM@ KMJ?P>DIB OC@ @G@H@ION JA OC@ I@SO
R<Q@.
BTZOD#VG() O<F@N < M<IB@ <I? <I JKODJI<G 4G887D E;L7 OC<O ?@O@MHDI@N CJR H<IT @G@H@ION OJ
=@ H<?@ <Q<DG<=G@ ?PMDIB @<>C R<Q@:
BVUP FMFNFOUT = UBTL1PPM.BTZOD#VG(range, buffer_size);
1J N@@ OC@ @AA@>ON JA BTZOD#VG(), G@O'N PN@ < M<IB@ OC<O O<F@N C<GA < N@>JI? OJ DO@M<O@ <I? C<GA
< N@>JI? OJ KMJ>@NN @<>C @G@H@IO. 1CDN M<IB@ NDHKGT KMJ?P>@N DIO@B@MN PK OJ OC@ NK@>DAD@?
GDHDO:
JNQPSU TUE.TUEJP;
JNQPSU DPSF.UISFBE;
TUSVDU 3BOHF
\
JOU MJNJU;
JOU J;
CPPM FNQUZ() DPOTU !QSPQFSUZ
\
SFUVSO J >= MJNJU;
^
JOU GSPOU() DPOTU !QSPQFSUZ
\
SFUVSO J;
^
WPJE QPQ'SPOU()
\
XSJUFGMO("1SPEVDJOH UIF FMFNFOU BGUFS %T", J);
5ISFBE.TMFFQ(500.NTFDT);
++J;
^
^
WPJE NBJO()
\
BVUP SBOHF = 3BOHF(10);
GPSFBDI (FMFNFOU; SBOHF) \
XSJUFGMO("6TJOH FMFNFOU %T", FMFNFOU);
5ISFBE.TMFFQ(500.NTFDT);
^
^
&3D3>>7>;E?
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
592
1C@ @G@H@ION <M@ KMJ?P>@? <I? PN@? G<UDGT. 0DI>@ DO O<F@N JI@ N@>JI? AJM @<>C @G@H@IO, OC@
RCJG@ M<IB@ O<F@N O@I N@>JI?N OJ KMJ>@NN DI OCDN KMJBM<H:
$ UJNF ./EFOFNF
6TJOH FMFNFOU 0
1SPEVDJOH UIF FMFNFOU BGUFS 0
6TJOH FMFNFOU 1
1SPEVDJOH UIF FMFNFOU BGUFS 1
6TJOH FMFNFOU 2
...
1SPEVDJOH UIF FMFNFOU BGUFS 8
6TJOH FMFNFOU 9
1SPEVDJOH UIF FMFNFOU BGUFS 9
SFBM 0N10.007T l 10 TFDPOET UPUBM
VTFS 0N0.004T
TZT 0N0.000T
A>>JM?DIB OJ OC<O JPOKPO, OC@ @G@H@ION <M@ KMJ?P>@? <I? PN@? N@LP@IOD<GGT.
,I OC@ JOC@M C<I?, DO H<T IJO =@ I@>@NN<MT OJ R<DO AJM KM@>@?DIB @G@H@ION OJ =@ KMJ>@NN@?
=@AJM@ NO<MODIB OJ KMJ?P>@ OC@ NP>>@NNDQ@ @G@H@ION. 1C@ KMJBM<H RJPG? O<F@ G@NN ODH@ DA
JOC@M @G@H@ION >JPG? =@ KMJ?P>@? RCDG@ OC@ AMJIO @G@H@IO DN DI PN@:
JNQPSU TUE.QBSBMMFMJTN;
//...
GPSFBDI (FMFNFOU; UBTL1PPM.BTZOD#VG(SBOHF, 2)) \
&I OC@ ><GG <=JQ@, BTZOD#VG() H<F@N ORJ @G@H@ION M@<?T DI DON =PAA@M. "G@H@ION <M@ KMJ?P>@?
DI K<M<GG@G RCDG@ OC@T <M@ =@DIB PN@?:
&3D3>>7>;E?
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
593
$ UJNF ./EFOFNF
1SPEVDJOH UIF FMFNFOU BGUFS 0
1SPEVDJOH UIF FMFNFOU BGUFS 1
6TJOH FMFNFOU 0
1SPEVDJOH UIF FMFNFOU BGUFS 2
6TJOH FMFNFOU 1
1SPEVDJOH UIF FMFNFOU BGUFS 3
6TJOH FMFNFOU 2
1SPEVDJOH UIF FMFNFOU BGUFS 4
6TJOH FMFNFOU 3
1SPEVDJOH UIF FMFNFOU BGUFS 5
6TJOH FMFNFOU 4
1SPEVDJOH UIF FMFNFOU BGUFS 6
1SPEVDJOH UIF FMFNFOU BGUFS 7
6TJOH FMFNFOU 5
6TJOH FMFNFOU 6
1SPEVDJOH UIF FMFNFOU BGUFS 8
1SPEVDJOH UIF FMFNFOU BGUFS 9
6TJOH FMFNFOU 7
6TJOH FMFNFOU 8
6TJOH FMFNFOU 9
SFBM 0N6.007T l OPX 6 TFDPOET
VTFS 0N0.000T
TZT 0N0.004T
1C@ ?@A<PGO Q<GP@ JA =PAA@M NDU@ DN 100. 1C@ =PAA@M NDU@ OC<O KMJ?P>@N OC@ =@NO K@MAJMH<I>@
RJPG? =@ ?DAA@M@IO PI?@M ?DAA@M@IO NDOP<ODJIN.
BTZOD#VG() ><I =@ PN@? JPOND?@ JA GPSFBDI GJJKN, < OM<DO OC<O N@ON DO <K<MO AMJH QBSBMMFM().
#JM @S<HKG@, OC@ AJGGJRDIB >J?@ PN@N OC@ M@OPMI Q<GP@ JA BTZOD#VG() <N <I *OQVU3BOHF
RCD>C JK@M<O@N N@HD-@<B@MGT:
BVUP SBOHF = 3BOHF(10);
BVUP BTZOD3BOHF = UBTL1PPM.BTZOD#VG(SBOHF, 2);
XSJUFMO(BTZOD3BOHF.GSPOU);
UBTL1PPM.NBQ()
83.4
&O C@GKN OJ @SKG<DI NBQ() AMJH OC@ TUE.BMHPSJUIN HJ?PG@ =@AJM@ @SKG<DIDIB
UBTL1PPM.NBQ(). TUE.BMHPSJUIN.NBQ DN <I <GBJMDOCH >JHHJIGT AJPI? DI H<IT API>ODJI<G
G<IBP<B@N. &O ><GGN < API>ODJI RDOC OC@ @G@H@ION JA < M<IB@ JI@-=T-JI@ <I? M@OPMIN < M<IB@
OC<O >JINDNON JA OC@ M@NPGON JA ><GGDIB OC<O API>ODJI RDOC @<>C @G@H@IO. &O DN < G<UT <GBJMDOCH: &O
><GGN OC@ API>ODJI <N I@@?@?.
1C@ A<>O OC<O TUE.BMHPSJUIN.NBQ JK@M<O@N G<UDGT DN Q@MT KJR@MAPG DI H<IT KMJBM<HN.
%JR@Q@M, DA OC@ API>ODJI I@@?N OJ =@ ><GG@? RDOC @Q@MT @G@H@IO <ITR<T <I? OC@ JK@M<ODJIN JI
@<>C @G@H@IO <M@ DI?@K@I?@IO AMJH @<>C JOC@M, G<UDI@NN H<T =@ PII@>@NN<MDGT NGJR@M OC<I
K<M<GG@G @S@>PODJI. UBTL1PPM.NBQ() <I? UBTL1PPM.BNBQ() AMJH OC@ TUE.QBSBMMFMJTN
HJ?PG@ O<F@ <?Q<IO<B@ JA HPGODKG@ >JM@N <I? MPI A<NO@M DI H<IT ><N@N.
)@O'N >JHK<M@ OC@N@ OCM@@ <GBJMDOCHN PNDIB OC@ 4UVEFOU @S<HKG@. )@O'N <NNPH@ OC<O 4UVEFOU
C<N < H@H=@M API>ODJI OC<O M@OPMIN OC@ <Q@M<B@ BM<?@ JA OC@ NOP?@IO. 1J ?@HJINOM<O@ CJR
K<M<GG@G <GBJMDOCHN <M@ A<NO@M, G@O'N <B<DI NGJR OCDN API>ODJI ?JRI RDOC 5ISFBE.TMFFQ().
&3D3>>7>;E?
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
594
TUE.BMHPSJUIN.NBQ O<F@N OC@ API>ODJI <N DON O@HKG<O@ K<M<H@O@M, <I? OC@ M<IB@ <N DON
API>ODJI K<M<H@O@M. &O M@OPMIN < M<IB@ OC<O >JINDNON JA OC@ M@NPGON JA <KKGTDIB OC<O API>ODJI OJ
OC@ @G@H@ION JA OC@ M<IB@:
BVUP result_range = NBQ!func(range);
1C@ API>ODJI H<T =@ NK@>DAD@? =T OC@ => NTIO<S <N < >3?463 7JBD7EE;A@ <N R@ C<Q@ N@@I DI
@<MGD@M >C<KO@MN. 1C@ AJGGJRDIB KMJBM<H PN@N NBQ() OJ ><GG OC@ BWFSBHF(SBEF() H@H=@M
API>ODJI JI @<>C @G@H@IO:
JNQPSU TUE.TUEJP;
JNQPSU TUE.BMHPSJUIN;
JNQPSU DPSF.UISFBE;
TUSVDU 4UVEFOU
\
JOU OVNCFS;
JOU<> HSBEFT;
EPVCMF BWFSBHF(SBEF() !QSPQFSUZ
\
XSJUFGMO("4UBSUFE XPSLJOH PO TUVEFOU %T",
OVNCFS);
5ISFBE.TMFFQ(1.TFDPOET);
JNNVUBCMF BWFSBHF =
SFEVDF!((B, C) => B + C)(0.0, HSBEFT) / HSBEFT.MFOHUI;
XSJUFGMO("'JOJTIFE XPSLJOH PO TUVEFOU %T", OVNCFS);
SFUVSO BWFSBHF;
^
^
WPJE NBJO()
\
4UVEFOU<> TUVEFOUT;
GPSFBDI (J; 0 .. 10) \
/* 5XP HSBEFT GPS FBDI TUVEFOU */
TUVEFOUT _= 4UVEFOU(J, <80 + J, 90 + J>);
^
BVUP SFTVMUT = NBQ!(B => B.BWFSBHF(SBEF)(TUVEFOUT);
GPSFBDI (SFTVMU; SFTVMUT) \
XSJUFMO(SFTVMU);
^
^
+JO@ OC<O OC@ KMJBM<H PN@N TUE.BMHPSJUIN.SFEVDF RC@I ><G>PG<ODIB OC@ <Q@M<B@ BM<?@. 4@
C<Q@ N@@I SFEVDF() DI <I @S<HKG@ DI OC@ /<IB@N >C<KO@M =@AJM@. SFEVDF() <I? DON K<M<GG@G
>JPIO@MK<MO UBTL1PPM.SFEVDF() RDGG =@ @SKG<DI@? =@GJR.
1C@ JPOKPO JA OC@ KMJBM<H ?@HJINOM<O@N OC<O NBQ() JK@M<O@N G<UDGT; BWFSBHF(SBEF() DN
><GG@? AJM @<>C M@NPGO <N OC@ GPSFBDI GJJK DO@M<O@N:
&3D3>>7>;E?
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
595
$ UJNF ./EFOFNF
4UBSUFE XPSLJOH PO TUVEFOU 0
'JOJTIFE XPSLJOH PO TUVEFOU 0
85 l DBMDVMBUFE BT GPSFBDI JUFSBUFT
4UBSUFE XPSLJOH PO TUVEFOU 1
'JOJTIFE XPSLJOH PO TUVEFOU 1
86
...
4UBSUFE XPSLJOH PO TUVEFOU 9
'JOJTIFE XPSLJOH PO TUVEFOU 9
94
SFBM 0N10.006T l 10 TFDPOET UPUBM
VTFS 0N0.000T
TZT 0N0.004T
&A TUE.BMHPSJUIN.NBQ R@M@ <I @<B@M <GBJMDOCH, OC@ H@NN<B@N <=JPO OC@ NO<MON <I? ADIDNC@N
JA OC@ JK@M<ODJIN RJPG? =@ KMDIO@? <GOJB@OC@M <O OC@ OJK.
UBTL1PPM.NBQ() AMJH OC@ TUE.QBSBMMFMJTN HJ?PG@ RJMFN @NN@IOD<GGT OC@ N<H@ <N
TUE.BMHPSJUIN.NBQ. 1C@ JIGT ?DAA@M@I>@ DN OC<O DO @S@>PO@N OC@ API>ODJI ><GGN N@HD-@<B@MGT
<I? NOJM@N OC@ M@NPGON DI < =PAA@M OJ =@ N@MQ@? AMJH <N I@@?@?. 1C@ NDU@ JA OCDN =PAA@M DN
?@O@MHDI@? =T OC@ N@>JI? K<M<H@O@M. #JM @S<HKG@, OC@ AJGGJRDIB >J?@ RJPG? H<F@ M@<?T OC@
M@NPGON JA OC@ API>ODJI ><GGN AJM OCM@@ @G@H@ION <O < ODH@:
JNQPSU TUE.QBSBMMFMJTN;
// ...
EPVCMF BWFSBHF(SBEF(4UVEFOU TUVEFOU)
\
SFUVSO TUVEFOU.BWFSBHF(SBEF;
^
// ...
BVUP SFTVMUT = UBTL1PPM.NBQ!BWFSBHF(SBEF(TUVEFOUT, 3);
Note: ):7 8D77-EF3@6;@9 averageGrade() 8G@5F;A@ 34AH7 ;E @77676 6G7 FA 3 >;?;F3F;A@ F:3F
;@HA>H7E GE;@9 >A53> 67>793F7E I;F: ?7?47D 8G@5F;A@ F7?B>3F7E >;=7 TaskPool.map. ):7D7
IAG>6 47 3 5A?B;>3F;A@ 7DDAD I;F:AGF F:3F 8D77-EF3@6;@9 8G@5F;A@:
BVUP SFTVMUT = UBTL1PPM.NBQ!(B => B.BWFSBHF(SBEF)(TUVEFOUT, 3); // j DPNQJMBUJPO &3303
1CDN ODH@ OC@ JK@M<ODJIN <M@ @S@>PO@? DI R<Q@N JA OCM@@ @G@H@ION:
&3D3>>7>;E?
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
596
$ UJNF ./EFOFNF
4UBSUFE XPSLJOH PO TUVEFOU 1 l JO QBSBMMFM
4UBSUFE XPSLJOH PO TUVEFOU 2 l CVU JO VOQSFEJDUBCMF PSEFS
4UBSUFE XPSLJOH PO TUVEFOU 0
'JOJTIFE XPSLJOH PO TUVEFOU 1
'JOJTIFE XPSLJOH PO TUVEFOU 2
'JOJTIFE XPSLJOH PO TUVEFOU 0
85
86
87
4UBSUFE XPSLJOH PO TUVEFOU 4
4UBSUFE XPSLJOH PO TUVEFOU 5
4UBSUFE XPSLJOH PO TUVEFOU 3
'JOJTIFE XPSLJOH PO TUVEFOU 4
'JOJTIFE XPSLJOH PO TUVEFOU 3
'JOJTIFE XPSLJOH PO TUVEFOU 5
88
89
90
4UBSUFE XPSLJOH PO TUVEFOU 7
4UBSUFE XPSLJOH PO TUVEFOU 8
4UBSUFE XPSLJOH PO TUVEFOU 6
'JOJTIFE XPSLJOH PO TUVEFOU 7
'JOJTIFE XPSLJOH PO TUVEFOU 6
'JOJTIFE XPSLJOH PO TUVEFOU 8
91
92
93
4UBSUFE XPSLJOH PO TUVEFOU 9
'JOJTIFE XPSLJOH PO TUVEFOU 9
94
SFBM 0N4.007T l 4 TFDPOET UPUBM
VTFS 0N0.000T
TZT 0N0.004T
1C@ N@>JI? K<M<H@O@M JA NBQ() C<N OC@ N<H@ H@<IDIB <N BTZOD#VG(): &O ?@O@MHDI@N OC@ NDU@
JA OC@ =PAA@M OC<O NBQ() PN@N OJ NOJM@ OC@ M@NPGON DI. 1C@ OCDM? K<M<H@O@M DN OC@ RJMF PIDO NDU@
<N DI QBSBMMFM(); OC@ ?DAA@M@I>@ =@DIB DON ?@A<PGO Q<GP@, RCD>C DN TJ[F@U.NBY:
/* ... */ = UBTL1PPM.NBQ!func(range,
buffer_size = 100
work_unit_size = TJ[F@U.NBY);
UBTL1PPM.BNBQ()
83.5
-<M<GG@G BNBQ() RJMFN OC@ N<H@ <N K<M<GG@G NBQ() RDOC ORJ ?DAA@M@I>@N:
t &O DN APGGT @<B@M.
t &O RJMFN RDOC 3BOEPN"DDFTT3BOHF M<IB@N.
BVUP SFTVMUT = UBTL1PPM.BNBQ!BWFSBHF(SBEF(TUVEFOUT);
&3D3>>7>;E?
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
597
0DI>@ DO DN @<B@M, <GG JA OC@ M@NPGON <M@ M@<?T =T OC@ ODH@ BNBQ() M@OPMIN:
$ UJNF ./EFOFNF
4UBSUFE XPSLJOH PO TUVEFOU 1 l BMM BSF FYFDVUFE VQ GSPOU
4UBSUFE XPSLJOH PO TUVEFOU 0
4UBSUFE XPSLJOH PO TUVEFOU 2
4UBSUFE XPSLJOH PO TUVEFOU 3
'JOJTIFE XPSLJOH PO TUVEFOU 1
4UBSUFE XPSLJOH PO TUVEFOU 4
'JOJTIFE XPSLJOH PO TUVEFOU 2
'JOJTIFE XPSLJOH PO TUVEFOU 3
4UBSUFE XPSLJOH PO TUVEFOU 6
'JOJTIFE XPSLJOH PO TUVEFOU 0
4UBSUFE XPSLJOH PO TUVEFOU 7
4UBSUFE XPSLJOH PO TUVEFOU 5
'JOJTIFE XPSLJOH PO TUVEFOU 4
4UBSUFE XPSLJOH PO TUVEFOU 8
'JOJTIFE XPSLJOH PO TUVEFOU 6
4UBSUFE XPSLJOH PO TUVEFOU 9
'JOJTIFE XPSLJOH PO TUVEFOU 7
'JOJTIFE XPSLJOH PO TUVEFOU 5
'JOJTIFE XPSLJOH PO TUVEFOU 8
'JOJTIFE XPSLJOH PO TUVEFOU 9
85
86
87
88
89
90
91
92
93
94
SFBM 0N3.005T l 3 TFDPOET UPUBM
VTFS 0N0.000T
TZT 0N0.004T
BNBQ() RJMFN A<NO@M OC<I NBQ() <O OC@ @SK@IN@ JA PNDIB <I <MM<T OC<O DN G<MB@ @IJPBC OJ
NOJM@ <GG JA OC@ M@NPGON. &O >JINPH@N HJM@ H@HJMT OJ B<DI NK@@?.
1C@ JKODJI<G N@>JI? K<M<H@O@M JA BNBQ() DN OC@ RJMF PIDO NDU@ <N R@GG:
BVUP SFTVMUT = UBTL1PPM.BNBQ!BWFSBHF(SBEF(TUVEFOUT, 2);
1C@ M@NPGON ><I <GNJ =@ NOJM@? DI < 3BOEPN"DDFTT3BOHF OC<O DN K<NN@? OJ BNBQ() <N DON OCDM?
K<M<H@O@M:
EPVCMF<> SFTVMUT;
SFTVMUT.MFOHUI = TUVEFOUT.MFOHUI;
UBTL1PPM.BNBQ!BWFSBHF(SBEF(TUVEFOUT, 2, SFTVMUT);
&3D3>>7>;E?
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
598
UBTL1PPM.SFEVDF()
83.6
AN RDOC NBQ(), DO C@GKN OJ @SKG<DI SFEVDF() AMJH OC@ TUE.BMHPSJUIN HJ?PG@ ADMNO.
4@ C<Q@ N@@I TUE.BMHPSJUIN.SFEVDF DI OC@ /<IB@N >C<KO@M =@AJM@. SFEVDF() DN <IJOC@M
CDBC-G@Q@G <GBJMDOCH >JHHJIGT AJPI? DI H<IT API>ODJI<G G<IBP<B@N. 'PNO GDF@ NBQ(), DO O<F@N
JI@ JM HJM@ API>ODJIN <N O@HKG<O@ K<M<H@O@MN. AN DON API>ODJI K<M<H@O@MN, DO O<F@N < Q<GP@ OJ
=@ PN@? <N OC@ DIDOD<G Q<GP@ JA OC@ M@NPGO, <I? < M<IB@. SFEVDF() ><GGN OC@ API>ODJIN RDOC OC@
>PMM@IO Q<GP@ JA OC@ M@NPGO <I? @<>C @G@H@IO JA OC@ M<IB@. 4C@I IJ DIDOD<G Q<GP@ DN NK@>DAD@?,
OC@ ADMNO @G@H@IO JA OC@ M<IB@ DN PN@? DINO@<?.
ANNPHDIB OC<O DO ?@ADI@N < Q<MD<=G@ I<H@? SFTVMU DI DON DHKG@H@IO<ODJI, OC@ R<T OC<O
SFEVDF() RJMFN ><I =@ ?@N>MD=@? =T OC@ AJGGJRDIB NO@KN:
1. ANNDBIN OC@ DIDOD<G Q<GP@ OJ SFTVMU
2. "S@>PO@N OC@ @SKM@NNDJI SFTVMU = GVOD(SFTVMU, FMFNFOU) AJM @Q@MT @G@H@IO
3. /@OPMIN OC@ ADI<G Q<GP@ JA SFTVMU
#JM @S<HKG@, OC@ NPH JA OC@ NLP<M@N JA OC@ @G@H@ION JA <I <MM<T ><I =@ ><G>PG<O@? <N DI OC@
AJGGJRDIB KMJBM<H:
JNQPSU TUE.TUEJP;
JNQPSU TUE.BMHPSJUIN;
WPJE NBJO()
\
XSJUFMO(SFEVDF!((B, C) => B + C * C)(0, <5, 10>));
^
4C@I OC@ API>ODJI DN NK@>DAD@? =T OC@ => NTIO<S <N DI OC@ KMJBM<H <=JQ@, OC@ ADMNO K<M<H@O@M
(C@M@ B) M@KM@N@ION OC@ >PMM@IO Q<GP@ JA OC@ M@NPGO (DIDOD<GDU@? =T OC@ K<M<H@O@M 0 <=JQ@) <I?
OC@ N@>JI? K<M<H@O@M (C@M@ C) M@KM@N@ION OC@ >PMM@IO @G@H@IO.
1C@ KMJBM<H JPOKPON OC@ NPH JA 25 <I? 100, OC@ NLP<M@N JA 5 <I? 10:
125
AN J=QDJPN AMJH DON =@C<QDJM, SFEVDF() PN@N < GJJK DI DON DHKG@H@IO<ODJI. B@><PN@ OC<O GJJK
DN IJMH<GGT @S@>PO@? JI < NDIBG@ >JM@, DO H<T =@ PII@>@NN<MDGT NGJR RC@I OC@ API>ODJI ><GGN
AJM @<>C @G@H@IO <M@ DI?@K@I?@IO AMJH @<>C JOC@M. &I NP>C ><N@N UBTL1PPM.SFEVDF() AMJH
OC@ TUE.QBSBMMFMJTN HJ?PG@ ><I =@ PN@? AJM O<FDIB <?Q<IO<B@ JA <GG JA OC@ >JM@N.
1J N@@ <I @S<HKG@ JA OCDN G@O'N PN@ SFEVDF() RDOC < API>ODJI OC<O DN NGJR@? ?JRI <B<DI
<MODAD>D<GGT:
JNQPSU TUE.TUEJP;
JNQPSU TUE.BMHPSJUIN;
JNQPSU DPSF.UISFBE;
JOU B$BMDVMBUJPO(JOU SFTVMU, JOU FMFNFOU)
\
XSJUFGMO("TUBSUFE - FMFNFOU: %T, SFTVMU: %T",
FMFNFOU, SFTVMU);
5ISFBE.TMFFQ(1.TFDPOET);
SFTVMU += FMFNFOU;
XSJUFGMO("GJOJTIFE - FMFNFOU: %T, SFTVMU: %T",
FMFNFOU, SFTVMU);
SFUVSO SFTVMU;
&3D3>>7>;E?
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
599
^
WPJE NBJO()
\
XSJUFMO("3FTVMU: ", SFEVDF!B$BMDVMBUJPO(0, <1, 2, 3, 4>));
^
SFEVDF() PN@N OC@ @G@H@ION DI N@LP@I>@ OJ M@<>C OC@ ADI<G Q<GP@ JA OC@ M@NPGO:
$ UJNF ./EFOFNF
TUBSUFE - FMFNFOU: 1, SFTVMU: 0
GJOJTIFE - FMFNFOU: 1, SFTVMU: 1
TUBSUFE - FMFNFOU: 2, SFTVMU: 1
GJOJTIFE - FMFNFOU: 2, SFTVMU: 3
TUBSUFE - FMFNFOU: 3, SFTVMU: 3
GJOJTIFE - FMFNFOU: 3, SFTVMU: 6
TUBSUFE - FMFNFOU: 4, SFTVMU: 6
GJOJTIFE - FMFNFOU: 4, SFTVMU: 10
3FTVMU: 10
SFBM 0N4.003T l 4 TFDPOET UPUBM
VTFS 0N0.000T
TZT 0N0.000T
AN DI OC@ QBSBMMFM() <I? NBQ() @S<HKG@N, DHKJMODIB OC@ TUE.QBSBMMFMJTN HJ?PG@ <I?
><GGDIB UBTL1PPM.SFEVDF() DN NPAAD>D@IO OJ O<F@ <?Q<IO<B@ JA <GG JA OC@ >JM@N:
JNQPSU TUE.QBSBMMFMJTN;
// ...
XSJUFMO("3FTVMU: ", UBTL1PPM.SFEVDF!B$BMDVMBUJPO(0, <1, 2, 3, 4>));
%JR@Q@M, OC@M@ <M@ DHKJMO<IO ?DAA@M@I>@N DI OC@ R<T UBTL1PPM.SFEVDF() RJMFN.
)DF@ OC@ JOC@M K<M<GG@G <GBJMDOCHN, UBTL1PPM.SFEVDF() @S@>PO@N OC@ API>ODJIN DI K<M<GG@G =T
PNDIB @G@H@ION DI ?DAA@M@IO O<NFN. "<>C O<NF RJMFN JI OC@ @G@H@ION OC<O DO DN <NNDBI@? OJ <I?
><G>PG<O@N < SFTVMU OC<O >JMM@NKJI?N OJ OC@ @G@H@ION JA OC<O O<NF. 0DI>@ SFEVDF() DN ><GG@?
RDOC JIGT < NDIBG@ DIDOD<G Q<GP@, @Q@MT O<NF HPNO PN@ OC<O N<H@ DIDOD<G Q<GP@ OJ DIDOD<GDU@ DON JRI
SFTVMU (OC@ K<M<H@O@M 0 <=JQ@).
1C@ ADI<G Q<GP@N JA OC@ M@NPGON OC<O @<>C O<NF KMJ?P>@N <M@ OC@HN@GQ@N PN@? DI OC@ N<H@
SFTVMU ><G>PG<ODJI JI@ G<NO ODH@. 1C@N@ ADI<G ><G>PG<ODJIN <M@ @S@>PO@? N@LP@IOD<GGT, IJO DI
K<M<GG@G. #JM OC<O M@<NJI, UBTL1PPM.SFEVDF() H<T @S@>PO@ NGJR@M DI NCJMO @S<HKG@N <N DI
OCDN >C<KO@M <N RDGG =@ J=N@MQ@? DI OC@ AJGGJRDIB JPOKPO.
1C@ A<>O OC<O OC@ N<H@ DIDOD<G Q<GP@ DN PN@? AJM <GG JA OC@ O<NFN, @AA@>ODQ@GT =@DIB PN@? DI OC@
><G>PG<ODJIN HPGODKG@ ODH@N, UBTL1PPM.SFEVDF() H<T ><G>PG<O@ < M@NPGO OC<O DN ?DAA@M@IO AMJH
RC<O TUE.BMHPSJUIN.SFEVDF() ><G>PG<O@N. #JM OC<O M@<NJI, OC@ DIDOD<G Q<GP@ HPNO =@ OC@
;67@F;FK H3>G7 AJM OC@ ><G>PG<ODJI OC<O DN =@DIB K@MAJMH@?, @.B. OC@ 0 DI OCDN @S<HKG@ RCD>C
?J@N IJO C<Q@ <IT @AA@>O DI <??DODJI.
A??DODJI<GGT, <N OC@ M@NPGON <M@ PN@? =T OC@ N<H@ API>ODJIN JI@ G<NO ODH@ DI OC@ N@LP@IOD<G
><G>PG<ODJIN, OC@ OTK@N JA OC@ K<M<H@O@MN OC<O OC@ API>ODJIN O<F@ HPNO =@ >JHK<OD=G@ RDOC OC@
OTK@N JA OC@ Q<GP@N OC<O OC@ API>ODJIN M@OPMI.
UBTL1PPM.SFEVDF() NCJPG? =@ PN@? JIGT PI?@M OC@N@ >JIND?@M<ODJIN.
&3D3>>7>;E?
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
600
JNQPSU TUE.QBSBMMFMJTN;
// ...
XSJUFMO("3FTVMU: ", UBTL1PPM.SFEVDF!B$BMDVMBUJPO(0, <1, 2, 3, 4>));
1C@ JPOKPO JA OC@ KMJBM<H DI?D><O@N OC<O ADMNO OC@ ><G>PG<ODJIN <M@ K@MAJMH@? DI K<M<GG@G, <I?
OC@I OC@DM M@NPGON <M@ ><G>PG<O@? N@LP@IOD<GGT. 1C@ ><G>PG<ODJIN OC<O <M@ K@MAJMH@?
N@LP@IOD<GGT <M@ CDBCGDBCO@? DI BM@@I:
$ UJNF ./EFOFNF
TUBSUFE - FMFNFOU: 3, SFTVMU: 0 l GJSTU, UIF UBTLT JO QBSBMMFM
TUBSUFE - FMFNFOU: 2, SFTVMU: 0
TUBSUFE - FMFNFOU: 1, SFTVMU: 0
TUBSUFE - FMFNFOU: 4, SFTVMU: 0
GJOJTIFE - FMFNFOU: 3, SFTVMU: 3
GJOJTIFE - FMFNFOU: 1, SFTVMU: 1
TUBSUFE - FMFNFOU: 1, SFTVMU: 0 l UIFO, UIFJS SFTVMUT TFRVFOUJBMMZ
GJOJTIFE - FMFNFOU: 4, SFTVMU: 4
GJOJTIFE - FMFNFOU: 2, SFTVMU: 2
GJOJTIFE - FMFNFOU: 1, SFTVMU: 1
TUBSUFE - FMFNFOU: 2, SFTVMU: 1
GJOJTIFE - FMFNFOU: 2, SFTVMU: 3
TUBSUFE - FMFNFOU: 3, SFTVMU: 3
GJOJTIFE - FMFNFOU: 3, SFTVMU: 6
TUBSUFE - FMFNFOU: 4, SFTVMU: 6
GJOJTIFE - FMFNFOU: 4, SFTVMU: 10
3FTVMU: 10
SFBM 0N5.006T l QBSBMMFM SFEVDF JT TMPXFS JO UIJT FYBNQMF
VTFS 0N0.004T
TZT 0N0.000T
-<M<GG@G SFEVDF() DN A<NO@M DI H<IT JOC@M ><G>PG<ODJIN GDF@ OC@ ><G>PG<ODJI JA OC@ H<OC
>JINO<IO B; (h) =T LP<?M<OPM@.
Multiple functions and tuple results
83.7
TUE.BMHPSJUIN.NBQ(), UBTL1PPM.NBQ(), UBTL1PPM.BNBQ(), <I? UBTL1PPM.SFEVDF() ><I <GG
O<F@ HJM@ OC<I JI@ API>ODJI, DI RCD>C ><N@ OC@ M@NPGON <M@ M@OPMI@? <N < 5VQMF. 4@ C<Q@ N@@I
OC@ 5VQMF OTK@ DI OC@ 1PKG@N >C<KO@M =@AJM@. 1C@ M@NPGON JA DI?DQD?P<G API>ODJIN >JMM@NKJI? OJ
OC@ @G@H@ION JA OC@ OPKG@ DI OC@ JM?@M OC<O OC@ API>ODJIN <M@ NK@>DAD@?. #JM @S<HKG@, OC@ M@NPGO
JA OC@ ADMNO API>ODJI DN OC@ ADMNO H@H=@M JA OC@ OPKG@.
1C@ AJGGJRDIB KMJBM<H ?@HJINOM<O@N HPGODKG@ API>ODJIN RDOC TUE.BMHPSJUIN.NBQ. +JO@ OC<O
OC@ M@OPMI OTK@N JA OC@ API>ODJIN I@@? IJO =@ OC@ N<H@, <N N@@I DI OC@ RVBSUFS0G() <I?
UFO5JNFT() API>ODJIN =@GJR. &I OC<O ><N@, OC@ OTK@N JA OC@ H@H=@MN JA OC@ OPKG@N RJPG? =@
?DAA@M@IO <N R@GG:
JNQPSU TUE.TUEJP;
JNQPSU TUE.BMHPSJUIN;
JNQPSU TUE.DPOW;
EPVCMF RVBSUFS0G(EPVCMF WBMVF)
\
SFUVSO WBMVF / 4;
^
&3D3>>7>;E?
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
601
TUSJOH UFO5JNFT(EPVCMF WBMVF)
\
SFUVSO UP!TUSJOH(WBMVF * 10);
^
WPJE NBJO()
\
BVUP WBMVFT = <10, 42, 100>;
BVUP SFTVMUT = NBQ!(RVBSUFS0G, UFO5JNFT)(WBMVFT);
XSJUFGMO(" 2VBSUFST 5FO 5JNFT");
GPSFBDI (RVBSUFS3FTVMU, UFO5JNFT3FTVMU; SFTVMUT) \
XSJUFGMO("%8.2G%8T", RVBSUFS3FTVMU, UFO5JNFT3FTVMU);
^
^
1C@ JPOKPO:
2VBSUFST 5FO 5JNFT
2.50 100
10.50 420
25.00 1000
&I OC@ ><N@ JA UBTL1PPM.SFEVDF(), OC@ DIDOD<G Q<GP@N JA OC@ M@NPGON HPNO =@ NK@>DAD@? <N <
OPKG@:
UBTL1PPM.SFEVDF!(GPP, CBS)(UVQMF(0, 1), <1, 2, 3, 4>);
5BTL1PPM
83.8
B@CDI? OC@ N>@I@N, OC@ K<M<GG@G <GBJMDOCHN AMJH OC@ TUE.QBSBMMFMJTN HJ?PG@ <GG PN@ O<NF
J=E@>ON OC<O <M@ @G@H@ION JA < 5BTL1PPM >JIO<DI@M. +JMH<GGT, <GG JA OC@ <GBJMDOCHN PN@ OC@
N<H@ >JIO<DI@M J=E@>O I<H@? UBTL1PPM.
UBTL1PPM >JIO<DIN <KKMJKMD<O@ IPH=@M JA O<NFN ?@K@I?DIB JI OC@ @IQDMJIH@IO OC<O OC@
KMJBM<H MPIN PI?@M. #JM OC<O M@<NJI, PNP<GGT OC@M@ DN IJ I@@? OJ >M@<O@ <IT JOC@M 5BTL1PPM
J=E@>O. "Q@I NJ, @SKGD>DO 5BTL1PPM J=E@>ON H<T =@ >M@<O@? <I? PN@? <N I@@?@?.
1C@ 5BTL1PPM >JINOMP>OJM O<F@N OC@ IPH=@M JA OCM@<?N OJ PN@ ?PMDIB OC@ K<M<GG@G JK@M<ODJIN
OC<O <M@ G<O@M NO<MO@? OCMJPBC DO. 1C@ ?@A<PGO Q<GP@ JA OC@ IPH=@M JA OCM@<?N DN JI@ G@NN OC<I
OC@ IPH=@M JA >JM@N JI OC@ NTNO@H. AGG JA OC@ A@<OPM@N OC<O R@ C<Q@ N@@I DI OCDN >C<KO@M ><I
=@ <KKGD@? OJ < N@K<M<O@ 5BTL1PPM J=E@>O.
1C@ AJGGJRDIB @S<HKG@ ><GGN QBSBMMFM() JI < GJ><G 5BTL1PPM J=E@>O:
JNQPSU TUE.TUEJP;
JNQPSU TUE.QBSBMMFMJTN;
WPJE NBJO()
\
BVUP XPSLFST = OFX 5BTL1PPM(2);
GPSFBDI (J; XPSLFST.QBSBMMFM(<1, 2, 3, 4>)) \
XSJUFGMO("8PSLJOH PO %T", J);
^
XPSLFST.GJOJTI();
^
&3D3>>7>;E?
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
602
5BTL1PPM.GJOJTI() O@GGN OC@ J=E@>O OJ NOJK KMJ>@NNDIB RC@I <GG JA DON >PMM@IO O<NFN <M@
>JHKG@O@?.
Summary
83.9
t &O DN <I @MMJM OJ @S@>PO@ JK@M<ODJIN DI K<M<GG@G PIG@NN OCJN@ JK@M<ODJIN <M@ DI?@K@I?@IO
AMJH @<>C JOC@M.
t QBSBMMFM() @S@>PO@N OC@ DO@M<ODJIN JA GPSFBDI GJJKN DI K<M<GG@G.
t 1<NFN ><I @SKGD>DOGT =@ >M@<O@?, NO<MO@?, <I? R<DO@? AJM =T UBTL(),
FYFDVUF*O/FX5ISFBE(), <I? ZJFME'PSDF(), M@NK@>ODQ@GT.
t 1C@ @S>@KODJIN OC<O <M@ @N><K@? AMJH O<NFN ><I =@ ><PBCO G<O@M =T HJNO JA OC@ K<M<GG@GDNH
API>ODJIN GDF@ ZJFME'PSDF().
t BTZOD#VG() DO@M<O@N OC@ @G@H@ION JA <I *OQVU3BOHF N@HD-@<B@MGT DI K<M<GG@G.
t NBQ() ><GGN API>ODJIN RDOC OC@ @G@H@ION JA <I *OQVU3BOHF N@HD-@<B@MGT DI K<M<GG@G.
t BNBQ() ><GGN API>ODJIN RDOC OC@ @G@H@ION JA < 3BOEPN"DDFTT3BOHF APGGT-@<B@MGT DI K<M<GG@G.
t SFEVDF() H<F@N ><G>PG<ODJIN JQ@M OC@ @G@H@ION JA < 3BOEPN"DDFTT3BOHF DI K<M<GG@G.
t NBQ(), BNBQ(), <I? SFEVDF() ><I O<F@ HPGODKG@ API>ODJIN <I? M@OPMI OC@ M@NPGON <N OPKG@N.
t 4C@I I@@?@?, 5BTL1PPM J=E@>ON JOC@M OC<I UBTL1PPM ><I =@ PN@?.
&3D3>>7>;E?
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
603
Message Passing Concurrency 84
JI>PMM@I>T DN NDHDG<M OJ =PO ?DAA@M@IO AMJH OC@ OJKD> JA OC@ KM@QDJPN >C<KO@M, K<M<GG@GDNH. AN
OC@N@ ORJ >JI>@KON =JOC DIQJGQ@ @S@>PODIB KMJBM<HN JI OCM@<?N, <I? <N K<M<GG@GDNH DN =<N@?
JI >JI>PMM@I>T, OC@T <M@ NJH@ODH@N >JIAPN@? RDOC @<>C JOC@M.
1C@ AJGGJRDIB <M@ OC@ ?DAA@M@I>@N =@OR@@I K<M<GG@GDNH <I? >JI>PMM@I>T:
t 1C@ H<DI KPMKJN@ JA K<M<GG@GDNH DN OJ O<F@ <?Q<IO<B@ JA HD>MJKMJ>@NNJM >JM@N OJ DHKMJQ@
OC@ K@MAJMH<I>@ JA KMJBM<HN. JI>PMM@I>T JI OC@ JOC@M C<I?, DN < >JI>@KO OC<O H<T =@
I@@?@? @Q@I JI < NDIBG@->JM@ @IQDMJIH@IO. JI>PMM@I>T DN <=JPO H<FDIB < KMJBM<H MPI
JI HJM@ OC<I JI@ OCM@<? <O < ODH@. AI @S<HKG@ JA < >JI>PMM@IO KMJBM<H RJPG? =@ <
N@MQ@M KMJBM<H OC<O DN M@NKJI?DIB OJ M@LP@NON JA HJM@ OC<I JI@ >GD@IO <O OC@ N<H@ ODH@.
t &I K<M<GG@GDNH, O<NFN <M@ DI?@K@I?@IO AMJH @<>C JOC@M. &I A<>O, DO RJPG? =@ < =PB DA OC@T ?D?
?@K@I? JI M@NPGON JA JOC@M O<NFN OC<O <M@ MPIIDIB <O OC@ N<H@ ODH@. &I >JI>PMM@I>T, DO DN
IJMH<G AJM OCM@<?N OJ ?@K@I? JI M@NPGON JA JOC@M OCM@<?N.
t AGOCJPBC =JOC KMJBM<HHDIB HJ?@GN PN@ JK@M<ODIB NTNO@H OCM@<?N, DI K<M<GG@GDNH OCM@<?N
<M@ @I><KNPG<O@? =T OC@ >JI>@KO JA O<NF. JI>PMM@I>T H<F@N PN@ JA OCM@<?N @SKGD>DOGT.
t -<M<GG@GDNH DN @<NT OJ PN@, <I? <N GJIB <N O<NFN <M@ DI?@K@I?@IO DO DN @<NT OJ KMJ?P>@
KMJBM<HN OC<O RJMF >JMM@>OGT. JI>PMM@I>T DN @<NT JIGT RC@I DO DN =<N@? JI ?7EE397
B3EE;@9. &O DN Q@MT ?DAAD>PGO OJ RMDO@ >JMM@>O >JI>PMM@IO KMJBM<HN DA OC@T <M@ =<N@? JI OC@
OM<?DODJI<G HJ?@G JA >JI>PMM@I>T OC<O DIQJGQ@N GJ>F-=<N@? ?<O< NC<MDIB.
! NPKKJMON =JOC HJ?@GN JA >JI>PMM@I>T: H@NN<B@ K<NNDIB <I? ?<O< NC<MDIB. 4@ RDGG >JQ@M
H@NN<B@ K<NNDIB DI OCDN >C<KO@M <I? ?<O< NC<MDIB DI OC@ I@SO >C<KO@M.
Concepts
84.1
Thread: ,K@M<ODIB NTNO@HN @S@>PO@ KMJBM<HN <N RJMF PIDON ><GG@? F:D736E. ! KMJBM<HN NO<MO
@S@>PODIB RDOC NBJO() JI < OCM@<? OC<O C<N =@@I <NNDBI@? OJ OC<O KMJBM<H =T OC@ JK@M<ODIB
NTNO@H. AGG JA OC@ JK@M<ODJIN JA OC@ KMJBM<H <M@ IJMH<GGT @S@>PO@? JI OC<O OCM@<?. 1C@
KMJBM<H DN AM@@ OJ NO<MO JOC@M OCM@<?N OJ =@ <=G@ OJ RJMF JI HPGODKG@ O<NFN <O OC@ N<H@ ODH@.
&I A<>O, O<NFN OC<O C<Q@ =@@I >JQ@M@? DI OC@ KM@QDJPN >C<KO@M <M@ =<N@? JI OCM@<?N OC<O <M@
NO<MO@? <POJH<OD><GGT =T TUE.QBSBMMFMJTN.
1C@ JK@M<ODIB NTNO@H ><I K<PN@ OCM@<?N <O PIKM@?D>O<=G@ ODH@N AJM PIKM@?D>O<=G@ ?PM<ODJIN.
AN < M@NPGO, @Q@I JK@M<ODJIN <N NDHKG@ <N DI>M@H@IODIB < Q<MD<=G@ H<T =@ K<PN@? HD?
JK@M<ODJI:
++J;
1C@ JK@M<ODJI <=JQ@ DIQJGQ@N OCM@@ NO@KN: /@<?DIB OC@ Q<GP@ JA OC@ Q<MD<=G@, DI>M@H@IODIB OC@
Q<GP@, <I? <NNDBIDIB OC@ I@R Q<GP@ =<>F OJ OC@ Q<MD<=G@. 1C@ OCM@<? H<T =@ K<PN@? <O <IT
KJDIO =@OR@@I OC@N@ NO@KN OJ =@ >JIODIP@? <AO@M <I PIKM@?D>O<=G@ ODH@.
Message: !<O< OC<O DN K<NN@? =@OR@@I OCM@<?N <M@ ><GG@? H@NN<B@N. *@NN<B@N H<T =@
>JHKJN@? JA <IT OTK@ <I? <IT IPH=@M JA Q<MD<=G@N.
Thread identifier: "Q@MT OCM@<? C<N <I D?, RCD>C DN PN@? AJM NK@>DATDIB M@>DKD@ION JA
H@NN<B@N.
Owner: AIT OCM@<? OC<O NO<MON <IJOC@M OCM@<? DN ><GG@? OC@ JRI@M JA OC@ I@R OCM@<?.
Worker: AIT OCM@<? OC<O DN NO<MO@? =T <I JRI@M DN ><GG@? < RJMF@M.
#7EE397 &3EE;@9 CA@5GDD7@5K
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
604
Starting threads
84.2
TQBXO() O<F@N < API>ODJI KJDIO@M <N < K<M<H@O@M <I? NO<MON < I@R OCM@<? AMJH OC<O API>ODJI.
AIT JK@M<ODJIN OC<O <M@ ><MMD@? JPO =T OC<O API>ODJI, DI>GP?DIB JOC@M API>ODJIN OC<O DO H<T
><GG, RJPG? =@ @S@>PO@? JI OC@ I@R OCM@<?. AN NJJI <N < I@R OCM@<? DN NO<MO@?, OC@ JRI@M <I?
OC@ RJMF@M NO<MO @S@>PODIB N@K<M<O@GT <N DA OC@T R@M@ DI?@K@I?@IO KMJBM<HN:
JNQPSU TUE.TUEJP;
JNQPSU TUE.DPODVSSFODZ;
JNQPSU DPSF.UISFBE;
WPJE XPSLFS()
\
GPSFBDI (J; 0 .. 5) \
5ISFBE.TMFFQ(500.NTFDT);
XSJUFMO(J, " (XPSLFS)");
^
^
WPJE NBJO()
\
TQBXO(&XPSLFS);
GPSFBDI (J; 0 .. 5) \
5ISFBE.TMFFQ(300.NTFDT);
XSJUFMO(J, " (NBJO)");
^
XSJUFMO("NBJO JT EPOF.");
^
1C@ @S<HKG@N DI OCDN >C<KO@M ><GG 5ISFBE.TMFFQ OJ NGJR ?JRI OCM@<?N OJ ?@HJINOM<O@ OC<O
OC@T MPI <O OC@ N<H@ ODH@. 1C@ JPOKPO JA OC@ KMJBM<H NCJRN OC<O OC@ ORJ OCM@<?N, JI@ OC<O
MPIN NBJO() <I? OC@ JOC@M OC<O C<N =@@I NO<MO@? =T TQBXO(), @S@>PO@ DI?@K@I?@IOGT <O OC@
N<H@ ODH@:
0 (NBJO)
0 (XPSLFS)
1 (NBJO)
2 (NBJO)
1 (XPSLFS)
3 (NBJO)
2 (XPSLFS)
4 (NBJO)
NBJO JT EPOF.
3 (XPSLFS)
4 (XPSLFS)
1C@ KMJBM<H <POJH<OD><GGT R<DON AJM <GG JA OC@ OCM@<?N OJ ADIDNC @S@>PODIB. 4@ ><I N@@ OCDN DI
OC@ JPOKPO <=JQ@ =T OC@ A<>O OC<O XPSLFS() >JIODIP@N @S@>PODIB @Q@I <AO@M NBJO() @SDON <AO@M
KMDIODIB "H<DI DN ?JI@."
1C@ K<M<H@O@MN OC<O OC@ OCM@<? API>ODJI O<F@N <M@ K<NN@? OJ TQBXO() <N DON N@>JI? <I? G<O@M
<MBPH@ION. 1C@ ORJ RJMF@M OCM@<?N DI OC@ AJGGJRDIB KMJBM<H KMDIO AJPM IPH=@MN @<>C. 1C@T
O<F@ OC@ NO<MODIB IPH=@M <N OC@ OCM@<? API>ODJI K<M<H@O@M:
JNQPSU TUE.TUEJP;
JNQPSU TUE.DPODVSSFODZ;
JNQPSU DPSF.UISFBE;
#7EE397 &3EE;@9 CA@5GDD7@5K
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
605
WPJE XPSLFS(JOU GJSTU/VNCFS)
\
GPSFBDI (J; 0 .. 4) \
5ISFBE.TMFFQ(500.NTFDT);
XSJUFMO(GJSTU/VNCFS + J);
^
^
WPJE NBJO()
\
GPSFBDI (J; 1 .. 3) \
TQBXO(&XPSLFS, J * 10);
^
^
1C@ JPOKPO JA JI@ JA OC@ OCM@<?N DN DI?D><O@? DI =GP@:
10
20
11
21
12
22
13
23
1C@ GDI@N JA OC@ JPOKPO H<T =@ ?DAA@M@IO <O ?DAA@M@IO ODH@N ?@K@I?DIB JI CJR OC@ OCM@<?N <M@
K<PN@? <I? M@NPH@? =T OC@ JK@M<ODIB NTNO@H.
Thread identifiers
84.3
1C@ UIJT5JE Q<MD<=G@ OC<O DN <Q<DG<=G@ BGJ=<GGT <O OC@ HJ?PG@ G@Q@G DN <GR<TN OC@ D? JA OC@
5GDD7@F OCM@<?.
JNQPSU TUE.TUEJP;
JNQPSU TUE.DPODVSSFODZ;
WPJE QSJOU5JE(TUSJOH UBH)
\
XSJUFGMO("%T: %T, BEESFTT: %T", UBH, UIJT5JE, &UIJT5JE);
^
WPJE XPSLFS()
\
QSJOU5JE("8PSLFS");
^
WPJE NBJO()
\
TQBXO(&XPSLFS);
QSJOU5JE("0XOFS ");
^
1C@ OTK@ JA UIJT5JE DN 5JE, =PO DON Q<GP@ C<N IJ NDBIDAD><I>@ AJM OC@ KMJBM<H. #PMOC@M, =JOC
OCM@<?N M@KJMO DO OJ =@ NPMKMDNDIBGT <O OC@ N<H@ <??M@NN:
0XOFS : 5JE(TUE.DPODVSSFODZ..FTTBHF#PY), BEESFTT: 809$360
8PSLFS: 5JE(TUE.DPODVSSFODZ..FTTBHF#PY), BEESFTT: 809$360
#7EE397 &3EE;@9 CA@5GDD7@5K
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
606
"Q@I NJ, OC@ ORJ UIJT5JE Q<MD<=G@N <=JQ@ <M@ DI?@K@I?@IO AMJH @<>C JOC@M. 1CDN DN =@><PN@
DI ! ?<O< DN OCM@<?-GJ><G =T ?@A<PGO.
1C@ JRI@M JA < RJMF@M OCM@<? DN OC@ PXOFS5JE Q<MD<=G@.
1C@ M@OPMI Q<GP@ JA TQBXO(), RCD>C & C<Q@ =@@I DBIJMDIB PIODG OCDN KJDIO DN OC@ D? JA OC@
RJMF@M OCM@<?:
5JE NZ8PSLFS = TQBXO(&XPSLFS);
&I NPHH<MT, OC@ JRI@M DN D?@IODAD@? =T PXOFS5JE <I? OC@ RJMF@M DN D?@IODAD@? =T OC@ M@OPMI
Q<GP@ JA TQBXO().
Message Passing
84.4
TFOE() N@I?N H@NN<B@N <I? SFDFJWF0OMZ() R<DON AJM < H@NN<B@ JA < K<MOD>PG<M OTK@. (1C@M@
DN <GNJ QSJPSJUZ4FOE(), SFDFJWF(), <I? SFDFJWF5JNFPVU(), RCD>C RDGG =@ @SKG<DI@? G<O@M
=@GJR.)
1C@ JRI@M DI OC@ AJGGJRDIB KMJBM<H N@I?N DON RJMF@M < H@NN<B@ JA OTK@ JOU <I? R<DON AJM <
H@NN<B@ AMJH OC@ RJMF@M JA OTK@ EPVCMF. 1C@ OCM@<?N >JIODIP@ N@I?DIB H@NN<B@N =<>F <I?
AJMOC PIODG OC@ JRI@M N@I?N < I@B<ODQ@ JOU. 1CDN DN OC@ JRI@M OCM@<?:
WPJE NBJO()
\
5JE XPSLFS = TQBXO(&XPSLFS'VOD);
GPSFBDI (WBMVF; 1 .. 5) \
XPSLFS.TFOE(WBMVF);
EPVCMF SFTVMU = SFDFJWF0OMZ!EPVCMF();
XSJUFGMO("TFOU: %T, SFDFJWFE: %T", WBMVF, SFTVMU);
^
/* 4FOEJOH B OFHBUJWF WBMVF UP UIF XPSLFS TP UIBU JU
* UFSNJOBUFT. */
XPSLFS.TFOE(-1);
^
NBJO() NOJM@N OC@ M@OPMI Q<GP@ JA TQBXO() PI?@M OC@ I<H@ XPSLFS <I? PN@N OC<O Q<MD<=G@
RC@I N@I?DIB H@NN<B@N OJ OC@ RJMF@M.
,I OC@ JOC@M ND?@, OC@ RJMF@M M@>@DQ@N OC@ H@NN<B@ OC<O DO I@@?N <N <I JOU, PN@N OC<O Q<GP@ DI
< ><G>PG<ODJI, <I? N@I?N OC@ M@NPGO <N OTK@ EPVCMF OJ DON JRI@M:
WPJE XPSLFS'VOD()
\
JOU WBMVF = 0;
XIJMF (WBMVF >= 0) \
WBMVF = SFDFJWF0OMZ!JOU();
EPVCMF SFTVMU = UP!EPVCMF(WBMVF) / 5;
PXOFS5JE.TFOE(SFTVMU);
^
^
1C@ H<DI OCM@<? M@KJMON OC@ H@NN<B@N OC<O DO N@I?N <I? OC@ H@NN<B@N OC<O DO M@>@DQ@N:
#7EE397 &3EE;@9 CA@5GDD7@5K
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
607
TFOU: 1, SFDFJWFE: 0.2
TFOU: 2, SFDFJWFE: 0.4
TFOU: 3, SFDFJWFE: 0.6
TFOU: 4, SFDFJWFE: 0.8
&O DN KJNND=G@ OJ N@I? HJM@ OC<I JI@ Q<GP@ <N < K<MO JA OC@ N<H@ H@NN<B@. 1C@ AJGGJRDIB
H@NN<B@ >JINDNON JA OCM@@ K<MON:
PXOFS5JE.TFOE(UIJT5JE, 42, 1.5);
3<GP@N OC<O <M@ K<NN@? <N K<MON JA < NDIBG@ H@NN<B@ <KK@<M <N < OPKG@ JI OC@ M@>@DQ@M'N ND?@.
&I NP>C ><N@N OC@ O@HKG<O@ K<M<H@O@MN JA SFDFJWF0OMZ() HPNO H<O>C OC@ OTK@N JA OC@ OPKG@
H@H=@MN:
/* 8BJU GPS B NFTTBHF DPNQPTFE PG 5JE, JOU, BOE EPVCMF. */
BVUP NFTTBHF = SFDFJWF0OMZ!(5JE, JOU, EPVCMF)();
BVUP TFOEFS = NFTTBHF<0>; // PG UZQF 5JE
BVUP JOUFHFS = NFTTBHF<1>; // PG UZQF JOU
BVUP GMPBUJOH = NFTTBHF<2>; // PG UZQF EPVCMF
&A OC@ OTK@N ?J IJO H<O>C, < .FTTBHF.JTNBUDI @S>@KODJI DN OCMJRI:
JNQPSU TUE.DPODVSSFODZ;
WPJE XPSLFS'VOD()
\
PXOFS5JE.TFOE("IFMMP"); // j 4FOEJOH TUSJOH
^
WPJE NBJO()
\
TQBXO(&XPSLFS'VOD);
BVUP NFTTBHF = SFDFJWF0OMZ!EPVCMF(); // j &YQFDUJOH EPVCMF
^
1C@ JPOKPO:
TUE.DPODVSSFODZ..FTTBHF.JTNBUDI!TUE/DPODVSSFODZ.E(235):
6OFYQFDUFE NFTTBHF UZQF: FYQFDUFE 'EPVCMF', HPU 'JNNVUBCMF(DIBS)<>'
1C@ @S>@KODJIN OC<O OC@ RJMF@M H<T OCMJR ><IIJO =@ ><PBCO =T OC@ JRI@M. ,I@ NJGPODJI DN OJ
C<Q@ OC@ RJMF@M ><O>C OC@ @S>@KODJI OJ =@ N@IO <N < H@NN<B@. 4@ RDGG N@@ OCDN =@GJR.
Example 84.4.1
)@O'N PN@ RC<O R@ C<Q@ N@@I NJ A<M DI < NDHPG<ODJI KMJBM<H.
1C@ AJGGJRDIB KMJBM<H NDHPG<O@N MJ=JON HJQDIB M<I?JHGT <I? DI?@K@IOGT DI < ORJ
?DH@INDJI<G NK<>@. 1C@ HJQ@H@IO JA @<>C MJ=JO DN C<I?G@? =T < N@K<M<O@ OCM@<?, RCD>C O<F@N
OCM@@ KD@>@N JA DIAJMH<ODJI RC@I NO<MO@?:
t 1C@ IPH=@M JA OC@ MJ=JO: 1CDN DIAJMH<ODJI DN N@IO =<>F OJ OC@ JRI@M OJ D?@IODAT OC@ MJ=JO
OC<O OC@ H@NN<B@ DN <=JPO.
t 1C@ JMDBDI: 1CDN DN RC@M@ OC@ MJ=JO NO<MON HJQDIB AMJH.
t 1C@ ?PM<ODJI =@OR@@I @<>C NO@K: 1CDN DIAJMH<ODJI DN PN@? AJM ?@O@MHDIDIB RC@I OC@
MJ=JO'N I@SO NO@K RDGG =@.
#7EE397 &3EE;@9 CA@5GDD7@5K
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
608
1C<O DIAJMH<ODJI ><I =@ NOJM@? DI OC@ AJGGJRDIB +PC NOMP>O:
TUSVDU +PC
\
TJ[F@U SPCPU*E;
1PTJUJPO PSJHJO;
%VSBUJPO SFTU%VSBUJPO;
^
1C@ OCM@<? API>ODJI OC<O HJQ@N @<>C MJ=JO >JIODIPJPNGT N@I?N OC@ IPH=@M JA OC@ MJ=JO <I?
DON HJQ@H@IO OJ OC@ JRI@M OCM@<?:
WPJE SPCPU.PWFS(+PC KPC)
\
1PTJUJPO GSPN = KPC.PSJHJO;
XIJMF (USVF) \
5ISFBE.TMFFQ(KPC.SFTU%VSBUJPO);
1PTJUJPO UP = SBOEPN/FJHICPS(GSPN);
.PWFNFOU NPWFNFOU = .PWFNFOU(GSPN, UP);
GSPN = UP;
PXOFS5JE.TFOE(.PWFNFOU.FTTBHF(KPC.SPCPU*E, NPWFNFOU));
^
^
1C@ JRI@M NDHKGT R<DON AJM OC@N@ H@NN<B@N DI <I DIADIDO@ GJJK. &O D?@IODAD@N OC@ MJ=JON =T OC@
MJ=JO IPH=@M OC<O DN N@IO <N < K<MO JA OC@ H@NN<B@ <I? NDHKGT KMDION @<>C HJQ@H@IO:
XIJMF (USVF) \
BVUP NFTTBHF = SFDFJWF0OMZ!.PWFNFOU.FTTBHF();
XSJUFGMO("%T %T",
SPCPUT<NFTTBHF.SPCPU*E>, NFTTBHF.NPWFNFOU);
^
AGG JA OC@ H@NN<B@N DI OCDN NDHKG@ KMJBM<H BJ AMJH OC@ RJMF@M OJ OC@ JRI@M. *@NN<B@ K<NNDIB
RJPG? IJMH<GGT =@ HJM@ >JHKGD><O@? DI H<IT JOC@M OTK@N JA KMJBM<HN.
%@M@ DN OC@ >JHKG@O@ KMJBM<H:
JNQPSU TUE.TUEJP;
JNQPSU TUE.SBOEPN;
JNQPSU TUE.TUSJOH;
JNQPSU TUE.DPODVSSFODZ;
JNQPSU DPSF.UISFBE;
TUSVDU 1PTJUJPO
\
JOU MJOF;
JOU DPMVNO;
TUSJOH UP4USJOH()
\
SFUVSO GPSNBU("%T,%T", MJOF, DPMVNO);
^
^
TUSVDU .PWFNFOU
\
1PTJUJPO GSPN;
1PTJUJPO UP;
TUSJOH UP4USJOH()
\
#7EE397 &3EE;@9 CA@5GDD7@5K
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
609
SFUVSO ((GSPN == UP)
GPSNBU("%T (JEMF)", GSPN)
: GPSNBU("%T -> %T", GSPN, UP));
^
^
DMBTT 3PCPU
\
TUSJOH JNBHF;
%VSBUJPO SFTU%VSBUJPO;
UIJT(TUSJOH JNBHF, %VSBUJPO SFTU%VSBUJPO)
\
UIJT.JNBHF = JNBHF;
UIJT.SFTU%VSBUJPO = SFTU%VSBUJPO;
^
PWFSSJEF TUSJOH UP4USJOH()
\
SFUVSO GPSNBU("%T(%T)", JNBHF, SFTU%VSBUJPO);
^
^
/* 3FUVSOT B SBOEPN QPTJUJPO BSPVOE 0,0. */
1PTJUJPO SBOEPN1PTJUJPO()
\
SFUVSO 1PTJUJPO(VOJGPSN!"<>"(-10, 10),
VOJGPSN!"<>"(-10, 10));
^
/* 3FUVSOT BU NPTU POF TUFQ GSPN UIF TQFDJGJFE DPPSEJOBUF. */
JOU SBOEPN4UFQ(JOU DVSSFOU)
\
SFUVSO DVSSFOU + VOJGPSN!"<>"(-1, 1);
^
/* 3FUVSOT B OFJHICPS PG UIF TQFDJGJFE 1PTJUJPO. *U NBZ CF POF
* PG UIF OFJHICPST BU FJHIU EJSFDUJPOT, PS UIF TQFDJGJFE
* QPTJUJPO JUTFMG. */
1PTJUJPO SBOEPN/FJHICPS(1PTJUJPO QPTJUJPO)
\
SFUVSO 1PTJUJPO(SBOEPN4UFQ(QPTJUJPO.MJOF),
SBOEPN4UFQ(QPTJUJPO.DPMVNO));
^
TUSVDU +PC
\
TJ[F@U SPCPU*E;
1PTJUJPO PSJHJO;
%VSBUJPO SFTU%VSBUJPO;
^
TUSVDU .PWFNFOU.FTTBHF
\
TJ[F@U SPCPU*E;
.PWFNFOU NPWFNFOU;
^
WPJE SPCPU.PWFS(+PC KPC)
\
1PTJUJPO GSPN = KPC.PSJHJO;
XIJMF (USVF) \
5ISFBE.TMFFQ(KPC.SFTU%VSBUJPO);
1PTJUJPO UP = SBOEPN/FJHICPS(GSPN);
.PWFNFOU NPWFNFOU = .PWFNFOU(GSPN, UP);
GSPN = UP;
PXOFS5JE.TFOE(.PWFNFOU.FTTBHF(KPC.SPCPU*E, NPWFNFOU));
^
#7EE397 &3EE;@9 CA@5GDD7@5K
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
610
^
WPJE NBJO()
\
/* 3PCPUT XJUI WBSJPVT SFTU%VSBUJPOT. */
3PCPU<> SPCPUT = < OFX 3PCPU(""", 600.NTFDT),
OFX 3PCPU("#", 2000.NTFDT),
OFX 3PCPU("$", 5000.NTFDT) >;
/* 4UBSU B NPWFS UISFBE GPS FBDI SPCPU. */
GPSFBDI (SPCPU*E, SPCPU; SPCPUT) \
TQBXO(&SPCPU.PWFS, +PC(SPCPU*E,
SBOEPN1PTJUJPO(),
SPCPU.SFTU%VSBUJPO));
^
/* 3FBEZ UP DPMMFDU JOGPSNBUJPO BCPVU UIF NPWFNFOUT PG UIF
* SPCPUT. */
XIJMF (USVF) \
BVUP NFTTBHF = SFDFJWF0OMZ!.PWFNFOU.FTTBHF();
/* 1SJOU UIF NPWFNFOU PG UIJT SPCPU. */
XSJUFGMO("%T %T",
SPCPUT<NFTTBHF.SPCPU*E>, NFTTBHF.NPWFNFOU);
^
^
1C@ KMJBM<H KMDION @<>C HJQ@H@IO PIODG O@MHDI<O@?:
"(600 NT) 6,2 -> 7,3
"(600 NT) 7,3 -> 8,3
"(600 NT) 8,3 -> 7,3
#(2 TFDT) -7,-4 -> -6,-3
"(600 NT) 7,3 -> 6,2
"(600 NT) 6,2 -> 7,1
"(600 NT) 7,1 (JEMF)
#(2 TFDT) -6,-3 (JEMF)
"(600 NT) 7,1 -> 7,2
"(600 NT) 7,2 -> 7,3
$(5 TFDT) -4,-4 -> -3,-5
"(600 NT) 7,3 -> 6,4
...
1C@ KJR@M JA >JI>PMM@I>T =T H@NN<B@ K<NNDIB DN ?@HJINOM<O@? DI OCDN KMJBM<H. *JQ@H@ION
JA @<>C MJ=JO <M@ ><G>PG<O@? DI?@K@I?@IOGT =T N@K<M<O@ OCM@<?N. &O DN OC@ JRI@M OCM@<? OC<O
E7D;3>;L7E OC@ KMDIODIB JA OC@ HJQ@H@ION =T KMDIODIB OC@H DI OC@ JM?@M OC<O DO M@>@DQ@N OC@
H@NN<B@N.
Expecting different types of messages
84.5
SFDFJWF0OMZ() ><I @SK@>O JIGT JI@ OTK@ JA H@NN<B@. SFDFJWF() JI OC@ JOC@M C<I? ><I R<DO
AJM HJM@ OC<I JI@ OTK@ JA H@NN<B@. &O ?DNK<O>C@N H@NN<B@N OJ H@NN<B@ C<I?GDIB ?@G@B<O@N.
4C@I < H@NN<B@ <MMDQ@N, DO DN >JHK<M@? OJ OC@ H@NN<B@ OTK@ JA @<>C ?@G@B<O@. 1C@ ?@G@B<O@
OC<O H<O>C@N OC@ OTK@ JA OC@ K<MOD>PG<M H@NN<B@ C<I?G@N DO.
#JM @S<HKG@, OC@ AJGGJRDIB SFDFJWF() ><GG NK@>DAD@N ORJ H@NN<B@ C<I?G@MN OC<O RJPG? C<I?G@
H@NN<B@N JA OTK@N JOU <I? TUSJOH, M@NK@>ODQ@GT:
#7EE397 &3EE;@9 CA@5GDD7@5K
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
611
WPJE XPSLFS'VOD()
\
CPPM JT%POF = GBMTF;
XIJMF (!JT%POF) \
WPJE JOU)BOEMFS(JOU NFTTBHF)
\
XSJUFMO("IBOEMJOH JOU NFTTBHF: ", NFTTBHF);
JG (NFTTBHF == -1) \
XSJUFMO("FYJUJOH");
JT%POF = USVF;
^
^
WPJE TUSJOH)BOEMFS(TUSJOH NFTTBHF)
\
XSJUFMO("IBOEMJOH TUSJOH NFTTBHF: ", NFTTBHF);
^
SFDFJWF(&JOU)BOEMFS, &TUSJOH)BOEMFS);
^
^
*@NN<B@N JA OTK@ JOU RJPG? H<O>C JOU)BOEMFS() <I? H@NN<B@N JA OTK@ TUSJOH RJPG? H<O>C
TUSJOH)BOEMFS(). 1C@ RJMF@M OCM@<? <=JQ@ ><I =@ O@NO@? =T OC@ AJGGJRDIB KMJBM<H:
JNQPSU TUE.TUEJP;
JNQPSU TUE.DPODVSSFODZ;
// ...
WPJE NBJO()
\
BVUP XPSLFS = TQBXO(&XPSLFS'VOD);
XPSLFS.TFOE(10);
XPSLFS.TFOE(42);
XPSLFS.TFOE("IFMMP");
XPSLFS.TFOE(-1); // j UP UFSNJOBUF UIF XPSLFS
^
1C@ JPOKPO JA OC@ KMJBM<H DI?D><O@N OC<O OC@ H@NN<B@N <M@ C<I?G@? =T H<O>CDIB API>ODJIN JI
OC@ M@>@DQ@M'N ND?@:
IBOEMJOH JOU NFTTBHF: 10
IBOEMJOH JOU NFTTBHF: 42
IBOEMJOH TUSJOH NFTTBHF: IFMMP
IBOEMJOH JOU NFTTBHF: -1
FYJUJOH
)<H=?< API>ODJIN <I? J=E@>ON JA OTK@N OC<O ?@ADI@ OC@ PQ$BMM() H@H=@M API>ODJI ><I <GNJ =@
K<NN@? OJ SFDFJWF() <N H@NN<B@ C<I?G@MN. 1C@ AJGGJRDIB RJMF@M C<I?G@N H@NN<B@N =T
G<H=?< API>ODJIN. 1C@ AJGGJRDIB KMJBM<H <GNJ ?@ADI@N < NK@>D<G OTK@ I<H@? &YJU PN@? AJM
>JHHPID><ODIB OJ OC@ OCM@<? OC<O DO DN ODH@ AJM DO OJ @SDO. 2NDIB NP>C < NK@>DAD> OTK@ DN HJM@
@SKM@NNDQ@ OC<I N@I?DIB OC@ <M=DOM<MT Q<GP@ JA -1.
1C@M@ <M@ OCM@@ <IJITHJPN API>ODJIN =@GJR OC<O <M@ K<NN@? OJ SFDFJWF() <N H@NN<B@
C<I?G@MN. 1C@DM >PMGT =M<>F@ON <M@ CDBCGDBCO@?:
JNQPSU TUE.TUEJP;
JNQPSU TUE.DPODVSSFODZ;
#7EE397 &3EE;@9 CA@5GDD7@5K
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
612
TUSVDU &YJU
\^
WPJE XPSLFS'VOD()
\
CPPM JT%POF = GBMTF;
XIJMF (!JT%POF) \
SFDFJWF(
(JOU NFTTBHF) \
XSJUFMO("JOU NFTTBHF: ", NFTTBHF);
^,
(TUSJOH NFTTBHF) \
XSJUFMO("TUSJOH NFTTBHF: ", NFTTBHF);
^,
(&YJU NFTTBHF) \
XSJUFMO("FYJUJOH");
JT%POF = USVF;
^);
^
^
WPJE NBJO()
\
BVUP XPSLFS = TQBXO(&XPSLFS'VOD);
XPSLFS.TFOE(10);
XPSLFS.TFOE(42);
XPSLFS.TFOE("IFMMP");
XPSLFS.TFOE(&YJU());
^
Receiving any type of message 84.5.1
TUE.WBSJBOU.7BSJBOU DN < OTK@ OC<O ><I @I><KNPG<O@ <IT OTK@ JA ?<O<. *@NN<B@N OC<O ?J IJO
H<O>C OC@ C<I?G@MN OC<O <M@ NK@>DAD@? @<MGD@M DI OC@ <MBPH@IO GDNO <GR<TN H<O>C < 7BSJBOU
C<I?G@M:
JNQPSU TUE.TUEJP;
JNQPSU TUE.DPODVSSFODZ;
WPJE XPSLFS'VOD()
\
SFDFJWF(
(JOU NFTTBHF) \ /* ... */ ^,
(EPVCMF NFTTBHF) \ /* ... */ ^,
(7BSJBOU NFTTBHF) \
XSJUFMO("6OFYQFDUFE NFTTBHF: ", NFTTBHF);
^);
^
TUSVDU 4QFDJBM.FTTBHF
\
/* ... */
^
WPJE NBJO()
\
BVUP XPSLFS = TQBXO(&XPSLFS'VOD);
XPSLFS.TFOE(4QFDJBM.FTTBHF());
^
1C@ JPOKPO:
#7EE397 &3EE;@9 CA@5GDD7@5K
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
613
6OFYQFDUFE NFTTBHF: 4QFDJBM.FTTBHF()
1C@ ?@O<DGN JA 7BSJBOU <M@ JPOND?@ JA OC@ N>JK@ JA OCDN >C<KO@M.
Waiting for messages up to a certain time
84.6
&O H<T IJO H<F@ N@IN@ OJ R<DO AJM H@NN<B@N =@TJI? < >@MO<DI ODH@. 1C@ N@I?@M H<T C<Q@
=@@I =PNT O@HKJM<MDGT JM H<T C<Q@ O@MHDI<O@? RDOC <I @S>@KODJI. SFDFJWF5JNFPVU()
KM@Q@ION =GJ>FDIB OC@ M@>@DQDIB OCM@<? DI?@ADIDO@GT.
1C@ ADMNO K<M<H@O@M JA SFDFJWF5JNFPVU() ?@O@MHDI@N CJR GJIB OC@ H@NN<B@ NCJPG? =@
R<DO@? AJM. &ON M@OPMI Q<GP@ DN USVF DA < H@NN<B@ C<N =@@I M@>@DQ@? RDOCDI OC<O ODH@, GBMTF
JOC@MRDN@.
JNQPSU TUE.TUEJP;
JNQPSU TUE.DPODVSSFODZ;
JNQPSU DPSF.UISFBE;
WPJE XPSLFS'VOD()
\
5ISFBE.TMFFQ(3.TFDPOET);
PXOFS5JE.TFOE("IFMMP");
^
WPJE NBJO()
\
TQBXO(&XPSLFS'VOD);
XSJUFMO("8BJUJOH GPS B NFTTBHF");
CPPM SFDFJWFE = GBMTF;
XIJMF (!SFDFJWFE) \
SFDFJWFE = SFDFJWF5JNFPVU(600.NTFDT,
(TUSJOH NFTTBHF) \
XSJUFMO("SFDFJWFE: ", NFTTBHF);
^);
JG (!SFDFJWFE) \
XSJUFMO("... OP NFTTBHF ZFU");
/* ... PUIFS PQFSBUJPOT NBZ CF FYFDVUFE IFSF ... */
^
^
^
1C@ JRI@M <=JQ@ R<DON AJM < H@NN<B@ AJM PK OJ 600 HDGGDN@>JI?N. &O ><I >JIODIP@ RJMFDIB JI
JOC@M OCDIBN DA < H@NN<B@ ?J@N IJO <MMDQ@ RDOCDI OC<O ODH@:
8BJUJOH GPS B NFTTBHF
... OP NFTTBHF ZFU
... OP NFTTBHF ZFU
... OP NFTTBHF ZFU
... OP NFTTBHF ZFU
SFDFJWFE: IFMMP
Exceptions during the execution of the worker
84.7
AN R@ C<Q@ N@@I DI OC@ KM@QDJPN >C<KO@M, OC@ A<>DGDOD@N JA OC@ TUE.QBSBMMFMJTN HJ?PG@
<POJH<OD><GGT ><O>C @S>@KODJIN OC<O C<Q@ =@@I OCMJRI ?PMDIB OC@ @S@>PODJI JA O<NFN <I?
M@OCMJR OC@H DI OC@ >JIO@SO JA OC@ JRI@M. 1CDN <GGJRN OC@ JRI@M OJ ><O>C NP>C @S>@KODJIN:
#7EE397 &3EE;@9 CA@5GDD7@5K
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
614
USZ \
UIF5BTL.ZJFME'PSDF();
^ DBUDI (&YDFQUJPO FYD) \
XSJUFGMO("%FUFDUFE BO FSSPS JO UIF UBTL: '%T'",
FYD.NTH);
^
TUE.DPODVSSFODZ ?J@N IJO KMJQD?@ NP>C < >JIQ@ID@I>@ AJM B@I@M<G @S>@KODJI OTK@N. %JR@Q@M,
OC@ @S>@KODJIN ><I =@ ><PBCO <I? N@IO @SKGD>DOGT =T OC@ RJMF@M. AN R@ RDGG N@@ =@GJR, DO DN <GNJ
KJNND=G@ OJ M@>@DQ@ 0XOFS5FSNJOBUFE <I? -JOL5FSNJOBUFE @S>@KODJIN <N H@NN<B@N.
1C@ DBMDVMBUF() API>ODJI =@GJR M@>@DQ@N TUSJOH H@NN<B@N, >JIQ@MON OC@H OJ EPVCMF, <??N
0.5, <I? N@I?N OC@ M@NPGO =<>F <N < H@NN<B@:
WPJE DBMDVMBUF()
\
XIJMF (USVF) \
BVUP NFTTBHF = SFDFJWF0OMZ!TUSJOH();
PXOFS5JE.TFOE(UP!EPVCMF(NFTTBHF) + 0.5);
^
^
1C@ UP!EPVCMF() ><GG <=JQ@ RJPG? OCMJR <I @S>@KODJI DA OC@ NOMDIB ><IIJO =@ >JIQ@MO@? OJ <
EPVCMF Q<GP@. B@><PN@ NP>C <I @S>@KODJI RJPG? O@MHDI<O@ OC@ RJMF@M OCM@<? MDBCO <R<T, OC@
JRI@M DI OC@ AJGGJRDIB KMJBM<H ><I M@>@DQ@ < M@NKJIN@ JIGT AJM OC@ ADMNO H@NN<B@:
JNQPSU TUE.TUEJP;
JNQPSU TUE.DPODVSSFODZ;
JNQPSU TUE.DPOW;
/* ... */
WPJE NBJO()
\
5JE DBMDVMBUPS = TQBXO(&DBMDVMBUF);
DBMDVMBUPS.TFOE("1.2");
DBMDVMBUPS.TFOE("IFMMP"); // j JODPSSFDU JOQVU
DBMDVMBUPS.TFOE("3.4");
GPSFBDI (J; 0 .. 3) \
BVUP NFTTBHF = SFDFJWF0OMZ!EPVCMF();
XSJUFGMO("SFTVMU %T: %T", J, NFTTBHF);
^
^
1C@ JRI@M M@>@DQ@N OC@ M@NKJIN@ AJM "1.2" <N 1.7 =PO =@><PN@ OC@ RJMF@M C<N =@@I
O@MHDI<O@?, OC@ JRI@M RJPG? =@ =GJ>F@? R<DODIB AJM < H@NN<B@ OC<O RJPG? I@Q@M <MMDQ@:
SFTVMU 0: 1.7
l XBJUJOH GPS B NFTTBHF UIBU XJMM OFWFS BSSJWF
,I@ OCDIB OC<O OC@ RJMF@M ><I ?J DN OJ ><O>C OC@ @S>@KODJI @SKGD>DOGT <I? OJ N@I? DO <N <
NK@>D<G @MMJM H@NN<B@. 1C@ AJGGJRDIB KMJBM<H N@I?N OC@ M@<NJI JA OC@ A<DGPM@ <N <
$BMDVMBUJPO'BJMVSF H@NN<B@. A??DODJI<GGT, OCDN KMJBM<H O<F@N <?Q<IO<B@ JA < NK@>D<G
H@NN<B@ OTK@ OJ NDBI<G OJ OC@ RJMF@M RC@I DO DN ODH@ OJ @SDO:
JNQPSU TUE.TUEJP;
JNQPSU TUE.DPODVSSFODZ;
JNQPSU TUE.DPOW;
#7EE397 &3EE;@9 CA@5GDD7@5K
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
615
TUSVDU $BMDVMBUJPO'BJMVSF
\
TUSJOH SFBTPO;
^
TUSVDU &YJU
\^
WPJE DBMDVMBUF()
\
CPPM JT%POF = GBMTF;
XIJMF (!JT%POF) \
SFDFJWF(
(TUSJOH NFTTBHF) \
USZ \
PXOFS5JE.TFOE(UP!EPVCMF(NFTTBHF) + 0.5);
^ DBUDI (&YDFQUJPO FYD) \
PXOFS5JE.TFOE($BMDVMBUJPO'BJMVSF(FYD.NTH));
^
^,
(&YJU NFTTBHF) \
JT%POF = USVF;
^);
^
^
WPJE NBJO()
\
5JE DBMDVMBUPS = TQBXO(&DBMDVMBUF);
DBMDVMBUPS.TFOE("1.2");
DBMDVMBUPS.TFOE("IFMMP"); // j JODPSSFDU JOQVU
DBMDVMBUPS.TFOE("3.4");
DBMDVMBUPS.TFOE(&YJU());
GPSFBDI (J; 0 .. 3) \
XSJUFG("SFTVMU %T: ", J);
SFDFJWF(
(EPVCMF NFTTBHF) \
XSJUFMO(NFTTBHF);
^,
($BMDVMBUJPO'BJMVSF NFTTBHF) \
XSJUFGMO("&3303! '%T'", NFTTBHF.SFBTPO);
^);
^
^
1CDN ODH@ OC@ M@<NJI JA OC@ A<DGPM@ DN KMDIO@? =T OC@ JRI@M:
SFTVMU 0: 1.7
SFTVMU 1: &3303! 'OP EJHJUT TFFO'
SFTVMU 2: 3.9
AIJOC@M H@OCJ? RJPG? =@ OJ N@I? OC@ <>OP<G @S>@KODJI J=E@>O DON@GA OJ OC@ JRI@M. 1C@ JRI@M
><I PN@ OC@ @S>@KODJI J=E@>O JM NDHKGT M@OCMJR DO:
// ... BU UIF XPSLFS ...
USZ \
// ...
^ DBUDI (TIBSFE(&YDFQUJPO) FYD) \
PXOFS5JE.TFOE(FYD);
#7EE397 &3EE;@9 CA@5GDD7@5K
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
616
^^,
// ... BU UIF PXOFS ...
SFDFJWF(
// ...
(TIBSFE(&YDFQUJPO) FYD) \
UISPX FYD;
^);
1C@ M@<NJI RCT OC@ TIBSFE NK@>DAD@MN <M@ I@>@NN<MT DN @SKG<DI@? DI OC@ I@SO >C<KO@M.
Detecting thread termination
84.8
1CM@<?N ><I ?@O@>O OC<O OC@ M@>@DQ@M JA < H@NN<B@ C<N O@MHDI<O@?.
0XOFS5FSNJOBUFE exception 84.8.1
1CDN @S>@KODJI DN OCMJRI RC@I M@>@DQDIB < H@NN<B@ AMJH OC@ JRI@M DA OC@ JRI@M C<N =@@I
O@MHDI<O@?. 1C@ DIO@MH@?D<O@ JRI@M OCM@<? =@GJR NDHKGT @SDON <AO@M N@I?DIB ORJ H@NN<B@N OJ
DON RJMF@M. 1CDN ><PN@N <I 0XOFS5FSNJOBUFE @S>@KODJI OJ =@ OCMJRI <O OC@ RJMF@M OCM@<?:
JNQPSU TUE.TUEJP;
JNQPSU TUE.DPODVSSFODZ;
WPJE NBJO()
\
TQBXO(&JOUFSNFEJBSZ'VOD);
^
WPJE JOUFSNFEJBSZ'VOD()
\
BVUP XPSLFS = TQBXO(&XPSLFS'VOD);
XPSLFS.TFOE(1);
XPSLFS.TFOE(2);
^ // j 5FSNJOBUFT BGUFS TFOEJOH UXP NFTTBHFT
WPJE XPSLFS'VOD()
\
XIJMF (USVF) \
BVUP N = SFDFJWF0OMZ!JOU(); // j "O FYDFQUJPO JT
// UISPXO JG UIF PXOFS
// IBT UFSNJOBUFE.
XSJUFMO(".FTTBHF: ", N);
^
^
1C@ JPOKPO:
.FTTBHF: 1
.FTTBHF: 2
TUE.DPODVSSFODZ.0XOFS5FSNJOBUFE!TUE/DPODVSSFODZ.E(248):
0XOFS UFSNJOBUFE
1C@ RJMF@M ><I ><O>C OC<O @S>@KODJI OJ @SDO BM<>@APGGT:
WPJE XPSLFS'VOD()
\
CPPM JT%POF = GBMTF;
XIJMF (!JT%POF) \
USZ \
#7EE397 &3EE;@9 CA@5GDD7@5K
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
617
BVUP N = SFDFJWF0OMZ!JOU();
XSJUFMO(".FTTBHF: ", N);
^ DBUDI (0XOFS5FSNJOBUFE FYD) \
XSJUFMO("5IF PXOFS IBT UFSNJOBUFE.");
JT%POF = USVF;
^
^
^
1C@ JPOKPO:
.FTTBHF: 1
.FTTBHF: 2
5IF PXOFS IBT UFSNJOBUFE.
4@ RDGG N@@ =@GJR OC<O OCDN @S>@KODJI ><I =@ M@>@DQ@? <N < H@NN<B@ <N R@GG.
-JOL5FSNJOBUFE exception 84.8.2
TQBXO-JOLFE() DN PN@? DI OC@ N<H@ R<T <N TQBXO(). 4C@I < RJMF@M OC<O C<N =@@I NO<MO@? =T
TQBXO-JOLFE() O@MHDI<O@N, < -JOL5FSNJOBUFE @S>@KODJI DN OCMJRI <O OC@ JRI@M:
JNQPSU TUE.TUEJP;
JNQPSU TUE.DPODVSSFODZ;
WPJE NBJO()
\
BVUP XPSLFS = TQBXO-JOLFE(&XPSLFS'VOD);
XIJMF (USVF) \
BVUP N = SFDFJWF0OMZ!JOU(); // j "O FYDFQUJPO JT
// UISPXO JG UIF XPSLFS
// IBT UFSNJOBUFE.
XSJUFMO(".FTTBHF: ", N);
^
^
WPJE XPSLFS'VOD()
\
PXOFS5JE.TFOE(10);
PXOFS5JE.TFOE(20);
^ // j 5FSNJOBUFT BGUFS TFOEJOH UXP NFTTBHFT
1C@ RJMF@M <=JQ@ O@MHDI<O@N <AO@M N@I?DIB ORJ H@NN<B@N. 0DI>@ OC@ RJMF@M C<N =@@I NO<MO@?
=T TQBXO-JOLFE(), OC@ JRI@M DN IJODAD@? JA OC@ RJMF@M'N O@MHDI<ODJI =T < -JOL5FSNJOBUFE
@S>@KODJI:
.FTTBHF: 10
.FTTBHF: 20
TUE.DPODVSSFODZ.-JOL5FSNJOBUFE!TUE/DPODVSSFODZ.E(263):
-JOL UFSNJOBUFE
1C@ JRI@M ><I ><O>C OC@ @S>@KODJI OJ ?J NJH@OCDIB NK@>D<G GDF@ O@MHDI<ODIB BM<>@APGGT:
CPPM JT%POF = GBMTF;
XIJMF (!JT%POF) \
USZ \
BVUP N = SFDFJWF0OMZ!JOU();
XSJUFMO(".FTTBHF: ", N);
#7EE397 &3EE;@9 CA@5GDD7@5K
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
618
^ DBUDI (-JOL5FSNJOBUFE FYD) \
XSJUFMO("5IF XPSLFS IBT UFSNJOBUFE.");
JT%POF = USVF;
^
^
1C@ JPOKPO:
.FTTBHF: 10
.FTTBHF: 20
5IF XPSLFS IBT UFSNJOBUFE.
1CDN @S>@KODJI ><I =@ M@>@DQ@? <N < H@NN<B@ <N R@GG.
Receiving exceptions as messages 84.8.3
1C@ 0XOFS5FSNJOBUFE <I? -JOL5FSNJOBUFE @S>@KODJIN ><I =@ M@>@DQ@? <N H@NN<B@N <N R@GG.
1C@ AJGGJRDIB >J?@ ?@HJINOM<O@N OCDN AJM OC@ 0XOFS5FSNJOBUFE @S>@KODJI:
CPPM JT%POF = GBMTF;
XIJMF (!JT%POF) \
SFDFJWF(
(JOU NFTTBHF)
\
XSJUFMO(".FTTBHF: ", NFTTBHF);
^,
(0XOFS5FSNJOBUFE FYD)
\
XSJUFMO("5IF PXOFS IBT UFSNJOBUFE; FYJUJOH.");
JT%POF = USVF;
^
);
^
Mailbox management
84.9
"Q@MT OCM@<? C<N < KMDQ<O@ H<DG=JS OC<O CJG?N OC@ H@NN<B@N OC<O <M@ N@IO OJ OC<O OCM@<?. 1C@
IPH=@M JA H@NN<B@N DI < H<DG=JS H<T DI>M@<N@ JM ?@>M@<N@ ?@K@I?DIB JI CJR GJIB DO O<F@N
AJM OC@ OCM@<? OJ M@>@DQ@ <I? M@NKJI? OJ @<>C H@NN<B@. A >JIODIPJPNGT BMJRDIB H<DG=JS KPON
NOM@NN JI OC@ @IODM@ NTNO@H <I? H<T KJDIO OJ < ?@NDBI AG<R DI OC@ KMJBM<H. &O H<T <GNJ H@<I
OC<O OC@ OCM@<? H<T I@Q@M B@O OJ OC@ HJNO M@>@IO H@NN<B@N.
TFU.BY.BJMCPY4J[F() DN PN@? AJM GDHDODIB OC@ IPH=@M JA H@NN<B@N OC<O < H<DG=JS ><I CJG?.
&ON OCM@@ K<M<H@O@MN NK@>DAT OC@ H<DG=JS, OC@ H<SDHPH IPH=@M JA H@NN<B@N OC<O DO ><I CJG?,
<I? RC<O NCJPG? C<KK@I RC@I OC@ H<DG=JS DN APGG, DI OC<O JM?@M. 1C@M@ <M@ AJPM >CJD>@N AJM OC@
G<NO K<M<H@O@M:
t 0O$SPXEJOH.CMPDL: 1C@ N@I?@M R<DON PIODG OC@M@ DN MJJH DI OC@ H<DG=JS.
t 0O$SPXEJOH.JHOPSF: 1C@ H@NN<B@ DN ?DN><M?@?.
t 0O$SPXEJOH.UISPX&YDFQUJPO: A .BJMCPY'VMM @S>@KODJI DN OCMJRI RC@I N@I?DIB OC@
H@NN<B@.
t A API>ODJI KJDIO@M JA OTK@ CPPM GVODUJPO(5JE): 1C@ NK@>DAD@? API>ODJI DN ><GG@?.
B@AJM@ N@@DIB <I @S<HKG@ JA TFU.BY.BJMCPY4J[F(), G@O'N ADMNO ><PN@ < H<DG=JS OJ BMJR
>JIODIPJPNGT. 1C@ RJMF@M DI OC@ AJGGJRDIB KMJBM<H N@I?N H@NN<B@N =<>F OJ =<>F =PO OC@
JRI@M NK@I?N NJH@ ODH@ AJM @<>C H@NN<B@:
#7EE397 &3EE;@9 CA@5GDD7@5K
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
619
/* 8"3/*/(: :PVS TZTUFN NBZ CFDPNF VOSFTQPOTJWF XIFO UIJT
* QSPHSBN JT SVOOJOH. */
JNQPSU TUE.DPODVSSFODZ;
JNQPSU DPSF.UISFBE;
WPJE XPSLFS'VOD()
\
XIJMF (USVF) \
PXOFS5JE.TFOE(42); // j 1SPEVDFT NFTTBHFT DPOUJOVPVTMZ
^
^
WPJE NBJO()
\
TQBXO(&XPSLFS'VOD);
XIJMF (USVF) \
SFDFJWF(
(JOU NFTTBHF) \
// 4QFOET UJNF GPS FBDI NFTTBHF
5ISFBE.TMFFQ(1.TFDPOET);
^);
^
^
B@><PN@ OC@ >JINPH@M DN NGJR@M OC<I OC@ KMJ?P>@M, OC@ H@HJMT OC<O OC@ KMJBM<H <=JQ@ PN@N
RJPG? BMJR >JIODIPJPNGT. 1J KM@Q@IO OC<O, OC@ JRI@M H<T GDHDO OC@ NDU@ JA DON H<DG=JS =@AJM@
NO<MODIB OC@ RJMF@M:
WPJE NBJO()
\
TFU.BY.BJMCPY4J[F(UIJT5JE, 1000, 0O$SPXEJOH.CMPDL);
TQBXO(&XPSLFS'VOD);
// ...
^
1C@ TFU.BY.BJMCPY4J[F() ><GG <=JQ@ N@ON OC@ H<DI OCM@<?'N H<DG=JS NDU@ OJ 1000.
0O$SPXEJOH.CMPDL ><PN@N OC@ N@I?@M OJ R<DO PIODG OC@M@ DN MJJH DI OC@ H<DG=JS.
1C@ AJGGJRDIB @S<HKG@ PN@N 0O$SPXEJOH.UISPX&YDFQUJPO, RCD>C ><PN@N < .BJMCPY'VMM
@S>@KODJI OJ =@ OCMJRI RC@I N@I?DIB < H@NN<B@ OJ < H<DG=JS OC<O DN APGG:
JNQPSU TUE.DPODVSSFODZ;
JNQPSU DPSF.UISFBE;
WPJE XPSLFS'VOD()
\
XIJMF (USVF) \
USZ \
PXOFS5JE.TFOE(42);
^ DBUDI (.BJMCPY'VMM FYD) \
/* 'BJMFE UP TFOE; XJMM USZ BHBJO MBUFS. */
5ISFBE.TMFFQ(1.NTFDT);
^
^
^
WPJE NBJO()
\
TFU.BY.BJMCPY4J[F(UIJT5JE, 1000, 0O$SPXEJOH.UISPX&YDFQUJPO);
TQBXO(&XPSLFS'VOD);
XIJMF (USVF) \
SFDFJWF(
#7EE397 &3EE;@9 CA@5GDD7@5K
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
620
(JOU NFTTBHF) \
5ISFBE.TMFFQ(1.TFDPOET);
^);
^
^
Priority messages
84.10
*@NN<B@N ><I =@ N@IO RDOC CDBC@M KMDJMDOT OC<I M@BPG<M H@NN<B@N =T QSJPSJUZ4FOE(). 1C@N@
H@NN<B@N <M@ C<I?G@? =@AJM@ OC@ JOC@M H@NN<B@N OC<O <M@ <GM@<?T DI OC@ H<DG=JS:
QSJPSJUZ4FOE(PXOFS5JE, *NQPSUBOU.FTTBHF(100));
&A OC@ M@>@DQ@M ?J@N IJO C<Q@ < H@NN<B@ C<I?G@M OC<O H<O>C@N OC@ OTK@ JA OC@ KMDJMDOT
H@NN<B@, OC@I < 1SJPSJUZ.FTTBHF&YDFQUJPO DN OCMJRI:
TUE.DPODVSSFODZ.1SJPSJUZ.FTTBHF&YDFQUJPO!TUE/DPODVSSFODZ.E(280):
1SJPSJUZ NFTTBHF
Thread names
84.11
&I OC@ NDHKG@ KMJBM<HN OC<O R@ C<Q@ PN@? <=JQ@, DO R<N @<NT OJ K<NN OC@ OCM@<? D?N JA JRI@MN
<I? RJMF@MN. -<NNDIB OCM@<? D?N AMJH OCM@<? OJ OCM@<? H<T =@ JQ@MGT >JHKGD><O@? DI
KMJBM<HN OC<O PN@ HJM@ OC<I < >JPKG@ JA OCM@<?N. 1J M@?P>@ OCDN >JHKG@SDOT, DO DN KJNND=G@ OJ
<NNDBI I<H@N OJ OCM@<?N, RCD>C <M@ BGJ=<GGT <>>@NND=G@ AMJH <IT OCM@<?.
1C@ AJGGJRDIB OCM@@ API>ODJIN ?@ADI@ <I DIO@MA<>@ OJ <I <NNJ>D<ODQ@ <MM<T OC<O @Q@MT OCM@<?
C<N <>>@NN OJ:
t SFHJTUFS(): ANNJ>D<O@N < OCM@<? RDOC < I<H@.
t MPDBUF(): /@OPMIN OC@ OCM@<? OC<O DN <NNJ>D<O@? RDOC OC@ NK@>DAD@? I<H@. &A OC@M@ DN IJ
OCM@<? <NNJ>D<O@? RDOC OC<O I<H@, OC@I 5JE.JOJU DN M@OPMI@?.
t VOSFHJTUFS(): BM@<FN OC@ <NNJ>D<ODJI =@OR@@I OC@ NK@>DAD@? I<H@ <I? OC@ OCM@<?.
1C@ AJGGJRDIB KMJBM<H NO<MON ORJ OCM@<?N OC<O ADI? @<>C JOC@M =T OC@DM I<H@N. 1C@N@ OCM@<?N
>JIODIPJPNGT N@I? H@NN<B@N OJ @<>C JOC@M PIODG DINOMP>O@? OJ O@MHDI<O@ =T <I &YJU H@NN<B@:
JNQPSU TUE.TUEJP;
JNQPSU TUE.DPODVSSFODZ;
JNQPSU DPSF.UISFBE;
TUSVDU &YJU
\^
WPJE NBJO()
\
// " UISFBE XIPTF QBSUOFS JT OBNFE "TFDPOE"
BVUP GJSTU = TQBXO(&QMBZFS, "TFDPOE");
SFHJTUFS("GJSTU", GJSTU);
TDPQF(FYJU) VOSFHJTUFS("GJSTU");
// " UISFBE XIPTF QBSUOFS JT OBNFE "GJSTU"
BVUP TFDPOE = TQBXO(&QMBZFS, "GJSTU");
SFHJTUFS("TFDPOE", TFDPOE);
TDPQF(FYJU) VOSFHJTUFS("TFDPOE");
5ISFBE.TMFFQ(2.TFDPOET);
QSJPSJUZ4FOE(GJSTU, &YJU());
QSJPSJUZ4FOE(TFDPOE, &YJU());
#7EE397 &3EE;@9 CA@5GDD7@5K
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
621
// 'PS UIF VOSFHJTUFS() DBMMT UP TVDDFFE, NBJO() NVTU XBJU
// VOUJM UIF XPSLFST UFSNJOBUF.
UISFBE@KPJO"MM();
^
WPJE QMBZFS(TUSJOH OBNF0G1BSUOFS)
\
5JE QBSUOFS;
XIJMF (QBSUOFS == 5JE.JOJU) \
5ISFBE.TMFFQ(1.NTFDT);
QBSUOFS = MPDBUF(OBNF0G1BSUOFS);
^
CPPM JT%POF = GBMTF;
XIJMF (!JT%POF) \
QBSUOFS.TFOE("IFMMP " _ OBNF0G1BSUOFS);
SFDFJWF(
(TUSJOH NFTTBHF) \
XSJUFMO(".FTTBHF: ", NFTTBHF);
5ISFBE.TMFFQ(500.NTFDT);
^,
(&YJU NFTTBHF) \
XSJUFGMO("%T, * BN FYJUJOH.", OBNF0G1BSUOFS);
JT%POF = USVF;
^);
^
^
1C@ UISFBE@KPJO"MM() ><GG OC<O DN N@@I <O OC@ @I? JA NBJO() DN AJM H<FDIB OC@ JRI@M OJ R<DO
AJM <GG JA DON RJMF@MN OJ O@MHDI<O@.
1C@ JPOKPO:
.FTTBHF: IFMMP TFDPOE
.FTTBHF: IFMMP GJSTU
.FTTBHF: IFMMP TFDPOE
.FTTBHF: IFMMP GJSTU
.FTTBHF: IFMMP GJSTU
.FTTBHF: IFMMP TFDPOE
.FTTBHF: IFMMP GJSTU
.FTTBHF: IFMMP TFDPOE
TFDPOE, * BN FYJUJOH.
GJSTU, * BN FYJUJOH.
Summary
84.12
t 4C@I OCM@<?N ?J IJO ?@K@I? JI JOC@M OCM@<?N, KM@A@M B3D3>>7>;E?, RCD>C C<N =@@I OC@
OJKD> JA OC@ KM@QDJPN >C<KO@M. JIND?@M 5A@5GDD7@5K JIGT RC@I OCM@<?N ?@K@I? JI
JK@M<ODJIN JA JOC@M OCM@<?N.
t B@><PN@ >JI>PMM@I>T =T ?<O< NC<MDIB DN C<M? OJ DHKG@H@IO >JMM@>OGT, KM@A@M >JI>PMM@I>T
=T H@NN<B@ K<NNDIB, RCD>C DN OC@ NP=E@>O JA OCDN >C<KO@M.
t TQBXO() <I? TQBXO-JOLFE() NO<MO OCM@<?N.
t UIJT5JE DN OC@ OCM@<? D? JA OC@ >PMM@IO OCM@<?.
t PXOFS5JE DN OC@ OCM@<? D? JA OC@ JRI@M JA OC@ >PMM@IO OCM@<?.
t TFOE() <I? QSJPSJUZ4FOE() N@I? H@NN<B@N.
t SFDFJWF0OMZ(), SFDFJWF(), <I? SFDFJWF5JNFPVU() R<DO AJM H@NN<B@N.
#7EE397 &3EE;@9 CA@5GDD7@5K
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
622
t 7BSJBOU H<O>C@N <IT OTK@ JA H@NN<B@.
t TFU.BY.BJMCPY4J[F() GDHDON OC@ NDU@ JA H<DG=JS@N.
t SFHJTUFS(), VOSFHJTUFS(), <I? MPDBUF() <GGJR M@A@MMDIB OJ OCM@<?N =T I<H@.
t "S>@KODJIN H<T =@ OCMJRI ?PMDIB H@NN<B@ K<NNDIB: .FTTBHF.JTNBUDI, 0XOFS5FSNJOBUFE,
-JOL5FSNJOBUFE, .BJMCPY'VMM, <I? 1SJPSJUZ.FTTBHF&YDFQUJPO.
t 1C@ JRI@M ><IIJO <POJH<OD><GGT ><O>C @S>@KODJIN OC<O <M@ OCMJRI AMJH OC@ RJMF@M.
#7EE397 &3EE;@9 CA@5GDD7@5K
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
623
Data Sharing Concurrency 85
1C@ KM@QDJPN >C<KO@M R<N <=JPO OCM@<?N NC<MDIB DIAJMH<ODJI OCMJPBC H@NN<B@ K<NNDIB. AN DO
C<N =@@I H@IODJI@? DI OC<O >C<KO@M, H@NN<B@ K<NNDIB DN < N<A@ H@OCJ? JA >JI>PMM@I>T.
AIJOC@M H@OCJ? DIQJGQ@N HJM@ OC<I JI@ OCM@<? M@<?DIB AMJH <I? RMDODIB OJ OC@ N<H@ ?<O<.
#JM @S<HKG@, OC@ JRI@M OCM@<? ><I NO<MO OC@ RJMF@M RDOC OC@ <??M@NN JA < CPPM Q<MD<=G@ <I?
OC@ RJMF@M ><I ?@O@MHDI@ RC@OC@M OJ O@MHDI<O@ JM IJO =T M@<?DIB OC@ >PMM@IO Q<GP@ JA OC<O
Q<MD<=G@. AIJOC@M @S<HKG@ RJPG? =@ RC@M@ OC@ JRI@M NO<MON HPGODKG@ RJMF@MN RDOC OC@
<??M@NN JA OC@ N<H@ Q<MD<=G@ NJ OC<O OC@ Q<MD<=G@ B@ON HJ?DAD@? =T HJM@ OC<I JI@ RJMF@M.
,I@ JA OC@ M@<NJIN RCT ?<O< NC<MDIB DN IJO N<A@ DN D357 5A@6;F;A@E. A M<>@ >JI?DODJI J>>PMN
RC@I HJM@ OC<I JI@ OCM@<? <>>@NN@N OC@ N<H@ HPO<=G@ ?<O< DI <I PI>JIOMJGG@? JM?@M. 0DI>@
OC@ JK@M<ODIB NTNO@H K<PN@N <I? NO<MON DI?DQD?P<G OCM@<?N DI PINK@>DAD@? R<TN, OC@ =@C<QDJM
JA < KMJBM<H OC<O C<N M<>@ >JI?DODJIN DN PIKM@?D>O<=G@.
1C@ @S<HKG@N DI OCDN >C<KO@M H<T GJJF NDHKGDNOD>. %JR@Q@M, OC@ DNNP@N OC<O OC@T >JIQ@T
<KK@<M DI M@<G KMJBM<HN <O BM@<O@M N><G@N. AGNJ, <GOCJPBC OC@N@ @S<HKG@N PN@ OC@
TUE.DPODVSSFODZ HJ?PG@, OC@ >JI>@KON JA OCDN >C<KO@M <KKGT OJ OC@ DPSF.UISFBE HJ?PG@ <N
R@GG.
Sharing is not automatic
85.1
2IGDF@ HJNO JOC@M KMJBM<HHDIB G<IBP<B@N, ?<O< DN IJO <POJH<OD><GGT NC<M@? DI !; ?<O< DN
OCM@<?-GJ><G =T ?@A<PGO. AGOCJPBC HJ?PG@-G@Q@G Q<MD<=G@N H<T BDQ@ OC@ DHKM@NNDJI JA =@DIB
<>>@NND=G@ =T <GG OCM@<?N, @<>C OCM@<? <>OP<GGT B@ON DON JRI >JKT:
JNQPSU TUE.TUEJP;
JNQPSU TUE.DPODVSSFODZ;
JNQPSU DPSF.UISFBE;
JOU WBSJBCMF;
WPJE QSJOU*OGP(TUSJOH NFTTBHF)
\
XSJUFGMO("%T: %T (!%T)", NFTTBHF, WBSJBCMF, &WBSJBCMF);
^
WPJE XPSLFS()
\
WBSJBCMF = 42;
QSJOU*OGP("#FGPSF UIF XPSLFS JT UFSNJOBUFE");
^
WPJE NBJO()
\
TQBXO(&XPSLFS);
UISFBE@KPJO"MM();
QSJOU*OGP(""GUFS UIF XPSLFS JT UFSNJOBUFE");
^
WBSJBCMF OC<O DN HJ?DAD@? DIND?@ XPSLFS() DN IJO OC@ N<H@ WBSJBCMF OC<O DN N@@I =T NBJO().
1CDN A<>O ><I =@ J=N@MQ@? =T KMDIODIB =JOC OC@ Q<GP@N <I? OC@ <??M@NN@N JA OC@ Q<MD<=G@N:
#FGPSF UIF XPSLFS JT UFSNJOBUFE: 42 (!7'26$6711670)
"GUFS UIF XPSLFS JT UFSNJOBUFE: 0 (!7'26$68127%0)
D3F3 (:3D;@9 CA@5GDD7@5K
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
624
0DI>@ @<>C OCM@<? B@ON DON JRI >JKT JA ?<O<, TQBXO() ?J@N IJO <GGJR K<NNDIB M@A@M@I>@N OJ
OCM@<?-GJ><G Q<MD<=G@N. #JM @S<HKG@, OC@ AJGGJRDIB KMJBM<H OC<O OMD@N OJ K<NN OC@ <??M@NN JA <
CPPM Q<MD<=G@ OJ <IJOC@M OCM@<? ><IIJO =@ >JHKDG@?:
JNQPSU TUE.DPODVSSFODZ;
WPJE XPSLFS(CPPM * JT%POF)
\
XIJMF (!(*JT%POF)) \
// ...
^
^
WPJE NBJO()
\
CPPM JT%POF = GBMTF;
TQBXO(&XPSLFS, &JT%POF); // j DPNQJMBUJPO &3303
// ...
// )PQJOH UP TJHOBM UIF XPSLFS UP UFSNJOBUF:
JT%POF = USVF;
// ...
^
A TUBUJD BTTFSU DIND?@ OC@ TUE.DPODVSSFODZ HJ?PG@ KM@Q@ION <>>@NNDIB ?GF34>7 ?<O< AMJH
<IJOC@M OCM@<?:
TSD/QIPCPT/TUE/DPODVSSFODZ.E(329): &SSPS: TUBUJD BTTFSU
""MJBTFT UP NVUBCMF UISFBE-MPDBM EBUB OPU BMMPXFE."
1C@ <??M@NN JA OC@ HPO<=G@ Q<MD<=G@ JT%POF ><IIJO =@ K<NN@? =@OR@@I OCM@<?N.
AI @S>@KODJI JA OCDN MPG@ DN < Q<MD<=G@ OC<O DN ?@ADI@? <N @@HTIBSFE:
@@HTIBSFE JOU HMPCBMMZ4IBSFE;
1C@M@ DN JIGT JI@ >JKT JA NP>C < Q<MD<=G@ DI OC@ @IODM@ KMJBM<H <I? <GG OCM@<?N ><I NC<M@ OC<O
Q<MD<=G@. @@HTIBSFE DN I@>@NN<MT RC@I DIO@M<>ODIB RDOC GD=M<MD@N JA G<IBP<B@N GDF@ <I?
++ RC@M@ ?<O< NC<MDIB DN <POJH<OD> =T ?@A<PGO.
TIBSFE to share mutable data between threads
85.2
*PO<=G@ Q<MD<=G@N OC<O I@@? OJ =@ NC<M@? HPNO =@ ?@ADI@? RDOC OC@ TIBSFE F@TRJM?:
JNQPSU TUE.DPODVSSFODZ;
WPJE XPSLFS(TIBSFE(CPPM) * JT%POF)
\
XIJMF (*JT%POF) \
// ...
^
^
WPJE NBJO()
\
TIBSFE(CPPM) JT%POF = GBMTF;
TQBXO(&XPSLFS, &JT%POF);
// ...
// 4JHOBMMJOH UIF XPSLFS UP UFSNJOBUF:
D3F3 (:3D;@9 CA@5GDD7@5K
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
625
JT%POF = USVF;
// ...
^
Note: &D787D ?7EE397-B3EE;@9 FA E;9@3> 3 F:D736.
,I OC@ JOC@M C<I?, NDI>@ JNNVUBCMF Q<MD<=G@N ><IIJO =@ HJ?DAD@?, OC@M@ DN IJ KMJ=G@H RDOC
NC<MDIB OC@H ?DM@>OGT. #JM OC<O M@<NJI, JNNVUBCMF DHKGD@N TIBSFE:
JNQPSU TUE.TUEJP;
JNQPSU TUE.DPODVSSFODZ;
JNQPSU DPSF.UISFBE;
WPJE XPSLFS(JNNVUBCMF(JOU) * EBUB)
\
XSJUFMO("EBUB: ", *EBUB);
^
WPJE NBJO()
\
JNNVUBCMF(JOU) J = 42;
TQBXO(&XPSLFS, &J); // j DPNQJMFT
UISFBE@KPJO"MM();
^
1C@ JPOKPO:
EBUB: 42
+JO@ OC<O NDI>@ OC@ GDA@ODH@ JA J DN ?@ADI@? =T OC@ N>JK@ JA NBJO(), DO DN DHKJMO<IO OC<O NBJO()
?J@N IJO O@MHDI<O@ =@AJM@ OC@ RJMF@M OCM@<?. 1C@ ><GG OJ DPSF.UISFBE.UISFBE@KPJO"MM
<=JQ@ DN OJ H<F@ < OCM@<? R<DO AJM <GG JA DON >CDG? OCM@<?N OJ O@MHDI<O@.
A race condition example
85.3
1C@ >JMM@>OI@NN JA OC@ KMJBM<H M@LPDM@N @SOM< <OO@IODJI RC@I HPO<=G@ ?<O< DN NC<M@?
=@OR@@I OCM@<?N.
1J N@@ <I @S<HKG@ JA < M<>@ >JI?DODJI G@O'N >JIND?@M HPGODKG@ OCM@<?N NC<MDIB OC@ N<H@
HPO<=G@ Q<MD<=G@. 1C@ OCM@<?N DI OC@ AJGGJRDIB KMJBM<H M@>@DQ@ OC@ <??M@NN@N <N ORJ
Q<MD<=G@N <I? NR<K OC@DM Q<GP@N < G<MB@ IPH=@M JA ODH@N:
JNQPSU TUE.TUEJP;
JNQPSU TUE.DPODVSSFODZ;
JNQPSU DPSF.UISFBE;
WPJE TXBQQFS(TIBSFE(JOU) * GJSTU, TIBSFE(JOU) * TFDPOE)
\
GPSFBDI (J; 0 .. 10@000) \
JOU UFNQ = *TFDPOE;
*TFDPOE = *GJSTU;
*GJSTU = UFNQ;
^
^
WPJE NBJO()
\
TIBSFE(JOU) J = 1;
TIBSFE(JOU) K = 2;
XSJUFGMO("CFGPSF: %T BOE %T", J, K);
D3F3 (:3D;@9 CA@5GDD7@5K
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
626
GPSFBDI (JE; 0 .. 10) \
TQBXO(&TXBQQFS, &J, &K);
^
// 8BJU GPS BMM UISFBET UP GJOJTI UIFJS UBTLT
UISFBE@KPJO"MM();
XSJUFGMO("BGUFS : %T BOE %T", J, K);
^
AGOCJPBC OC@ KMJBM<H <=JQ@ B@ON >JHKDG@? NP>>@NNAPGGT, DI HJNO ><N@N DO RJPG? RJMF
DI>JMM@>OGT. ,=N@MQ@ OC<O DO NO<MON O@I OCM@<?N OC<O <GG <>>@NN OC@ N<H@ ORJ Q<MD<=G@N J <I? K.
AN < M@NPGO JA OC@ D357 5A@6;F;A@E OC<O OC@T <M@ DI, OC@T DI<?Q@MO@IOGT NKJDG OC@ JK@M<ODJIN JA
JOC@M OCM@<?N.
AGNJ J=N@MQ@ OC<O OJO<G IPH=@M JA NR<KN DN 10 ODH@N 10 OCJPN<I?. 0DI>@ OC<O <HJPIO DN <I
@Q@I IPH=@M, DO DN I<OPM<G OJ @SK@>O OC<O OC@ Q<MD<=G@N @I? PK C<QDIB Q<GP@N 1 <I? 2, OC@DM
DIDOD<G Q<GP@N:
CFGPSF: 1 BOE 2
BGUFS : 1 BOE 2 j FYQFDUFE SFTVMU
AGOCJPBC DO DN KJNND=G@ OC<O OC@ KMJBM<H ><I DI?@@? KMJ?P>@ OC<O M@NPGO, HJNO JA OC@ ODH@ OC@
<>OP<G JPO>JH@ RJPG? =@ JI@ JA OC@ AJGGJRDIB:
CFGPSF: 1 BOE 2
BGUFS : 1 BOE 1 l JODPSSFDU SFTVMU
CFGPSF: 1 BOE 2
BGUFS : 2 BOE 2 l JODPSSFDU SFTVMU
&O DN KJNND=G@ =PO CDBCGT PIGDF@GT OC<O OC@ M@NPGO H<T @Q@I @I? PK =@DIB "2 <I? 1" <N R@GG.
1C@ M@<NJI RCT OC@ KMJBM<H RJMFN DI>JMM@>OGT ><I =@ @SKG<DI@? =T OC@ AJGGJRDIB N>@I<MDJ
=@OR@@I EPNO ORJ OCM@<?N OC<O <M@ DI < M<>@ >JI?DODJI. AN OC@ JK@M<ODIB NTNO@H K<PN@N <I?
M@NO<MON OC@ OCM@<?N <O DI?@O@MHDI<O@ ODH@N, OC@ AJGGJRDIB JM?@M JA @S@>PODJI JA OC@
JK@M<ODJIN JA OC@ ORJ OCM@<?N DN GDF@GT <N R@GG.
)@O'N >JIND?@M OC@ NO<O@ RC@M@ J DN 1 <I? K DN 2. AGOCJPBC OC@ ORJ OCM@<?N @S@>PO@ OC@ N<H@
TXBQQFS() API>ODJI, M@H@H=@M OC<O OC@ GJ><G Q<MD<=G@ UFNQ DN N@K<M<O@ AJM @<>C OCM@<? <I? DO
DN DI?@K@I?@IO AMJH OC@ JOC@M UFNQ Q<MD<=G@N JA JOC@M OCM@<?N. 1J D?@IODAT OCJN@ N@K<M<O@
Q<MD<=G@N, OC@T <M@ M@I<H@? <N UFNQ" <I? UFNQ# =@GJR.
1C@ >C<MO =@GJR ?@HJINOM<O@N CJR OC@ 3-GDI@ >J?@ DIND?@ OC@ GPS GJJK H<T =@ @S@>PO@? =T
@<>C OCM@<? JQ@M ODH@, AMJH OJK OJ =JOOJH, JK@M<ODJI 1 =@DIB OC@ ADMNO JK@M<ODJI <I?
JK@M<ODJI 6 =@DIB OC@ G<NO JK@M<ODJI. 4C@OC@M J JM K DN HJ?DAD@? <O @<>C NO@K DN DI?D><O@? =T
CDBCGDBCODIB OC<O Q<MD<=G@:
D3F3 (:3D;@9 CA@5GDD7@5K
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
627
0QFSBUJPO 5ISFBE " 5ISFBE #
1: JOU UFNQ = *TFDPOE; (UFNQ"==2)
2: *TFDPOE = *GJSTU; (J==1, K==1)
("TTVNF UIBU " JT QBVTFE BOE # JT TUBSUFE BU UIJT QPJOU)
3: JOU UFNQ = *TFDPOE; (UFNQ#==1)
4: *TFDPOE = *GJSTU; (J==1, K==1)
("TTVNF UIBU # JT QBVTFE BOE " JT SFTUBSUFE BU UIJT QPJOU)
5: *GJSTU = UFNQ; (J==2, K==1)
("TTVNF UIBU " JT QBVTFE BOE # JT SFTUBSUFE BU UIJT QPJOU)
6: *GJSTU = UFNQ; (J==1, K==1)
AN ><I =@ N@@I, <O OC@ @I? JA OC@ KM@QDJPN N>@I<MDJ =JOC J <I? K @I? PK C<QDIB OC@ Q<GP@ 1. &O
DN IJO KJNND=G@ OC<O OC@T ><I @Q@M C<Q@ <IT JOC@M Q<GP@ <AO@M OC<O KJDIO.
1C@ N>@I<MDJ <=JQ@ DN EPNO JI@ @S<HKG@ OC<O DN NPAAD>D@IO OJ @SKG<DI OC@ DI>JMM@>O M@NPGON JA OC@
KMJBM<H. ,=QDJPNGT, OC@ M<>@ >JI?DODJIN RJPG? =@ HP>C HJM@ >JHKGD><O@? DI OC@ ><N@ JA OC@
O@I OCM@<?N JA OCDN @S<HKG@.
TZODISPOJ[FE to avoid race conditions
85.4
1C@ DI>JMM@>O KMJBM<H =@C<QDJM <=JQ@ DN ?P@ OJ HJM@ OC<I JI@ OCM@<? <>>@NNDIB OC@ N<H@
HPO<=G@ ?<O< (<I? <O G@<NO JI@ JA OC@H HJ?DATDIB DO). ,I@ R<T JA <QJD?DIB OC@N@ M<>@
>JI?DODJIN DN OJ H<MF OC@ >JHHJI >J?@ RDOC OC@ TZODISPOJ[FE F@TRJM?. 1C@ KMJBM<H RJPG?
RJMF >JMM@>OGT RDOC OC@ AJGGJRDIB >C<IB@:
GPSFBDI (J; 0 .. 10@000) \
TZODISPOJ[FE \
JOU UFNQ = *C;
*C = *B;
*B = UFNQ;
^
^
1C@ JPOKPO:
CFGPSF: 1 BOE 2
BGUFS : 1 BOE 2 l DPSSFDU SFTVMU
1C@ @AA@>O JA TZODISPOJ[FE DN OJ >M@<O@ < GJ>F =@CDI? OC@ N>@I@N <I? OJ <GGJR JIGT JI@ OCM@<?
CJG? OC<O GJ>F <O < BDQ@I ODH@. ,IGT OC@ OCM@<? OC<O CJG?N OC@ GJ>F ><I =@ @S@>PO@? <I? OC@
JOC@MN R<DO PIODG OC@ GJ>F =@>JH@N <Q<DG<=G@ <B<DI RC@I OC@ @S@>PODIB OCM@<? >JHKG@O@N DON
TZODISPOJ[FE =GJ>F. 0DI>@ JI@ OCM@<? @S@>PO@N OC@ EK@5:DA@;L76 >J?@ <O < ODH@, @<>C OCM@<?
RJPG? IJR NR<K OC@ Q<GP@N N<A@GT =@AJM@ <IJOC@M OCM@<? ?J@N OC@ N<H@. 1C@ NO<O@ JA OC@
Q<MD<=G@N J <I? K RJPG? <GR<TN =@ @DOC@M "1 <I? 2" JM "2 <I? 1" <O OC@ @I? JA KMJ>@NNDIB OC@
NTI>CMJIDU@? =GJ>F.
Note: !F ;E 3 D7>3F;H7>K 7JB7@E;H7 AB7D3F;A@ 8AD 3 F:D736 FA I3;F 8AD 3 >A5=, I:;5: ?3K E>AI
6AI@ F:7 7J75GF;A@ A8 F:7 BDA9D3? @AF;5734>K. FADFG@3F7>K, ;@ EA?7 53E7E BDA9D3?
5ADD75F@7EE 53@ 47 7@EGD76 I;F:AGF F:7 GE7 A8 3 synchronized 4>A5=, 4K F3=;@9 36H3@F397 A8
3FA?;5 AB7D3F;A@E F:3F I;>> 47 7JB>3;@76 47>AI.
4C@I DO DN I@@?@? OJ NTI>CMJIDU@ HJM@ OC<I JI@ =GJ>F JA >J?@, DO DN KJNND=G@ OJ NK@>DAT JI@ JM
HJM@ GJ>FN RDOC OC@ TZODISPOJ[FE F@TRJM?.
D3F3 (:3D;@9 CA@5GDD7@5K
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
628
)@O'N N@@ <I @S<HKG@ JA OCDN DI OC@ AJGGJRDIB KMJBM<H OC<O C<N ORJ N@K<M<O@ >J?@ =GJ>FN OC<O
<>>@NN OC@ N<H@ NC<M@? Q<MD<=G@. 1C@ KMJBM<H ><GGN ORJ API>ODJIN RDOC OC@ <??M@NN JA OC@
N<H@ Q<MD<=G@, JI@ API>ODJI DI>M@H@IODIB <I? OC@ JOC@M API>ODJI ?@>M@H@IODIB DO @LP<G
IPH=@M JA ODH@N:
WPJE JODSFNFOUFS(TIBSFE(JOU) * WBMVF)
\
GPSFBDI (J; 0 .. DPVOU) \
++(*WBMVF);
^
^
WPJE EFDSFNFOUFS(TIBSFE(JOU) * WBMVF)
\
GPSFBDI (J; 0 .. DPVOU) \
--(*WBMVF);
^
^
2IAJMOPI<O@GT, H<MFDIB OCJN@ =GJ>FN DI?DQD?P<GGT RDOC TZODISPOJ[FE DN IJO NPAAD>D@IO, =@><PN@
OC@ <IJITHJPN GJ>FN JA OC@ ORJ =GJ>FN RJPG? =@ DI?@K@I?@IO. 0J, OC@ ORJ >J?@ =GJ>FN RJPG?
NODGG =@ <>>@NNDIB OC@ N<H@ Q<MD<=G@ >JI>PMM@IOGT:
JNQPSU TUE.TUEJP;
JNQPSU TUE.DPODVSSFODZ;
JNQPSU DPSF.UISFBE;
FOVN DPVOU = 1000;
WPJE JODSFNFOUFS(TIBSFE(JOU) * WBMVF)
\
GPSFBDI (J; 0 .. DPVOU) \
TZODISPOJ[FE \ // j 5IJT MPDL JT EJGGFSFOU GSPN UIF POF CFMPX.
++(*WBMVF);
^
^
^
WPJE EFDSFNFOUFS(TIBSFE(JOU) * WBMVF)
\
GPSFBDI (J; 0 .. DPVOU) \
TZODISPOJ[FE \ // j 5IJT MPDL JT EJGGFSFOU GSPN UIF POF BCPWF.
--(*WBMVF);
^
^
^
WPJE NBJO()
\
TIBSFE(JOU) OVNCFS = 0;
GPSFBDI (J; 0 .. 100) \
TQBXO(&JODSFNFOUFS, &OVNCFS);
TQBXO(&EFDSFNFOUFS, &OVNCFS);
^
UISFBE@KPJO"MM();
XSJUFMO("'JOBM WBMVF: ", OVNCFS);
^
0DI>@ OC@M@ <M@ @LP<G IPH=@M JA OCM@<?N OC<O DI>M@H@IO <I? ?@>M@H@IO OC@ N<H@ Q<MD<=G@
@LP<G IPH=@M JA ODH@N, JI@ RJPG? @SK@>O OC@ ADI<G Q<GP@ JA OVNCFS OJ =@ U@MJ. %JR@Q@M, OC<O
DN <GHJNO I@Q@M OC@ ><N@:
'JOBM WBMVF: -672 l OPU [FSP
D3F3 (:3D;@9 CA@5GDD7@5K
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
629
#JM HJM@ OC<I JI@ =GJ>F OJ PN@ OC@ N<H@ GJ>F JM GJ>FN, OC@ GJ>F J=E@>ON HPNO =@ NK@>DAD@?
RDOCDI OC@ TZODISPOJ[FE K<M@IO@N@N:
TZODISPOJ[FE (lock_object, another_lock_object, ...)
1C@M@ DN IJ I@@? AJM < NK@>D<G GJ>F OTK@ DI ! =@><PN@ <IT >G<NN J=E@>O ><I =@ PN@? <N <
TZODISPOJ[FE GJ>F. 1C@ AJGGJRDIB KMJBM<H ?@ADI@N <I @HKOT >G<NN I<H@? -PDL OJ PN@ DON
J=E@>ON <N GJ>FN:
JNQPSU TUE.TUEJP;
JNQPSU TUE.DPODVSSFODZ;
JNQPSU DPSF.UISFBE;
FOVN DPVOU = 1000;
DMBTT -PDL
\^
WPJE JODSFNFOUFS(TIBSFE(JOU) * WBMVF, TIBSFE(-PDL) MPDL)
\
GPSFBDI (J; 0 .. DPVOU) \
TZODISPOJ[FE (MPDL) \
++(*WBMVF);
^
^
^
WPJE EFDSFNFOUFS(TIBSFE(JOU) * WBMVF, TIBSFE(-PDL) MPDL)
\
GPSFBDI (J; 0 .. DPVOU) \
TZODISPOJ[FE (MPDL) \
--(*WBMVF);
^
^
^
WPJE NBJO()
\
TIBSFE(-PDL) MPDL = OFX TIBSFE(-PDL)();
TIBSFE(JOU) OVNCFS = 0;
GPSFBDI (J; 0 .. 100) \
TQBXO(&JODSFNFOUFS, &OVNCFS, MPDL);
TQBXO(&EFDSFNFOUFS, &OVNCFS, MPDL);
^
UISFBE@KPJO"MM();
XSJUFMO("'JOBM WBMVF: ", OVNCFS);
^
B@><PN@ OCDN ODH@ =JOC TZODISPOJ[FE =GJ>FN <M@ >JII@>O@? =T OC@ N<H@ GJ>F, JIGT JI@ JA
OC@H DN @S@>PO@? <O < BDQ@I ODH@ <I? OC@ M@NPGO DN U@MJ <N @SK@>O@?:
'JOBM WBMVF: 0 l DPSSFDU SFTVMU
G<NN OTK@N ><I =@ ?@ADI@? <N TZODISPOJ[FE <N R@GG. 1CDN H@<IN OC<O <GG JA OC@ IJI-NO<OD>
H@H=@M API>ODJIN JA OC<O OTK@ <M@ NTI>CMJIDU@? JI < BDQ@I J=E@>O JA OC<O >G<NN:
TZODISPOJ[FE DMBTT $MBTT
\
WPJE GPP()
\
// ...
^
D3F3 (:3D;@9 CA@5GDD7@5K
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
630
WPJE CBS()
\
// ...
^
^
1C@ AJGGJRDIB DN OC@ @LPDQ<G@IO JA OC@ >G<NN ?@ADIDODJI <=JQ@:
DMBTT $MBTT
\
WPJE GPP()
\
TZODISPOJ[FE (UIJT) \
// ...
^
^
WPJE CBS()
\
TZODISPOJ[FE (UIJT) \
// ...
^
^
^
4C@I =GJ>FN JA >J?@ I@@? OJ =@ NTI>CMJIDU@? JI HJM@ OC<I JI@ J=E@>O, OCJN@ J=E@>ON HPNO =@
NK@>DAD@? OJB@OC@M. ,OC@MRDN@, DO DN KJNND=G@ OC<O HJM@ OC<I JI@ OCM@<? H<T C<Q@ GJ>F@?
J=E@>ON OC<O JOC@M OCM@<?N <M@ R<DODIB AJM, DI RCD>C ><N@ OC@ KMJBM<H H<T =@ 6736>A5=76.
A R@GG FIJRI @S<HKG@ JA OCDN KMJ=G@H DN < API>ODJI OC<O OMD@N OJ OM<INA@M HJI@T AMJH JI@
=<IF <>>JPIO OJ <IJOC@M. #JM OCDN API>ODJI OJ RJMF >JMM@>OGT DI < HPGOD-OCM@<?@? @IQDMJIH@IO,
=JOC JA OC@ <>>JPION HPNO ADMNO =@ GJ>F@?. %JR@Q@M, OC@ AJGGJRDIB <OO@HKO RJPG? =@ DI>JMM@>O:
WPJE USBOTGFS.POFZ(TIBSFE #BOL"DDPVOU GSPN,
TIBSFE #BOL"DDPVOU UP)
\
TZODISPOJ[FE (GSPN) \ // j */$033&$5
TZODISPOJ[FE (UP) \
// ...
^
^
^
1C@ @MMJM ><I =@ @SKG<DI@? =T <I @S<HKG@ RC@M@ JI@ OCM@<? <OO@HKODIB OJ OM<INA@M HJI@T
AMJH <>>JPIO A OJ <>>JPIO OJ B RCDG@ <IJOC@M OCM@<? <OO@HKODIB OJ OM<INA@M HJI@T DI OC@
M@Q@MN@ ?DM@>ODJI. &O DN KJNND=G@ OC<O @<>C OCM@<? H<T C<Q@ EPNO GJ>F@? DON M@NK@>ODQ@ GSPN
J=E@>O, CJKDIB I@SO OJ GJ>F DON UP J=E@>O. 0DI>@ OC@ GSPN J=E@>ON >JMM@NKJI? OJ A <I? B DI OC@
ORJ OCM@<?N M@NK@>ODQ@GT, OC@ J=E@>ON RJPG? =@ DI GJ>F@? NO<O@ DI N@K<M<O@ OCM@<?N, H<FDIB DO
DHKJNND=G@ AJM OC@ JOC@M OCM@<? OJ @Q@M GJ>F DON UP J=E@>O. 1CDN NDOP<ODJI DN ><GG@? < 6736>A5=.
1C@ NJGPODJI OJ OCDN KMJ=G@H DN OJ ?@ADI@ <I JM?@MDIB M@G<ODJI =@OR@@I OC@ J=E@>ON <I? OJ GJ>F
OC@H DI OC<O JM?@M, RCD>C DN C<I?G@? <POJH<OD><GGT =T OC@ TZODISPOJ[FE NO<O@H@IO. &I !, DO DN
NPAAD>D@IO OJ NK@>DAT OC@ J=E@>ON DI OC@ N<H@ TZODISPOJ[FE NO<O@H@IO AJM OC@ >J?@ OJ <QJD?
NP>C ?@<?GJ>FN:
WPJE USBOTGFS.POFZ(TIBSFE #BOL"DDPVOU GSPN,
TIBSFE #BOL"DDPVOU UP)
\
TZODISPOJ[FE (GSPN, UP) \ // j DPSSFDU
// ...
^
^
D3F3 (:3D;@9 CA@5GDD7@5K
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
631
TIBSFE TUBUJD UIJT() for single initialization
85.5
4@ FIJR OC<O TUBUJD UIJT() ><I =@ PN@? AJM DIDOD<GDU<ODJI JA HJ?PG@ Q<MD<=G@N. A
>JIN@LP@I>@ JA ?<O< =@DIB OCM@<?-GJ><G =T ?@A<PGO DN OC<O TUBUJD UIJT() HPNO =@ @S@>PO@?
AJM @<>C OCM@<?:
JNQPSU TUE.TUEJP;
JNQPSU TUE.DPODVSSFODZ;
JNQPSU DPSF.UISFBE;
TUBUJD UIJT()
\
XSJUFMO("FYFDVUJOH TUBUJD UIJT()");
^
WPJE XPSLFS()
\^
WPJE NBJO()
\
TQBXO(&XPSLFS);
UISFBE@KPJO"MM();
^
1C@ TUBUJD UIJT() =GJ>F <=JQ@ RJPG? =@ @S@>PO@? JI>@ AJM OC@ H<DI OCM@<? <I? JI>@ AJM
OC@ RJMF@M OCM@<?:
FYFDVUJOH TUBUJD UIJT()
FYFDVUJOH TUBUJD UIJT()
1CDN RJPG? ><PN@ < KMJ=G@H AJM TIBSFE HJ?PG@ Q<MD<=G@N =@><PN@ DIDOD<GDUDIB < Q<MD<=G@ HJM@
OC<I JI>@ >JPG? =@ RMJIB @NK@>D<GGT DI >JI>PMM@I>T. 1C@ NJGPODJI OJ OCDN KMJ=G@H DN < TIBSFE
TUBUJD UIJT() =GJ>F, RCD>C DN @S@>PO@? JIGT JI>@:
TIBSFE TUBUJD UIJT()
\
XSJUFMO("FYFDVUJOH TIBSFE TUBUJD UIJT()");
^
TUBUJD UIJT()
\
XSJUFMO("FYFDVUJOH TUBUJD UIJT()");
^
1C@ JPOKPO:
FYFDVUJOH TIBSFE TUBUJD UIJT() l POMZ PODF
FYFDVUJOH TUBUJD UIJT()
FYFDVUJOH TUBUJD UIJT()
Atomic operations
85.6
AIJOC@M R<T JA @INPMDIB OC<O JIGT JI@ OCM@<? HPO<O@N < >@MO<DI Q<MD<=G@ DN =T PNDIB <OJHD>
JK@M<ODJIN, API>ODJI<GDOT JA RCD>C <M@ KMJQD?@? =T OC@ HD>MJKMJ>@NNJM, OC@ >JHKDG@M, JM OC@
JK@M<ODIB NTNO@H.
1C@ <OJHD> JK@M<ODJIN JA ! <M@ DI OC@ DPSF.BUPNJD HJ?PG@. 4@ RDGG N@@ JIGT ORJ JA DON
API>ODJIN DI OCDN >C<KO@M:
D3F3 (:3D;@9 CA@5GDD7@5K
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
632
BUPNJD0Q 85.6.1
1CDN API>ODJI <KKGD@N DON O@HKG<O@ K<M<H@O@M OJ DON ORJ API>ODJI K<M<H@O@MN. 1C@ O@HKG<O@
K<M<H@O@M HPNO =@ < 4;@3DK AB7D3FAD GDF@ "+", "+=", @O>.
JNQPSU DPSF.BUPNJD;
// ...
BUPNJD0Q!"+="(*WBMVF, 1); // BUPNJD
1C@ GDI@ <=JQ@ DN OC@ @LPDQ<G@IO JA OC@ AJGGJRDIB GDI@, RDOC OC@ ?DAA@M@I>@ OC<O OC@ +=
JK@M<ODJI RJPG? =@ @S@>PO@? RDOCJPO DIO@MMPKODJIN =T JOC@M OCM@<?N (D.@. DO RJPG? =@ @S@>PO@?
3FA?;53>>K):
*WBMVF += 1; // /05 BUPNJD
JIN@LP@IOGT, RC@I DO DN JIGT < =DI<MT JK@M<ODJI OC<O I@@?N OJ =@ NTI>CMJIDU@?, OC@I OC@M@ DN
IJ I@@? AJM < TZODISPOJ[FE =GJ>F, RCD>C DN FIJRI OJ =@ NGJR =@><PN@ JA I@@?DIB OJ <>LPDM@
< GJ>F. 1C@ AJGGJRDIB @LPDQ<G@ION JA OC@ JODSFNFOUFS() <I? EFDSFNFOUFS() API>ODJIN OC<O
PN@ BUPNJD0Q <M@ >JMM@>O <N R@GG. +JO@ OC<O OC@M@ DN IJ I@@? AJM OC@ -PDL >G<NN <ITHJM@
@DOC@M:
JNQPSU DPSF.BUPNJD;
//...
WPJE JODSFNFOUFS(TIBSFE(JOU) * WBMVF)
\
GPSFBDI (J; 0 .. DPVOU) \
BUPNJD0Q!"+="(*WBMVF, 1);
^
^
WPJE EFDSFNFOUFS(TIBSFE(JOU) * WBMVF)
\
GPSFBDI (J; 0 .. DPVOU) \
BUPNJD0Q!"-="(*WBMVF, 1);
^
^
BUPNJD0Q ><I =@ PN@? RDOC JOC@M =DI<MT JK@M<OJMN <N R@GG.
DBT 85.6.2
1C@ I<H@ JA OCDN API>ODJI DN OC@ <==M@QD<ODJI JA ">JHK<M@ <I? NR<K". &ON JK@M<ODJI DN =<N@?
JI ?GF3F;@9 3 H3D;34>7 3E >A@9 3E ;F EF;>> :3E ;FE 5GDD7@F>K =@AI@ H3>G7. 1C@ R<T DO DN PN@? DN
=T NK@>DATDIB OC@ >PMM@IO <I? OC@ ?@NDM@? Q<GP@N JA OC@ Q<MD<=G@ <O OC@ N<H@ ODH@:
CPPM JT@NVUBUFE = DBT(BEESFTT@PG@WBSJBCMF, DVSSFOU7BMVF, OFX7BMVF);
1C@ A<>O OC<O OC@ Q<GP@ JA OC@ Q<MD<=G@ NODGG @LP<GN DVSSFOU7BMVF RC@I DBT() DN JK@M<ODIB DN
<I DI?D><ODJI OC<O IJ JOC@M OCM@<? C<N HPO<O@? OC@ Q<MD<=G@ NDI>@ DO C<N G<NO =@@I M@<? =T OCDN
OCM@<?. &A NJ, DBT() <NNDBIN OFX7BMVF OJ OC@ Q<MD<=G@ <I? M@OPMIN USVF. ,I OC@ JOC@M C<I?, DA
OC@ Q<MD<=G@'N Q<GP@ DN ?DAA@M@IO AMJH DVSSFOU7BMVF OC@I DBT() ?J@N IJO HPO<O@ OC@ Q<MD<=G@
<I? M@OPMIN GBMTF.
1C@ AJGGJRDIB API>ODJIN M@-M@<? OC@ >PMM@IO Q<GP@ <I? ><GG DBT() PIODG OC@ JK@M<ODJI
NP>>@@?N. AB<DI, OC@N@ ><GGN ><I =@ ?@N>MD=@? <N ;8 F:7 H3>G7 A8 F:7 H3D;34>7 7CG3>E F:;E A>6
H3>G7, D7B>357 I;F: F:;E @7I H3>G7:
D3F3 (:3D;@9 CA@5GDD7@5K
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
633
WPJE JODSFNFOUFS(TIBSFE(JOU) * WBMVF)
\
GPSFBDI (J; 0 .. DPVOU) \
JOU DVSSFOU7BMVF;
EP \
DVSSFOU7BMVF = *WBMVF;
^ XIJMF (!DBT(WBMVF, DVSSFOU7BMVF, DVSSFOU7BMVF + 1));
^
^
WPJE EFDSFNFOUFS(TIBSFE(JOU) * WBMVF)
\
GPSFBDI (J; 0 .. DPVOU) \
JOU DVSSFOU7BMVF;
EP \
DVSSFOU7BMVF = *WBMVF;
^ XIJMF (!DBT(WBMVF, DVSSFOU7BMVF, DVSSFOU7BMVF - 1));
^
^
1C@ API>ODJIN <=JQ@ RJMF >JMM@>OGT RDOCJPO OC@ I@@? AJM TZODISPOJ[FE =GJ>FN.
&I HJNO ><N@N, OC@ A@<OPM@N JA OC@ DPSF.BUPNJD HJ?PG@ ><I =@ N@Q@M<G ODH@N A<NO@M OC<I PNDIB
TZODISPOJ[FE =GJ>FN. & M@>JHH@I? OC<O TJP >JIND?@M OCDN HJ?PG@ <N GJIB <N OC@ JK@M<ODJIN
OC<O I@@? NTI>CMJIDU<ODJI <M@ G@NN OC<I < =GJ>F JA >J?@.
AOJHD> JK@M<ODJIN @I<=G@ >A5=-8D77 63F3 EFDG5FGD7E <N R@GG, RCD>C <M@ =@TJI? OC@ N>JK@ JA
OCDN =JJF.
6JP H<T <GNJ R<IO OJ DIQ@NODB<O@ OC@ DPSF.TZOD K<>F<B@, RCD>C >JIO<DIN >G<NND> >JI>PMM@I>T
KMDHDODQ@N DI OC@ AJGGJRDIB HJ?PG@N:
t DPSF.TZOD.CBSSJFS
t DPSF.TZOD.DPOEJUJPO
t DPSF.TZOD.DPOGJH
t DPSF.TZOD.FYDFQUJPO
t DPSF.TZOD.NVUFY
t DPSF.TZOD.SXNVUFY
t DPSF.TZOD.TFNBQIPSF
Summary
85.7
t 4C@I OCM@<?N ?J IJO ?@K@I? JI JOC@M OCM@<?N, KM@A@M B3D3>>7>;E?. JIND?@M 5A@5GDD7@5K
JIGT RC@I OCM@<?N ?@K@I? JI JK@M<ODJIN JA JOC@M OCM@<?N.
t "Q@I OC@I, KM@A@M ?7EE397 B3EE;@9 5A@5GDD7@5K, RCD>C C<N =@@I OC@ OJKD> JA OC@ KM@QDJPN
>C<KO@M.
t ,IGT TIBSFE ?<O< ><I =@ NC<M@?; JNNVUBCMF DN DHKGD>DOGT TIBSFE.
t @@HTIBSFE KMJQD?@N ?<O< NC<MDIB <N DI <I? ++ G<IBP<B@N.
t TZODISPOJ[FE DN AJM KM@Q@IODIB JOC@M OCM@<?N AMJH DIO@MQ@IDIB RC@I < OCM@<? DN
@S@>PODIB < >@MO<DI KD@>@ JA >J?@.
t A >G<NN ><I =@ ?@ADI@? <N TZODISPOJ[FE NJ OC<O JIGT JI@ H@H=@M API>ODJI ><I =@
@S@>PO@? JI < BDQ@I J=E@>O <O < BDQ@I ODH@. &I JOC@M RJM?N, < OCM@<? ><I @S@>PO@ <
H@H=@M API>ODJI JIGT DA IJ JOC@M OCM@<? DN @S@>PODIB < H@H=@M API>ODJI JI OC@ N<H@
J=E@>O.
t TUBUJD UIJT() DN @S@>PO@? JI>@ AJM @<>C OCM@<?; TIBSFE TUBUJD UIJT() DN @S@>PO@?
JI>@ AJM OC@ @IODM@ KMJBM<H.
D3F3 (:3D;@9 CA@5GDD7@5K
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
634
t 1C@ DPSF.BUPNJD HJ?PG@ @I<=G@N N<A@ ?<O< NC<MDIB OC<O ><I =@ HPGODKG@ ODH@N A<NO@M OC<I
TZODISPOJ[FE.
t 1C@ DPSF.TZOD K<>F<B@ DI>GP?@N H<IT JOC@M >JI>PMM@I>T KMDHDODQ@N.
D3F3 (:3D;@9 CA@5GDD7@5K
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
635
Memory Management 86
! DN < G<IBP<B@ OC<O ?J@N IJO M@LPDM@ @SKGD>DO H@HJMT H<I<B@H@IO. %JR@Q@M, DO DN DHKJMO<IO
AJM < NTNO@H KMJBM<HH@M OJ FIJR CJR OJ H<I<B@ H@HJMT RC@I I@@?@? AJM NK@>D<G ><N@N.
*@HJMT H<I<B@H@IO DN < Q@MT =MJ<? OJKD>. 1CDN >C<KO@M RDGG DIOMJ?P>@ JIGT OC@ B<M=<B@
>JGG@>OJM ($), <GGJ><ODIB H@HJMT AMJH DO, <I? >JINOMP>ODIB J=E@>ON <O NK@>DAD> H@HJMT
GJ><ODJIN.
AN DI NJH@ JA OC@ KM@QDJPN >C<KO@MN, RC@I & RMDO@ H3D;34>7 =@GJR, & H@<I <IT OTK@ JA Q<MD<=G@
DI>GP?DIB TUSVDU <I? DMBTT J=E@>ON.
Memory
86.1
*@HJMT DN < HJM@ NDBIDAD><IO M@NJPM>@ OC<I JOC@M NTNO@H M@NJPM>@N =@><PN@ =JOC OC@ MPIIDIB
KMJBM<H <I? DON ?<O< <M@ GJ><O@? JI OC@ H@HJMT. 1C@ H@HJMT =@GJIBN PGODH<O@GT OJ OC@
JK@M<ODIB NTNO@H. 1C@ JK@M<ODIB NTNO@H H<F@N DO <Q<DG<=G@ OJ KMJBM<HN OJ N<ODNAT OC@DM I@@?N.
1C@ <HJPIO JA H@HJMT OC<O < KMJBM<H PN@N H<T DI>M@<N@ JM ?@>M@<N@ <>>JM?DIB OJ OC@
DHH@?D<O@ I@@?N JA < KMJBM<H. 4C@I < KMJBM<H O@MHDI<O@N, OC@ H@HJMT <M@<N OC<O DO C<N
=@@I PNDIB <M@ <POJH<OD><GGT M@OPMI@? =<>F OJ OC@ JK@M<ODIB NTNO@H.
1C@ H@HJMT ><I =@ DH<BDI@? GDF@ < G<MB@ NC@@O JA K<K@M RC@M@ OC@ Q<GP@N JA Q<MD<=G@N <M@
IJO@? ?JRI. "<>C Q<MD<=G@ DN F@KO <O < NK@>DAD> GJ><ODJI RC@M@ DON Q<GP@ DN RMDOO@I OJ <I? M@<?
AMJH <N I@@?@?. ,I>@ OC@ GDA@ODH@ JA < Q<MD<=G@ @I?N, DON KG<>@ DN PN@? AJM <IJOC@M Q<MD<=G@.
1C@ & (<??M@NN-JA) JK@M<OJM DN PN@APG RC@I @SK@MDH@IODIB RDOC H@HJMT. #JM @S<HKG@, OC@
AJGGJRDIB KMJBM<H KMDION OC@ <??M@NN@N JA ORJ Q<MD<=G@N OC<O <M@ ?@ADI@? I@SO OJ @<>C JOC@M:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
JOU J;
JOU K;
XSJUFMO("J: ", &J);
XSJUFMO("K: ", &K);
^
Note: ):7 366D7EE7E IAG>6 >;=7>K 47 6;887D7@F 7H7DK F;?7 F:7 BDA9D3? ;E 7J75GF76.
A66;F;A@3>>K, F:7 ?7D7 35F A8 F3=;@9 F:7 366D7EE A8 3 H3D;34>7 6;E34>7E F:7 ABF;?;L3F;A@ F:3F
IAG>6 AF:7DI;E7 ?3=7 F:7 H3D;34>7 >;H7 A@ 3 C&* D79;EF7D.
AN ><I =@ N@@I AMJH OC@ JPOKPO, OC@ GJ><ODJIN JA OC@ Q<MD<=G@N <M@ AJPM =TO@N <K<MO:
J: 7'''2#633&28
K: 7'''2#633&2$
1C@ G<NO ?DBDON JA OC@ ORJ <??M@NN@N DI?D><O@ OC<O J GDQ@N DI < H@HJMT GJ><ODJI OC<O DN MDBCO
=@AJM@ OC@ GJ><ODJI JA K: 8 KGPN 4 (NDU@ JA JOU) H<F@N 12 ( DI C@S<?@>DH<G IJO<ODJI).
The garbage collector
86.2
1C@ ?TI<HD> Q<MD<=G@N OC<O <M@ PN@? DI ! KMJBM<HN GDQ@ JI H@HJMT =GJ>FN OC<O <M@ JRI@? =T
OC@ B<M=<B@ >JGG@>OJM ($). 4C@I OC@ GDA@ODH@ JA < Q<MD<=G@ @I?N, OC<O Q<MD<=G@ DN NP=E@>O OJ
=@DIB ADI<GDU@? <>>JM?DIB OJ <I <GBJMDOCH OC<O DN @S@>PO@? =T OC@ $. 1C@ H@HJMT GJ><ODJI
OC<O OC@ Q<MD<=G@ GDQ@N JI DN M@>G<DH@? OJ =@ M@PN@? AJM JOC@M Q<MD<=G@N. 1CDN <GBJMDOCH DN
#7?ADK #3@397?7@F
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
636
><GG@? 93D4397 5A>>75F;A@ <I? <I @S@>PODJI JA OC@ <GBJMDOCH DN ><GG@? < 93D4397 5A>>75F;A@
5K5>7.
1C@ <GBJMDOCH OC<O OC@ $ @S@>PO@N ><I MJPBCGT =@ ?@N>MD=@? <N OC@ AJGGJRDIB. AGG JA OC@
H@HJMT =GJ>FN OC<O ><I =@ M@<>C@? ?DM@>OGT JM DI?DM@>OGT =T KJDIO@MN (DI>GP?DIB M@A@M@I>@N)
OC<O <M@ DI OC@ KMJBM<H NO<>F <M@ N><II@?. AIT H@HJMT =GJ>F OC<O ><I =@ M@<>C@? DN O<BB@?
<N =@DIB NODGG DI PN@ <I? <GG OC@ JOC@MN <M@ O<BB@? <N IJO =@DIB PN@? <ITHJM@. 1C@ ADI<GDU@MN JA
J=E@>ON OC<O GDQ@ JI DI<>>@NND=G@ =GJ>FN <M@ @S@>PO@? <I? OCJN@ H@HJMT =GJ>FN <M@ M@>G<DH@?
OJ =@ PN@? AJM APOPM@ Q<MD<=G@N.
0JH@ $ <GBJMDOCHN ><I HJQ@ J=E@>ON <MJPI? OJ F@@K OC@H OJB@OC@M DI JI@ KG<>@ DI H@HJMT.
1J KM@N@MQ@ KMJBM<H >JMM@>OI@NN, <GG JA OC@ KJDIO@MN (<I? M@A@M@I>@N) OC<O KJDIO OJ NP>C
J=E@>ON <M@ <POJH<OD><GGT HJ?DAD@? OJ KJDIO OJ OC@ I@R GJ><ODJIN.
1C@ JM?@M JA @S@>PODIB OC@ ADI<GDU@MN DN PINK@>DAD@?. #JM @S<HKG@, < M@A@M@I>@ H@H=@M JA <I
J=E@>O H<T =@ ADI<GDU@? =@AJM@ OC@ J=E@>O OC<O >JIO<DIN OC<O H@H=@M. #JM OC<O M@<NJI, IJ >G<NN
H@H=@M OC<O M@A@MN OJ < ?TI<HD> Q<MD<=G@ NCJPG? =@ <>>@NN@? DIND?@ OC@ ?@NOMP>OJM. +JO@ OC<O
OCDN DN Q@MT ?DAA@M@IO AMJH OC@ ?@O@MHDIDNOD> ?@NOMP>ODJI JM?@M JA G<IBP<B@N GDF@ ++.
A B<M=<B@ >JGG@>ODJI >T>G@ ><I =@ NO<MO@? AJM Q<MDJPN M@<NJIN GDF@ I@@?DIB OJ ADI? NK<>@ AJM
HJM@ ?<O<. !@K@I?DIB JI OC@ $ DHKG@H@IO<ODJI, =@><PN@ <GGJ><ODIB I@R J=E@>ON ?PMDIB <
B<M=<B@ >JGG@>ODJI >T>G@ ><I DIO@MA@M@ RDOC OC@ >JGG@>ODJI KMJ>@NN DON@GA, <GG JA OC@ MPIIDIB
OCM@<?N H<T C<Q@ OJ =@ C<GO@? ?PMDIB >JGG@>ODJI >T>G@N. 0JH@ODH@N OCDN ><I =@ A@GO <N <
C@NDO<ODJI DI OC@ @S@>PODJI JA OC@ KMJBM<H.
&I HJNO ><N@N OC@ KMJBM<HH@M ?J@N IJO I@@? OJ DIO@MA@M@ RDOC OC@ B<M=<B@ >JGG@>ODJI
KMJ>@NN. %JR@Q@M, DO DN KJNND=G@ OJ ?@G<T JM ?DNK<O>C B<M=<B@ >JGG@>ODJI >T>G@N <N I@@?@? =T
OC@ API>ODJIN ?@ADI@? DI OC@ DPSF.NFNPSZ HJ?PG@.
Starting and delaying garbage collection cycles 86.2.1
&O H<T =@ ?@NDM@? OJ ?@G<T OC@ @S@>PODJI JA B<M=<B@ >JGG@>ODJI >T>G@N ?PMDIB < K<MO JA OC@
KMJBM<H RC@M@ DO DN DHKJMO<IO AJM OC@ KMJBM<H OJ =@ M@NKJINDQ@. ($.EJTBCMF ?DN<=G@N
B<M=<B@ >JGG@>ODJI >T>G@N <I? ($.FOBCMF @I<=G@N OC@H <B<DI:
($.EJTBCMF();
// ... B QBSU PG UIF QSPHSBN XIFSF SFTQPOTJWFOFTT JT JNQPSUBOU ...
($.FOBCMF();
%JR@Q@M, DO DN IJO BP<M<IO@@? OC<O IJ B<M=<B@ >JGG@>ODJI >T>G@ RDGG =@ @S@>PO@?: &A OC@ $
<=NJGPO@GT I@@?N OJ <GGJ><O@ H@HJMT AJM <IT M@<NJI, DO NODGG BJ@N <C@<? <I? MPIN < B<M=<B@
>JGG@>ODJI >T>G@ OJ H<F@ HJM@ H@HJMT <Q<DG<=G@.
&INO@<? JA M@GTDIB JI B<M=<B@ >JGG@>ODJIN C<KK@IDIB <POJH<OD><GGT <O PINK@>DAD@? ODH@N, <
B<M=<B@ >JGG@>ODJI >T>G@ ><I =@ NO<MO@? @SKGD>DOGT =T ($.DPMMFDU():
JNQPSU DPSF.NFNPSZ;
// ...
($.DPMMFDU(); // TUBSUT B HBSCBHF DPMMFDUJPO DZDMF
+JMH<GGT, OC@ $ ?J@N IJO M@OPMI H@HJMT =GJ>FN =<>F OJ OC@ JK@M<ODIB NTNO@H; DO CJG?N JI OJ
OCJN@ H@HJMT K<B@N AJM APOPM@ I@@?N JA OC@ KMJBM<H. &A OCDN =@C<QDJM DN FIJRI OJ =@
PII@>@NN<MT AJM OC@ KMJBM<H, OC@ $ ><I =@ <NF@? OJ BDQ@ PIPN@? H@HJMT =<>F OJ OC@
JK@M<ODIB NTNO@H =T ($.NJOJNJ[F():
#7?ADK #3@397?7@F
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
637
($.NJOJNJ[F();
Allocating memory
86.3
0TNO@H G<IBP<B@N <GGJR KMJBM<HH@MN OJ NK@>DAT OC@ H@HJMT <M@<N RC@M@ J=E@>ON NCJPG? GDQ@.
0P>C H@HJMT <M@<N <M@ >JHHJIGT ><GG@? 4G887DE.
1C@M@ <M@ N@Q@M<G H@OCJ?N JA <GGJ><ODIB H@HJMT. 1C@ NDHKG@NO H@OCJ? RJPG? =@ PNDIB <
ADS@?-G@IBOC <MM<T:
VCZUF<100> CVGGFS; // " NFNPSZ BSFB PG 100 CZUFT
CVGGFS DN M@<?T OJ =@ PN@? <N < 100-=TO@ H@HJMT <M@<. &INO@<? JA VCZUF, DO DN <GNJ KJNND=G@ OJ
?@ADI@ NP>C =PAA@MN <N <MM<TN JA WPJE, RDOCJPO <IT <NNJ>D<ODJI OJ <IT OTK@. 0DI>@ WPJE ><IIJO
=@ <NNDBI@? <IT Q<GP@, DO ><IIJO C<Q@ OC@ .JOJU Q<GP@ @DOC@M. 0P>C <MM<TN HPNO =@ DIDOD<GDU@?
=T OC@ NK@>D<G NTIO<S =WPJE:
WPJE<100> CVGGFS = WPJE; // " NFNPSZ BSFB PG 100 CZUFT
4@ RDGG PN@ JIGT ($.DBMMPD AMJH OC@ DPSF.NFNPSZ HJ?PG@ OJ M@N@MQ@ H@HJMT DI OCDN >C<KO@M.
1C<O HJ?PG@ C<N H<IT JOC@M A@<OPM@N OC<O <M@ PN@APG DI Q<MDJPN NDOP<ODJIN. A??DODJI<GGT, OC@
H@HJMT <GGJ><ODJI API>ODJIN JA OC@ NO<I?<M? GD=M<MT <M@ <Q<GD<=G@ DI OC@ TUE.D.TUEMJC
HJ?PG@.
($.DBMMPD <GGJ><O@N < H@HJMT <M@< JA OC@ NK@>DAD@? NDU@ <I? M@OPMIN OC@ =@BDIIDIB <??M@NN
JA OC@ <GGJ><O@? <M@<:
JNQPSU DPSF.NFNPSZ;
// ...
WPJE * CVGGFS = ($.DBMMPD(100); // " NFNPSZ BSFB PG 100 CZUFT
+JMH<GGT, OC@ M@OPMI@? WPJE* Q<GP@ DN ><NO@? OJ < KJDIO@M JA OC@ KMJK@M OTK@:
JOU * JOU#VGGFS = DBTU(JOU*)CVGGFS;
%JR@Q@M, OC<O DIO@MH@?D<O@ NO@K DN PNP<GGT NFDKK@? <I? OC@ M@OPMI Q<GP@ DN ><NO@? ?DM@>OGT:
JOU * JOU#VGGFS = DBTU(JOU*)($.DBMMPD(100);
&INO@<? JA <M=DOM<MT Q<GP@N GDF@ 100, OC@ NDU@ JA OC@ H@HJMT <M@< DN PNP<GGT ><G>PG<O@? =T
HPGODKGTDIB OC@ IPH=@M JA @G@H@ION I@@?@? RDOC OC@ NDU@ JA @<>C @G@H@IO:
// "MMPDBUF SPPN GPS 25 JOUT
JOU * JOU#VGGFS = DBTU(JOU*)($.DBMMPD(JOU.TJ[FPG * 25);
1C@M@ DN <I DHKJMO<IO ?DAA@M@I>@ AJM >G<NN@N: 1C@ NDU@ JA < >G<NN Q<MD<=G@ <I? OC@ NDU@ JA <
>G<NN J=E@>O <M@ IJO OC@ N<H@. .TJ[FPG DN OC@ NDU@ JA < >G<NN Q<MD<=G@ <I? DN <GR<TN OC@ N<H@
Q<GP@: 8 JI 64-=DO NTNO@HN <I? 4 JI 32-=DO NTNO@HN. 1C@ NDU@ JA < >G<NN J=E@>O HPNO =@
J=O<DI@? =T @@USBJUT(DMBTT*OTUBODF4J[F):
// "MMPDBUF SPPN GPS 10 .Z$MBTT PCKFDUT
.Z$MBTT * CVGGFS =
DBTU(.Z$MBTT*)($.DBMMPD(@@USBJUT(DMBTT*OTUBODF4J[F, .Z$MBTT) * 10);
#7?ADK #3@397?7@F
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
638
4C@I OC@M@ DN IJO @IJPBC H@HJMT DI OC@ NTNO@H AJM OC@ M@LP@NO@? NDU@, OC@I <
DPSF.FYDFQUJPO.0VU0G.FNPSZ&SSPS @S>@KODJI DN OCMJRI:
WPJE * CVGGFS = ($.DBMMPD(10@000@000@000);
1C@ JPOKPO JI < NTNO@H OC<O ?J@N IJO C<Q@ OC<O HP>C AM@@ NK<>@:
DPSF.FYDFQUJPO.0VU0G.FNPSZ&SSPS
1C@ H@HJMT <M@<N OC<O <M@ <GGJ><O@? AMJH OC@ $ ><I =@ M@OPMI@? =<>F =T ($.GSFF:
($.GSFF(CVGGFS);
%JR@Q@M, ><GGDIB GSFF() ?J@N IJO @S@>PO@ OC@ ?@NOMP>OJMN JA OC@ J=E@>ON OC<O GDQ@ JI OC<O
H@HJMT =GJ>F. 4C@I I@@?@?, OC@ ?@NOMP>OJMN HPNO =@ @S@>PO@? @SKGD>DOGT =T ><GGDIB
EFTUSPZ() AJM @<>C J=E@>O.
0JH@ODH@N OC@ KMJBM<H H<T ?@O@MHDI@ OC<O < KM@QDJPNGT <GGJ><O@? H@HJMT <M@< DN <GG PN@?
PK <I? ?J@N IJO C<Q@ MJJH AJM HJM@ ?<O<. &O DN KJNND=G@ OJ 7JF7@6 < KM@QDJPNGT <GGJ><O@?
H@HJMT <M@< =T ($.SFBMMPD. SFBMMPD() O<F@N OC@ KM@QDJPNGT <GGJ><O@? H@HJMT KJDIO@M <I?
OC@ I@RGT M@LP@NO@? NDU@, <I? M@OPMIN < I@R <M@<:
WPJE * PME#VGGFS = ($.DBMMPD(100);
// ...
WPJE * OFX#VGGFS = ($.SFBMMPD(PME#VGGFS, 200);
SFBMMPD() OMD@N OJ =@ @AAD>D@IO =T IJO <>OP<GGT <GGJ><ODIB I@R H@HJMT PIG@NN DO DN M@<GGT
I@>@NN<MT:
t &A OC@ H@HJMT <M@< AJGGJRDIB OC@ JG? <M@< DN IJO DI PN@ AJM <IT JOC@M KPMKJN@ <I? DN G<MB@
@IJPBC OJ N<ODNAT OC@ I@R M@LP@NO, SFBMMPD() <??N OC<O K<MO JA OC@ H@HJMT OJ OC@ JG?
<M@<, @SO@I?DIB OC@ =PAA@M ;@-B>357.
t &A OC@ H@HJMT <M@< AJGGJRDIB OC@ JG? <M@< DN <GM@<?T DI PN@ JM DN IJO G<MB@ @IJPBC, OC@I
SFBMMPD() <GGJ><O@N < I@R G<MB@M H@HJMT <M@< <I? >JKD@N OC@ >JIO@ION JA OC@ JG? <M@< OJ
OC@ I@R JI@.
t &O DN KJNND=G@ OJ K<NN OVMM <N PME#VGGFS, DI RCD>C ><N@ SFBMMPD() NDHKGT <GGJ><O@N I@R
H@HJMT.
t &O DN KJNND=G@ OJ K<NN < NDU@ G@NN OC<I OC@ KM@QDJPN JI@, DI RCD>C ><N@ OC@ M@H<DIDIB K<MO JA
OC@ JG? H@HJMT DN M@OPMI@? =<>F OJ OC@ $.
t &O DN KJNND=G@ OJ K<NN 0 <N OC@ I@R NDU@, DI RCD>C ><N@ SFBMMPD() NDHKGT AM@@N OC@ H@HJMT.
($.SFBMMPD DN <?<KO@? AMJH OC@ NO<I?<M? GD=M<MT API>ODJI SFBMMPD(). #JM C<QDIB NP>C <
>JHKGD><O@? =@C<QDJM, SFBMMPD() DN >JIND?@M@? OJ C<Q@ < =<?GT ?@NDBI@? API>ODJI DIO@MA<>@. A
KJO@IOD<GGT NPMKMDNDIB <NK@>O JA ($.SFBMMPD DN OC<O @Q@I DA OC@ JMDBDI<G H@HJMT C<N =@@I
<GGJ><O@? RDOC ($.DBMMPD, OC@ @SO@I?@? K<MO DN I@Q@M >G@<M@?. #JM OC<O M@<NJI, RC@I DO DN
DHKJMO<IO OC<O OC@ H@HJMT DN U@MJ-DIDOD<GDU@?, < API>ODJI GDF@ SFBMMPD$MFBSFE() =@GJR RJPG?
=@ PN@APG. 4@ RDGG N@@ OC@ H@<IDIB JA CMPDL"UUSJCVUFT G<O@M =@GJR:
JNQPSU DPSF.NFNPSZ;
/* 8PSLT MJLF ($.SFBMMPD CVU DMFBST UIF FYUSB CZUFT JG NFNPSZ
* JT FYUFOEFE. */
WPJE * SFBMMPD$MFBSFE(WPJE * CVGGFS,
TJ[F@U PME-FOHUI,
TJ[F@U OFX-FOHUI,
($.#ML"UUS CMPDL"UUSJCVUFT = ($.#ML"UUS./0/&,
DPOTU 5ZQF*OGP UZQF*OGP = OVMM)
#7?ADK #3@397?7@F
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
639
\
/* %JTQBUDI UIF BDUVBM XPSL UP ($.SFBMMPD. */
CVGGFS = ($.SFBMMPD(CVGGFS, OFX-FOHUI,
CMPDL"UUSJCVUFT, UZQF*OGP);
/* $MFBS UIF FYUSB CZUFT JG FYUFOEFE. */
JG (OFX-FOHUI > PME-FOHUI) \
JNQPSU TUE.D.TUSJOH;
BVUP FYUFOEFE1BSU = CVGGFS + PME-FOHUI;
BVUP FYUFOEFE-FOHUI = OFX-FOHUI - PME-FOHUI;
NFNTFU(FYUFOEFE1BSU, 0, FYUFOEFE-FOHUI);
^
SFUVSO CVGGFS;
^
1C@ API>ODJI <=JQ@ PN@N NFNTFU() AMJH OC@ TUE.D.TUSJOH HJ?PG@ OJ >G@<M OC@ I@RGT
@SO@I?@? =TO@N. NFNTFU() <NNDBIN OC@ NK@>DAD@? Q<GP@ OJ OC@ =TO@N JA < H@HJMT <M@< NK@>DAD@?
=T < KJDIO@M <I? < G@IBOC. &I OC@ @S<HKG@, DO <NNDBIN 0 OJ FYUFOEFE-FOHUI IPH=@M JA =TO@N <O
FYUFOEFE1BSU.
4@ RDGG PN@ SFBMMPD$MFBSFE() DI <I @S<HKG@ =@GJR.
(A>EA @AF7 :AI A@7 A8 F:7 import 6;D75F;H7E 34AH7 ;E ;@E;67 3 >A53> E5AB7. ):3F ;E 3 @7I
873FGD7 F:3F :3E 477@ 36676 FA D 38F7D F:;E 4AA= I3E EF3DF76.)
1C@ =@C<QDJM JA OC@ NDHDG<M API>ODJI ($.FYUFOE DN IJO >JHKGD><O@? GDF@ SFBMMPD(); DO <KKGD@N
JIGT OC@ ADMNO DO@H <=JQ@: &A OC@ H@HJMT <M@< ><IIJO =@ @SO@I?@? DI-KG<>@, FYUFOE() ?J@N IJO
?J <ITOCDIB <I? M@OPMIN 0.
Memory block attributes 86.3.1
1C@ >JI>@KON <I? OC@ NO@KN JA < $ <GBJMDOCH ><I =@ >JIADBPM@? OJ NJH@ ?@BM@@ AJM @<>C
H@HJMT =GJ>F =T FOVN #ML"UUS. #ML"UUS DN <I JKODJI<G K<M<H@O@M JA ($.DBMMPD <I? JOC@M
<GGJ><ODJI API>ODJIN. &O >JINDNON JA OC@ AJGGJRDIB Q<GP@N:
t /0/&: 1C@ Q<GP@ U@MJ; NK@>DAD@N @A 3FFD;4GF7.
t '*/"-*;&: 0K@>DAD@N OC<O OC@ J=E@>ON OC<O GDQ@ DI OC@ H@HJMT =GJ>F NCJPG? =@ ADI<GDU@?.
+JMH<GGT, OC@ $ <NNPH@N OC<O OC@ GDA@ODH@N JA J=E@>ON OC<O GDQ@ JI @SKGD>DOGT-<GGJ><O@?
H@HJMT GJ><ODJIN <M@ PI?@M OC@ >JIOMJG JA OC@ KMJBM<HH@M; DO ?J@N IJO ADI<GDU@
J=E@>ON JI NP>C H@HJMT <M@<N. ($.#ML"UUS.'*/"-*;& DN AJM M@LP@NODIB OC@ $ OJ
@S@>PO@ OC@ ?@NOMP>OJMN JA J=E@>ON:
$MBTT * CVGGFS =
DBTU($MBTT*)($.DBMMPD(
@@USBJUT(DMBTT*OTUBODF4J[F, $MBTT) * 10,
($.#ML"UUS.'*/"-*;&);
t /0@4$"/: 0K@>DAD@N OC<O OC@ H@HJMT <M@< NCJPG? IJO =@ N><II@? =T OC@ $.
1C@ =TO@ Q<GP@N DI < H@HJMT <M@< H<T <>>D?@IO<GGT GJJF GDF@ KJDIO@MN OJ PIM@G<O@?
J=E@>ON DI JOC@M K<MON JA OC@ H@HJMT. 4C@I OC<O C<KK@IN, OC@ $ RJPG? <NNPH@ OC<O
OCJN@ J=E@>ON <M@ NODGG DI PN@ @Q@I <AO@M OC@DM <>OP<G GDA@ODH@N C<Q@ @I?@?.
A H@HJMT =GJ>F OC<O DN FIJRI OJ IJO >JIO<DI <IT J=E@>O KJDIO@MN NCJPG? =@ H<MF@? <N
($.#ML"UUS./0@4$"/:
JOU * JOU#VGGFS = DBTU(JOU*)($.DBMMPD(100, ($.#ML"UUS./0@4$"/);
#7?ADK #3@397?7@F
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
640
1C@ JOU Q<MD<=G@N KG<>@? DI OC<O H@HJMT =GJ>F ><I C<Q@ <IT Q<GP@ RDOCJPO >JI>@MI JA
=@DIB HDNO<F@I AJM J=E@>O KJDIO@MN.
t /0@.07&: 0K@>DAD@N OC<O J=E@>ON DI OC@ H@HJMT =GJ>F NCJPG? IJO =@ HJQ@? OJ JOC@M KG<>@N.
t "11&/%"#-&: 0K@>DAD@N OC<O OC@ H@HJMT =GJ>F RDGG =@ PN@? AJM NGD>@ @G@H@ION <I? OC<O A<NO
<KK@I?DIB NCJPG? =@ NPKKJMO@?.
&O <GGJRN PNDIB OC@ H@HJMT =GJ>F <N NGD>@ ><K<>DOT:
JOU * CVGGFS = DBTU(JOU*)($.DBMMPD(100, ($.#ML"UUS."11&/%"#-&);
JOU<> TMJDF = CVGGFS<0..0>; // j )BT OP FMFNFOUT
BTTFSU(TMJDF.DBQBDJUZ > 0); // j )BT DBQBDJUZ
t /0@*/5&3*03: 0K@>DAD@N OC<O Q<MD<=G@N DI OC@ H@HJMT =GJ>F ?J IJO >JIO<DI KJDIO@MN OJ
J=E@>ON DI OC@ N<H@ H@HJMT =GJ>F.
1CDN <QJD?N < H@HJMT =GJ>F CJG?DIB DON@GA <GDQ@ =T >JDI>D?@I>@.
1C@ Q<GP@N JA FOVN #ML"UUS <M@ NPDO<=G@ OJ =@ PN@? <N =DO AG<BN OC<O R@ C<Q@ N@@I DI OC@ BDO
,K@M<ODJIN >C<KO@M. 1C@ AJGGJRDIB DN CJR ORJ <OOMD=PO@N ><I =@ H@MB@? =T OC@ ] JK@M<OJM:
DPOTU BUUSJCVUFT = ($.#ML"UUS./0@4$"/ ] ($.#ML"UUS."11&/%"#-&;
+<OPM<GGT, OC@ $ RJPG? =@ <R<M@ JIGT JA H@HJMT =GJ>FN OC<O <M@ M@N@MQ@? =T DON JRI
API>ODJIN <I? N><IN JIGT OCJN@ H@HJMT =GJ>FN. #JM @S<HKG@, DO RJPG? IJO FIJR <=JPO <
H@HJMT =GJ>F <GGJ><O@? =T TUE.D.TUEMJC.DBMMPD.
($.BEE3BOHF DN AJM DIOMJ?P>DIB PIM@G<O@? H@HJMT =GJ>FN OJ OC@ $. 1C@ >JHKG@H@IO
API>ODJI ($.SFNPWF3BOHF NCJPG? =@ ><GG@? =@AJM@ AM@@DIB < H@HJMT =GJ>F =T JOC@M H@<IN
@.B. =T TUE.D.TUEMJC.GSFF.
&I NJH@ ><N@N, OC@M@ H<T =@ IJ M@A@M@I>@ DI OC@ KMJBM<H OJ < H@HJMT =GJ>F @Q@I DA OC<O
H@HJMT =GJ>F C<N =@@I M@N@MQ@? =T OC@ $. #JM @S<HKG@ DA OC@ JIGT M@A@M@I>@ OJ < H@HJMT
=GJ>F GDQ@N DIND?@ < GD=M<MT, OC@ $ RJPG? IJMH<GGT IJO FIJR <=JPO OC<O M@A@M@I>@ <I?
<NNPH@ OC<O OC@ H@HJMT =GJ>F DN IJO DI PN@ <ITHJM@.
($.BEE3PPU DIOMJ?P>@N < H@HJMT =GJ>F OJ OC@ $ <N < DAAF, OJ =@ N><II@? ?PMDIB >JGG@>ODJI
>T>G@N. AGG JA OC@ Q<MD<=G@N OC<O ><I =@ M@<>C@? ?DM@>OGT JM DI?DM@>OGT OCMJPBC OC<O H@HJMT
=GJ>F RJPG? =@ H<MF@? <N <GDQ@. 1C@ >JHKG@H@IO API>ODJI ($.SFNPWF3PPU NCJPG? =@ ><GG@?
RC@I < H@HJMT =GJ>F DN IJO DI PN@ <ITHJM@.
Example of extending a memory area 86.3.2
)@O'N ?@NDBI < NDHKG@ TUSVDU O@HKG<O@ OC<O RJMFN GDF@ <I <MM<T. 1J F@@K OC@ @S<HKG@ NCJMO,
G@O'N KMJQD?@ JIGT OC@ API>ODJI<GDOT JA <??DIB <I? <>>@NNDIB @G@H@ION. 0DHDG<M OJ <MM<TN, G@O'N
DI>M@<N@ OC@ ><K<>DOT <N I@@?@?. 1C@ AJGGJRDIB KMJBM<H PN@N SFBMMPD$MFBSFE(), RCD>C C<N
=@@I ?@ADI@? <=JQ@:
TUSVDU "SSBZ(5)
\
5 * CVGGFS; // .FNPSZ BSFB UIBU IPMET UIF FMFNFOUT
TJ[F@U DBQBDJUZ; // 5IF FMFNFOU DBQBDJUZ PG UIF CVGGFS
TJ[F@U MFOHUI; // 5IF OVNCFS PG BDUVBM FMFNFOUT
/* 3FUVSOT UIF TQFDJGJFE FMFNFOU */
5 FMFNFOU(TJ[F@U JOEFY)
\
JNQPSU TUE.TUSJOH;
FOGPSDF(JOEFY < MFOHUI, GPSNBU("*OWBMJE JOEFY %T", JOEFY));
SFUVSO *(CVGGFS + JOEFY);
^
#7?ADK #3@397?7@F
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
641
/* "QQFOET UIF FMFNFOU UP UIF FOE */
WPJE BQQFOE(5 FMFNFOU)
\
XSJUFGMO(""QQFOEJOH FMFNFOU %T", MFOHUI);
JG (MFOHUI == DBQBDJUZ) \
/* 5IFSF JT OP SPPN GPS UIF OFX FMFNFOU; NVTU
* JODSFBTF DBQBDJUZ. */
TJ[F@U OFX$BQBDJUZ = DBQBDJUZ + (DBQBDJUZ / 2) + 1;
JODSFBTF$BQBDJUZ(OFX$BQBDJUZ);
^
/* 1MBDF UIF FMFNFOU BU UIF FOE */
*(CVGGFS + MFOHUI) = FMFNFOU;
++MFOHUI;
^
WPJE JODSFBTF$BQBDJUZ(TJ[F@U OFX$BQBDJUZ)
\
XSJUFGMO("*ODSFBTJOH DBQBDJUZ GSPN %T UP %T",
DBQBDJUZ, OFX$BQBDJUZ);
TJ[F@U PME#VGGFS4J[F = DBQBDJUZ * 5.TJ[FPG;
TJ[F@U OFX#VGGFS4J[F = OFX$BQBDJUZ * 5.TJ[FPG;
/* "MTP TQFDJGZ UIBU UIJT NFNPSZ CMPDL TIPVME OPU CF
* TDBOOFE GPS QPJOUFST. */
CVGGFS = DBTU(5*)SFBMMPD$MFBSFE(
CVGGFS, PME#VGGFS4J[F, OFX#VGGFS4J[F,
($.#ML"UUS./0@4$"/);
DBQBDJUZ = OFX$BQBDJUZ;
^
^
1C@ ><K<>DOT JA OC@ <MM<T BMJRN =T <=JPO 50%. #JM @S<HKG@, <AO@M OC@ ><K<>DOT AJM 100
@G@H@ION DN >JINPH@?, OC@ I@R ><K<>DOT RJPG? =@>JH@ 151. ():7 7JFD3 1 ;E FA 3HA;6 FD73F;@9
F:7 ;@;F;3> 53B35;FK A8 L7DA EB75;3>>K. %F:7DI;E7, 4753GE7 50% A8 L7DA ;E L7DA, F:7 53B35;FK
5AG>6 @7H7D 9DAI.)
1C@ AJGGJRDIB KMJBM<H PN@N OC<O O@HKG<O@ RDOC OC@ EPVCMF OTK@:
JNQPSU TUE.TUEJP;
JNQPSU DPSF.NFNPSZ;
JNQPSU TUE.FYDFQUJPO;
// ...
WPJE NBJO()
\
BVUP BSSBZ = "SSBZ!EPVCMF();
DPOTU DPVOU = 10;
GPSFBDI (J; 0 .. DPVOU) \
EPVCMF FMFNFOU7BMVF = J * 1.1;
BSSBZ.BQQFOE(FMFNFOU7BMVF);
^
XSJUFMO("5IF FMFNFOUT:");
GPSFBDI (J; 0 .. DPVOU) \
XSJUF(BSSBZ.FMFNFOU(J), ' ');
^
XSJUFMO();
^
#7?ADK #3@397?7@F
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
642
1C@ JPOKPO:
"EEJOH FMFNFOU XJUI JOEFY 0
*ODSFBTJOH DBQBDJUZ GSPN 0 UP 1
"EEJOH FMFNFOU XJUI JOEFY 1
*ODSFBTJOH DBQBDJUZ GSPN 1 UP 2
"EEJOH FMFNFOU XJUI JOEFY 2
*ODSFBTJOH DBQBDJUZ GSPN 2 UP 4
"EEJOH FMFNFOU XJUI JOEFY 3
"EEJOH FMFNFOU XJUI JOEFY 4
*ODSFBTJOH DBQBDJUZ GSPN 4 UP 7
"EEJOH FMFNFOU XJUI JOEFY 5
"EEJOH FMFNFOU XJUI JOEFY 6
"EEJOH FMFNFOU XJUI JOEFY 7
*ODSFBTJOH DBQBDJUZ GSPN 7 UP 11
"EEJOH FMFNFOU XJUI JOEFY 8
"EEJOH FMFNFOU XJUI JOEFY 9
5IF FMFNFOUT:
0 1.1 2.2 3.3 4.4 5.5 6.6 7.7 8.8 9.9
3FUVSOJOH UIF NFNPSZ
Constructing variables at specific memory locations
86.4
1C@ OFX @SKM@NNDJI <>CD@Q@N ORJ O<NFN:
1. AGGJ><O@N H@HJMT G<MB@ @IJPBC AJM OC@ J=E@>O. 1C@ I@RGT <GGJ><O@? H@HJMT <M@< DN
>JIND?@M@? OJ =@ D3I, IJO <NNJ>D<O@? RDOC <IT OTK@ JM <IT J=E@>O.
2. <GGN OC@ >JINOMP>OJM JA OC@ J=E@>O JI OC<O H@HJMT GJ><ODJI. ,IGT <AO@M OCDN NO@K OC@ J=E@>O
=@>JH@N B>3576 JI OC<O H@HJMT <M@<.
4@ C<Q@ <GM@<?T N@@I OC<O OC@ ADMNO JA OC@N@ O<NFN ><I @SKGD>DOGT =@ <>CD@Q@? =T H@HJMT
<GGJ><ODJI API>ODJIN GDF@ ($.DBMMPD. B@DIB < NTNO@H G<IBP<B@, ! <GGJRN OC@ KMJBM<HH@M
H<I<B@ OC@ N@>JI? NO@K <N R@GG.
3<MD<=G@N ><I =@ >JINOMP>O@? <O NK@>DAD> GJ><ODJIN RDOC TUE.DPOW.FNQMBDF.
B@AJM@ N@@DIB @S<HKG@N JA FNQMBDF(), R@ HPNO ADMNO PI?@MNO<I? OC@ >JI>@KO JA 3>;9@?7@F.
The .BMJHOPG property 86.4.1
1C@M@ DN < M@LPDM@H@IO JI H@HJMT GJ><ODJIN RC@M@ NK@>DAD> OTK@N JA Q<MD<=G@N ><I =@ KG<>@?
<O: "Q@MT OTK@ JA J=E@>O ><I JIGT =@ KG<>@? JI H@HJMT GJ><ODJIN OC<O <M@ HPGODKG@N JA <
>@MO<DI <HJPIO NK@>DAD> OJ OC<O OTK@. 1C<O <HJPIO DN ><GG@? OC@ 3>;9@?7@F JA OC<O OTK@. #JM
@S<HKG@, OC@ <GDBIH@IO JA JOU DN 4 =@><PN@ JOU Q<MD<=G@N ><I JIGT =@ <O H@HJMT <??M@NN@N
OC<O <M@ < HPGODKG@ JA AJPM (4, 8, 12, @O>.).
1C@ .BMJHOPG KMJK@MOT JA < OTK@ DN DON <GDBIH@IO Q<GP@. #JM >G<NN@N, .BMJHOPG DN OC@
<GDBIH@IO JA OC@ >G<NN Q<MD<=G@, IJO OC@ >G<NN J=E@>O. 1C@ <GDBIH@IO JA < >G<NN J=E@>O HPNO =@
J=O<DI@? RDOC TUE.USBJUT.DMBTT*OTUBODF"MJHONFOU.
1C@ AJGGJRDIB KMJBM<H KMDION OC@ <GDBIH@ION JA Q<MDJPN OTK@N:
JNQPSU TUE.TUEJP;
JNQPSU TUE.UZQFUVQMF;
JNQPSU TUE.USBJUT;
#7?ADK #3@397?7@F
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
643
TUSVDU &NQUZ4USVDU
\^
TUSVDU 4USVDU
\
DIBS D;
EPVCMF E;
^
DMBTT &NQUZ$MBTT
\^
DMBTT $MBTT
\
DIBS D;
^
WPJE NBJO()
\
BMJBT 5ZQFT = 5ZQF5VQMF!(DIBS, TIPSU, JOU, MPOH,
EPVCMF, SFBM,
TUSJOH, JOU<JOU>, JOU*,
&NQUZ4USVDU, 4USVDU,
&NQUZ$MBTT, $MBTT);
XSJUFMO(" 4J[F "MJHONFOU 5ZQF=O",
"=========================");
GPSFBDI (5ZQF; 5ZQFT) \
TUBUJD JG (JT (5ZQF == DMBTT)) \
TJ[F@U TJ[F = @@USBJUT(DMBTT*OTUBODF4J[F, 5ZQF);
TJ[F@U BMJHONFOU = DMBTT*OTUBODF"MJHONFOU!5ZQF;
^ FMTF \
TJ[F@U TJ[F = 5ZQF.TJ[FPG;
TJ[F@U BMJHONFOU = 5ZQF.BMJHOPG;
^
XSJUFGMO("%4T%8T %T",
TJ[F, BMJHONFOU, 5ZQF.TUSJOHPG);
^
^
1C@ JPOKPO JA OC@ KMJBM<H H<T =@ ?DAA@M@IO DI ?DAA@M@IO @IQDMJIH@ION. %@M@ DN < N<HKG@
JPOKPO:
4J[F "MJHONFOU 5ZQF
=========================
1 1 DIBS
2 2 TIPSU
4 4 JOU
8 8 MPOH
8 8 EPVCMF
16 16 SFBM
16 8 TUSJOH
8 8 JOU<JOU>
8 8 JOU*
1 1 &NQUZ4USVDU
16 8 4USVDU
16 8 &NQUZ$MBTT
17 8 $MBTT
#7?ADK #3@397?7@F
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
644
4C@I KG<>DIB Q<MD<=G@N JI NK@>DAD> H@HJMT GJ><ODJIN, OC@ <GDBIH@IO M@LPDM@H@IO JA OC@DM
OTK@N HPNO =@ J=N@MQ@?.
)@O'N >JIND?@M ORJ 5A@E75GF;H7 J=E@>ON JA OC@ $MBTT OTK@ <=JQ@, RCD>C <M@ 17 =TO@N @<>C.
AGOCJPBC 0 DN I@Q@M < G@B<G Q<MD<=G@ <??M@NN, OJ NDHKGDAT OC@ @S<HKG@ G@O'N <NNPH@ OC<O OC@
ADMNO J=E@>O DN <O <??M@NN 0. 1C@ 17 =TO@N JA OCDN J=E@>O RJPG? =@ <O <?M@NN@N AMJH 0 OJ 16:
0 1 16
+----+----+- ... -+----+- ...
] <-- GJSTU PCKFDU --> ]
+----+----+- ... -+----+- ...
AGOCJPBC OC@ I@SO <Q<DG<=G@ <??M@NN DN 17, OC<O GJ><ODJI ><IIJO =@ PN@? AJM < $MBTT J=E@>O
=@><PN@ 17 DN IJO < HPGODKG@ JA OC@ <GDBIH@IO Q<GP@ 8 JA OC<O OTK@. 1C@ I@<M@NO KJNND=G@
<??M@NN AJM OC@ N@>JI? J=E@>O DN 24 =@><PN@ 24 DN OC@ I@SO NH<GG@NO HPGODKG@ JA 8. 1C@ PIPN@?
=TO@N =@OR@@I OC@ ORJ J=E@>ON <M@ ><GG@? B366;@9 4KF7E:
0 1 16 17 23 24 25 30
+----+----+- ... -+----+----+- ... -+----+----+----+- ... -+----+- ...
] <-- GJSTU PCKFDU --> ] <-- QBEEJOH --> ] <- TFDPOE PCKFDU --> ]
+----+----+- ... -+----+----+- ... -+----+----+----+- ... -+----+- ...
1C@ AJGGJRDIB AJMHPG< ><I ?@O@MHDI@ OC@ I@<M@NO <??M@NN Q<GP@ OC<O <I J=E@>O ><I =@ KG<>@?
<O:
(DBOEJEBUF"EESFTT + BMJHONFOU7BMVF - 1)
/ BMJHONFOU7BMVF
* BMJHONFOU7BMVF
#JM OC<O AJMHPG< OJ RJMF, OC@ AM<>ODJI<G K<MO JA OC@ M@NPGO JA OC@ ?DQDNDJI HPNO =@ OMPI><O@?.
0DI>@ OC<O DN OC@ <POJH<OD> =@C<QDJM AJM DIO@BM<G OTK@N, <GG JA OC@ Q<MD<=G@N <=JQ@ <M@ <NNPH@?
OJ =@ DIO@BM<G OTK@N.
4@ RDGG PN@ OC@ AJGGJRDIB API>ODJI DI OC@ @S<HKG@N G<O@M =@GJR:
5 * OFYU"MJHOFE"EESFTT(5)(5 * DBOEJEBUF"EES)
\
JNQPSU TUE.USBJUT;
TUBUJD JG (JT (5 == DMBTT)) \
DPOTU BMJHONFOU = DMBTT*OTUBODF"MJHONFOU!5;
^ FMTF \
DPOTU BMJHONFOU = 5.BMJHOPG;
^
DPOTU SFTVMU = (DBTU(TJ[F@U)DBOEJEBUF"EES + BMJHONFOU - 1)
/ BMJHONFOU * BMJHONFOU;
SFUVSO DBTU(5*)SFTVMU;
^
1C<O API>ODJI O@HKG<O@ ?@?P>@N OC@ OTK@ JA OC@ J=E@>O AMJH DON O@HKG<O@ K<M<H@O@M, RCD>C DN
IJO KJNND=G@ RC@I OC@ KJDIO@M DN < WPJE*. %JR@Q@M, OC@ OTK@ ><I =@ KMJQD?@? <N <I @SKGD>DO
O@HKG<O@ <MBPH@IO OJ OC@ WPJE* JQ@MGJ<? <I? OC@ ><GG ><I =@ AJMR<M?@? OJ OC@ KM@QDJPN
API>ODJI O@HKG<O@:
WPJE * OFYU"MJHOFE"EESFTT(5)(WPJE * DBOEJEBUF"EES)
\
SFUVSO OFYU"MJHOFE"EESFTT(DBTU(5*)DBOEJEBUF"EES);
^
#7?ADK #3@397?7@F
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
645
1C@ API>ODJI O@HKG<O@ <=JQ@ RDGG =@ PN@APG G<O@M =@GJR RC@I >JINOMP>ODIB 5>3EE J=E@>ON =T
FNQMBDF().
)@O'N ?@ADI@ JI@ HJM@ API>ODJI O@HKG<O@ OJ ><G>PG<O@ OC@ OJO<G NDU@ JA <I J=E@>O, DI>GP?DIB OC@
K<??DIB =TO@N OC<O HPNO =@ KG<>@? =@OR@@I ORJ J=E@>ON JA OC<O OTK@:
TJ[F@U TJ[F8JUI1BEEJOH(5)()
\
TUBUJD JG (JT (5 == DMBTT)) \
DPOTU DBOEJEBUF"EES = @@USBJUT(DMBTT*OTUBODF4J[F, 5);
^ FMTF \
DPOTU DBOEJEBUF"EES = 5.TJ[FPG;
^
SFUVSO DBTU(TJ[F@U)OFYU"MJHOFE"EESFTT(DBTU(5*)DBOEJEBUF"EES);
^
Constructing a struct object at a specific location 86.4.2
FNQMBDF() O<F@N OC@ <??M@NN JA < H@HJMT GJ><ODJI <N DON ADMNO K<M<H@O@M <I? >JINOMP>ON <I
J=E@>O <O OC<O GJ><ODJI. &A KMJQD?@?, DO PN@N OC@ M@H<DIDIB K<M<H@O@MN <N OC@ J=E@>O'N
>JINOMP>OJM <MBPH@ION:
JNQPSU TUE.DPOW;
// ...
FNQMBDF(address, /* ... DPOTUSVDUPS BSHVNFOUT ... */);
&O DN IJO I@>@NN<MT OJ NK@>DAT OC@ OTK@ JA OC@ J=E@>O @SKGD>DOGT RC@I >JINOMP>ODIB < TUSVDU
J=E@>O =@><PN@ FNQMBDF() ?@?P>@N OC@ OTK@ JA OC@ J=E@>O AMJH OC@ OTK@ JA OC@ KJDIO@M. #JM
@S<HKG@, NDI>@ OC@ OTK@ JA OC@ AJGGJRDIB KJDIO@M DN 4UVEFOU*, FNQMBDF() >JINOMP>ON <
4UVEFOU J=E@>O <O OC<O <??M@NN:
4UVEFOU * PCKFDU"EES = OFYU"MJHOFE"EESFTT(DBOEJEBUF"EES);
// ...
FNQMBDF(PCKFDU"EES, OBNF, JE);
1C@ AJGGJRDIB KMJBM<H <GGJ><O@N < H@HJMT <M@< G<MB@ @IJPBC AJM OCM@@ J=E@>ON <I?
>JINOMP>ON OC@H JI@ =T JI@ <O <GDBI@? <??M@NN@N DIND?@ OC<O H@HJMT <M@<:
JNQPSU TUE.TUEJP;
JNQPSU TUE.TUSJOH;
JNQPSU DPSF.NFNPSZ;
JNQPSU TUE.DPOW;
// ...
TUSVDU 4UVEFOU
\
TUSJOH OBNF;
JOU JE;
TUSJOH UP4USJOH()
\
SFUVSO GPSNBU("%T(%T)", OBNF, JE);
^
^
WPJE NBJO()
\
/* 4PNF JOGPSNBUJPO BCPVU UIJT UZQF. */
XSJUFGMO("4UVEFOU.TJ[FPG: %#Y (%T) CZUFT",
4UVEFOU.TJ[FPG, 4UVEFOU.TJ[FPG);
#7?ADK #3@397?7@F
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
646
XSJUFGMO("4UVEFOU.BMJHOPG: %#Y (%T) CZUFT",
4UVEFOU.BMJHOPG, 4UVEFOU.BMJHOPG);
TUSJOH<> OBNFT = < ""NZ", "5JN", "+PF" >;
BVUP UPUBM4J[F = TJ[F8JUI1BEEJOH!4UVEFOU() * OBNFT.MFOHUI;
/*
* 3FTFSWF SPPN GPS BMM 4UVEFOU PCKFDUT.
*
* 8BSOJOH! 5IF PCKFDUT UIBU BSF BDDFTTJCMF UISPVHI UIJT
* TMJDF BSF OPU DPOTUSVDUFE ZFU; UIFZ TIPVME OPU CF
* BDDFTTFE VOUJM BGUFS UIFZ BSF QSPQFSMZ DPOTUSVDUFE.
*/
4UVEFOU<> TUVEFOUT =
(DBTU(4UVEFOU*)($.DBMMPD(UPUBM4J[F))<0 .. OBNFT.MFOHUI>;
GPSFBDI (JOU J, OBNF; OBNFT) \
4UVEFOU * DBOEJEBUF"EES = TUVEFOUT.QUS + J;
4UVEFOU * PCKFDU"EES = OFYU"MJHOFE"EESFTT(DBOEJEBUF"EES);
XSJUFGMO("BEESFTT PG PCKFDU %T: %T", J, PCKFDU"EES);
DPOTU JE = 100 + J;
FNQMBDF(PCKFDU"EES, OBNF, JE);
^
/* "MM PG UIF PCKFDUT BSF DPOTUSVDUFE BOE DBO CF VTFE. */
XSJUFMO(TUVEFOUT);
^
1C@ JPOKPO JA OC@ KMJBM<H:
4UVEFOU.TJ[FPG: 0Y18 (24) CZUFT
4UVEFOU.BMJHOPG: 0Y8 (8) CZUFT
BEESFTT PG PCKFDU 0: 7'1532861'00
BEESFTT PG PCKFDU 1: 7'1532861'18
BEESFTT PG PCKFDU 2: 7'1532861'30
<"NZ(100), 5JN(101), +PF(102)>
Constructing a class object at a specific location 86.4.3
G<NN Q<MD<=G@N I@@? IJO =@ JA OC@ @S<>O OTK@ JA >G<NN J=E@>ON. #JM @S<HKG@, < >G<NN Q<MD<=G@ JA
OTK@ "OJNBM ><I M@A@M OJ < $BU J=E@>O. #JM OC<O M@<NJI, FNQMBDF() ?J@N IJO ?@O@MHDI@ OC@
OTK@ JA OC@ J=E@>O AMJH OC@ OTK@ JA OC@ H@HJMT KJDIO@M. &INO@<?, OC@ <>OP<G OTK@ JA OC@ J=E@>O
HPNO =@ @SKGD>DOGT NK@>DAD@? <N < O@HKG<O@ <MBPH@IO JA FNQMBDF(). (Note: A66;F;A@3>>K, 3 5>3EE
BA;@F7D ;E 3 BA;@F7D FA 3 5>3EE H3D;34>7, @AF FA 3 5>3EE A4<75F. FAD F:3F D73EA@, EB75;8K;@9 F:7
35FG3> FKB7 3>>AIE F:7 BDA9D3??7D FA EB75;8K I:7F:7D FA 7?B>357 3 5>3EE A4<75F AD 3 5>3EE
H3D;34>7.)
1C@ H@HJMT GJ><ODJI AJM < >G<NN J=E@>O HPNO =@ NK@>DAD@? <N < WPJE<> NGD>@ RDOC OC@ AJGGJRDIB
NTIO<S:
5ZQF WBSJBCMF =
FNQMBDF!Type(voidSlice,
/* ... DPOTUSVDUPS BSHVNFOUT ... */);
FNQMBDF() >JINOMP>ON < >G<NN A4<75F <O OC@ GJ><ODJI NK@>DAD@? =T OC@ NGD>@ <I? M@OPMIN < >G<NN
H3D;34>7 AJM OC<O J=E@>O.
)@O'N PN@ FNQMBDF() JI J=E@>ON JA <I "OJNBM CD@M<M>CT. 1C@ J=E@>ON JA OCDN CD@M<M>CT RDGG =@
KG<>@? E;67-4K-E;67 JI < KD@>@ JA H@HJMT OC<O DN <GGJ><O@? =T ($.DBMMPD. 1J H<F@ OC@
@S<HKG@ HJM@ DIO@M@NODIB, R@ RDGG @INPM@ OC<O OC@ NP=>G<NN@N C<Q@ ?DAA@M@IO NDU@N. 1CDN RDGG =@
#7?ADK #3@397?7@F
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
647
PN@APG OJ ?@HJINOM<O@ CJR OC@ <??M@NN JA < NP=N@LP@IO J=E@>O ><I =@ ?@O@MHDI@? ?@K@I?DIB
JI OC@ NDU@ JA OC@ KM@QDJPN JI@.
JOUFSGBDF "OJNBM
\
TUSJOH TJOH();
^
DMBTT $BU : "OJNBM
\
TUSJOH TJOH()
\
SFUVSO "NFPX";
^
^
DMBTT 1BSSPU : "OJNBM
\
TUSJOH<> MZSJDT;
UIJT(TUSJOH<> MZSJDT)
\
UIJT.MZSJDT = MZSJDT;
^
TUSJOH TJOH()
\
/* TUE.BMHPSJUIN.KPJOFS KPJOT FMFNFOUT PG B SBOHF XJUI
* UIF TQFDJGJFE TFQBSBUPS. */
SFUVSO MZSJDT.KPJOFS(", ").UP!TUSJOH;
^
^
1C@ =PAA@M OC<O CJG?N OC@ J=E@>ON RDGG =@ <GGJ><O@? =T ($.DBMMPD =T NK@>DATDIB '*/"-*;& OJ
<GGJR OC@ $ OJ @S@>PO@ OC@ ADI<GDU@MN JA OC@ J=E@>ON OC<O <M@ KG<>@? DI OC<O =PAA@M:
BVUP DBQBDJUZ = 10@000;
WPJE * CVGGFS = ($.DBMMPD(DBQBDJUZ, ($.#ML"UUS.'*/"-*;&);
+JMH<GGT, DO HPNO =@ @INPM@? OC<O OC@M@ DN <GR<TN <Q<DG<=G@ ><K<>DOT AJM J=E@>ON. 4@ RDGG
DBIJM@ OC<O >C@>F C@M@ OJ F@@K OC@ @S<HKG@ NDHKG@ <I? <NNPH@ OC<O OC@ J=E@>ON DI OC@
@S<HKG@ RDGG ADO DI O@I OCJPN<I? =TO@N.
1C@ =PAA@M RDGG =@ PN@? AJM >JINOMP>ODIB < $BU <I? < 1BSSPU J=E@>O:
$BU DBU = FNQMBDF!$BU(DBU1MBDF);
// ...
1BSSPU QBSSPU =
FNQMBDF!1BSSPU(QBSSPU1MBDF, < "TRVBXL", "BSSHI" >);
+JO@ OC<O OC@ >JINOMP>OJM <MBPH@IO JA 1BSSPU DN NK@>DAD@? <AO@M OC@ <??M@NN JA OC@ J=E@>O.
1C@ Q<MD<=G@N OC<O FNQMBDF() M@OPMIN RDGG =@ NOJM@? DI <I "OJNBM NGD>@ G<O@M OJ =@ PN@? DI <
GPSFBDI GJJK:
"OJNBM<> BOJNBMT;
// ...
BOJNBMT _= DBU;
// ...
BOJNBMT _= QBSSPU;
GPSFBDI (BOJNBM; BOJNBMT) \
XSJUFMO(BOJNBM.TJOH());
^
#7?ADK #3@397?7@F
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
648
*JM@ @SKG<I<ODJIN <M@ DIND?@ OC@ >J?@ >JHH@ION:
JNQPSU TUE.TUEJP;
JNQPSU TUE.BMHPSJUIN;
JNQPSU TUE.DPOW;
JNQPSU DPSF.NFNPSZ;
// ...
WPJE NBJO()
\
/* " TMJDF PG "OJNBM WBSJBCMFT (OPU "OJNBM PCKFDUT). */
"OJNBM<> BOJNBMT;
/* "MMPDBUJOH B CVGGFS XJUI BO BSCJUSBSZ DBQBDJUZ BOE
* BTTVNJOH UIBU UIF UXP PCKFDUT JO UIJT FYBNQMF XJMM GJU
* JO UIBU BSFB. /PSNBMMZ, UIJT DPOEJUJPO NVTU CF
* WBMJEBUFE. */
BVUP DBQBDJUZ = 10@000;
WPJE * CVGGFS = ($.DBMMPD(DBQBDJUZ, ($.#ML"UUS.'*/"-*;&);
/* -FU'T GJSTU QMBDF B $BU PCKFDU. */
WPJE * DBU$BOEJEBUF"EES = CVGGFS;
WPJE * DBU"EES = OFYU"MJHOFE"EESFTT!$BU(DBU$BOEJEBUF"EES);
XSJUFMO("$BU BEESFTT : ", DBU"EES);
/* 4JODF FNQMBDF() SFRVJSFT B WPJE<> GPS B DMBTT PCKFDU,
* XF NVTU GJSTU QSPEVDF B TMJDF GSPN UIF QPJOUFS. */
TJ[F@U DBU4J[F = @@USBJUT(DMBTT*OTUBODF4J[F, $BU);
WPJE<> DBU1MBDF = DBU"EES<0..DBU4J[F>;
/* $POTUSVDU B $BU PCKFDU JOTJEF UIBU NFNPSZ TMJDF BOE
* TUPSF UIF SFUVSOFE DMBTT WBSJBCMF GPS MBUFS VTF. */
$BU DBU = FNQMBDF!$BU(DBU1MBDF);
BOJNBMT _= DBU;
/* /PX DPOTUSVDU B 1BSSPU PCKFDU BU UIF OFYU BWBJMBCMF
* BEESFTT UIBU TBUJTGJFT UIF BMJHONFOU SFRVJSFNFOU. */
WPJE * QBSSPU$BOEJEBUF"EES = DBU"EES + DBU4J[F;
WPJE * QBSSPU"EES =
OFYU"MJHOFE"EESFTT!1BSSPU(QBSSPU$BOEJEBUF"EES);
XSJUFMO("1BSSPU BEESFTT: ", QBSSPU"EES);
TJ[F@U QBSSPU4J[F = @@USBJUT(DMBTT*OTUBODF4J[F, 1BSSPU);
WPJE<> QBSSPU1MBDF = QBSSPU"EES<0..QBSSPU4J[F>;
1BSSPU QBSSPU =
FNQMBDF!1BSSPU(QBSSPU1MBDF, < "TRVBXL", "BSSHI" >);
BOJNBMT _= QBSSPU;
/* 6TF UIF PCKFDUT. */
GPSFBDI (BOJNBM; BOJNBMT) \
XSJUFMO(BOJNBM.TJOH());
^
^
1C@ JPOKPO:
$BU BEESFTT : 7'0&343"2000
1BSSPU BEESFTT: 7'0&343"2018
NFPX
TRVBXL, BSSHI
&INO@<? JA M@K@<ODIB OC@ NO@KN DIND?@ NBJO() AJM @<>C J=E@>O, < API>ODJI O@HKG<O@ GDF@
OFX0CKFDU(5) RJPG? =@ HJM@ PN@APG.
#7?ADK #3@397?7@F
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
649
Destroying objects explicitly
86.5
1C@ M@Q@MN@ JK@M<ODJIN JA OC@ OFX JK@M<OJM <M@ ?@NOMJTDIB <I J=E@>O <I? M@OPMIDIB OC@
J=E@>O'N H@HJMT =<>F OJ OC@ $. +JMH<GGT, OC@N@ JK@M<ODJIN <M@ @S@>PO@? <POJH<OD><GGT <O
PINK@>DAD@? ODH@N.
%JR@Q@M, NJH@ODH@N DO DN I@>@NN<MT OJ @S@>PO@ ?@NOMP>OJMN <O NK@>DAD> KJDION DI OC@ KMJBM<H.
#JM @S<HKG@, <I J=E@>O H<T =@ >GJNDIB < 'JMF H@H=@M DI DON ?@NOMP>OJM <I? OC@ ?@NOMP>OJM
H<T C<Q@ OJ =@ @S@>PO@? DHH@?D<O@GT RC@I OC@ GDA@ODH@ JA OC@ J=E@>O @I?N.
EFTUSPZ() ><GGN OC@ ?@NOMP>OJM JA <I J=E@>O:
EFTUSPZ(WBSJBCMF);
EFTUSPZ() N@ON OC@ Q<MD<=G@ OJ DON .JOJU NO<O@. +JO@ OC<O OC@ .JOJU NO<O@ JA < >G<NN Q<MD<=G@ DN
OVMM; NJ, < >G<NN Q<MD<=G@ ><IIJO =@ PN@? JI>@ ?@NOMJT@?. EFTUSPZ() H@M@GT @S@>PO@N OC@
?@NOMP>OJM. &O DN NODGG PK OJ OC@ $ RC@I OJ M@PN@ OC@ KD@>@ JA H@HJMT OC<O PN@? OJ =@ J>>PKD@?
=T OC@ ?@NOMJT@? J=E@>O.
Constructing objects at run time by name
86.6
1C@ GBDUPSZ() H@H=@M API>ODJI JA 0CKFDU O<F@N OC@ APGGT LP<GDAD@? I<H@ JA < >G<NN OTK@ <N
K<M<H@O@M, >JINOMP>ON <I J=E@>O JA OC<O OTK@, <I? M@OPMIN < >G<NN Q<MD<=G@ AJM OC<O J=E@>O:
NPEVMF UFTU@NPEVMF;
JNQPSU TUE.TUEJP;
JOUFSGBDF "OJNBM
\
TUSJOH TJOH();
^
DMBTT $BU : "OJNBM
\
TUSJOH TJOH()
\
SFUVSO "NFPX";
^
^
DMBTT %PH : "OJNBM
\
TUSJOH TJOH()
\
SFUVSO "XPPG";
^
^
WPJE NBJO()
\
TUSJOH<> UP$POTUSVDU = < "$BU", "%PH", "$BU" >;
"OJNBM<> BOJNBMT;
GPSFBDI (UZQF/BNF; UP$POTUSVDU) \
/* 5IF QTFVEP WBSJBCMF @@.0%6-&@@ JT BMXBZT UIF OBNF
* PG UIF DVSSFOU NPEVMF, XIJDI DBO CF VTFE BT B
* TUSJOH MJUFSBM BU DPNQJMF UJNF. */
DPOTU GVMM/BNF = @@.0%6-&@@ _ '.' _ UZQF/BNF;
XSJUFGMO("$POTUSVDUJOH %T", GVMM/BNF);
BOJNBMT _= DBTU("OJNBM)0CKFDU.GBDUPSZ(GVMM/BNF);
^
#7?ADK #3@397?7@F
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
650
GPSFBDI (BOJNBM; BOJNBMT) \
XSJUFMO(BOJNBM.TJOH());
^
^
AGOCJPBC OC@M@ DN IJ @SKGD>DO OFX @SKM@NNDJI DI OC<O KMJBM<H, OCM@@ >G<NN J=E@>ON <M@ >M@<O@?
<I? <??@? OJ OC@ BOJNBMT NGD>@:
$POTUSVDUJOH UFTU@NPEVMF.$BU
$POTUSVDUJOH UFTU@NPEVMF.%PH
$POTUSVDUJOH UFTU@NPEVMF.$BU
NFPX
XPPG
NFPX
+JO@ OC<O 0CKFDU.GBDUPSZ() O<F@N OC@ APGGT LP<GDAD@? I<H@ JA OC@ OTK@ JA OC@ J=E@>O. AGNJ, OC@
M@OPMI OTK@ JA GBDUPSZ() DN 0CKFDU; NJ, DO HPNO =@ ><NO@? OJ OC@ <>OP<G OTK@ JA OC@ J=E@>O
=@AJM@ =@DIB PN@? DI OC@ KMJBM<H.
Summary
86.7
t 1C@ B<M=<B@ >JGG@>OJM N><IN OC@ H@HJMT <O PINK@>DAD@? ODH@N, ?@O@MHDI@N OC@ J=E@>ON OC<O
><IIJO KJNND=GT =@ M@<>C@? <ITHJM@ =T OC@ KMJBM<H, ?@NOMJTN OC@H, <I? M@>G<DHN OC@DM
H@HJMT GJ><ODJIN.
t 1C@ JK@M<ODJIN JA OC@ $ H<T =@ >JIOMJGG@? =T OC@ KMJBM<HH@M OJ NJH@ @SO@IO =T
($.DPMMFDU, ($.EJTBCMF, ($.FOBCMF, ($.NJOJNJ[F, @O>.
t ($.DBMMPD <I? JOC@M API>ODJIN M@N@MQ@ H@HJMT, ($.SFBMMPD @SO@I?N < KM@QDJPNGT
<GGJ><O@? H@HJMT <M@<, <I? ($.GSFF M@OPMIN DO =<>F OJ OC@ $.
t &O DN KJNND=G@ OJ H<MF OC@ <GGJ><O@? H@HJMT =T <OOMD=PO@N GDF@ ($.#ML"UUS./0@4$"/,
($.#ML"UUS.'*/"-*;&, @O>.
t 1C@ .BMJHOPG <OOMD=PO@ DN OC@ H@HJMT <GDBIH@IO M@LPDM@H@IO JA < OTK@. AGDBIH@IO HPNO
=@ J=O<DI@? =T @@USBJUT(DMBTT*OTUBODF"MJHONFOU) AJM >G<NN J=E@>ON.
t FNQMBDF() O<F@N < KJDIO@M RC@I >JINOMP>ODIB < TUSVDU J=E@>O, < WPJE<> NGD>@ RC@I
>JINOMP>ODIB < DMBTT J=E@>O.
t 0CKFDU.GBDUPSZ() >JINOMP>ON J=E@>ON RDOC OC@DM APGGT LP<GDAD@? OTK@ I<H@N.
#7?ADK #3@397?7@F
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
651
Exercise Solutions 87
Assignment and Order of Evaluation
87.8
1. 1C@ Q<GP@N JA B, C, <I? D <M@ KMDIO@? JI OC@ MDBCO-C<I? ND?@ JA @<>C JK@M<ODJI. 1C@ Q<GP@
OC<O >C<IB@N <O @Q@MT JK@M<ODJI DN KMDIO@? DI T@GGJR:
BU UIF CFHJOOJOH l B 1, C 2, D JSSFMFWBOU
D = B l B 1, C 2, D 1
B = C l B 2, C 2, D 1
C = D l B 2, C 1, D 1
AO OC@ @I?, OC@ Q<GP@N JA B <I? C C<Q@ =@@I NR<KK@?.
The Hello World Program
87.9
1.
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
XSJUFMO("4PNFUIJOH FMTF... :Q");
^
2.
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
XSJUFMO("" MJOF...");
XSJUFMO(""OPUIFS MJOF...");
^
3. 1C@ AJGGJRDIB KMJBM<H ><IIJO =@ >JHKDG@? =@><PN@ OC@ N@HD>JGJI <O OC@ @I? JA OC@
XSJUFMO GDI@ DN HDNNDIB:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
XSJUFMO(")FMMP XPSME!")
^
writeln and write
87.10
1. ,I@ H@OCJ? DN OJ PN@ <IJOC@M K<M<H@O@M DI =@OR@@I:
XSJUFMO(")FMMP XPSME!", " ", ")FMMP GJTI!");
2. XSJUF ><I O<F@ HPGODKG@ K<M<H@O@MN <N R@GG:
XSJUF("POF", " UXP", " UISFF");
EJ7D5;E7 (A>GF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
652
Fundamental Types
87.11
1. 4@ ><I PN@ JOC@M OTK@N DINO@<? JA JOU:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
XSJUFMO("5ZQF : ", TIPSU.TUSJOHPG);
XSJUFMO("-FOHUI JO CZUFT: ", TIPSU.TJ[FPG);
XSJUFMO(".JOJNVN WBMVF : ", TIPSU.NJO);
XSJUFMO(".BYJNVN WBMVF : ", TIPSU.NBY);
XSJUFMO();
XSJUFMO("5ZQF : ", VMPOH.TUSJOHPG);
XSJUFMO("-FOHUI JO CZUFT: ", VMPOH.TJ[FPG);
XSJUFMO(".JOJNVN WBMVF : ", VMPOH.NJO);
XSJUFMO(".BYJNVN WBMVF : ", VMPOH.NBY);
^
Variables
87.12
1.
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
JOU BNPVOU = 20;
EPVCMF SBUF = 2.11;
XSJUFMO("* IBWF FYDIBOHFE ", BNPVOU,
" &VSPT BU UIF SBUF PG ", SBUF);
^
Standard Input and Output Streams
87.13
1.
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
TUEPVU.XSJUFMO(1, ",", 2);
^
Reading from the Standard Input
87.14
t 4C@I OC@ >C<M<>O@MN ><IIJO =@ >JIQ@MO@? OJ OC@ ?@NDM@? OTK@, TUEJO B@ON DI <I PIPN<=G@
NO<O@. #JM @S<HKG@, @IO@MDIB "<=>" RC@I <I JOU DN @SK@>O@? RJPG? H<F@ TUEJO PIPN<=G@.
Logical Expressions
87.15
1. B@><PN@ OC@ >JHKDG@M M@>JBIDU@N 10 < WBMVF <GM@<?T <N <I @SKM@NNDJI, DO @SK@>ON <
>JHH< <AO@M DO OJ <>>@KO DO <N < G@B<G <MBPH@IO OJ XSJUFMO. 2NDIB K<M@IOC@N@N <MJPI? OC@
RCJG@ @SKM@NNDJI RJPG? IJO RJMF @DOC@M, =@><PN@ OCDN ODH@ < >GJNDIB K<M@IOC@NDN RJPG? =@
@SK@>O@? <AO@M OC@ N<H@ @SKM@NNDJI.
EJ7D5;E7 (A>GF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
653
2. $MJPKDIB OC@ @SKM@NNDJI <N (10 < WBMVF) < 20 M@HJQ@N OC@ >JHKDG<ODJI @MMJM, =@><PN@
DI OCDN ><N@ ADMNO 10 < WBMVF DN @Q<GP<O@? <I? OC@I DON M@NPGO DN PN@? RDOC < 20.
4@ FIJR OC<O OC@ Q<GP@ JA < GJBD><G @SKM@NNDJI GDF@ 10 < WBMVF DN @DOC@M GBMTF JM
USVF. GBMTF <I? USVF O<F@ K<MO DI DIO@B@M @SKM@NNDJIN <N 0 <I? 1, M@NK@>ODQ@GT. (4@
RDGG N@@ <POJH<OD> OTK@ >JIQ@MNDJIN DI < G<O@M >C<KO@M.) AN < M@NPGO, OC@ RCJG@
@SKM@NNDJI DN OC@ @LPDQ<G@IO JA @DOC@M 0 < 20 JM 1 < 20, =JOC JA RCD>C @Q<GP<O@ OJ
USVF.
3. 1C@ @SKM@NNDJI "BM@<O@M OC<I OC@ GJR@M Q<GP@ <I? G@NN OC<I OC@ PKK@M Q<GP@" ><I =@ >J?@?
GDF@ OC@ AJGGJRDIB:
XSJUFMO("*T CFUXFFO: ", (WBMVF > 10) && (WBMVF < 20));
4. "1C@M@ DN < =D>T>G@ AJM @Q@MTJI@" ><I =@ >J?@? <N QFSTPO$PVOU <= CJDZDMF$PVOU JM
CJDZDMF$PVOU >= QFSTPO$PVOU. 1C@ M@NO JA OC@ GJBD><G @SKM@NNDJI ><I ?DM@>OGT =@
OM<ING<O@? OJ KMJBM<H >J?@ AMJH OC@ @S@M>DN@:
XSJUFMO("8F BSF HPJOH UP UIF CFBDI: ",
((EJTUBODF < 10) && (CJDZDMF$PVOU >= QFSTPO$PVOU))
]]
((QFSTPO$PVOU <= 5) && FYJTUT$BS && FYJTUT-JDFOTF)
);
+JO@ OC@ KG<>@H@IO JA OC@ ]] JK@M<OJM OJ C@GK RDOC M@<?<=DGDOT =T N@K<M<ODIB OC@ ORJ
H<DI >JI?DODJIN.
The if Statement
87.16
1. 1C@ NO<O@H@IO XSJUFMO("8BTIJOH UIF QMBUF") DN RMDOO@I DI?@IO@? <N DA OJ =@ RDOCDI OC@
FMTF N>JK@. %JR@Q@M, =@><PN@ OC@ N>JK@ JA OC<O FMTF DN IJO RMDOO@I RDOC >PMGT =M<>F@ON,
JIGT OC@ XSJUFMO("&BUJOH QJF") NO<O@H@IO DN <>OP<GGT DIND?@ OC@ N>JK@ JA OC<O FMTF.
0DI>@ RCDO@NK<>@N <M@ IJO DHKJMO<IO DI ! KMJBM<HN, OC@ B>3F7 EF3F7?7@F DN <>OP<GGT
<I DI?@K@I?@IO NO<O@H@IO RDOCDI NBJO() <I? DN @S@>PO@? PI>JI?DODJI<GGT. &O >JIAPN@N
OC@ M@<?@M <N R@GG =@><PN@ JA C<QDIB =@@I DI?@IO@? HJM@ OC<I PNP<G. &A OC@ B>3F7
EF3F7?7@F HPNO M@<GGT =@ RDOCDI OC@ FMTF N>JK@, OC@M@ HPNO =@ >PMGT =M<>F@ON <MJPI?
OC<O N>JK@:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
CPPM FYJTUT-FNPOBEF = USVF;
JG (FYJTUT-FNPOBEF) \
XSJUFMO("%SJOLJOH MFNPOBEF");
XSJUFMO("8BTIJOH UIF DVQ");
^ FMTF \
XSJUFMO("&BUJOH QJF");
XSJUFMO("8BTIJOH UIF QMBUF");
^
^
2. 4@ ><I >JH@ PK RDOC HJM@ OC<I JI@ ?@NDBI AJM OC@ >JI?DODJIN JA OCDN B<H@. & RDGG NCJR
ORJ @S<HKG@N. &I OC@ ADMNO JI@, R@ <KKGT OC@ DIAJMH<ODJI ?DM@>OGT AMJH OC@ @S@M>DN@:
JNQPSU TUE.TUEJP;
WPJE NBJO()
EJ7D5;E7 (A>GF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
654
\
XSJUF("8IBU JT UIF WBMVF PG UIF EJF ");
JOU EJF;
SFBEG(" %T", &EJF);
JG (EJF == 1) \
XSJUFMO(":PV XPO");
^ FMTF JG (EJF == 2) \
XSJUFMO(":PV XPO");
^ FMTF JG (EJF == 3) \
XSJUFMO(":PV XPO");
^ FMTF JG (EJF == 4) \
XSJUFMO("* XPO");
^ FMTF JG (EJF == 5) \
XSJUFMO("* XPO");
^ FMTF JG (EJF == 6) \
XSJUFMO("* XPO");
^ FMTF \
XSJUFMO("&3303: ", EJF, " JT JOWBMJE");
^
^
2IAJMOPI<O@GT, OC<O KMJBM<H C<N H<IT M@K@ODODJIN. 4@ ><I <>CD@Q@ OC@ N<H@ M@NPGO =T
JOC@M ?@NDBIN. %@M@ DN JI@:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
XSJUF("8IBU JT UIF WBMVF PG UIF EJF ");
JOU EJF;
SFBEG(" %T", &EJF);
JG ((EJF == 1) ]] (EJF == 2) ]] (EJF == 3)) \
XSJUFMO(":PV XPO");
^ FMTF JG ((EJF == 4) ]] (EJF == 5) ]] (EJF == 6)) \
XSJUFMO("* XPO");
^ FMTF \
XSJUFMO("&3303: ", EJF, " JT JOWBMJE");
^
^
3. 1C@ KM@QDJPN ?@NDBIN ><IIJO =@ PN@? DI OCDN ><N@. &O DN IJO KM<>OD><G OJ OTK@ 1000 ?DAA@M@IO
Q<GP@N DI < KMJBM<H <I? @SK@>O OC@H <GG =@ >JMM@>O JM M@<?<=G@. #JM OC<O M@<NJI, DO DN
=@OO@M OJ ?@O@MHDI@ RC@OC@M OC@ Q<GP@ JA OC@ ?D@ DN I;F:;@ 3 D3@97:
JG ((EJF >= 1) && (EJF <= 500))
The XIJMF Loop
87.17
1. B@><PN@ OC@ DIDOD<G Q<GP@ JA OVNCFS DN 0, OC@ GJBD><G @SKM@NNDJI JA OC@ XIJMF GJJK DN GBMTF
NDI>@ OC@ Q@MT =@BDIIDIB, <I? OCDN DN KM@Q@IODIB AMJH @IO@MDIB OC@ GJJK =J?T. A NJGPODJI DN
OJ PN@ <I DIDOD<G Q<GP@ OC<O RDGG <GGJR OC@ XIJMF >JI?DODJI OJ =@ USVF <O OC@ =@BDIIDIB:
JOU OVNCFS = 3;
EJ7D5;E7 (A>GF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
655
2. AGG JA OC@ Q<MD<=G@N DI OC@ AJGGJRDIB KMJBM<H <M@ ?@A<PGO DIDOD<GDU@? OJ 0. 1CDN <GGJRN
@IO@MDIB =JOC JA OC@ GJJKN <O G@<NO JI>@:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
JOU TFDSFU/VNCFS;
XIJMF ((TFDSFU/VNCFS < 1) ]] (TFDSFU/VNCFS > 10)) \
XSJUF("1MFBTF FOUFS B OVNCFS CFUXFFO 1 BOE 10: ");
SFBEG(" %T", &TFDSFU/VNCFS);
^
JOU HVFTT;
XIJMF (HVFTT != TFDSFU/VNCFS) \
XSJUF("(VFTT UIF TFDSFU OVNCFS: ");
SFBEG(" %T", &HVFTT);
^
XSJUFMO("5IBU JT DPSSFDU!");
^
Integers and Arithmetic Operations
87.18
1. 4@ ><I PN@ OC@ / JK@M<OJM AJM OC@ ?DQDNDJI <I? OC@ % JK@M<OJM AJM OC@ M@H<DI?@M:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
JOU GJSTU;
XSJUF("1MFBTF FOUFS UIF GJSTU OVNCFS: ");
SFBEG(" %T", &GJSTU);
JOU TFDPOE;
XSJUF("1MFBTF FOUFS UIF TFDPOE OVNCFS: ");
SFBEG(" %T", &TFDPOE);
JOU RVPUJFOU = GJSTU / TFDPOE;
JOU SFNBJOEFS = GJSTU % TFDPOE;
XSJUFMO(GJSTU, " = ",
TFDPOE, " * ", RVPUJFOU, " + ", SFNBJOEFS);
^
2. 4@ ><I ?@O@MHDI@ RC@OC@M OC@ M@H<DI?@M DN 0 JM IJO RDOC <I JG NO<O@H@IO:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
JOU GJSTU;
XSJUF("1MFBTF FOUFS UIF GJSTU OVNCFS: ");
SFBEG(" %T", &GJSTU);
JOU TFDPOE;
XSJUF("1MFBTF FOUFS UIF TFDPOE OVNCFS: ");
SFBEG(" %T", &TFDPOE);
JOU RVPUJFOU = GJSTU / TFDPOE;
JOU SFNBJOEFS = GJSTU % TFDPOE;
// 8F DBOOPU DBMM XSJUFMO VQ GSPOU CFGPSF EFUFSNJOJOH
// XIFUIFS UIF SFNBJOEFS JT 0 PS OPU. 8F NVTU UFSNJOBUF
// UIF MJOF MBUFS XJUI B XSJUFMO.
EJ7D5;E7 (A>GF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
656
XSJUF(GJSTU, " = ", TFDPOE, " * ", RVPUJFOU);
// 5IF SFNBJOEFS NVTU CF QSJOUFE POMZ JG OPO-[FSP.
JG (SFNBJOEFS != 0) \
XSJUF(" + ", SFNBJOEFS);
^
// 8F BSF OPX SFBEZ UP UFSNJOBUF UIF MJOF.
XSJUFMO();
^
3.
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
XIJMF (USVF) \
XSJUF("0: &YJU, 1: "EE, 2: 4VCUSBDU, 3: .VMUJQMZ,",
" 4: %JWJEF - 1MFBTF FOUFS UIF PQFSBUJPO: ");
JOU PQFSBUJPO;
SFBEG(" %T", &PQFSBUJPO);
// -FU'T GJSTU WBMJEBUF UIF PQFSBUJPO
JG ((PQFSBUJPO < 0) ]] (PQFSBUJPO > 4)) \
XSJUFMO("* EPO'U LOPX UIJT PQFSBUJPO");
DPOUJOVF;
^
JG (PQFSBUJPO == 0)\
XSJUFMO("(PPECZF!");
CSFBL;
^
// *G XF BSF IFSF, XF LOPX UIBU XF BSF EFBMJOH XJUI
// POF PG UIF GPVS PQFSBUJPOT. /PX JT UIF UJNF UP SFBE
// UXP JOUFHFST GSPN UIF VTFS:
JOU GJSTU;
JOU TFDPOE;
XSJUF(" 'JSTU OVNCFS: ");
SFBEG(" %T", &GJSTU);
XSJUF("4FDPOE OVNCFS: ");
SFBEG(" %T", &TFDPOE);
JOU SFTVMU;
JG (PQFSBUJPO == 1) \
SFTVMU = GJSTU + TFDPOE;
^ FMTF JG (PQFSBUJPO == 2) \
SFTVMU = GJSTU - TFDPOE;
^ FMTF JG (PQFSBUJPO == 3) \
SFTVMU = GJSTU * TFDPOE;
^ FMTF JG (PQFSBUJPO == 4) \
SFTVMU = GJSTU / TFDPOE;
^ FMTF \
XSJUFMO(
"5IFSF JT BO FSSPS! ",
"5IJT DPOEJUJPO TIPVME IBWF OFWFS PDDVSSFE.");
CSFBL;
^
XSJUFMO(" 3FTVMU: ", SFTVMU);
EJ7D5;E7 (A>GF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
657
^
^
4.
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
JOU WBMVF = 1;
XIJMF (WBMVF <= 10) \
JG (WBMVF != 7) \
XSJUFMO(WBMVF);
^
++WBMVF;
^
^
Floating Point Types
87.19
1. /@KG<>DIB OC@ OCM@@ JOUN RDOC OCM@@ EPVCMFN DN NPAAD>D@IO:
EPVCMF GJSTU;
EPVCMF TFDPOE;
// ...
EPVCMF SFTVMU;
2. 1C@ AJGGJRDIB KMJBM<H ?@HJINOM<O@N CJR HP>C HJM@ >JHKGD><O@? DO RJPG? =@>JH@ DA
HJM@ OC<I ADQ@ Q<MD<=G@N R@M@ I@@?@?:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
EPVCMF WBMVF@1;
EPVCMF WBMVF@2;
EPVCMF WBMVF@3;
EPVCMF WBMVF@4;
EPVCMF WBMVF@5;
XSJUF("7BMVF 1: ");
SFBEG(" %T", &WBMVF@1);
XSJUF("7BMVF 2: ");
SFBEG(" %T", &WBMVF@2);
XSJUF("7BMVF 3: ");
SFBEG(" %T", &WBMVF@3);
XSJUF("7BMVF 4: ");
SFBEG(" %T", &WBMVF@4);
XSJUF("7BMVF 5: ");
SFBEG(" %T", &WBMVF@5);
XSJUFMO("5XJDF UIF WBMVFT:");
XSJUFMO(WBMVF@1 * 2);
XSJUFMO(WBMVF@2 * 2);
XSJUFMO(WBMVF@3 * 2);
XSJUFMO(WBMVF@4 * 2);
XSJUFMO(WBMVF@5 * 2);
XSJUFMO("0OF GJGUI UIF WBMVFT:");
XSJUFMO(WBMVF@1 / 5);
XSJUFMO(WBMVF@2 / 5);
XSJUFMO(WBMVF@3 / 5);
EJ7D5;E7 (A>GF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
658
XSJUFMO(WBMVF@4 / 5);
XSJUFMO(WBMVF@5 / 5);
^
Arrays
87.20
1.
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
XSJUF(")PX NBOZ WBMVFT XJMM CF FOUFSFE ");
JOU DPVOU;
SFBEG(" %T", &DPVOU);
EPVCMF<> WBMVFT;
WBMVFT.MFOHUI = DPVOU;
// 5IF DPVOUFS JT DPNNPOMZ OBNFE BT 'J'
JOU J;
XIJMF (J < DPVOU) \
XSJUF("7BMVF ", J, ": ");
SFBEG(" %T", &WBMVFT<J>);
++J;
^
XSJUFMO("*O TPSUFE PSEFS:");
WBMVFT.TPSU;
J = 0;
XIJMF (J < DPVOU) \
XSJUF(WBMVFT<J>, " ");
++J;
^
XSJUFMO();
XSJUFMO("*O SFWFSTF PSEFS:");
WBMVFT.SFWFSTF;
J = 0;
XIJMF (J < DPVOU) \
XSJUF(WBMVFT<J>, " ");
++J;
^
XSJUFMO();
^
2. 1C@ @SKG<I<ODJIN <M@ DI>GP?@? <N >J?@ >JHH@ION:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
// 6TJOH EZOBNJD BSSBZT CFDBVTF JU JT OPU LOPXO IPX NBOZ
// WBMVFT BSF HPJOH UP CF SFBE GSPN UIF JOQVU
JOU<> PEET;
JOU<> FWFOT;
XSJUFMO("1MFBTF FOUFS JOUFHFST (-1 UP UFSNJOBUF):");
XIJMF (USVF) \
// 3FBEJOH UIF WBMVF
JOU WBMVF;
SFBEG(" %T", &WBMVF);
EJ7D5;E7 (A>GF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
659
// 5IF TQFDJBM WBMVF PG -1 CSFBLT UIF MPPQ
JG (WBMVF == -1) \
CSFBL;
^
// "EEJOH UP UIF DPSSFTQPOEJOH BSSBZ, EFQFOEJOH PO
// XIFUIFS UIF WBMVF JT PEE PS FWFO. *U JT BO FWFO
// OVNCFS JG UIFSF JT OP SFNBJOEFS XIFO EJWJEFE CZ 2.
JG ((WBMVF % 2) == 0) \
FWFOT _= WBMVF;
^ FMTF \
PEET _= WBMVF;
^
^
// 5IF PEET BOE FWFOT BSSBZT BSF TPSUFE TFQBSBUFMZ
PEET.TPSU;
FWFOT.TPSU;
// 5IF UXP BSSBZT BSF UIFO BQQFOEFE UP GPSN B OFX BSSBZ
JOU<> SFTVMU;
SFTVMU = PEET _ FWFOT;
XSJUFMO("'JSTU UIF PEET UIFO UIF FWFOT, TPSUFE:");
// 1SJOUJOH UIF BSSBZ FMFNFOUT JO B MPPQ
JOU J;
XIJMF (J < SFTVMU.MFOHUI) \
XSJUF(SFTVMU<J>, " ");
++J;
^
XSJUFMO();
^
3. 1C@M@ <M@ OCM@@ HDNO<F@N (=PBN) DI OCDN KMJBM<H. 1C@ ADMNO ORJ <M@ RDOC OC@ XIJMF GJJKN:
=JOC JA OC@ GJJK >JI?DODJIN PN@ OC@ <= JK@M<OJM DINO@<? JA OC@ < JK@M<OJM. AN < M@NPGO, OC@
KMJBM<H PN@N DIQ<GD? DI?@S@N <I? <OO@HKON OJ <>>@NN @G@H@ION OC<O <M@ IJO K<MON JA OC@
<MM<TN.
0DI>@ DO DN HJM@ =@I@AD>D<G AJM TJP OJ ?@=PB OC@ OCDM? HDNO<F@ TJPMN@GA, & RJPG? GDF@
TJP OJ ADMNO MPI OC@ KMJBM<H <AO@M ADSDIB OC@ KM@QDJPN ORJ =PBN. 6JP RDGG IJOD>@ OC<O
OC@ KMJBM<H RDGG IJO KMDIO OC@ M@NPGON. 4CT?
1C@ <INR@M RDGG =@ M@Q@<G@? DA TJP N@G@>O OC@ <M@< =@OR@@I OC@ AJGGJRDIB CJMDUJIO<G
GDI@N RDOC TJPM HJPN@.
Slices and Other Array Features
87.21
t &O@M<ODIB JQ@M @G@H@ION =T >JINPHDIB < NGD>@ AMJH OC@ =@BDIIDIB DN <I DIO@M@NODIB >JI>@KO.
1CDN H@OCJ? DN <GNJ OC@ =<NDN JA -CJ=JN M<IB@N OC<O R@ RDGG N@@ DI < G<O@M >C<KO@M.
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
EPVCMF<> BSSBZ = < 1, 20, 2, 30, 7, 11 >;
EPVCMF<> TMJDF = BSSBZ; // 4UBSU XJUI B TMJDF UIBU
// QSPWJEFT BDDFTT UP BMM PG
// UIF FMFNFOUT PG UIF BSSBZ
XIJMF (TMJDF.MFOHUI) \ // "T MPOH BT UIFSF JT BU MFBTU
// POF FMFNFOU JO UIBU TMJDF
EJ7D5;E7 (A>GF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
660
JG (TMJDF<0> > 10) \ // "MXBZT VTF UIF GJSTU FMFNFOU
TMJDF<0> /= 2; // JO UIF FYQSFTTJPOT
^
TMJDF = TMJDF<1 .. $>; // 4IPSUFO UIF TMJDF GSPN UIF
// CFHJOOJOH
^
XSJUFMO(BSSBZ); // 5IF BDUVBM FMFNFOUT BSF
// DIBOHFE
^
Strings
87.22
1. AGOCJPBC NJH@ JA OC@ API>ODJIN DI -CJ=JN HJ?PG@N RDGG =@ @<NT OJ PN@ RDOC NOMDIBN, GD=M<MT
?J>PH@IO<ODJIN <M@ PNP<GGT O@MN@ >JHK<M@? OJ OPOJMD<GN. 6JP H<T ADI? @NK@>D<GGT OC@
-CJ=JN M<IB@N >JIAPNDIB <O OCDN KJDIO. 4@ RDGG N@@ -CJ=JN M<IB@N DI < G<O@M >C<KO@M.
2. *<IT JOC@M API>ODJIN H<T =@ >C<DI@? <N R@GG:
JNQPSU TUE.TUEJP;
JNQPSU TUE.TUSJOH;
WPJE NBJO()
\
XSJUF("'JSTU OBNF: ");
TUSJOH GJSTU = DBQJUBMJ[F(DIPNQ(SFBEMO()));
XSJUF("-BTU OBNF: ");
TUSJOH MBTU = DBQJUBMJ[F(DIPNQ(SFBEMO()));
TUSJOH GVMM/BNF = GJSTU _ " " _ MBTU;
XSJUFMO(GVMM/BNF);
^
3. 1CDN KMJBM<H PN@N ORJ DI?@S@N OJ H<F@ < NGD>@:
JNQPSU TUE.TUEJP;
JNQPSU TUE.TUSJOH;
WPJE NBJO()
\
XSJUF("1MFBTF FOUFS B MJOF: ");
TUSJOH MJOF = DIPNQ(SFBEMO());
TJ[FEJGG@U GJSTU@F = JOEFY0G(MJOF, 'F');
JG (GJSTU@F == -1) \
XSJUFMO("5IFSF JT OP MFUUFS F JO UIJT MJOF.");
^ FMTF \
TJ[FEJGG@U MBTU@F = MBTU*OEFY0G(MJOF, 'F');
XSJUFMO(MJOF<GJSTU@F .. MBTU@F + 1>);
^
^
Redirecting Standard Input and Output Streams
87.23
1. /@?DM@>ODIB NO<I?<M? DIKPO <I? JPOKPO JA KMJBM<HN <M@ >JHHJIGT PN@? @NK@>D<GGT JI
2IDS-=<N@? JK@M<ODIB NTNO@H >JINJG@N. 0JH@ KMJBM<HN <M@ ?@NDBI@? OJ RJMF R@GG RC@I
KDK@? OJ JOC@M KMJBM<HN.
EJ7D5;E7 (A>GF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
661
#JM @S<HKG@, < ADG@ I<H@? EFOFNF.E ><I =@ N@<M>C@? PI?@M < ?DM@>OJMT OM@@ =T KDKDIB
GJOE <I? HSFQ <N DI OC@ AJGGJRDIB GDI@:
GJOE ] HSFQ EFOFNF.E
GJOE KMDION OC@ I<H@N JA <GG JA OC@ ADG@N OJ DON JPOKPO. HSFQ M@>@DQ@N OC<O JPOKPO
OCMJPBC DON DIKPO <I? KMDION OC@ GDI@N OC<O >JIO<DI EFOFNF.E OJ DON JRI JPOKPO.
Files
87.24
t
JNQPSU TUE.TUEJP;
JNQPSU TUE.TUSJOH;
WPJE NBJO()
\
XSJUF("1MFBTF FOUFS UIF OBNF PG UIF GJMF UP SFBE GSPN: ");
TUSJOH JO'JMF/BNF = DIPNQ(SFBEMO());
'JMF JO'JMF = 'JMF(JO'JMF/BNF, "S");
TUSJOH PVU'JMF/BNF = JO'JMF/BNF _ ".PVU";
'JMF PVU'JMF = 'JMF(PVU'JMF/BNF, "X");
XIJMF (!JO'JMF.FPG()) \
TUSJOH MJOF = DIPNQ(JO'JMF.SFBEMO());
JG (MJOF.MFOHUI != 0) \
PVU'JMF.XSJUFMO(MJOF);
^
^
XSJUFMO(PVU'JMF/BNF, " IBT CFFO DSFBUFE.");
^
BVUP and UZQFPG
87.25
1. 4@ ><I PN@ UZQFPG OJ ?@O@MHDI@ OC@ OTK@ JA OC@ GDO@M<G <I? .TUSJOHPG OJ B@O OC@ I<H@ JA
OC<O OTK@ <N TUSJOH:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
XSJUFMO(UZQFPG(1.2).TUSJOHPG);
^
1C@ JPOKPO:
EPVCMF
The GPS Loop
87.26
1.
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
GPS (JOU MJOF = 0; MJOF != 9; ++MJOF) \
EJ7D5;E7 (A>GF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
662
GPS (JOU DPMVNO = 0; DPMVNO != 9; ++DPMVNO) \
XSJUF(MJOF, ',', DPMVNO, ' ');
^
XSJUFMO();
^
^
2. 1MD<IBG@:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
GPS (JOU MJOF = 0; MJOF != 9; ++MJOF) \
JOU MFOHUI = MJOF + 1;
GPS (JOU J = 0; J != MFOHUI; ++J) \
XSJUF('*');
^
XSJUFMO();
^
^
-<M<GG@GGJBM<H:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
GPS (JOU MJOF = 0; MJOF != 9; ++MJOF) \
GPS (JOU J = 0; J != MJOF; ++J) \
XSJUF(' ');
^
XSJUFMO("********");
^
^
<I TJP KMJ?P>@ OC@ ?D<HJI? K<OO@MI?
*
***
*****
*******
*****
***
*
The Ternary Operator :
87.27
1. AGOCJPBC DO H<T H<F@ HJM@ N@IN@ OJ PN@ <I JG-FMTF NO<O@H@IO DI OCDN @S@M>DN@, OC@
AJGGJRDIB KMJBM<H PN@N ORJ : JK@M<OJMN:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
XSJUF("1MFBTF FOUFS UIF OFU BNPVOU: ");
JOU BNPVOU;
EJ7D5;E7 (A>GF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
663
SFBEG(" %T", &BNPVOU);
XSJUFMO("$",
BNPVOU < 0 -BNPVOU : BNPVOU,
BNPVOU < 0 " MPTU" : " HBJOFE");
^
1C@ KMJBM<H KMDION "B<DI@?" @Q@I RC@I OC@ Q<GP@ DN U@MJ. *J?DAT OC@ KMJBM<H OJ
KMDIO < H@NN<B@ HJM@ <KKMJKMD<O@ AJM U@MJ.
Literals
87.28
1. 1C@ KMJ=G@H C@M@ DN OC<O OC@ Q<GP@ JI OC@ MDBCO-C<I? ND?@ DN OJJ G<MB@ OJ ADO DI <I JOU.
A>>JM?DIB OJ OC@ MPG@N <=JPO DIO@B@M GDO@M<GN, DON OTK@ DN MPOH. #JM OC<O M@<NJI DO ?J@NI'O ADO
OC@ OTK@ JA OC@ Q<MD<=G@ JI OC@ G@AO-C<I? ND?@. 1C@M@ <M@ <O G@<NO ORJ NJGPODJIN.
,I@ NJGPODJI DN OJ G@<Q@ OC@ OTK@ JA OC@ Q<MD<=G@ OJ OC@ >JHKDG@M AJM @S<HKG@ =T OC@
BVUP F@TRJM?:
BVUP BNPVOU = 10@000@000@000;
1C@ OTK@ JA BNPVOU RJPG? =@ ?@?P>@? OJ =@ MPOH AMJH DON DIDOD<G Q<GP@ AMJH OC@ MDBCO-
C<I? ND?@.
AIJOC@M NJGPODJI DN OJ H<F@ OC@ OTK@ JA OC@ Q<MD<=G@ MPOH <N R@GG:
MPOH BNPVOU = 10@000@000@000;
2. 4@ ><I O<F@ <?Q<IO<B@ JA OC@ NK@>D<G '=S' >C<M<>O@M OC<O O<F@N OC@ KMDIODIB OJ OC@
=@BDIIDIB JA OC@ GDI@.
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
GPS (JOU OVNCFS = 0; ; ++OVNCFS) \
XSJUF("=S/VNCFS: ", OVNCFS);
^
^
1C@ JPOKPO JA OC<O KMJBM<H H<T =@ @MM<OD> ?P@ OJ DON DIO@M<>ODJIN RDOC OC@ JPOKPO
=PAA@M. 1C@ AJGGJRDIB KMJBM<H AGPNC@N OC@ JPOKPO =PAA@M <I? R<DON AJM 10 HDGGDN@>JI?
<AO@M @<>C RMDO@:
JNQPSU TUE.TUEJP;
JNQPSU DPSF.UISFBE;
WPJE NBJO()
\
GPS (JOU OVNCFS = 0; ; ++OVNCFS) \
XSJUF("=S/VNCFS: ", OVNCFS);
TUEPVU.GMVTI();
5ISFBE.TMFFQ(10.NTFDT);
^
^
#GPNCDIB OC@ JPOKPO DN IJMH<GGT IJO I@>@NN<MT <N DO DN AGPNC@? <POJH<OD><GGT =@AJM@
B@OODIB OJ OC@ I@SO GDI@ @.B. =T XSJUFMO, JM =@AJM@ M@<?DIB AMJH TUEJO.
EJ7D5;E7 (A>GF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
664
Formatted Output
87.29
1. 4@ C<Q@ <GM@<?T N@@I OC<O OCDN DN OMDQD<G RDOC AJMH<O NK@>DAD@MN:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
XSJUFMO("(&OUFS 0 UP FYJU UIF QSPHSBN.)");
XIJMF (USVF) \
XSJUF("1MFBTF FOUFS B OVNCFS: ");
MPOH OVNCFS;
SFBEG(" %T", &OVNCFS);
JG (OVNCFS == 0) \
CSFBL;
^
XSJUFGMO("%1$E <=> %1$#Y", OVNCFS);
^
^
2. /@H@H=@MDIB OC<O OC@ % >C<M<>O@M HPNO <KK@<M ORD>@ DI OC@ AJMH<O NOMDIB OJ =@ KMDIO@? <N
DON@GA:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
XSJUF("1MFBTF FOUFS UIF QFSDFOUBHF WBMVF: ");
EPVCMF QFSDFOUBHF;
SFBEG(" %T", &QFSDFOUBHF);
XSJUFGMO("%%%.2G", QFSDFOUBHF);
^
Formatted Input
87.30
1. 2NDIB < AJMH<O NOMDIB RC@M@ OC@ K<MON JA OC@ ?<O@ <M@ M@KG<>@? RDOC %T RJPG? =@
NPAAD>D@IO:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
JOU ZFBS;
JOU NPOUI;
JOU EBZ;
SFBEG("%T.%T.%T", &ZFBS, &NPOUI, &EBZ);
XSJUFMO(".POUI: ", NPOUI);
^
The EP-XIJMF Loop
87.31
1. 1CDN KMJBM<H DN IJO ?DM@>OGT M@G<O@? OJ OC@ EP-XIJMF GJJK, <N <IT KMJ=G@H OC<O DN NJGQ@? =T
OC@ EP-XIJMF GJJK ><I <GNJ =@ NJGQ@? =T OC@ JOC@M GJJK NO<O@H@ION.
1C@ KMJBM<H ><I BP@NN OC@ IPH=@M OC<O OC@ PN@M DN OCDIFDIB JA =T NCJMO@IDIB OC@
><I?D?<O@ M<IB@ AMJH OJK JM =JOOJH <>>JM?DIB OJ OC@ PN@M'N <INR@MN. #JM @S<HKG@, DA
DON ADMNO BP@NN DN 50 <I? OC@ PN@M'N M@KGT DN OC<O OC@ N@>M@O IPH=@M DN BM@<O@M, OC@
EJ7D5;E7 (A>GF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
665
KMJBM<H RJPG? OC@I FIJR OC<O OC@ IPH=@M HPNO =@ DI OC@ M<IB@ 851,100:. &A OC@
KMJBM<H OC@I BP@NN@N <IJOC@M IPH=@M MDBCO DI OC@ HD??G@ JA OC<O M<IB@, OCDN ODH@ OC@
IPH=@M RJPG? =@ FIJRI OJ =@ @DOC@M DI OC@ M<IB@ 851,75: JM DI OC@ M<IB@ 876,100:.
4C@I OC@ NDU@ JA OC@ M<IB@ DN 1, OC@ KMJBM<H RJPG? =@ NPM@ OC<O DO HPNO =@ OC@
IPH=@M OC<O OC@ PN@M C<N BP@NN@?.
Associative Arrays
87.32
1. w 1C@ .LFZT KMJK@MOT M@OPMIN < NGD>@ (D.@. ?TI<HD> <MM<T) OC<O DI>GP?@N <GG JA OC@
F@TN JA OC@ <NNJ>D<ODQ@ <MM<T. &O@M<ODIB JQ@M OCDN NGD>@ <I? M@HJQDIB OC@ @G@H@IO
AJM @<>C F@T =T ><GGDIB .SFNPWF RJPG? M@NPGO DI <I @HKOT <NNJ>D<ODQ@ <MM<T:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
TUSJOH<JOU> OBNFT =
<
1 : "POF",
10 : "UFO",
100 : "IVOESFE",
>;
XSJUFMO("*OJUJBM MFOHUI: ", OBNFT.MFOHUI);
JOU<> LFZT = OBNFT.LFZT;
GPS (JOU J = 0; J != LFZT.MFOHUI; ++J) \
XSJUFGMO("3FNPWJOH UIF FMFNFOU GPS %T", LFZT<J>);
OBNFT.SFNPWF(LFZT<J>);
^
XSJUFMO("'JOBM MFOHUI: ", OBNFT.MFOHUI);
^
1C<O NJGPODJI H<T =@ NGJR @NK@>D<GGT AJM G<MB@ <MM<TN. 1C@ AJGGJRDIB H@OCJ?N
RJPG? @HKOT OC@ <MM<T DI < NDIBG@ NO@K.
w AIJOC@M NJGPODJI DN OJ <NNDBI <I @HKOT <MM<T:
TUSJOH<JOU> FNQUZ"";
OBNFT = FNQUZ"";
w 0DI>@ OC@ DIDOD<G Q<GP@ JA <I <MM<T DN <I @HKOT <MM<T <ITR<T, OC@ AJGGJRDIB H@OCJ?
RJPG? <>CD@Q@ OC@ N<H@ M@NPGO:
OBNFT = OBNFT.JOJU;
2. 1C@ BJ<G DN OJ NOJM@ HPGODKG@ BM<?@N K@M NOP?@IO. 0DI>@ HPGODKG@ BM<?@N ><I =@ NOJM@? DI <
?TI<HD> <MM<T, <I <NNJ>D<ODQ@ <MM<T OC<O H<KN AMJH TUSJOH OJ JOU<> RJPG? RJMF C@M@.
1C@ BM<?@N ><I =@ <KK@I?@? OJ OC@ ?TI<HD> <MM<TN OC<O <M@ NOJM@? DI OC@ <NNJ>D<ODQ@
<MM<T:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
/* 5IF LFZ UZQF PG UIJT BTTPDJBUJWF BSSBZ JT TUSJOH BOE
* UIF WBMVF UZQF JT JOU<>, J.F. BO BSSBZ PG JOUT. 5IF
* BTTPDJBUJWF BSSBZ JT CFJOH EFGJOFE XJUI BO FYUSB
* TQBDF JO CFUXFFO UP IFMQ EJTUJOHVJTI UIF WBMVF UZQF: */
EJ7D5;E7 (A>GF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
666
JOU<> <TUSJOH> HSBEFT;
/* 5IF BSSBZ PG JOUT UIBU DPSSFTQPOE UP "FNSF" JT CFJOH
* VTFE GPS BQQFOEJOH UIF OFX HSBEF UP UIBU BSSBZ: */
HSBEFT<"FNSF"> _= 90;
HSBEFT<"FNSF"> _= 85;
/* 1SJOUJOH UIF HSBEFT PG "FNSF": */
XSJUFMO(HSBEFT<"FNSF">);
^
1C@ BM<?@N ><I <GNJ =@ <NNDBI@? <GOJB@OC@M <N <I <MM<T:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
JOU<><TUSJOH> HSBEFT;
HSBEFT<"FNSF"> = < 90, 85, 95 >;
XSJUFMO(HSBEFT<"FNSF">);
^
The GPSFBDI Loop
87.33
1. 1J C<Q@ <I <NNJ>D<ODQ@ <MM<T OC<O RJMFN OC@ JKKJNDO@ JA OBNFT, OC@ OTK@N JA OC@ F@T <I?
OC@ Q<GP@ HPNO =@ NR<KK@?. 1C@ I@R <NNJ>D<ODQ@ <MM<T HPNO =@ ?@ADI@? <N JA OTK@
JOU<TUSJOH>.
&O@M<ODIB JQ@M OC@ F@TN <I? OC@ Q<GP@N JA OC@ JMDBDI<G <NNJ>D<ODQ@ <MM<T RCDG@ PNDIB
F@TN <N Q<GP@N <I? Q<GP@N <N F@TN RJPG? KJKPG<O@ OC@ OVNCFST O<=G@:
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
TUSJOH<JOU> OBNFT = < 1:"POF", 7:"TFWFO", 20:"UXFOUZ" >;
JOU<TUSJOH> WBMVFT;
GPSFBDI (LFZ, WBMVF; OBNFT) \
WBMVFT<WBMVF> = LFZ;
^
XSJUFMO(WBMVFT<"UXFOUZ">);
^
TXJUDI and DBTF
87.34
1.
JNQPSU TUE.TUEJP;
JNQPSU TUE.TUSJOH;
WPJE NBJO()
\
TUSJOH PQ;
EPVCMF GJSTU;
EPVCMF TFDPOE;
XSJUF("1MFBTF FOUFS UIF PQFSBUJPO: ");
PQ = DIPNQ(SFBEMO());
EJ7D5;E7 (A>GF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
667
XSJUF("1MFBTF FOUFS UXP WBMVFT TFQBSBUFE CZ B TQBDF: ");
SFBEG(" %T %T", &GJSTU, &TFDPOE);
EPVCMF SFTVMU;
GJOBM TXJUDI (PQ) \
DBTF "BEE":
SFTVMU = GJSTU + TFDPOE;
CSFBL;
DBTF "TVCUSBDU":
SFTVMU = GJSTU - TFDPOE;
CSFBL;
DBTF "NVMUJQMZ":
SFTVMU = GJSTU * TFDPOE;
CSFBL;
DBTF "EJWJEF":
SFTVMU = GJSTU / TFDPOE;
CSFBL;
^
XSJUFMO(SFTVMU);
^
2. BT O<FDIB <?Q<IO<B@ JA ?DNODI>O DBTF Q<GP@N:
GJOBM TXJUDI (PQ) \
DBTF "BEE", "+":
SFTVMU = GJSTU + TFDPOE;
CSFBL;
DBTF "TVCUSBDU", "-":
SFTVMU = GJSTU - TFDPOE;
CSFBL;
DBTF "NVMUJQMZ", "*":
SFTVMU = GJSTU * TFDPOE;
CSFBL;
DBTF "EJWJEF", "/":
SFTVMU = GJSTU / TFDPOE;
CSFBL;
^
3. 0DI>@ OC@ EFGBVMU N@>ODJI DN I@@?@? OJ OCMJR OC@ @S>@KODJI AMJH, DO ><IIJO =@ < GJOBM
TXJUDI NO<O@H@IO <ITHJM@. %@M@ <M@ OC@ K<MON JA OC@ KMJBM<H OC<O <M@ HJ?DAD@?:
// ...
TXJUDI (PQ) \
// ...
EFGBVMU:
UISPX OFX &YDFQUJPO("*OWBMJE PQFSBUJPO: " _ PQ);
^
// ...
FOVN
87.35
1.
EJ7D5;E7 (A>GF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
668
JNQPSU TUE.TUEJP;
JNQPSU TUE.DPOW;
FOVN 0QFSBUJPO \ FYJU, BEE, TVCUSBDU, NVMUJQMZ, EJWJEF ^
WPJE NBJO()
\
// 1SJOU UIF TVQQPSUFE PQFSBUJPOT
XSJUF("0QFSBUJPOT - ");
GPS (0QFSBUJPO PQFSBUJPO;
PQFSBUJPO <= 0QFSBUJPO.NBY;
++PQFSBUJPO) \
XSJUFG("%E:%T ", PQFSBUJPO, PQFSBUJPO);
^
XSJUFMO();
// *OGJOJUF MPPQ VOUJM UIF VTFS XBOUT UP FYJU
XIJMF (USVF) \
XSJUF("0QFSBUJPO ");
// 5IF JOQVU NVTU CF SFBE JO UIF BDUVBM UZQF (JOU) PG
// UIF FOVN
JOU PQFSBUJPO$PEF;
SFBEG(" %T", &PQFSBUJPO$PEF);
/*
8F XJMM TUBSU VTJOH FOVN WBMVFT JOTUFBE PG NBHJD
DPOTUBOUT GSPN UIJT QPJOU PO. 4P UIF PQFSBUJPO DPEF
UIBU IBT CFFO SFBE JO JOU NVTU CF DPOWFSUFE UP JUT
DPSSFTQPOEJOH FOVN WBMVF.
(5ZQF DPOWFSTJPOT XJMM CF DPWFSFE JO NPSF EFUBJM JO
B MBUFS DIBQUFS.)
*/
0QFSBUJPO PQFSBUJPO = DBTU(0QFSBUJPO)PQFSBUJPO$PEF;
JG ((PQFSBUJPO < 0QFSBUJPO.NJO) ]]
(PQFSBUJPO > 0QFSBUJPO.NBY)) \
XSJUFMO("&3303: *OWBMJE PQFSBUJPO");
DPOUJOVF;
^
JG (PQFSBUJPO == 0QFSBUJPO.FYJU) \
XSJUFMO("(PPECZF!");
CSFBL;
^
EPVCMF GJSTU;
EPVCMF TFDPOE;
EPVCMF SFTVMU;
XSJUF(" 'JSTU PQFSBOE ");
SFBEG(" %T", &GJSTU);
XSJUF("4FDPOE PQFSBOE ");
SFBEG(" %T", &TFDPOE);
TXJUDI (PQFSBUJPO) \
DBTF 0QFSBUJPO.BEE:
SFTVMU = GJSTU + TFDPOE;
CSFBL;
DBTF 0QFSBUJPO.TVCUSBDU:
SFTVMU = GJSTU - TFDPOE;
CSFBL;
DBTF 0QFSBUJPO.NVMUJQMZ:
SFTVMU = GJSTU * TFDPOE;
CSFBL;
EJ7D5;E7 (A>GF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
669
DBTF 0QFSBUJPO.EJWJEF:
SFTVMU = GJSTU / TFDPOE;
CSFBL;
EFGBVMU:
UISPX OFX &YDFQUJPO(
"&3303: 5IJT MJOF TIPVME IBWF OFWFS CFFO SFBDIFE.");
^
XSJUFMO(" 3FTVMU: ", SFTVMU);
^
^
Functions
87.36
1.
JNQPSU TUE.TUEJP;
WPJE QSJOU.FOV(TUSJOH<> JUFNT, JOU GJSTU/VNCFS)
\
GPSFBDI (J, JUFN; JUFNT) \
XSJUFMO(' ', J + GJSTU/VNCFS, ' ', JUFN);
^
^
WPJE NBJO()
\
TUSJOH<> JUFNT =
< "#MBDL", "3FE", "(SFFO", "#MVF", "8IJUF" >;
QSJOU.FOV(JUFNT, 1);
^
2. %@M@ <M@ NJH@ D?@<N:
w 4MDO@ < API>ODJI I<H@? ESBX)PSJ[POUBM-JOF() OJ ?M<R CJMDUJIO<G GDI@N.
w 4MDO@ < API>ODJI I<H@? ESBX4RVBSF() OJ ?M<R NLP<M@N. 1CDN API>ODJI >JPG? O<F@
<?Q<IO<B@ JA ESBX7FSUJDBM-JOF() <I? ESBX)PSJ[POUBM-JOF() RC@I ?M<RDIB OC@
NLP<M@.
w &HKMJQ@ OC@ API>ODJIN OJ <GNJ O<F@ OC@ >C<M<>O@M OC<O DN PN@? RC@I "?M<RDIB". 1CDN
RJPG? <GGJR ?M<RDIB @<>C NC<K@ RDOC < ?DAA@M@IO >C<M<>O@M:
WPJE QVU%PU($BOWBT DBOWBT, JOU MJOF, JOU DPMVNO, EDIBS EPU)
\
DBOWBT<MJOF><DPMVNO> = EPU;
^
Function Parameters
87.37
1. B@><PN@ OC@ K<M<H@O@MN JA OCDN API>ODJI <M@ OC@ FDI? OC<O B@ON >JKD@? AMJH OC@ <MBPH@ION,
RC<O B@O NR<KK@? DI OC@ API>ODJI <M@ OCJN@ >JKD@N.
1J H<F@ OC@ API>ODJI NR<K OC@ <MBPH@ION, =JOC JA OC@ K<M<H@O@MN HPNO =@ K<NN@? =T
M@A@M@I>@:
WPJE TXBQ(SFG JOU GJSTU, SFG JOU TFDPOE)
\
JNNVUBCMF JOU UFNQ = GJSTU;
GJSTU = TFDPOE;
TFDPOE = UFNQ;
^
EJ7D5;E7 (A>GF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
670
4DOC OC<O >C<IB@, IJR OC@ Q<MD<=G@N DI NBJO() RJPG? =@ NR<KK@?:
2 1
AGOCJPBC IJO M@G<O@? OJ OC@ JMDBDI<G KMJ=G@H, <GNJ IJO@ OC<O UFNQ DN NK@>DAD@? <N
JNNVUBCMF <N DO RJPG? IJO =@ >C<IB@? DI OC@ API>ODJI JI>@ C<QDIB =@@I DIDOD<GDU@?.
Program Environment
87.38
1.
JNQPSU TUE.TUEJP;
JNQPSU TUE.DPOW;
JOU NBJO(TUSJOH<> BSHT)
\
JG (BSHT.MFOHUI != 4) \
TUEFSS.XSJUFMO(
"&3303! 6TBHF: =O ", BSHT<0>,
" B@OVNCFS PQFSBUPS BOPUIFS@OVNCFS");
SFUVSO 1;
^
JNNVUBCMF GJSTU = UP!EPVCMF(BSHT<1>);
TUSJOH PQ = BSHT<2>;
JNNVUBCMF TFDPOE = UP!EPVCMF(BSHT<3>);
TXJUDI (PQ) \
DBTF "+":
XSJUFMO(GJSTU + TFDPOE);
CSFBL;
DBTF "-":
XSJUFMO(GJSTU - TFDPOE);
CSFBL;
DBTF "Y":
XSJUFMO(GJSTU * TFDPOE);
CSFBL;
DBTF "/":
XSJUFMO(GJSTU / TFDPOE);
CSFBL;
EFGBVMU:
UISPX OFX &YDFQUJPO("*OWBMJE PQFSBUPS: " _ PQ);
^
SFUVSO 0;
^
2.
JNQPSU TUE.TUEJP;
JNQPSU TUE.QSPDFTT;
WPJE NBJO()
\
XSJUF("1MFBTF FOUFS UIF DPNNBOE MJOF UP FYFDVUF: ");
TUSJOH DPNNBOE-JOF = SFBEMO();
XSJUFMO("3FUVSO WBMVF: ", TZTUFN(DPNNBOE-JOF));
^
EJ7D5;E7 (A>GF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
671
BTTFSU and FOGPSDF
87.39
1. 6JP RDGG IJOD>@ OC<O OC@ KMJBM<H O@MHDI<O@N IJMH<GGT RC@I TJP @IO@M 06:09 <I? 1:2.
%JR@Q@M, TJP H<T IJOD>@ OC<O OC@ NO<MO ODH@ DN IJO RC<O C<N =@@I @IO@M@? =T OC@ PN@M:
1 IPVST BOE 2 NJOVUFT BGUFS 09:06 JT 10:08.
AN TJP ><I N@@, <GOCJPBC OC@ ODH@ OC<O C<N =@@I @IO@M@? <N 06:09, OC@ JPOKPO
>JIO<DIN 09:06. 1CDN @MMJM RDGG =@ ><PBCO =T OC@ C@GK JA <I BTTFSU DI OC@ I@SO
KMJ=G@H.
2. 1C@ BTTFSU A<DGPM@ <AO@M @IO@MDIB 06:09 <I? 15:2 O<F@N PN OJ OC@ AJGGJRDIB GDI@:
TUSJOH UJNF5P4USJOH(JO JOU IPVS, JO JOU NJOVUF)
\
BTTFSU((IPVS >= 0) && (IPVS <= 23));
// ...
^
#JM OCDN BTTFSU >C@>F OJ A<DG, OCDN API>ODJI HPNO C<Q@ =@@I ><GG@? RDOC DIQ<GD? IPVS
Q<GP@.
1C@ JIGT ORJ ><GGN OJ UJNF5P4USJOH() DI OC@ KMJBM<H ?J IJO <KK@<M OJ C<Q@ <IT
KMJ=G@HN:
XSJUFGMO("%T IPVST BOE %T NJOVUFT BGUFS %T JT %T.",
EVSBUJPO)PVS, EVSBUJPO.JOVUF,
UJNF5P4USJOH(TUBSU)PVS, TUBSU.JOVUF),
UJNF5P4USJOH(FOE)PVS, FOE.JOVUF));
A GDOOG@ HJM@ DIQ@NODB<ODJI NCJPG? M@Q@<G OC@ <>OP<G ><PN@ JA OC@ =PB: 1C@ CJPM <I?
HDIPO@ Q<MD<=G@N <M@ NR<KK@? RC@I M@<?DIB OC@ NO<MO ODH@:
SFBE5JNF("4UBSU UJNF", TUBSU.JOVUF, TUBSU)PVS);
1C<O KMJBM<HHDIB @MMJM ><PN@N OC@ ODH@ OJ =@ DIO@MKM@O@? <N 09:06 <I?
DI>M@H@IODIB DO =T ?PM<ODJI 15:2 ><PN@N <I DIQ<GD? CJPM Q<GP@.
AI J=QDJPN >JMM@>ODJI DN OJ K<NN OC@ CJPM <I? HDIPO@ Q<MD<=G@N DI OC@ MDBCO JM?@M:
SFBE5JNF("4UBSU UJNF", TUBSU)PVS, TUBSU.JOVUF);
1C@ JPOKPO:
4UBSU UJNF ()):..) 06:09
%VSBUJPO ()):..) 15:2
15 IPVST BOE 2 NJOVUFT BGUFS 06:09 JT 21:11.
3. &O DN <B<DI OC@ N<H@ BTTFSU >C@>F:
BTTFSU((IPVS >= 0) && (IPVS <= 23));
1C@ M@<NJI DN OC<O BEE%VSBUJPO() ><I KMJ?P>@ CJPM Q<GP@N OC<O <M@ BM@<O@M OC<I 23.
A??DIB < D7?3;@67D JK@M<ODJI <O OC@ @I? RJPG? @INPM@ JI@ JA OC@ AGFBGF 9G3D3@F77E
JA OC@ API>ODJI:
EJ7D5;E7 (A>GF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
672
WPJE BEE%VSBUJPO(JO JOU TUBSU)PVS, JO JOU TUBSU.JOVUF,
JO JOU EVSBUJPO)PVS, JO JOU EVSBUJPO.JOVUF,
PVU JOU SFTVMU)PVS, PVU JOU SFTVMU.JOVUF)
\
SFTVMU)PVS = TUBSU)PVS + EVSBUJPO)PVS;
SFTVMU.JOVUF = TUBSU.JOVUF + EVSBUJPO.JOVUF;
JG (SFTVMU.JOVUF > 59) \
++SFTVMU)PVS;
^
SFTVMU)PVS %= 24;
^
,=N@MQ@ OC<O OC@ API>ODJI C<N JOC@M KMJ=G@HN. #JM @S<HKG@, SFTVMU.JOVUF H<T @I?
PK =@DIB BM@<O@M OC<I 59. 1C@ AJGGJRDIB API>ODJI ><G>PG<O@N OC@ HDIPO@ Q<GP@
>JMM@>OGT <I? H<F@N NPM@ OC<O OC@ API>ODJI'N JPOKPO BP<M<IO@@N <M@ @IAJM>@?:
WPJE BEE%VSBUJPO(JO JOU TUBSU)PVS, JO JOU TUBSU.JOVUF,
JO JOU EVSBUJPO)PVS, JO JOU EVSBUJPO.JOVUF,
PVU JOU SFTVMU)PVS, PVU JOU SFTVMU.JOVUF)
\
SFTVMU)PVS = TUBSU)PVS + EVSBUJPO)PVS;
SFTVMU.JOVUF = TUBSU.JOVUF + EVSBUJPO.JOVUF;
SFTVMU)PVS += SFTVMU.JOVUF / 60;
SFTVMU)PVS %= 24;
SFTVMU.JOVUF %= 60;
BTTFSU((SFTVMU)PVS >= 0) && (SFTVMU)PVS <= 23));
BTTFSU((SFTVMU.JOVUF >= 0) && (SFTVMU.JOVUF <= 59));
^
4. $JJ? GP>F.
Unit Testing
87.40
t 1C@ ADMNO OCDIB OJ ?J DN OJ >JHKDG@ <I? MPI OC@ KMJBM<H OJ @INPM@ OC<O OC@ O@NON <>OP<GGT
RJMF <I? DI?@@? A<DG:
$ ENE EFOFNF.E -PGEFOFNF -X -VOJUUFTU
$ ./EFOFNF
DPSF.FYDFQUJPO."TTFSU&SSPS!EFOFNF(11): VOJUUFTU GBJMVSF
1C@ GDI@ IPH=@M 11 DI?D><O@N OC<O OC@ ADMNO JI@ JA OC@ O@NON C<N A<DG@?.
#JM ?@HJINOM<ODJI KPMKJN@N G@O'N RMDO@ <I J=QDJPNGT DI>JMM@>O DHKG@H@IO<ODJI OC<O
K<NN@N OC@ ADMNO O@NO =T <>>D?@IO. 1C@ AJGGJRDIB API>ODJI NDHKGT M@OPMIN < >JKT JA OC@
DIKPO:
ETUSJOH UP'SPOU(ETUSJOH TUS, JO EDIBS MFUUFS)
\
ETUSJOH SFTVMU;
GPSFBDI (D; TUS) \
SFTVMU _= D;
^
SFUVSO SFTVMU;
^
VOJUUFTU
EJ7D5;E7 (A>GF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
673
\
JNNVUBCMF TUS = "IFMMP"E;
BTTFSU(UP'SPOU(TUS, 'I') == "IFMMP");
BTTFSU(UP'SPOU(TUS, 'P') == "PIFMM");
BTTFSU(UP'SPOU(TUS, 'M') == "MMIFP");
^
WPJE NBJO()
\^
1C@ ADMNO O@NO K<NN@N =PO OC@ N@>JI? JI@ A<DGN:
$ ./EFOFNF
DPSF.FYDFQUJPO."TTFSU&SSPS!EFOFNF.E(17): VOJUUFTU GBJMVSF
%@M@ DN < >JMM@>O DHKG@H@IO<ODJI OC<O K<NN@N <GG JA OC@ O@NON:
ETUSJOH UP'SPOU(ETUSJOH TUS, JO EDIBS MFUUFS)
\
EDIBS<> GJSTU1BSU;
EDIBS<> MBTU1BSU;
GPSFBDI (D; TUS) \
JG (D == MFUUFS) \
GJSTU1BSU _= D;
^ FMTF \
MBTU1BSU _= D;
^
^
SFUVSO (GJSTU1BSU _ MBTU1BSU).JEVQ;
^
VOJUUFTU
\
JNNVUBCMF TUS = "IFMMP"E;
BTTFSU(UP'SPOU(TUS, 'I') == "IFMMP");
BTTFSU(UP'SPOU(TUS, 'P') == "PIFMM");
BTTFSU(UP'SPOU(TUS, 'M') == "MMIFP");
^
WPJE NBJO()
\^
1C@ O@NON ADI<GGT K<NN:
$ ./EFOFNF
$
1CDN API>ODJI ><I IJR =@ HJ?DAD@? DI ?DAA@M@IO R<TN PI?@M OC@ >JIAD?@I>@ OC<O DON
O@NON RDGG C<Q@ OJ K<NN. 1C@ AJGGJRDIB ORJ DHKG@H@IO<ODJIN <M@ Q@MT ?DAA@M@IO AMJH OC@
ADMNO JI@ =PO OC@T OJJ <M@ >JMM@>O <>>JM?DIB OJ OC@ O@NON.
w AI DHKG@H@IO<ODJI OC<O O<F@N <?Q<IO<B@ JA TUE.BMHPSJUIN.QBSUJUJPO:
JNQPSU TUE.BMHPSJUIN;
ETUSJOH UP'SPOU(ETUSJOH TUS, JO EDIBS MFUUFS)
\
EDIBS<> SFTVMU = TUS.EVQ;
QBSUJUJPO!(D => D == MFUUFS, 4XBQ4USBUFHZ.TUBCMF)(SFTVMU);
EJ7D5;E7 (A>GF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
674
SFUVSO SFTVMU.JEVQ;
^
VOJUUFTU
\
JNNVUBCMF TUS = "IFMMP"E;
BTTFSU(UP'SPOU(TUS, 'I') == "IFMMP");
BTTFSU(UP'SPOU(TUS, 'P') == "PIFMM");
BTTFSU(UP'SPOU(TUS, 'M') == "MMIFP");
^
WPJE NBJO()
\^
Note: ):7 => EK@F3J F:3F 3BB73DE ;@ F:7 BDA9D3? 34AH7 5D73F7E 3 >3?463
8G@5F;A@. ,7 I;>> E77 >3?463 8G@5F;A@E ;@ >3F7D 5:3BF7DE.
w 1C@ AJGGJRDIB DHKG@H@IO<ODJI ADMNO >JPION CJR H<IT ODH@N OC@ NK@>D<G G@OO@M
<KK@<MN DI OC@ NOMDIB. 1C<O DIAJMH<ODJI DN OC@I N@IO OJ < N@K<M<O@ API>ODJI I<H@?
SFQFBUFE() OJ KMJ?P>@ OC@ ADMNO K<MO JA OC@ M@NPGO. +JO@ OC<O SFQFBUFE() C<N < N@O
JA PIDO O@NON JA DON JRI:
ETUSJOH SFQFBUFE(TJ[F@U DPVOU, EDIBS MFUUFS)
\
ETUSJOH SFTVMU;
GPSFBDI (J; 0..DPVOU) \
SFTVMU _= MFUUFS;
^
SFUVSO SFTVMU;
^
VOJUUFTU
\
BTTFSU(SFQFBUFE(3, '[') == "[[[");
BTTFSU(SFQFBUFE(10, 'a') == "aaaaaaaaaa");
^
ETUSJOH UP'SPOU(ETUSJOH TUS, JO EDIBS MFUUFS)
\
TJ[F@U TQFDJBM-FUUFS$PVOU;
ETUSJOH MBTU1BSU;
GPSFBDI (D; TUS) \
JG (D == MFUUFS) \
++TQFDJBM-FUUFS$PVOU;
^ FMTF \
MBTU1BSU _= D;
^
^
SFUVSO SFQFBUFE(TQFDJBM-FUUFS$PVOU, MFUUFS) _ MBTU1BSU;
^
VOJUUFTU
\
JNNVUBCMF TUS = "IFMMP"E;
BTTFSU(UP'SPOU(TUS, 'I') == "IFMMP");
BTTFSU(UP'SPOU(TUS, 'P') == "PIFMM");
BTTFSU(UP'SPOU(TUS, 'M') == "MMIFP");
^
EJ7D5;E7 (A>GF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
675
WPJE NBJO()
\^
Contract Programming
87.41
t 1C@ VOJUUFTU =GJ>F ><I =@ DHKG@H@IO@? OMDQD<GGT =T >JKTDIB OC@ >C@>FN OC<O <M@ <GM@<?T
RMDOO@I DI NBJO(). 1C@ JIGT <??DODJI =@GJR DN OC@ O@NO AJM OC@ ><N@ RC@I OC@ N@>JI? O@<H
RDIN:
JOU BEE1PJOUT(JO JOU HPBMT1,
JO JOU HPBMT2,
SFG JOU QPJOUT1,
SFG JOU QPJOUT2)
JO
\
BTTFSU(HPBMT1 >= 0);
BTTFSU(HPBMT2 >= 0);
BTTFSU(QPJOUT1 >= 0);
BTTFSU(QPJOUT2 >= 0);
^
PVU (SFTVMU)
\
BTTFSU((SFTVMU >= 0) && (SFTVMU <= 2));
^
CPEZ
\
JOU XJOOFS;
JG (HPBMT1 > HPBMT2) \
QPJOUT1 += 3;
XJOOFS = 1;
^ FMTF JG (HPBMT1 < HPBMT2) \
QPJOUT2 += 3;
XJOOFS = 2;
^ FMTF \
++QPJOUT1;
++QPJOUT2;
XJOOFS = 0;
^
SFUVSO XJOOFS;
^
VOJUUFTU
\
JOU QPJOUT1 = 10;
JOU QPJOUT2 = 7;
JOU XJOOFS;
// 'JSTU UFBN XJOT
XJOOFS = BEE1PJOUT(3, 1, QPJOUT1, QPJOUT2);
BTTFSU(QPJOUT1 == 13);
BTTFSU(QPJOUT2 == 7);
BTTFSU(XJOOFS == 1);
// %SBX
XJOOFS = BEE1PJOUT(2, 2, QPJOUT1, QPJOUT2);
BTTFSU(QPJOUT1 == 14);
BTTFSU(QPJOUT2 == 8);
BTTFSU(XJOOFS == 0);
// 4FDPOE UFBN XJOT
XJOOFS = BEE1PJOUT(0, 1, QPJOUT1, QPJOUT2);
BTTFSU(QPJOUT1 == 14);
BTTFSU(QPJOUT2 == 11);
EJ7D5;E7 (A>GF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
676
BTTFSU(XJOOFS == 2);
^
WPJE NBJO()
\
// ...
^
Structs
87.42
1. ,I@ JA OC@ NDHKG@NO ?@NDBIN DN OJ PN@ ORJ EDIBS H@H=@MN:
TUSVDU $BSE
\
EDIBS TVJU;
EDIBS WBMVF;
^
2. &O RJPG? =@ <N NDHKG@ <N KMDIODIB OC@ ORJ H@H=@MN ND?@ =T ND?@:
WPJE QSJOU$BSE(JO $BSE DBSE)
\
XSJUF(DBSE.TVJU, DBSE.WBMVF);
^
3. ANNPHDIB OC<O OC@M@ DN <GM@<?T < API>ODJI ><GG@? OFX4VJU(), OFX%FDL() ><I =@
DHKG@H@IO@? =T ><GGDIB OC<O API>ODJI AJM @<>C NPDO:
$BSE<> OFX%FDL()
PVU (SFTVMU)
\
BTTFSU(SFTVMU.MFOHUI == 52);
^
CPEZ
\
$BSE<> EFDL;
EFDL _= OFX4VJU('v');
EFDL _= OFX4VJU('w');
EFDL _= OFX4VJU('x');
EFDL _= OFX4VJU('y');
SFUVSO EFDL;
^
1C@ M@NO JA OC@ RJMF ><I =@ <>>JHKGDNC@? =T OC@ AJGGJRDIB OFX4VJU(), RCD>C
>JINOMP>ON OC@ NPDO =T >JH=DIDIB OC@ NPDO >C<M<>O@M RDOC @<>C Q<GP@ JA < NOMDIB:
$BSE<> OFX4VJU(JO EDIBS TVJU)
JO
\
BTTFSU((TVJU == 'v') ]]
(TVJU == 'w') ]]
(TVJU == 'x') ]]
(TVJU == 'y'));
^
PVU (SFTVMU)
\
BTTFSU(SFTVMU.MFOHUI == 13);
^
CPEZ
\
$BSE<> TVJU$BSET;
EJ7D5;E7 (A>GF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
677
GPSFBDI (WBMVF; "234567890+2,"") \
TVJU$BSET _= $BSE(TVJU, WBMVF);
^
SFUVSO TVJU$BSET;
^
+JO@ OC<O OC@ API>ODJIN <=JQ@ O<F@ <?Q<IO<B@ JA >JIOM<>O KMJBM<HHDIB OJ M@?P>@ MDNF
JA KMJBM<H @MMJMN.
4. 0R<KKDIB ORJ @G@H@ION <O M<I?JH RJPG? H<F@ OC@ ?@>F =@>JH@ HJM@ <I? HJM@ NCPAAG@?
<O @<>C M@K@ODODJI. AGOCJPBC DO DN KJNND=G@ OJ KD>F OC@ N<H@ @G@H@IO =T >C<I>@, NR<KKDIB
<I @G@H@IO RDOC DON@GA ?J@N IJO C<Q@ <IT @AA@>O JOC@M OC<I HDNNDIB <I JKKJMOPIDOT OJR<M?N
< HJM@ NCPAAG@? ?@>F.
WPJE TIVGGMF($BSE<> EFDL, JO JOU SFQFUJUJPO)
\
/* /PUF: " CFUUFS BMHPSJUIN JT UP XBML UIF EFDL GSPN UIF
* CFHJOOJOH UP UIF FOE BOE UP TXBQ FBDI FMFNFOU
* XJUI B SBOEPN POF UIBU JT QJDLFE BNPOH UIF
* FMFNFOUT GSPN UIBU QPJOU UP UIF FOE.
*
* *U XPVME CF FWFO CFUUFS UP DBMM SBOEPN4IVGGMF() GSPN
* UIF TUE.BMHPSJUIN NPEVMF, XIJDI BMSFBEZ BQQMJFT UIF
* TBNF BMHPSJUIN. 1MFBTF SFBE UIF DPNNFOU JO NBJO() UP
* TFF IPX SBOEPN4IVGGMF() DBO CF VTFE.
*/
GPSFBDI (J; 0 .. SFQFUJUJPO) \
// 1JDL UXP FMFNFOUT BU SBOEPN
JNNVUBCMF GJSTU = VOJGPSN(0, EFDL.MFOHUI);
JNNVUBCMF TFDPOE = VOJGPSN(0, EFDL.MFOHUI);
TXBQ(EFDL<GJSTU>, EFDL<TFDPOE>);
^
^
1C@ API>ODJI <=JQ@ ><GGN TUE.BMHPSJUIN.TXBQ, RCD>C NDHKGT NR<KN OC@ Q<GP@N JA DON
ORJ SFG K<M<H@O@MN. &O DN @AA@>ODQ@GT OC@ @LPDQ<G@IO JA OC@ AJGGJRDIB API>ODJI:
WPJE NZ4XBQ(SFG $BSE MFGU,
SFG $BSE SJHIU)
\
JNNVUBCMF UFNQPSBSZ = MFGU;
MFGU = SJHIU;
SJHIU = UFNQPSBSZ;
^
%@M@ DN OC@ @IODM@ KMJBM<H:
JNQPSU TUE.TUEJP;
JNQPSU TUE.SBOEPN;
JNQPSU TUE.BMHPSJUIN;
TUSVDU $BSE
\
EDIBS TVJU;
EDIBS WBMVF;
^
WPJE QSJOU$BSE(JO $BSE DBSE)
\
XSJUF(DBSE.TVJU, DBSE.WBMVF);
^
EJ7D5;E7 (A>GF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
678
$BSE<> OFX4VJU(JO EDIBS TVJU)
JO
\
BTTFSU((TVJU == 'v') ]]
(TVJU == 'w') ]]
(TVJU == 'x') ]]
(TVJU == 'y'));
^
PVU (SFTVMU)
\
BTTFSU(SFTVMU.MFOHUI == 13);
^
CPEZ
\
$BSE<> TVJU$BSET;
GPSFBDI (WBMVF; "234567890+2,"") \
TVJU$BSET _= $BSE(TVJU, WBMVF);
^
SFUVSO TVJU$BSET;
^
$BSE<> OFX%FDL()
PVU (SFTVMU)
\
BTTFSU(SFTVMU.MFOHUI == 52);
^
CPEZ
\
$BSE<> EFDL;
EFDL _= OFX4VJU('v');
EFDL _= OFX4VJU('w');
EFDL _= OFX4VJU('x');
EFDL _= OFX4VJU('y');
SFUVSO EFDL;
^
WPJE TIVGGMF($BSE<> EFDL, JO JOU SFQFUJUJPO)
\
/* /PUF: " CFUUFS BMHPSJUIN JT UP XBML UIF EFDL GSPN UIF
* CFHJOOJOH UP UIF FOE BOE UP TXBQ FBDI FMFNFOU
* XJUI B SBOEPN POF UIBU JT QJDLFE BNPOH UIF
* FMFNFOUT GSPN UIBU QPJOU UP UIF FOE.
*
* *U XPVME CF FWFO CFUUFS UP DBMM SBOEPN4IVGGMF() GSPN
* UIF TUE.BMHPSJUIN NPEVMF, XIJDI BMSFBEZ BQQMJFT UIF
* TBNF BMHPSJUIN. 1MFBTF SFBE UIF DPNNFOU JO NBJO() UP
* TFF IPX SBOEPN4IVGGMF() DBO CF VTFE.
*/
GPSFBDI (J; 0 .. SFQFUJUJPO) \
// 1JDL UXP FMFNFOUT BU SBOEPN
JNNVUBCMF GJSTU = VOJGPSN(0, EFDL.MFOHUI);
JNNVUBCMF TFDPOE = VOJGPSN(0, EFDL.MFOHUI);
TXBQ(EFDL<GJSTU>, EFDL<TFDPOE>);
^
^
WPJE NBJO()
\
$BSE<> EFDL = OFX%FDL();
TIVGGMF(EFDL, 100);
/* /PUF: *OTUFBE PG UIF TIVGGMF() DBMM BCPWF, JU XPVME CF
* CFUUFS UP DBMM SBOEPN4IVGGMF() BT JO UIF
* GPMMPXJOH MJOF:
*
EJ7D5;E7 (A>GF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
679
* SBOEPN4IVGGMF(EFDL);
*/
GPSFBDI (DBSE; EFDL) \
QSJOU$BSE(DBSE);
XSJUF(' ');
^
XSJUFMO();
^
Variable Number of Parameters
87.43
t #JM OC@ DBMDVMBUF() API>ODJI OJ =@ <=G@ OJ O<F@ Q<MD<=G@ IPH=@M JA K<M<H@O@MN, DON
K<M<H@O@M GDNO HPNO DI>GP?@ < NGD>@ JA $BMDVMBUJPO AJGGJR@? =T ...:
EPVCMF<> DBMDVMBUF(JO $BMDVMBUJPO<> DBMDVMBUJPOT ...)
\
EPVCMF<> SFTVMUT;
GPSFBDI (DBMDVMBUJPO; DBMDVMBUJPOT) \
GJOBM TXJUDI (DBMDVMBUJPO.PQ) \
DBTF 0QFSBUJPO.BEE:
SFTVMUT _= DBMDVMBUJPO.GJSTU + DBMDVMBUJPO.TFDPOE;
CSFBL;
DBTF 0QFSBUJPO.TVCUSBDU:
SFTVMUT _= DBMDVMBUJPO.GJSTU - DBMDVMBUJPO.TFDPOE;
CSFBL;
DBTF 0QFSBUJPO.NVMUJQMZ:
SFTVMUT _= DBMDVMBUJPO.GJSTU * DBMDVMBUJPO.TFDPOE;
CSFBL;
DBTF 0QFSBUJPO.EJWJEF:
SFTVMUT _= DBMDVMBUJPO.GJSTU / DBMDVMBUJPO.TFDPOE;
CSFBL;
^
^
SFUVSO SFTVMUT;
^
"<>C ><G>PG<ODJI DN @Q<GP<O@? DIND?@ < GJJK <I? OC@DM M@NPGON <M@ <KK@I?@? OJ < NGD>@ JA
OTK@ EPVCMF<>.
%@M@ DN OC@ @IODM@ KMJBM<H:
JNQPSU TUE.TUEJP;
FOVN 0QFSBUJPO \ BEE, TVCUSBDU, NVMUJQMZ, EJWJEF ^
TUSVDU $BMDVMBUJPO
\
0QFSBUJPO PQ;
EPVCMF GJSTU;
EPVCMF TFDPOE;
^
EPVCMF<> DBMDVMBUF(JO $BMDVMBUJPO<> DBMDVMBUJPOT ...)
\
EPVCMF<> SFTVMUT;
GPSFBDI (DBMDVMBUJPO; DBMDVMBUJPOT) \
GJOBM TXJUDI (DBMDVMBUJPO.PQ) \
EJ7D5;E7 (A>GF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
680
DBTF 0QFSBUJPO.BEE:
SFTVMUT _= DBMDVMBUJPO.GJSTU + DBMDVMBUJPO.TFDPOE;
CSFBL;
DBTF 0QFSBUJPO.TVCUSBDU:
SFTVMUT _= DBMDVMBUJPO.GJSTU - DBMDVMBUJPO.TFDPOE;
CSFBL;
DBTF 0QFSBUJPO.NVMUJQMZ:
SFTVMUT _= DBMDVMBUJPO.GJSTU * DBMDVMBUJPO.TFDPOE;
CSFBL;
DBTF 0QFSBUJPO.EJWJEF:
SFTVMUT _= DBMDVMBUJPO.GJSTU / DBMDVMBUJPO.TFDPOE;
CSFBL;
^
^
SFUVSO SFTVMUT;
^
WPJE NBJO()
\
XSJUFMO(DBMDVMBUF($BMDVMBUJPO(0QFSBUJPO.BEE, 1.1, 2.2),
$BMDVMBUJPO(0QFSBUJPO.TVCUSBDU, 3.3, 4.4),
$BMDVMBUJPO(0QFSBUJPO.NVMUJQMZ, 5.5, 6.6),
$BMDVMBUJPO(0QFSBUJPO.EJWJEF, 7.7, 8.8)));
^
1C@ JPOKPO:
<3.3, -1.1, 36.3, 0.875>
Function Overloading
87.44
1. 1C@ AJGGJRDIB ORJ JQ@MGJ<?N O<F@ <?Q<IO<B@ JA OC@ @SDNODIB JOGP() JQ@MGJ<?N:
WPJE JOGP(JO .FBM NFBM)
\
JOGP(NFBM.UJNF);
XSJUF('-');
JOGP(BEE%VSBUJPO(NFBM.UJNF, 5JNF0G%BZ(1, 30)));
XSJUF(" .FBM, "EESFTT: ", NFBM.BEESFTT);
^
WPJE JOGP(JO %BJMZ1MBO QMBO)
\
JOGP(QMBO.BN.FFUJOH);
XSJUFMO();
JOGP(QMBO.MVODI);
XSJUFMO();
JOGP(QMBO.QN.FFUJOH);
^
%@M@ DN OC@ @IODM@ KMJBM<H OC<O PN@N <GG JA OC@N@ OTK@N:
JNQPSU TUE.TUEJP;
TUSVDU 5JNF0G%BZ
\
JOU IPVS;
JOU NJOVUF;
^
EJ7D5;E7 (A>GF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
681
WPJE JOGP(JO 5JNF0G%BZ UJNF)
\
XSJUFG("%02T:%02T", UJNF.IPVS, UJNF.NJOVUF);
^
5JNF0G%BZ BEE%VSBUJPO(JO 5JNF0G%BZ TUBSU,
JO 5JNF0G%BZ EVSBUJPO)
\
5JNF0G%BZ SFTVMU;
SFTVMU.NJOVUF = TUBSU.NJOVUF + EVSBUJPO.NJOVUF;
SFTVMU.IPVS = TUBSU.IPVS + EVSBUJPO.IPVS;
SFTVMU.IPVS += SFTVMU.NJOVUF / 60;
SFTVMU.NJOVUF %= 60;
SFTVMU.IPVS %= 24;
SFUVSO SFTVMU;
^
TUSVDU .FFUJOH
\
TUSJOH UPQJD;
TJ[F@U BUUFOEBODF$PVOU;
5JNF0G%BZ TUBSU;
5JNF0G%BZ FOE;
^
WPJE JOGP(JO .FFUJOH NFFUJOH)
\
JOGP(NFFUJOH.TUBSU);
XSJUF('-');
JOGP(NFFUJOH.FOE);
XSJUFG(" ="%T=" NFFUJOH XJUI %T BUUFOEFFT",
NFFUJOH.UPQJD,
NFFUJOH.BUUFOEBODF$PVOU);
^
TUSVDU .FBM
\
5JNF0G%BZ UJNF;
TUSJOH BEESFTT;
^
WPJE JOGP(JO .FBM NFBM)
\
JOGP(NFBM.UJNF);
XSJUF('-');
JOGP(BEE%VSBUJPO(NFBM.UJNF, 5JNF0G%BZ(1, 30)));
XSJUF(" .FBM, "EESFTT: ", NFBM.BEESFTT);
^
TUSVDU %BJMZ1MBO
\
.FFUJOH BN.FFUJOH;
.FBM MVODI;
.FFUJOH QN.FFUJOH;
^
WPJE JOGP(JO %BJMZ1MBO QMBO)
\
JOGP(QMBO.BN.FFUJOH);
XSJUFMO();
JOGP(QMBO.MVODI);
XSJUFMO();
JOGP(QMBO.QN.FFUJOH);
^
EJ7D5;E7 (A>GF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
682
WPJE NBJO()
\
JNNVUBCMF CJLF3JEF.FFUJOH = .FFUJOH("#JLF 3JEF", 4,
5JNF0G%BZ(10, 30),
5JNF0G%BZ(11, 45));
JNNVUBCMF MVODI = .FBM(5JNF0G%BZ(12, 30), "eTUBOCVM");
JNNVUBCMF CVEHFU.FFUJOH = .FFUJOH("#VEHFU", 8,
5JNF0G%BZ(15, 30),
5JNF0G%BZ(17, 30));
JNNVUBCMF UPEBZT1MBO = %BJMZ1MBO(CJLF3JEF.FFUJOH,
MVODI,
CVEHFU.FFUJOH);
JOGP(UPEBZT1MBO);
XSJUFMO();
^
1C<O NBJO() API>ODJI ><I <GNJ =@ RMDOO@I RDOC JIGT J=E@>O GDO@M<GN:
WPJE NBJO()
\
JOGP(%BJMZ1MBO(.FFUJOH("#JLF 3JEF", 4,
5JNF0G%BZ(10, 30),
5JNF0G%BZ(11, 45)),
.FBM(5JNF0G%BZ(12, 30), "eTUBOCVM"),
.FFUJOH("#VEHFU", 8,
5JNF0G%BZ(15, 30),
5JNF0G%BZ(17, 30))));
XSJUFMO();
^
Member Functions
87.45
1. -JO@IOD<GGT I@B<ODQ@ DIO@MH@?D<O@ Q<GP@N H<F@ EFDSFNFOU() NGDBCOGT HJM@ >JHKGD><O@?
OC<I JODSFNFOU():
TUSVDU 5JNF0G%BZ
\
// ...
WPJE EFDSFNFOU(JO %VSBUJPO EVSBUJPO)
\
BVUP NJOVUFT5P4VCUSBDU = EVSBUJPO.NJOVUF % 60;
BVUP IPVST5P4VCUSBDU = EVSBUJPO.NJOVUF / 60;
NJOVUF -= NJOVUFT5P4VCUSBDU;
JG (NJOVUF < 0) \
NJOVUF += 60;
++IPVST5P4VCUSBDU;
^
IPVS -= IPVST5P4VCUSBDU;
JG (IPVS < 0) \
IPVS = 24 - (-IPVS % 24);
^
^
EJ7D5;E7 (A>GF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
683
// ...
^
2. 1J N@@ CJR HP>C @<ND@M DO B@ON RDOC UP4USJOH() H@H=@M API>ODJIN, G@O'N GJJF <O OC@
.FFUJOH JQ@MGJ<? JA JOGP() JI@ HJM@ ODH@:
WPJE JOGP(JO .FFUJOH NFFUJOH)
\
JOGP(NFFUJOH.TUBSU);
XSJUF('-');
JOGP(NFFUJOH.FOE);
XSJUFG(" ="%T=" NFFUJOH XJUI %T BUUFOEFFT",
NFFUJOH.UPQJD,
NFFUJOH.BUUFOEBODF$PVOU);
^
1<FDIB <?Q<IO<B@ JA OC@ <GM@<?T-?@ADI@? 5JNF0G%BZ.UP4USJOH, OC@ DHKG@H@IO<ODJI JA
.FFUJOH.UP4USJOH =@>JH@N OMDQD<G:
TUSJOH UP4USJOH()
\
SFUVSO GPSNBU("%T-%T ="%T=" NFFUJOH XJUI %T BUUFOEFFT",
TUBSU, FOE, UPQJD, BUUFOEBODF$PVOU);
^
%@M@ DN OC@ @IODM@ KMJBM<H:
JNQPSU TUE.TUEJP;
JNQPSU TUE.TUSJOH;
TUSVDU %VSBUJPO
\
JOU NJOVUF;
^
TUSVDU 5JNF0G%BZ
\
JOU IPVS;
JOU NJOVUF;
TUSJOH UP4USJOH()
\
SFUVSO GPSNBU("%02T:%02T", IPVS, NJOVUF);
^
WPJE JODSFNFOU(JO %VSBUJPO EVSBUJPO)
\
NJOVUF += EVSBUJPO.NJOVUF;
IPVS += NJOVUF / 60;
NJOVUF %= 60;
IPVS %= 24;
^
^
TUSVDU .FFUJOH
\
TUSJOH UPQJD;
JOU BUUFOEBODF$PVOU;
5JNF0G%BZ TUBSU;
5JNF0G%BZ FOE;
TUSJOH UP4USJOH()
\
SFUVSO GPSNBU("%T-%T ="%T=" NFFUJOH XJUI %T BUUFOEFFT",
EJ7D5;E7 (A>GF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
684
TUBSU, FOE, UPQJD, BUUFOEBODF$PVOU);
^
^
TUSVDU .FBM
\
5JNF0G%BZ UJNF;
TUSJOH BEESFTT;
TUSJOH UP4USJOH()
\
5JNF0G%BZ FOE = UJNF;
FOE.JODSFNFOU(%VSBUJPO(90));
SFUVSO GPSNBU("%T-%T .FBM, "EESFTT: %T",
UJNF, FOE, BEESFTT);
^
^
TUSVDU %BJMZ1MBO
\
.FFUJOH BN.FFUJOH;
.FBM MVODI;
.FFUJOH QN.FFUJOH;
TUSJOH UP4USJOH()
\
SFUVSO GPSNBU("%T=O%T=O%T",
BN.FFUJOH,
MVODI,
QN.FFUJOH);
^
^
WPJE NBJO()
\
BVUP CJLF3JEF.FFUJOH = .FFUJOH("#JLF 3JEF", 4,
5JNF0G%BZ(10, 30),
5JNF0G%BZ(11, 45));
BVUP MVODI = .FBM(5JNF0G%BZ(12, 30), "eTUBOCVM");
BVUP CVEHFU.FFUJOH = .FFUJOH("#VEHFU", 8,
5JNF0G%BZ(15, 30),
5JNF0G%BZ(17, 30));
BVUP UPEBZT1MBO = %BJMZ1MBO(CJLF3JEF.FFUJOH,
MVODI,
CVEHFU.FFUJOH);
XSJUFMO(UPEBZT1MBO);
XSJUFMO();
^
1C@ JPOKPO JA OC@ KMJBM<H DN OC@ N<H@ <N OC@ @<MGD@M JI@ OC<O C<N =@@I PNDIB JOGP()
API>ODJI JQ@MGJ<?N:
10:30-11:45 "#JLF 3JEF" NFFUJOH XJUI 4 BUUFOEFFT
12:30-14:00 .FBM, "EESFTT: fTUBOCVM
15:30-17:30 "#VEHFU" NFFUJOH XJUI 8 BUUFOEFFT
Operator Overloading
87.46
t 1C@ AJGGJRDIB DHKG@H@IO<ODJI K<NN@N <GG JA OC@ PIDO O@NON. 1C@ ?@NDBI ?@>DNDJIN C<Q@ =@@I
DI>GP?@? <N >J?@ >JHH@ION.
EJ7D5;E7 (A>GF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
685
0JH@ JA OC@ API>ODJIN JA OCDN NOMP>O ><I =@ DHKG@H@IO@? OJ MPI HJM@ @AAD>D@IOGT.
A??DODJI<GGT, DO RJPG? =@ =@I@AD>D<G OJ <GNJ @AD?3>;L7 OC@ IPH@M<OJM <I? ?@IJHDI<OJM.
#JM @S<HKG@, DINO@<? JA F@@KDIB OC@ Q<GP@N 20 <I? 60, OC@ Q<GP@N >JPG? =@ ?DQD?@? =T
OC@DM 9D73F7EF 5A??A@ 6;H;EAD <I? OC@ IPH@M<OJM <I? OC@ ?@IJHDI<OJM ><I =@ NOJM@?
<N 1 <I? 3 DINO@<?. ,OC@MRDN@, HJNO JA OC@ JK@M<ODJIN JI OC@ J=E@>O RJPG? ><PN@ OC@
Q<GP@N JA OC@ IPH@M<OJM <I? OC@ ?@IJHDI<OJM OJ DI>M@<N@.
JNQPSU TUE.FYDFQUJPO;
JNQPSU TUE.DPOW;
TUSVDU 'SBDUJPO
\
MPOH OVN; // OVNFSBUPS
MPOH EFO; // EFOPNJOBUPS
/* "T B DPOWFOJFODF, UIF DPOTUSVDUPS VTFT UIF EFGBVMU
* WBMVF PG 1 GPS UIF EFOPNJOBUPS. */
UIJT(MPOH OVN, MPOH EFO = 1)
\
FOGPSDF(EFO != 0, "5IF EFOPNJOBUPS DBOOPU CF [FSP");
UIJT.OVN = OVN;
UIJT.EFO = EFO;
/* &OTVSJOH UIBU UIF EFOPNJOBUPS JT BMXBZT QPTJUJWF
* XJMM TJNQMJGZ UIF EFGJOJUJPOT PG TPNF PG UIF
* PQFSBUPS GVODUJPOT. */
JG (UIJT.EFO < 0) \
UIJT.OVN = -UIJT.OVN;
UIJT.EFO = -UIJT.EFO;
^
^
/* 6OBSZ -: 3FUVSOT UIF OFHBUJWF PG UIJT GSBDUJPO. */
'SBDUJPO PQ6OBSZ(TUSJOH PQ)() DPOTU
JG (PQ == "-")
\
/* 4JNQMZ DPOTUSVDUT BOE SFUVSOT BO BOPOZNPVT
* PCKFDU. */
SFUVSO 'SBDUJPO(-OVN, EFO);
^
/* ++: *ODSFNFOUT UIF WBMVF PG UIF GSBDUJPO CZ POF. */
SFG 'SBDUJPO PQ6OBSZ(TUSJOH PQ)()
JG (PQ == "++")
\
/* 8F DPVME IBWF VTFE 'UIJT += 'SBDUJPO(1)' IFSF. */
OVN += EFO;
SFUVSO UIJT;
^
/* --: %FDSFNFOUT UIF WBMVF PG UIF GSBDUJPO CZ POF. */
SFG 'SBDUJPO PQ6OBSZ(TUSJOH PQ)()
JG (PQ == "--")
\
/* 8F DPVME IBWF VTFE 'UIJT -= 'SBDUJPO(1)' IFSF. */
OVN -= EFO;
SFUVSO UIJT;
^
/* +=: "EET UIF SJHIU-IBOE GSBDUJPO UP UIJT POF. */
SFG 'SBDUJPO PQ0Q"TTJHO(TUSJOH PQ)(JO 'SBDUJPO SIT)
JG (PQ == "+")
\
/* "EEJUJPO GPSNVMB: BC + DE = (B*E + D*C)(C*E) */
OVN = (OVN * SIT.EFO) + (SIT.OVN * EFO);
EFO *= SIT.EFO;
SFUVSO UIJT;
^
EJ7D5;E7 (A>GF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
686
/* -=: 4VCUSBDUT UIF SJHIU-IBOE GSBDUJPO GSPN UIJT POF. */
SFG 'SBDUJPO PQ0Q"TTJHO(TUSJOH PQ)(JO 'SBDUJPO SIT)
JG (PQ == "-")
\
/* 8F NBLF VTF PG UIF BMSFBEZ-EFGJOFE PQFSBUPST += BOE
* VOBSZ - IFSF. "MUFSOBUJWFMZ, UIF TVCUSBDUJPO
* GPSNVMB DPVME FYQMJDJUMZ CF BQQMJFE TJNJMBS UP UIF
* += PQFSBUPS BCPWF.
*
* 4VCUSBDUJPO GPSNVMB: BC - DE = (B*E - D*C)(C*E)
*/
UIJT += -SIT;
SFUVSO UIJT;
^
/* *=: .VMUJQMJFT UIF GSBDUJPO CZ UIF SJHIU-IBOE TJEF. */
SFG 'SBDUJPO PQ0Q"TTJHO(TUSJOH PQ)(JO 'SBDUJPO SIT)
JG (PQ == "*")
\
/* .VMUJQMJDBUJPO GPSNVMB: BC * DE = (B*D)(C*E) */
OVN *= SIT.OVN;
EFO *= SIT.EFO;
SFUVSO UIJT;
^
/* /=: %JWJEFT UIF GSBDUJPO CZ UIF SJHIU-IBOE TJEF. */
SFG 'SBDUJPO PQ0Q"TTJHO(TUSJOH PQ)(JO 'SBDUJPO SIT)
JG (PQ == "/")
\
FOGPSDF(SIT.OVN != 0, "$BOOPU EJWJEF CZ [FSP");
/* %JWJTJPO GPSNVMB: (BC) / (DE) = (B*E)(C*D) */
OVN *= SIT.EFO;
EFO *= SIT.OVN;
SFUVSO UIJT;
^
/* #JOBSZ +: 1SPEVDFT UIF SFTVMU PG BEEJOH UIJT BOE UIF
* SJHIU-IBOE TJEF GSBDUJPOT. */
'SBDUJPO PQ#JOBSZ(TUSJOH PQ)(JO 'SBDUJPO SIT) DPOTU
JG (PQ == "+")
\
/* 5BLFT B DPQZ PG UIJT GSBDUJPO BOE BEET UIF
* SJHIU-IBOE TJEF GSBDUJPO UP UIBU DPQZ. */
'SBDUJPO SFTVMU = UIJT;
SFTVMU += SIT;
SFUVSO SFTVMU;
^
/* #JOBSZ -: 1SPEVDFT UIF SFTVMU PG TVCUSBDUJOH UIF
* SJHIU-IBOE TJEF GSBDUJPO GSPN UIJT POF. */
'SBDUJPO PQ#JOBSZ(TUSJOH PQ)(JO 'SBDUJPO SIT) DPOTU
JG (PQ == "-")
\
/* 6TFT UIF BMSFBEZ-EFGJOFE -= PQFSBUPS. */
'SBDUJPO SFTVMU = UIJT;
SFTVMU -= SIT;
SFUVSO SFTVMU;
^
/* #JOBSZ *: 1SPEVDFT UIF SFTVMU PG NVMUJQMZJOH UIJT
* GSBDUJPO XJUI UIF SJHIU-IBOE TJEF GSBDUJPO. */
'SBDUJPO PQ#JOBSZ(TUSJOH PQ)(JO 'SBDUJPO SIT) DPOTU
JG (PQ == "*")
\
/* 6TFT UIF BMSFBEZ-EFGJOFE *= PQFSBUPS. */
'SBDUJPO SFTVMU = UIJT;
SFTVMU *= SIT;
SFUVSO SFTVMU;
^
EJ7D5;E7 (A>GF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
687
/* #JOBSZ /: 1SPEVDFT UIF SFTVMU PG EJWJEJOH UIJT GSBDUJPO
* CZ UIF SJHIU-IBOE TJEF GSBDUJPO. */
'SBDUJPO PQ#JOBSZ(TUSJOH PQ)(JO 'SBDUJPO SIT) DPOTU
JG (PQ == "/")
\
/* 6TFT UIF BMSFBEZ-EFGJOFE /= PQFSBUPS. */
'SBDUJPO SFTVMU = UIJT;
SFTVMU /= SIT;
SFUVSO SFTVMU;
^
/* 3FUVSOT UIF WBMVF PG UIF GSBDUJPO BT EPVCMF. */
EPVCMF PQ$BTU(5 : EPVCMF)() DPOTU
\
/* " TJNQMF EJWJTJPO. )PXFWFS, BT EJWJEJOH WBMVFT PG
* UZQF MPOH XPVME MPTF UIF QBSU PG UIF WBMVF BGUFS
* UIF EFDJNBM QPJOU, XF DPVME OPU IBWF XSJUUFO
* 'OVN/EFO' IFSF. */
SFUVSO UP!EPVCMF(OVN) / EFO;
^
/* 4PSU PSEFS PQFSBUPS: 3FUVSOT B OFHBUJWF WBMVF JG UIJT
* GSBDUJPO JT CFGPSF, B QPTJUJWF WBMVF JG UIJT GSBDUJPO
* JT BGUFS, BOE [FSP JG CPUI GSBDUJPOT IBWF UIF TBNF TPSU
* PSEFS. */
JOU PQ$NQ(DPOTU SFG 'SBDUJPO SIT) DPOTU
\
JNNVUBCMF SFTVMU = UIJT - SIT;
/* #FJOH B MPOH, OVN DBOOPU CF DPOWFSUFE UP JOU
* BVUPNBUJDBMMZ; JU NVTU CF DPOWFSUFE FYQMJDJUMZ CZ
* 'UP' (PS DBTU). */
SFUVSO UP!JOU(SFTVMU.OVN);
^
/* &RVBMJUZ DPNQBSJTPO: 3FUVSOT USVF JG UIF GSBDUJPOT BSF
* FRVBM.
*
* 5IF FRVBMJUZ DPNQBSJTPO IBE UP CF EFGJOFE GPS UIJT UZQF
* CFDBVTF UIF DPNQJMFS-HFOFSBUFE POF XPVME CF DPNQBSJOH
* UIF NFNCFST POF-CZ-POF, XJUIPVU SFHBSE UP UIF BDUVBM
* WBMVFT UIBU UIF PCKFDUT SFQSFTFOU.
*
* 'PS FYBNQMF, BMUIPVHI UIF WBMVFT PG CPUI 'SBDUJPO(1,2)
* BOE 'SBDUJPO(2,4) BSF 0.5, UIF DPNQJMFS-HFOFSBUFE
* PQ&RVBMT XPVME EFDJEF UIBU UIFZ XFSF OPU FRVBM PO
* BDDPVOU PG IBWJOH NFNCFST PG EJGGFSFOU WBMVFT.
*/
CPPM PQ&RVBMT(DPOTU SFG 'SBDUJPO SIT) DPOTU
\
/* $IFDLJOH XIFUIFS UIF SFUVSO WBMVF PG PQ$NQ JT [FSP
* JT TVGGJDJFOU IFSF. */
SFUVSO PQ$NQ(SIT) == 0;
^
^
VOJUUFTU
\
/* .VTU UISPX XIFO EFOPNJOBUPS JT [FSP. */
BTTFSU5ISPXO('SBDUJPO(42, 0));
/* -FU'T TUBSU XJUI 13. */
BVUP B = 'SBDUJPO(1, 3);
/* -13 */
BTTFSU(-B == 'SBDUJPO(-1, 3));
/* 13 + 1 == 43 */
++B;
BTTFSU(B == 'SBDUJPO(4, 3));
EJ7D5;E7 (A>GF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
688
/* 43 - 1 == 13 */
--B;
BTTFSU(B == 'SBDUJPO(1, 3));
/* 13 + 23 == 33 */
B += 'SBDUJPO(2, 3);
BTTFSU(B == 'SBDUJPO(1));
/* 33 - 23 == 13 */
B -= 'SBDUJPO(2, 3);
BTTFSU(B == 'SBDUJPO(1, 3));
/* 13 * 8 == 83 */
B *= 'SBDUJPO(8);
BTTFSU(B == 'SBDUJPO(8, 3));
/* 83 / 169 == 32 */
B /= 'SBDUJPO(16, 9);
BTTFSU(B == 'SBDUJPO(3, 2));
/* .VTU QSPEVDF UIF FRVJWBMFOU WBMVF JO UZQF 'EPVCMF'.
*
* /PUF UIBU BMUIPVHI EPVCMF DBOOPU SFQSFTFOU FWFSZ WBMVF
* QSFDJTFMZ, 1.5 JT BO FYDFQUJPO. 5IBU JT XIZ UIJT UFTU
* JT CFJOH BQQMJFE BU UIJT QPJOU. */
BTTFSU(UP!EPVCMF(B) == 1.5);
/* 1.5 + 2.5 == 4 */
BTTFSU(B + 'SBDUJPO(5, 2) == 'SBDUJPO(4, 1));
/* 1.5 - 0.75 == 0.75 */
BTTFSU(B - 'SBDUJPO(3, 4) == 'SBDUJPO(3, 4));
/* 1.5 * 10 == 15 */
BTTFSU(B * 'SBDUJPO(10) == 'SBDUJPO(15, 1));
/* 1.5 / 4 == 38 */
BTTFSU(B / 'SBDUJPO(4) == 'SBDUJPO(3, 8));
/* .VTU UISPX XIFO EJWJEJOH CZ [FSP. */
BTTFSU5ISPXO('SBDUJPO(42, 1) / 'SBDUJPO(0));
/* 5IF POF XJUI MPXFS OVNFSBUPS JT CFGPSF. */
BTTFSU('SBDUJPO(3, 5) < 'SBDUJPO(4, 5));
/* 5IF POF XJUI MBSHFS EFOPNJOBUPS JT CFGPSF. */
BTTFSU('SBDUJPO(3, 9) < 'SBDUJPO(3, 8));
BTTFSU('SBDUJPO(1, 1@000) > 'SBDUJPO(1, 10@000));
/* 5IF POF XJUI MPXFS WBMVF JT CFGPSF. */
BTTFSU('SBDUJPO(10, 100) < 'SBDUJPO(1, 2));
/* 5IF POF XJUI OFHBUJWF WBMVF JT CFGPSF. */
BTTFSU('SBDUJPO(-1, 2) < 'SBDUJPO(0));
BTTFSU('SBDUJPO(1, -2) < 'SBDUJPO(0));
/* 5IF POFT XJUI FRVBM WBMVFT NVTU CF CPUI <= BOE >=. */
BTTFSU('SBDUJPO(-1, -2) <= 'SBDUJPO(1, 2));
BTTFSU('SBDUJPO(1, 2) <= 'SBDUJPO(-1, -2));
BTTFSU('SBDUJPO(3, 7) <= 'SBDUJPO(9, 21));
BTTFSU('SBDUJPO(3, 7) >= 'SBDUJPO(9, 21));
/* 5IF POFT XJUI FRVBM WBMVFT NVTU CF FRVBM. */
BTTFSU('SBDUJPO(1, 3) == 'SBDUJPO(20, 60));
/* 5IF POFT XJUI FRVBM WBMVFT XJUI TJHO NVTU CF FRVBM. */
BTTFSU('SBDUJPO(-1, 2) == 'SBDUJPO(1, -2));
BTTFSU('SBDUJPO(1, 2) == 'SBDUJPO(-1, -2));
^
EJ7D5;E7 (A>GF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
689
WPJE NBJO()
\^
AN C<N =@@I H@IODJI@? DI OC@ >C<KO@M, NOMDIB HDSDIN ><I =@ PN@? OJ >JH=DI@ OC@
?@ADIDODJIN JA NJH@ JA OC@ JK@M<OJMN. #JM @S<HKG@, OC@ AJGGJRDIB ?@ADIDODJI >JQ@MN OC@
AJPM <MDOCH@OD> JK@M<OJMN:
/* #JOBSZ BSJUINFUJD PQFSBUPST. */
'SBDUJPO PQ#JOBSZ(TUSJOH PQ)(JO 'SBDUJPO SIT) DPOTU
JG ((PQ == "+") ]] (PQ == "-") ]]
(PQ == "*") ]] (PQ == "/"))
\
/* 5BLFT B DPQZ PG UIJT GSBDUJPO BOE BQQMJFT UIF
* SJHIU-IBOE TJEF GSBDUJPO UP UIBU DPQZ. */
'SBDUJPO SFTVMU = UIJT;
NJYJO ("SFTVMU " _ PQ _ "= SIT;");
SFUVSO SFTVMU;
^
Inheritance
87.47
1. 1C@ H@H=@M API>ODJIN OC<O <M@ ?@>G<M@? <N BCTUSBDU =T NPK@M>G<NN@N HPNO =@ ?@ADI@? =T
OC@ PWFSSJEF F@TRJM? =T NP=>G<NN@N.
&BIJMDIB OC@ 5SBJO >G<NN AJM OCDN @S@M>DN@, -PDPNPUJWF.NBLF4PVOE <I?
3BJMXBZ$BS.NBLF4PVOE ><I =@ DHKG@H@IO@? <N DI OC@ AJGGJRDIB KMJBM<H:
JNQPSU TUE.TUEJP;
JNQPSU TUE.FYDFQUJPO;
DMBTT 3BJMXBZ7FIJDMF
\
WPJE BEWBODF(JO TJ[F@U LJMPNFUFST)
\
XSJUFGMO("5IF WFIJDMF JT BEWBODJOH %T LJMPNFUFST",
LJMPNFUFST);
GPSFBDI (J; 0 .. LJMPNFUFST / 100) \
XSJUFGMO(" %T", NBLF4PVOE());
^
^
BCTUSBDU TUSJOH NBLF4PVOE();
^
DMBTT -PDPNPUJWF : 3BJMXBZ7FIJDMF
\
PWFSSJEF TUSJOH NBLF4PVOE()
\
SFUVSO "DIPP DIPP";
^
^
DMBTT 3BJMXBZ$BS : 3BJMXBZ7FIJDMF
\
// ...
PWFSSJEF TUSJOH NBLF4PVOE()
\
SFUVSO "DMBDL DMBDL";
^
^
DMBTT 1BTTFOHFS$BS : 3BJMXBZ$BS
\
// ...
EJ7D5;E7 (A>GF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
690
^
DMBTT 'SFJHIU$BS : 3BJMXBZ$BS
\
// ...
^
WPJE NBJO()
\
BVUP SBJMXBZ$BS1 = OFX 1BTTFOHFS$BS;
SBJMXBZ$BS1.BEWBODF(100);
BVUP SBJMXBZ$BS2 = OFX 'SFJHIU$BS;
SBJMXBZ$BS2.BEWBODF(200);
BVUP MPDPNPUJWF = OFX -PDPNPUJWF;
MPDPNPUJWF.BEWBODF(300);
^
2. 1C@ AJGGJRDIB KMJBM<H PN@N OC@ NJPI?N JA OC@ >JHKJI@ION JA 5SBJO OJ H<F@ OC@ NJPI? JA
5SBJO DON@GA:
JNQPSU TUE.TUEJP;
JNQPSU TUE.FYDFQUJPO;
DMBTT 3BJMXBZ7FIJDMF
\
WPJE BEWBODF(JO TJ[F@U LJMPNFUFST)
\
XSJUFGMO("5IF WFIJDMF JT BEWBODJOH %T LJMPNFUFST",
LJMPNFUFST);
GPSFBDI (J; 0 .. LJMPNFUFST / 100) \
XSJUFGMO(" %T", NBLF4PVOE());
^
^
BCTUSBDU TUSJOH NBLF4PVOE();
^
DMBTT -PDPNPUJWF : 3BJMXBZ7FIJDMF
\
PWFSSJEF TUSJOH NBLF4PVOE()
\
SFUVSO "DIPP DIPP";
^
^
DMBTT 3BJMXBZ$BS : 3BJMXBZ7FIJDMF
\
BCTUSBDU WPJE MPBE();
BCTUSBDU WPJE VOMPBE();
PWFSSJEF TUSJOH NBLF4PVOE()
\
SFUVSO "DMBDL DMBDL";
^
^
DMBTT 1BTTFOHFS$BS : 3BJMXBZ$BS
\
PWFSSJEF WPJE MPBE()
\
XSJUFMO("5IF QBTTFOHFST BSF HFUUJOH PO");
^
PWFSSJEF WPJE VOMPBE()
\
XSJUFMO("5IF QBTTFOHFST BSF HFUUJOH PGG");
EJ7D5;E7 (A>GF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
691
^
^
DMBTT 'SFJHIU$BS : 3BJMXBZ$BS
\
PWFSSJEF WPJE MPBE()
\
XSJUFMO("5IF DSBUFT BSF CFJOH MPBEFE");
^
PWFSSJEF WPJE VOMPBE()
\
XSJUFMO("5IF DSBUFT BSF CFJOH VOMPBEFE");
^
^
DMBTT 5SBJO : 3BJMXBZ7FIJDMF
\
-PDPNPUJWF MPDPNPUJWF;
3BJMXBZ$BS<> DBST;
UIJT(-PDPNPUJWF MPDPNPUJWF)
\
FOGPSDF(MPDPNPUJWF !JT OVMM,
"-PDPNPUJWF DBOOPU CF OVMM");
UIJT.MPDPNPUJWF = MPDPNPUJWF;
^
WPJE BEE$BS(3BJMXBZ$BS<> DBST...)
\
UIJT.DBST _= DBST;
^
PWFSSJEF TUSJOH NBLF4PVOE()
\
TUSJOH SFTVMU = MPDPNPUJWF.NBLF4PVOE();
GPSFBDI (DBS; DBST) \
SFTVMU _= ", " _ DBS.NBLF4PVOE();
^
SFUVSO SFTVMU;
^
WPJE EFQBSU4UBUJPO(TUSJOH TUBUJPO)
\
GPSFBDI (DBS; DBST) \
DBS.MPBE();
^
XSJUFGMO("%FQBSUJOH GSPN UIF %T TUBUJPO", TUBUJPO);
^
WPJE BSSJWF4UBUJPO(TUSJOH TUBUJPO)
\
XSJUFGMO(""SSJWJOH BU UIF %T TUBUJPO", TUBUJPO);
GPSFBDI (DBS; DBST) \
DBS.VOMPBE();
^
^
^
WPJE NBJO()
\
BVUP MPDPNPUJWF = OFX -PDPNPUJWF;
BVUP USBJO = OFX 5SBJO(MPDPNPUJWF);
USBJO.BEE$BS(OFX 1BTTFOHFS$BS, OFX 'SFJHIU$BS);
USBJO.EFQBSU4UBUJPO(""OLBSB");
EJ7D5;E7 (A>GF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
692
USBJO.BEWBODF(500);
USBJO.BSSJWF4UBUJPO(")BZEBSQBhB");
^
1C@ JPOKPO:
5IF QBTTFOHFST BSF HFUUJOH PO
5IF DSBUFT BSF CFJOH MPBEFE
%FQBSUJOH GSPN UIF "OLBSB TUBUJPO
5IF WFIJDMF JT BEWBODJOH 500 LJMPNFUFST
DIPP DIPP, DMBDL DMBDL, DMBDL DMBDL
DIPP DIPP, DMBDL DMBDL, DMBDL DMBDL
DIPP DIPP, DMBDL DMBDL, DMBDL DMBDL
DIPP DIPP, DMBDL DMBDL, DMBDL DMBDL
DIPP DIPP, DMBDL DMBDL, DMBDL DMBDL
"SSJWJOH BU UIF )BZEBSQBiB TUBUJPO
5IF QBTTFOHFST BSF HFUUJOH PGG
5IF DSBUFT BSF CFJOH VOMPBEFE
0CKFDU
87.48
1. #JM OC@ @LP<GDOT >JHK<MDNJI, SIT =@DIB IJI-OVMM <I? OC@ H@H=@MN =@DIB @LP<G RJPG? =@
NPAAD>D@IO:
FOVN $PMPS \ CMVF, HSFFO, SFE ^
DMBTT 1PJOU
\
JOU Y;
JOU Z;
$PMPS DPMPS;
// ...
PWFSSJEF CPPM PQ&RVBMT(0CKFDU P) DPOTU
\
DPOTU SIT = DBTU(DPOTU 1PJOU)P;
SFUVSO SIT && (Y == SIT.Y) && (Z == SIT.Z);
^
^
2. 4C@I OC@ OTK@ JA OC@ MDBCO-C<I? ND?@ J=E@>O DN <GNJ 1PJOU, OC@T <M@ >JHK<M@? <>>JM?DIB OJ
OC@ Q<GP@N JA OC@ Y H@H=@MN ADMNO <I? OC@I <>>JM?DIB OJ OC@ Q<GP@N JA OC@ Z H@H=@MN:
DMBTT 1PJOU
\
JOU Y;
JOU Z;
$PMPS DPMPS;
// ...
PWFSSJEF JOU PQ$NQ(0CKFDU P) DPOTU
\
DPOTU SIT = DBTU(DPOTU 1PJOU)P;
FOGPSDF(SIT);
SFUVSO (Y != SIT.Y
Y - SIT.Y
: Z - SIT.Z);
EJ7D5;E7 (A>GF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
693
^
^
3. +JO@ OC<O DO DN IJO KJNND=G@ OJ ><NO OJ OTK@ DPOTU 5SJBOHVMBS"SFB DIND?@ PQ$NQ =@GJR.
4C@I SIT DN DPOTU 5SJBOHVMBS"SFB, OC@I DON H@H=@M SIT.QPJOUT RJPG? =@ DPOTU <N
R@GG. 0DI>@ OC@ K<M<H@O@M JA PQ$NQ DN IJI-DPOTU, DO RJPG? IJO =@ KJNND=G@ OJ K<NN
SIT.QPJOUT<J> OJ QPJOU.PQ$NQ.
DMBTT 5SJBOHVMBS"SFB
\
1PJOU<3> QPJOUT;
UIJT(1PJOU POF, 1PJOU UXP, 1PJOU UISFF)
\
QPJOUT = < POF, UXP, UISFF >;
^
PWFSSJEF CPPM PQ&RVBMT(0CKFDU P) DPOTU
\
DPOTU SIT = DBTU(DPOTU 5SJBOHVMBS"SFB)P;
SFUVSO SIT && (QPJOUT == SIT.QPJOUT);
^
PWFSSJEF JOU PQ$NQ(0CKFDU P) DPOTU
\
BVUP SIT = DBTU(5SJBOHVMBS"SFB)P;
FOGPSDF(SIT);
GPSFBDI (J, QPJOU; QPJOUT) \
JNNVUBCMF DPNQBSJTPO = QPJOU.PQ$NQ(SIT.QPJOUT<J>);
JG (DPNQBSJTPO != 0) \
/* 5IF TPSU PSEFS IBT BMSFBEZ CFFO
* EFUFSNJOFE. 4JNQMZ SFUVSO UIF SFTVMU. */
SFUVSO DPNQBSJTPO;
^
^
/* 5IF PCKFDUT BSF DPOTJEFSFE FRVBM CFDBVTF BMM PG
* UIFJS QPJOUT IBWF CFFO FRVBM. */
SFUVSO 0;
^
PWFSSJEF TJ[F@U UP)BTI() DPOTU
\
/* 4JODF UIF 'QPJOUT' NFNCFS JT BO BSSBZ, XF DBO UBLF
* BEWBOUBHF PG UIF FYJTUJOH UP)BTI BMHPSJUIN GPS
* BSSBZ UZQFT. */
SFUVSO UZQFJE(QPJOUT).HFU)BTI(&QPJOUT);
^
^
Pointers
87.49
1. 4C@I K<M<H@O@MN <M@ Q<GP@ OTK@N GDF@ JOU, OC@ <MBPH@ION <M@ >JKD@? OJ API>ODJIN. 1C@
KM@A@MM@? R<T JA ?@ADIDIB M@A@M@I>@ K<M<H@O@MN DN OJ NK@>DAT OC@H <N SFG.
AIJOC@M R<T DN OJ ?@ADI@ OC@ K<M<H@O@MN <N KJDIO@MN OC<O KJDIO <O OC@ <>OP<G Q<MD<=G@N.
1C@ K<MON JA OC@ KMJBM<H OC<O C<Q@ =@@I >C<IB@? <M@ CDBCGDBCO@?:
WPJE TXBQ(JOU * MIT, JOU * SIT)
\
JOU UFNQ = *MIT;
*MIT = *SIT;
*SIT = UFNQ;
^
EJ7D5;E7 (A>GF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
694
WPJE NBJO()
\
JOU J = 1;
JOU K = 2;
TXBQ(&J, &K);
BTTFSU(J == 2);
BTTFSU(K == 1);
^
1C@ >C@>FN <O OC@ @I? JA OC@ KMJBM<H IJR K<NN.
2. /PEF <I? -JTU C<Q@ =@@I RMDOO@I OJ RJMF JIGT RDOC OC@ JOU OTK@. 4@ ><I >JIQ@MO OC@N@
OTK@N OJ NOMP>O O@HKG<O@N =T <??DIB (5) <AO@M OC@DM I<H@N <I? M@KG<>DIB <KKMJKMD<O@ JOUN
DI OC@DM ?@ADIDODJIN =T 5N:
TUSVDU /PEF(5)
\
5 FMFNFOU;
/PEF * OFYU;
TUSJOH UP4USJOH() DPOTU
\
TUSJOH SFTVMU = UP!TUSJOH(FMFNFOU);
JG (OFYU) \
SFTVMU _= " -> " _ UP!TUSJOH(*OFYU);
^
SFUVSO SFTVMU;
^
^
TUSVDU -JTU(5)
\
/PEF!5 * IFBE;
WPJE JOTFSU"U)FBE(5 FMFNFOU)
\
IFBE = OFX /PEF!5(FMFNFOU, IFBE);
^
TUSJOH UP4USJOH() DPOTU
\
SFUVSO GPSNBU("(%T)", IFBE UP!TUSJOH(*IFBE) : "");
^
^
-JTU ><I IJR =@ PN@? RDOC <IT OTK@:
JNQPSU TUE.TUEJP;
JNQPSU TUE.DPOW;
JNQPSU TUE.TUSJOH;
// ...
TUSVDU 1PJOU
\
EPVCMF Y;
EPVCMF Z;
TUSJOH UP4USJOH() DPOTU
\
SFUVSO GPSNBU("(%T,%T)", Y, Z);
^
^
EJ7D5;E7 (A>GF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
695
WPJE NBJO()
\
-JTU!1PJOU QPJOUT;
QPJOUT.JOTFSU"U)FBE(1PJOU(1.1, 2.2));
QPJOUT.JOTFSU"U)FBE(1PJOU(3.3, 4.4));
QPJOUT.JOTFSU"U)FBE(1PJOU(5.5, 6.6));
XSJUFMO(QPJOUT);
^
1C@ JPOKPO:
((5.5,6.6) -> (3.3,4.4) -> (1.1,2.2))
3. &I OCDN ><N@ R@ I@@? <IJOC@M KJDIO@M OJ KJDIO <O OC@ G<NO IJ?@ JA OC@ GDNO. 1C@ I@R >J?@ DN
I@>@NN<MDGT HJM@ >JHKG@S DI JM?@M OJ H<I<B@ OC@ I@R Q<MD<=G@ <N R@GG:
TUSVDU -JTU(5)
\
/PEF!5 * IFBE;
/PEF!5 * UBJM;
WPJE BQQFOE(5 FMFNFOU)
\
/* 4JODF UIFSF JT OP OPEF BGUFS UIF MBTU POF, XF TFU
* UIF OFX OPEF'T OFYU QPJOUFS UP 'OVMM'. */
BVUP OFX/PEF = OFX /PEF!5(FMFNFOU, OVMM);
JG (!IFBE) \
/* 5IF MJTU IBT CFFO FNQUZ. 5IF OFX OPEF CFDPNFT
* UIF IFBE. */
IFBE = OFX/PEF;
^
JG (UBJM) \
/* 8F QMBDF UIJT OPEF BGUFS UIF DVSSFOU UBJM. */
UBJM.OFYU = OFX/PEF;
^
/* 5IF OFX OPEF CFDPNFT UIF OFX UBJM. */
UBJM = OFX/PEF;
^
WPJE JOTFSU"U)FBE(5 FMFNFOU)
\
BVUP OFX/PEF = OFX /PEF!5(FMFNFOU, IFBE);
/* 5IF OFX OPEF CFDPNFT UIF OFX IFBE. */
IFBE = OFX/PEF;
JG (!UBJM) \
/* 5IF MJTU IBT CFFO FNQUZ. 5IF OFX OPEF CFDPNFT
* UIF UBJM. */
UBJM = OFX/PEF;
^
^
TUSJOH UP4USJOH() DPOTU
\
SFUVSO GPSNBU("(%T)", IFBE UP!TUSJOH(*IFBE) : "");
^
^
1C@ I@R DHKG@H@IO<ODJI JA JOTFSU"U)FBE() ><I <>OP<GGT =@ NCJMO@M:
EJ7D5;E7 (A>GF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
696
WPJE JOTFSU"U)FBE(5 FMFNFOU)
\
IFBE = OFX /PEF!5(FMFNFOU, IFBE);
JG (!UBJM) \
UBJM = IFBE;
^
^
1C@ AJGGJRDIB KMJBM<H PN@N OC@ I@R -JTU OJ DIN@MO 1PJOU J=E@>ON RDOC J?? Q<GP@N <O
OC@ C@<? <I? 1PJOU J=E@>ON RDOC @Q@I Q<GP@N <O OC@ @I?.
WPJE NBJO()
\
-JTU!1PJOU QPJOUT;
GPSFBDI (J; 1 .. 7) \
JG (J % 2) \
QPJOUT.JOTFSU"U)FBE(1PJOU(J, J));
^ FMTF \
QPJOUT.BQQFOE(1PJOU(J, J));
^
^
XSJUFMO(QPJOUT);
^
1C@ JPOKPO:
((5,5) -> (3,3) -> (1,1) -> (2,2) -> (4,4) -> (6,6))
Bit Operations
87.50
1. &O H<T =@ <>>@KO<=G@ OJ PN@ H<BD> >JINO<ION DI NP>C < NCJMO API>ODJI. ,OC@MRDN@, OC@ >J?@
H<T B@O OJJ >JHKGD><O@?.
TUSJOH EPUUFE(VJOU BEESFTT)
\
SFUVSO GPSNBU("%T.%T.%T.%T",
(BEESFTT >> 24) & 0YGG,
(BEESFTT >> 16) & 0YGG,
(BEESFTT >> 8) & 0YGG,
(BEESFTT >> 0) & 0YGG);
^
B@><PN@ OC@ OTK@ DN <I PINDBI@? OTK@, OC@ =DON OC<O <M@ DIN@MO@? DIOJ OC@ Q<GP@ AMJH
OC@ G@AO-C<I? ND?@ RDGG <GG C<Q@ 0 Q<GP@N. #JM OC<O M@<NJI, OC@M@ DN IJ I@@? OJ H<NF OC@
Q<GP@ OC<O DN NCDAO@? =T 24 =DON. A??DODJI<GGT, NDI>@ NCDAODIB =T 0 =DON C<N IJ @AA@>O, OC<O
JK@M<ODJI ><I =@ @GDHDI<O@? <N R@GG:
TUSJOH EPUUFE(VJOU BEESFTT)
\
SFUVSO GPSNBU("%T.%T.%T.%T",
BEESFTT >> 24,
(BEESFTT >> 16) & 0YGG,
(BEESFTT >> 8) & 0YGG,
BEESFTT & 0YGG);
^
EJ7D5;E7 (A>GF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
697
2. "<>C J>O@O ><I =@ NCDAO@? OJ DON KMJK@M KJNDODJI DI OC@ &-Q4 <??M@NN <I? OC@I OC@N@
@SKM@NNDJIN ><I =@ "AD'D76":
VJOU JQ"EESFTT(VCZUF PDUFU3, // NPTU TJHOJGJDBOU PDUFU
VCZUF PDUFU2,
VCZUF PDUFU1,
VCZUF PDUFU0) // MFBTU TJHOJGJDBOU PDUFU
\
SFUVSO
(PDUFU3 << 24) ]
(PDUFU2 << 16) ]
(PDUFU1 << 8) ]
(PDUFU0 << 0);
^
3. 1C@ AJGGJRDIB H@OCJ? NO<MON RDOC < Q<GP@ RC@M@ <GG JA OC@ =DON <M@ 1. #DMNO, OC@ Q<GP@ DN
NCDAO@? OJ OC@ MDBCO NJ OC<O OC@ PKK@M =DON =@>JH@ 0, <I? OC@I DO DN NCDAO@? OJ OC@ G@AO NJ
OC<O OC@ GJR@M =DON =@>JH@ 0:
VJOU NBTL(JOU MPXFTU#JU, JOU XJEUI)
\
VJOU SFTVMU = VJOU.NBY;
SFTVMU >>= (VJOU.TJ[FPG * 8) - XJEUI;
SFTVMU <<= MPXFTU#JU;
SFUVSO SFTVMU;
^
VJOU.NBY DN OC@ Q<GP@ RC@M@ <GG JA OC@ =DON <M@ 1. AGO@MI<ODQ@GT, OC@ ><G>PG<ODJI ><I
NO<MO RDOC OC@ Q<GP@ OC<O DN OC@ >JHKG@H@IO JA 0, RCD>C DN OC@ N<H@ <N VJOU.NBY:
VJOU SFTVMU = _0;
// ...
GPSFBDI with Structs and Classes
87.51
1. 1C@ NO@K NDU@ HPNO =@ NOJM@? <GJIBND?@ CFHJO <I? FOE, <I? OC@ @G@H@IO Q<GP@ HPNO =@
DI>M@H@IO@? =T OC<O NO@K NDU@:
TUSVDU /VNCFS3BOHF
\
JOU CFHJO;
JOU FOE;
JOU TUFQ4J[F;
JOU PQ"QQMZ(JOU EFMFHBUF(SFG JOU) EH) DPOTU
\
JOU SFTVMU;
GPS (JOU OVNCFS = CFHJO; OVNCFS != FOE; OVNCFS += TUFQ4J[F) \
SFTVMU = EH(OVNCFS);
JG (SFTVMU) \
CSFBL;
^
^
SFUVSO SFTVMU;
^
^
JNQPSU TUE.TUEJP;
WPJE NBJO()
\
EJ7D5;E7 (A>GF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
698
GPSFBDI (FMFNFOU; /VNCFS3BOHF(0, 10, 2)) \
XSJUF(FMFNFOU, ' ');
^
^
2.
JNQPSU TUE.TUEJP;
JNQPSU TUE.TUSJOH;
DMBTT 4UVEFOU
\
TUSJOH OBNF;
JOU JE;
UIJT(TUSJOH OBNF, JOU JE)
\
UIJT.OBNF = OBNF;
UIJT.JE = JE;
^
PWFSSJEF TUSJOH UP4USJOH()
\
SFUVSO GPSNBU("%T(%T)", OBNF, JE);
^
^
DMBTT 5FBDIFS
\
TUSJOH OBNF;
TUSJOH TVCKFDU;
UIJT(TUSJOH OBNF, TUSJOH TVCKFDU)
\
UIJT.OBNF = OBNF;
UIJT.TVCKFDU = TVCKFDU;
^
PWFSSJEF TUSJOH UP4USJOH()
\
SFUVSO GPSNBU("%T UFBDIFS %T", TVCKFDU, OBNF);
^
^
DMBTT 4DIPPM
\
QSJWBUF:
4UVEFOU<> TUVEFOUT;
5FBDIFS<> UFBDIFST;
QVCMJD:
UIJT(4UVEFOU<> TUVEFOUT, 5FBDIFS<> UFBDIFST)
\
UIJT.TUVEFOUT = TUVEFOUT;
UIJT.UFBDIFST = UFBDIFST;
^
/* 5IJT PQ"QQMZ PWFSSJEF XJMM CF DBMMFE XIFO UIF GPSFBDI
* WBSJBCMF JT B 4UVEFOU. */
JOU PQ"QQMZ(JOU EFMFHBUF(SFG 4UVEFOU) EH)
\
JOU SFTVMU;
GPSFBDI (TUVEFOU; TUVEFOUT) \
SFTVMU = EH(TUVEFOU);
JG (SFTVMU) \
CSFBL;
EJ7D5;E7 (A>GF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
699
^
^
SFUVSO SFTVMU;
^
/* 4JNJMBSMZ, UIJT PQ"QQMZ XJMM CF DBMMFE XIFO UIF GPSFBDI
* WBSJBCMF JT B 5FBDIFS. */
JOU PQ"QQMZ(JOU EFMFHBUF(SFG 5FBDIFS) EH)
\
JOU SFTVMU;
GPSFBDI (UFBDIFS; UFBDIFST) \
SFTVMU = EH(UFBDIFS);
JG (SFTVMU) \
CSFBL;
^
^
SFUVSO SFTVMU;
^
^
WPJE QSJOU*OEFOUFE(5)(5 WBMVF)
\
XSJUFMO(" ", WBMVF);
^
WPJE NBJO()
\
BVUP TDIPPM = OFX 4DIPPM(
< OFX 4UVEFOU("$BO", 1),
OFX 4UVEFOU("$BOBO", 10),
OFX 4UVEFOU("$FN", 42),
OFX 4UVEFOU("$FNJMF", 100) >,
< OFX 5FBDIFS("/B[NJZF", ".BUI"),
OFX 5FBDIFS(".BLCVMF", "-JUFSBUVSF") >);
XSJUFMO("4UVEFOU MPPQ");
GPSFBDI (4UVEFOU TUVEFOU; TDIPPM) \
QSJOU*OEFOUFE(TUVEFOU);
^
XSJUFMO("5FBDIFS MPPQ");
GPSFBDI (5FBDIFS UFBDIFS; TDIPPM) \
QSJOU*OEFOUFE(UFBDIFS);
^
^
1C@ JPOKPO:
4UVEFOU MPPQ
$BO(1)
$BOBO(10)
$FN(42)
$FNJMF(100)
5FBDIFS MPPQ
.BUI UFBDIFS /B[NJZF
-JUFSBUVSF UFBDIFS .BLCVMF
AN TJP ><I N@@, OC@ DHKG@H@IO<ODJIN JA =JOC JA OC@ PQ"QQMZ() JQ@MMD?@N <M@ @S<>OGT
OC@ N<H@, @S>@KO OC@ NGD>@ OC<O OC@T DO@M<O@ JI. 1J M@?P>@ >J?@ ?PKGD><ODJI, OC@
EJ7D5;E7 (A>GF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
700
>JHHJI API>ODJI<GDOT ><I =@ HJQ@? OJ <I DHKG@H@IO<ODJI API>ODJI O@HKG<O@, RCD>C
OC@I B@ON ><GG@? =T OC@ ORJ PQ"QQMZ() JQ@MMD?@N:
DMBTT 4DIPPM
\
// ...
JOU PQ"QQMZ*NQM(5)(5<> TMJDF, JOU EFMFHBUF(SFG 5) EH)
\
JOU SFTVMU;
GPSFBDI (FMFNFOU; TMJDF) \
SFTVMU = EH(FMFNFOU);
JG (SFTVMU) \
CSFBL;
^
^
SFUVSO SFTVMU;
^
JOU PQ"QQMZ(JOU EFMFHBUF(SFG 4UVEFOU) EH)
\
SFUVSO PQ"QQMZ*NQM(TUVEFOUT, EH);
^
JOU PQ"QQMZ(JOU EFMFHBUF(SFG 5FBDIFS) EH)
\
SFUVSO PQ"QQMZ*NQM(UFBDIFST, EH);
^
^
EJ7D5;E7 (A>GF;A@E
CABKD;9:F M 2009-2012, :FFB://66;>;.AD9
701

You might also like