ΠΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΏΡΠΈΡΠ°ΡΠ΅Π½ΠΈΡ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ ΠΏΠΎΠ»Π΅Π·Π½Ρ Π΄Π»Ρ ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΡ ΠΈ ΡΠΌΠ΅Π½ΡΡΠ΅Π½ΠΈΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Π² ΡΠΈΠΊΠ»Π°Ρ . ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΎΠΊΠ°Π½ΡΠΈΠ²Π°ΡΡΡΡΡΡ Π½Π»Π΅ΠΌ ΡΡΡΠΎΠΊΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΡΠ°ΠΊ:
inline void cpy(char* p, const char* q) (* while (*p++ = *q++) ; *)
ΠΠ°ΠΏΠΎΠΌΠ½Ρ, ΡΡΠΎ ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΠ΅ ΠΈ ΡΠΌΠ΅Π½ΡΡΠ΅Π½ΠΈΠ΅ Π°ΡΠΈΡΠΌΠ΅ΡΠΈΡΠ΅ΡΠΊΠΈΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ, ΡΠ°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ ΡΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ Π²ΡΡΠΈΡΠ°Π½ΠΈΠ΅ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ, ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΡΡΡ Π² ΡΠ΅ΡΠΌΠΈΠ½Π°Ρ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Π²Π΅ΠΊΡΠΎΡΠ°, Π½Π° ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ p++ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ ΡΠΎΠΌΡ, ΡΡΠΎ p ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π½Π° ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ. ΠΠ»Ρ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ p ΡΠΈΠΏΠ° T* ΠΏΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅:
long(p+1) == long(p)+sizeof(T);
3.2.4 ΠΠΎΠ±ΠΈΡΠΎΠ²ΡΠ΅ Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ
ΠΠΎΠ±ΠΈΡΠΎΠ²ΡΠ΅ Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ
amp; ! ^ ~ »» ««
ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡΡΡ ΠΊ ΡΠ΅Π»ΡΠΌ, ΡΠΎ Π΅ΡΡΡ ΠΊ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌ ΡΠΈΠΏΠ° char, short, int, long ΠΈ ΠΈΡ unsigned Π°Π½Π°Π»ΠΎΠ³Π°ΠΌ, ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ ΡΠΎΠΆΠ΅ ΡΠ»ΡΠ΅.
ΠΠ΄Π½ΠΎ ΠΈΠ· ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΡ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΠΏΠΎΠ±ΠΈΡΠΎΠ²ΡΡ Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈΡ ΠΎΠΏΡΠ°ΡΠΈΠΉ β ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΌΠ°Π»Π΅Π½ΡΠΊΠΎΠ³ΠΎ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° (Π²Π΅ΠΊΡΠΎΡ Π±ΠΈΡΠΎΠ²). Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΊΠ°ΠΆΠ΄ΡΠΉ Π±ΠΈΡ Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²ΠΎΠ³ΠΎ ΡΠ΅Π»ΠΎΠ³ΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΎΠ΄ΠΈΠ½ ΡΠ»Π΅Π½ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π°, Π° ΡΠΈΡΠ»ΠΎ ΡΠ»Π΅Π½ΠΎΠ² ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΎ ΡΠΈΡΠ»ΠΎΠΌ Π±ΠΈΡΠΎΠ². ΠΠ½Π°ΡΠ½Π°Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ amp; ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠΈΡΡΠ΅ΡΡΡ ΠΊΠ°ΠΊ ΠΏΠ΅ΡΠ΅ΡΠ΅ΡΠ΅Π½ΠΈΠ΅, ! ΠΊΠ°ΠΊ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅, Π° ^ ΠΊΠ°ΠΊ ΡΠ°Π·Π½ΠΎΡΡΡ. ΠΠ»Ρ Π½Π°ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΡ ΡΠ»Π΅Π½ΠΎΠ² ΡΠ°ΠΊΠΎΠ³ΠΎ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½ΠΈΠ΅. ΠΠΎΡ ΠΌΠ°Π»Π΅Π½ΡΠΊΠΈΠΉ ΠΏΡΠΌΠ΅Ρ, Π·Π°ΠΈΠΌΡΡΠ²ΠΎΠ²Π°Π½Π½ΡΠΉ ΠΈΠ· ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ (Π½Π΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΠΈΡΠ΅ΡΡΠ΅ΠΉΡΠ°) Β«stream.hΒ»:
enum state_value (* _good=0, _eof=1, _fail=2, _bad=4 *); // Ρ ΠΎΡΠΎΡΠΎ, ΠΊΠΎΠ½Π΅Ρ ΡΠ°ΠΉΠ»Π°, ΠΎΡΠΈΠ±ΠΊΠ°, ΠΏΠ»ΠΎΡ ΠΎ
ΠΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ _good Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠΌ. Π― ΠΏΡΠΎΡΡΠΎ Ρ ΡΠ΅Π», ΡΡΠΎΠ±Ρ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅, ΠΊΠΎΠ³Π΄Π° Π²ΡΠ΅ Π² ΠΏΠΎΡΡΠ΄ΠΊΠ΅, ΠΈΠΌΠ΅Π»ΠΎ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡΠ΅Π΅ ΠΈΠΌΡ. Π‘ΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΠΏΠΎΡΠΎΠΊΠ° ΠΌΠΎΠΆΠ½ΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π·Π°Π½ΠΎΠ²ΠΎ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ·ΠΎΠΌ:
cout.state = _good;
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ, Π½Π΅ Π±ΡΠ» Π»ΠΈ ΠΈΡΠΏΠΎΡΡΠ΅Π½ ΠΏΠΎΡΠΎΠΊ ΠΈΠ»ΠΈ Π΄ΠΎΠΏΡΡΠ΅Π½Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½Π°Ρ ΠΎΡΠΈΠ±ΠΊΠ°:
if (cout.state amp;(_bad!_fail)) // Π½Π΅ good
ΠΡΠ΅ ΠΎΠ΄Π½ΠΈ ΡΠΊΠΎΠ±ΠΊΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ amp; ΠΈΠΌΠ΅Π΅Ρ Π±ΠΎΠ»Π΅Π΅ Π²ΡΠΎΠΊΠΈΠΉ ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ, ΡΠ΅ΠΌ !.
Π€ΡΠ½ΠΊΡΠΈΡ, Π΄ΠΎΡΡΠΈΠ³Π°ΡΡΠ°Ρ ΠΊΠΎΠ½ΡΠ° Π²Π²ΠΎΠ΄Π°, ΠΌΠΎΠΆΠ΅Ρ ΡΠΎΠΎΠ±ΡΠ°ΡΡ ΠΎΠ± ΡΡΠΎΠΌ ΡΠ°ΠΊ:
cin.state != _eof;
ΠΠΏΠ΅ΡΠ°ΡΠΈΡ != ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΏΠΎΡΠΎΠΌΡ, ΡΡΠΎ ΠΏΠΎΡΠΎΠΊ ΡΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΈΡΠΏΠΎΡΡΠ΅Π½ (ΡΠΎ Π΅ΡΡΡ, state==_bad), ΠΏΠΎΡΡΠΎΠΌΡ
cin.state = _eof;
ΠΎΡΠΈΡΡΠΈΠ»ΠΎ Π±Ρ ΡΡΠΎΡ ΠΏΡΠΈΠ·Π½Π°ΠΊ. Π Π°Π·Π»ΠΈΡΠΈΠ΅ Π΄Π²ΡΡ ΠΏΠΎΡΠΎΠΊΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡ ΡΠ°ΠΊ:
state_value diff = cin.state^cout.state;
Π ΡΠ»ΡΡΠ°Π΅ ΡΠΈΠΏΠ° stream_state (ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΠΏΠΎΡΠΎΠΊΠ°) ΡΠ°ΠΊΠ°Ρ ΡΠ°Π½ΠΎΡΡΡ Π½Π΅ ΠΎΡΠ΅Π½Ρ Π½ΡΠΆΠ½Π°, Π½ΠΎ Π΄Π»Ρ Π΄ΡΡΠ³ΠΈΡ ΠΏΠΎΡ ΠΎΠΆΠΈΡ ΡΠΈΠΏΠΎΠ² ΠΎΠ½Π° ΠΎΠΊΠ°Π·Π²Π°Π΅ΡΡΡ ΡΠ°ΠΌΠΎΠΉ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠΈ ΡΡΠ°Π²Π½Π΅Π½ΠΈΠΈ Π²Π΅ΠΊΡΠΎΡΠ° Π±ΠΈΡ, ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡΠ΅Π³ΠΎ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΡΡ, Ρ Π΄ΡΡΠ³ΠΈΠΌ, ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡΠΈΠΌ ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΡ, ΠΆΠ΄ΡΡΠΈΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ.
Π‘Π»Π΅Π΄ΡΠ΅Ρ Π·Π°ΠΌΠ΅ΡΠΈΡΡ, ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΠ»Π΅ΠΉ (#2.5.1) Π² Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΎΠΊΡΠ°ΡΠ΅Π½Π½ΠΎΠΉ Π·Π°ΠΏΠΈΡΡΡ ΡΠ΄Π²ΠΈΠ³Π° ΠΈ ΠΌΠ°ΡΠΊΡΠΎΠ²Π°Π½ΠΈΡ Π΄Π»Ρ ΠΈΠ·Π²Π»Π΅ΡΠ΅Π½ΠΈΡ ΠΏΠΎΠ»Π΅ΠΉ Π±ΠΈΡ ΠΈΠ· ΡΠ»ΠΎΠ²Π°. ΠΡΠΎ, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ, ΠΌΠΎΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ ΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΏΠΎΠ±ΠΈΡΠΎΠ²ΡΡ Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ, ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΈΠ·Π²Π»Π΅ΡΡ ΡΡΠ΅Π΄Π½ΠΈΠ΅ 16 Π±ΠΈΡ ΠΈΠ· 32-Π±ΠΈΡΠΎΠ²ΠΎΠ³ΠΎ int ΠΌΠΎΠΆΠ½ΠΎ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
unsigned short middle(int a) (* return (a»»8) amp;0xffff; *)
ΠΠ΅ ΠΏΡΡΠ°ΠΉΡΠ΅ ΠΏΠΎΠ±ΠΈΡΠΎΠ²ΡΠ΅ Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Ρ Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈΠΌΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡΠΌΠΈ:
amp; amp; !! !
ΠΠΎΡΠ»Π΅Π΄Π½ΠΈΠ΅ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ 0 ΠΈΠ»ΠΈ 1, ΠΈ ΠΎΠ½ΠΈ Π³Π»Π°Π²Π½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΈΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π΄Π»Ρ Π·Π°ΠΏΠΈΡΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π² ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ°Ρ if, while ΠΈΠ»ΠΈ for (#3.3.1). ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, !0 (Π½Π΅ Π½ΠΎΠ»Ρ) Π΅ΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ 1, ΡΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ ~ 0 (Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π½ΡΠ»Ρ) Π΅ΡΡΡ Π½Π°Π±ΠΎΡ Π±ΠΈΡΠΎΠ² Π²ΡΠ΅-Π΅Π΄ΠΈΠ½ΠΈΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΠ±ΡΡΠ½ΠΎ ΡΠ²Π»ΡΠ΅ΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ -1.
3.2.5 ΠΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΈΠΏΠ°
ΠΡΠ²Π°Π΅Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ²Π½ΠΎ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠΏΠ° Π² Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π΄ΡΡΠ³ΠΎΠ³ΠΎ. Π―Π²Π½ΠΎΠ΅ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΈΠΏΠ° Π΄Π°Π΅Ρ Π·Π½Π°ΡΠ½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ° Π΄Π»Ρ Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΡΠΈΠΏΠ°. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ:
float r = float(1);
ΠΏΠ΅ΡΠ΅Π΄ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅Ρ ΡΠ΅Π»ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ 1 ΠΊ Π·Π½ΡΠ΅Π½ΠΈΡ Ρ ΠΏΠ»Π°Π²Π°ΡΡΠ΅ΠΉ ΡΠΎΡΠΊΠΎΠΉ 1.0. Π Π΅Π·ΡΠ»ΡΡΠ°Ρ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ ΡΠΈΠΏΠ° Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ lvalue, ΠΏΠΎΡΡΠΎΠΌΡ Π΅ΠΌΡ Π½Π΅Π»ΡΠ·Ρ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°ΡΡ (Π΅ΡΠ»ΠΈ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΈΠΏ Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΡΡΠ»ΠΎΡΠ½ΡΠΌ ΡΠΈΠΏΠΎΠΌ).
ΠΡΡΡ Π΄Π²Π° ΡΠΏΠΎΡΠΎΠ±Π° Π·Π°ΠΏΠΈΡΠΈ ΡΠ²Π½ΠΎΠ³ΠΎ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ ΡΠΈΠΏΠ°: ΡΡΠ΄ΠΈΡΠΈΠΎΠ½Π½Π°Ρ Π² C Π·Π°ΠΏΠΈΡΡ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΡ ΠΊ ΡΠΈΠΏΡ (double)a ΠΈ ΡΡΠ½ΠΊΡΠΈΠ½Π°Π»ΡΠ½Π°Ρ Π·Π°ΠΏΠΈΡΡ double(a). Π€ΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½Π°Ρ Π·Π°ΠΏΠΈΡΡ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΌΠ΅Π½ΡΡΡΡΡ Π΄Π»Ρ ΡΠΈΠΏΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π΅ ΠΈΠΌΠ΅ΡΡ ΠΏΡΠΎΡΡΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΡΠΎΠ±Ρ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΊ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΡΠ½ΠΎΠΌΡ ΡΠΈΠΏΡ Π½Π°Π΄ΠΎ ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π·Π°ΠΏΠΈΡΡ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ ΡΠΈΠΏΠ°
char* p = (char*)0777;
ΠΈΠ»ΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ Π½ΠΎΠ²ΠΎΠ΅ ΠΈΠΌΡ ΡΠΈΠΏΠ°:
typedef char* Pchar; char* p = Pchar(0777);
ΠΠΎ ΠΌΠΎΠ΅ΠΌΡ ΠΌΠ½Π΅Π½ΠΈΡ, ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½Π°Ρ Π·Π°ΠΏΠΈΡΡ Π² Π½Π΅ΡΡΠΈΠ²ΠΈΠ°Π»ΡΠ½ΡΡ ΡΠ»ΡΡΠ°ΡΡ ΠΏΡΠ΅Π΄ΠΏΠΎΡΡΠΈΡΠ΅Π»ΡΠ½Π°. Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ Π΄Π²Π° ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ½ΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ°
Pname n2 = Pbase(n1-Β»tp)-Β»b_name; //ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½Π°Ρ Π·Π°ΠΏΠΈΡΡ Pname n3 = ((Pbase)n2-Β»tp)-Β»b_name; // Π·Π°ΠΏΠΈΡΡ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΡ // ΠΊ ΡΠΈΠΏΡ ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ -Β» ΠΈΠΌΠ΅Π΅Ρ Π±ΠΎΠ»ΡΡΠΈΠΉ ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ, ΡΠ΅ΠΌ ΠΏΡΠ²Π΅Π΄Π΅Π½ΠΈΠ΅, ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π΅ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠΈΡΡΠ΅ΡΡΡ ΠΊΠ°ΠΊ
((Pbase)(n2-Β»tp))-Β»b_name
Π‘ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ²Π½ΠΎΠ³ΠΎ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ ΡΠΈΠΏΠ° ΠΊ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΡΠ½ΡΠΌ ΡΠΏΠ°ΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΈΠΌΠΈΡΠΈΡΠΎΠ²Π°ΡΡ, ΡΡΠΎ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΈΠΌΠ΅Π΅Ρ ΡΠΎΠ²Π΅ΡΡΠ΅Π½Π½ΠΎ ΠΏΡΠΎΠΈΠ²ΠΎΠ»ΡΠ½ΡΠΉ ΡΠΈΠΏ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ:
any_type* p = (any_type*) amp;some_object;
ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²ΠΎΠΌ p Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌ some_object ΠΊΠ°ΠΊ Ρ Π»ΡΠ±ΡΠΌ ΡΠΈΠΏΠΎΠΌ any_type.
ΠΠΎΠ³Π΄Π° ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΈΠΏΠ° Π½Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ, Π΅Π³ΠΎ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΈΠ±Π΅Π³Π°ΡΡ. ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, Π² ΠΊΠΎΡΠΎΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ²Π½ΡΡ ΠΏΡΠ΅ΠΎΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠΉ ΡΠΈΠΏΠΎΠ², ΡΡΡΠ΄Π½Π΅Π΅ ΠΏΠΎΠ½ΠΈΠΌΠ°ΡΡ, ΡΠ΅ΠΌ ΡΠ΅, Π² ΠΊΠΎΡΠΎΡΡΡ ΡΡΠΎ Π½Π΅ Π΄Π΅Π»Π°Π΅ΡΡΡ. ΠΠ΄Π½Π°ΠΊΠΎ ΡΠ°ΠΊΠΈΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π»Π΅Π³ΡΠ΅ ΠΏΠΎΠ½ΠΈΠΌΠ°ΡΡ, ΡΠ΅ΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΏΡΠΎΡΡΠΎ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΠ΅ ΡΠΈΠΏΡ Π΄Π»Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΏΠΎΠ½ΡΡΠΈΠΉ Π±Π»Π΅Π΅ Π²ΡΡΠΎΠΊΠΎΠ³ΠΎ ΡΡΠΎΠ²Π½Ρ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΎΠΏΠ΅ΡΠΈΡΡΠ΅Ρ ΡΠ΅Π³ΠΈΡΡΡΠΎΠΌ ΡΡΡΡΠΎΠΉΡΡΠ²Π° Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ΄Π²ΠΈΠ³Π° ΠΈ ΠΌΠ°ΡΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΡ, Π²ΠΌΠ΅ΡΡΠΎ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡΡΡ struct ΠΈ ΠΎΠΏΠ΅ΡΠΈΡΠΎΠ²Π°ΡΡ Π΅Ρ, ΡΠΌ. #2.5.2). ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΡΡΡ ΡΠ²Π½ΠΎΠ³ΠΎ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ ΡΠΈΠΏΠ° ΡΠ°ΡΡΠΎ ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΡΠΎΠΌ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΡΠΈΠΏΠΎΠ² ΠΎΠ±ΡΠ°Π±Π°ΡΠ²Π°ΡΡΡΡ Π² ΡΠ·ΡΠΊΠ΅, ΠΈ ΠΎΡΠ΅Π½Ρ ΡΠ°ΡΡΠΎ ΠΎΡ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠ΅ΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ:
int i = 1; char* pc = Β«asdfΒ»; int* pi = amp;i;
i = (int)pc; pc = (char*)i; // ΠΎΡΡΠ΅ΡΠ΅Π³Π°ΠΉΡΠ΅ΡΡ! Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ pc ΠΌΠΎΠΆΠ΅Ρ ΠΈΠ·ΠΌ//Π½ΠΈΡΡΡΡ // Π½Π° Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΠΌΠ°ΡΠΈΠ½Π°Ρ // sizeof(int)Β«sizeof(char*) pi = (int*)pc; pc = (char*)pi; // ΠΎΡΡΠ΅ΡΠ΅Π³Π°ΠΉΡΠ΅ΡΡ! Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ pc ΠΌΠΎΠΆΠ΅Ρ ΠΈΠ·ΠΌ// Π½ΠΈΡΡΡΡ // Π½Π° Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΠΌΠ°ΡΠΈΠ½Π°Ρ char* // ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅ΡΡΡ ΠΈΠ½Π°ΡΠ΅, ΡΠ΅ΠΌ int*
ΠΠ° ΠΌΠ½ΠΎΠ³ΠΈΡ ΠΌΠ°ΡΠΈΠ½Π°Ρ Π½ΠΈΡΠ΅Π³ΠΎ ΠΏΠ»ΠΎΡ ΠΎΠ³ΠΎ Π½Π΅ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ, Π½ΠΎ Π½Π° Π΄ΡΡΠ³ΠΈΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ Π±ΡΠ΄ΡΡ ΠΊΠ°ΡΠ°ΡΡΡΠΎΡΠΈΡΠ΅ΡΠΊΠΈΠΌΠΈ. ΠΡΠΎΡ ΠΊΠΎΠ΄ Π² Π»ΡΡΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ Π½Π΅ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠΈΠΌ. ΠΠ±ΡΡΠ½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π±Π΅Π· ΡΠΈΡΠΊΠ° ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°ΡΡ, ΡΡΠΎ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΡΡΡΡΠΊΡΡΡΡ ΠΈΠΌΠ΅ΡΡ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π½ΠΈΠ΅. ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, Π»ΡΠ±ΠΎΠΉ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ ΠΌΠΎΠΆΠ½ΠΎ (Π±Π΅Π· ΡΠ²Π½ΠΎΠ³ΠΎ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·Π²Π°Π½ΠΈΡ ΡΠΈΠΏΠ°) ΠΏΡΠΈΡΠ²ΠΎΠΈΡΡ void*, Π° void* ΠΌΠΎΠΆΠ½ΠΎ ΡΠ²Π½ΠΎ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°ΡΡ ΠΊ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π»ΡΠ±ΠΎΠ³ΠΎ ΡΠΈΠΏΠ°.
Π Π‘++ ΡΠ²Π½ΠΎΠ΅ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΈΠΏΠ° ΠΎΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ Π½Π΅Π½ΡΠΆΠ½ΡΠΌ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ ΡΠ»ΡΡΠ°ΡΡ , ΠΊΠΎΠ³Π΄Π° C (ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ ΡΠ·ΡΠΊΠΈ) ΡΡΠ΅Π±ΡΡΡ Π΅Π³ΠΎ. ΠΠΎ ΠΌΠ½Π³ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°Ρ ΡΠ²Π½ΠΎΠ³ΠΎ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ ΡΠΈΠΏΠ° ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ²ΡΠ΅ΠΌ ΠΈΠ·Π±ΠΆΠ°ΡΡ, Π° Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ Π΄ΡΡΠ³ΠΈΡ Π΅Π³ΠΎ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΎΠΊΠ°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ Π²
Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠΌ ΡΠΈΡΠ»Π΅ ΠΏΠΎΠ΄ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ.
3.2.6 Π‘Π²ΠΎΠ±ΠΎΠ΄Π½Π°Ρ ΠΏΠ°ΠΌΡΡΡ
ΠΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ ΡΠ²Π»ΡΠ΅ΡΡΡ Π»ΠΈΠ±ΠΎ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΌ, Π»ΠΈΠ±ΠΎ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΌ (ΡΠΌ. #2.1.3). Π‘ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ ΡΠ°Π·ΠΌΠ΅ΡΠ°Π΅ΡΡΡ Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π·Π°ΠΏΡΡΠΊΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΈ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π² ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π²ΡΠ΅Π³ΠΎ Π²ΡΠΏΠΎΠ»Π½Π½ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ ΡΠ°Π·ΠΌΠ΅ΡΠ°Π΅ΡΡΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π· ΠΏΡΠΈ Π²Ρ ΠΎΠ΄Π΅ Π² Π΅Π³ΠΎ Π±Π»ΠΎΠΊ ΠΈ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΡΠΎΠ»ΡΠΊΠΎ Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° ΠΈΠ· ΡΡΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° Π½Π΅ Π²ΡΡΠ»ΠΈ. ΠΠ΄Π½Π°ΠΊΠΎ ΡΠ°ΡΡΠΎ Π±ΡΠ²Π°Π΅Ρ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ Π½Π²ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ, ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠΉ Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° ΠΎΠ½ Π½Π΅ ΡΡΠ°Π½Π΅Ρ Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ Π½ΡΠΆΠ΅Π½. Π ΡΠ°ΡΡΠ½ΠΎΡΡΠΈ, ΡΠ°ΡΡΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΠΎΡΠ»Π΅ Π²ΠΎΠ·Π²ΡΠ°ΡΠ° ΠΈΠ· ΡΡΠ½ΠΊΡΠΈΠΈ, Π³Π΄Π΅ ΠΎΠ½ ΡΠΎΠ·Π΄Π°Π΅ΡΡ. Π’Π°ΠΊΠΈΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΡΠΎΠ·Π΄Π°Π΅Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ new, Π° Π²ΠΏΠΎΡΠ»Π΅Π΄ΡΡΠ²ΠΈΠΈ ΡΠ½ΠΈΡΠΎΠΆΠ°ΡΡ ΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ΅ΠΉ delete. ΠΡΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΡ, Π²ΡΠ΄Π΅Π»Π΅Π½Π½ΡΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ new, Π³ΠΎΠ²ΠΎΡΡΡ, ΡΡΠΎ ΠΎΠ½ΠΈ Π² ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ. Π’Π°ΠΊΠΈΠΌΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌΠΈ ΠΎΠ±ΡΡΠ½ΠΎ ΡΠ²Π»ΡΡΡΡΡ Π²Π΅ΡΡΠΈΠ½Ρ Π΄Π΅ΡΠ΅Π²ΡΠ΅Π² ΠΈΠ»ΠΈ ΡΠ»Π΅ΠΌΠ΅ΡΡ ΡΠ²ΡΠ·Π°Π½Π½ΡΡ ΡΠΏΠΈΡΠΊΠΎΠ², ΡΠ²Π»ΡΡΡΠΈΠ΅ΡΡ ΡΠ°ΡΡΡΡ Π±ΠΎΠ»ΡΡΠ΅ΠΉ ΡΡΡΡΠΊΡΡΡΡ Π΄Π°Π½Π½ΡΡ , ΡΠ°Π·ΠΌΠ΅Ρ ΠΊΠΎΡΠΎΡΠΎΠΉ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΈΠ·Π²Π΅ΡΡΠ΅Π½ Π½Π° ΡΡΠ°Π΄ΠΈΠΈ ΠΊΠΎΠΏΠΈΠ»ΡΡΠΈΠΈ. Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π±Ρ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ Π² Π΄ΡΡ Π΅ Π½Π°ΠΏΠΈΡΠ°Π½Π½ΠΎΠ³ΠΎ Π½Π°ΡΡΠΎΠ»ΡΠ½ΠΎΠ³ΠΎ ΠΊΠ°Π»ΡΠΊΡΠ»ΡΡΠΎΡΠ°. Π€ΡΠ½ΠΊΡΠΈΠΈ ΡΠΈΠ½ΡΠ°ΠΊΡΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π° ΠΌΠΎΠ³ΡΡ ΡΡΡΠΎΠΈΡΡ Π΄ΡΠ΅Π²ΠΎΠ²ΠΈΠ΄Π½ΠΎΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π²ΡΡΠΆΠ΅Π½ΠΈΠΉ, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΠΏΡΠΈ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ ΠΊΠΎΠ΄Π°. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ:
struct enode (* token_value oper; enode* left; enode* right; *);
enode* expr() (* enode* left = term();
for(;;) switch(curr_tok) (* case PLUS: case MINUS: get_token(); enode* n = new enode; n-Β»oper = curr_tok; n-Β»left = left; n-Β»right = term(); left = n; break; default: return left; *) *)
ΠΠΎΠ»ΡΡΠ°ΡΡΠ΅Π΅ΡΡ Π΄Π΅ΡΠ΅Π²ΠΎ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡ ΠΊΠΎΠ΄Π° ΠΌΠΎΠΆΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΡΠ°ΠΊ:
void generate(enode* n) (* switch (n-Β»oper) (* case PLUS: // Π΄Π΅Π»Π°Π΅Ρ Π½Π΅ΡΡΠΎ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅Π΅ delete n; *) *)
ΠΠ±ΡΠ΅ΠΊΡ, ΡΠΎΠ·Π΄Π°Π½Π½ΡΠΉ Ρ ΠΏΠΎΠΌΠΎΡΡΡ new, ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ, ΠΏΠΎΠΊΠ° ΠΎΠ½ Π½Π΅ Π±ΡΠ΄Π΅Ρ ΡΠ²Π½ΠΎ ΡΠ½ΠΈΡΡΠΎΠΆΠ΅Π½ delete, ΠΏΠΎΡΠ»Π΅ ΡΠ΅Π³ΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΎΠ½ Π·Π°Π½ΠΈΠΌΠ°Π», ΠΎΠΏΡΡΡ ΠΌΠΎΠΆΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ new. ΠΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ Β«ΡΠ±ΠΎΡΡΠΊΠ° ΠΌΡΡΠΎΡΠ°Β», ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΡΠ΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡΡ, Π½Π° ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π΅Ρ ΡΡΡΠ»ΠΎΠΊ, ΠΈ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΈΡ Π² ΡΠ°ΡΠΏΠΎΡΡΠΆΠ΅Π½ΠΈΠ΅ new, Π½Π΅Ρ. ΠΠΏΠ΅ΡΠ°ΡΠΈΡ delete ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΊ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ» Π²ΠΎΠ·Π²ΡΠ°ΡΠ΅Π½ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ΅ΠΉ new, ΠΈΠ»ΠΈ ΠΊ Π½ΡΠ»Ρ. ΠΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ delete ΠΊ Π½ΡΠ»Ρ Π½Π΅ Π²ΡΠ·Π²Π°Π΅Ρ Π½ΠΈΠΊΠ°ΠΊΠΈΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ.
Π‘ ΠΏΠΎΠΌΠΎΡΡΡ new ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°ΠΊΠΆΠ΅ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ Π²Π΅ΠΊΡΠΎΡΠ° ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ². ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ:
char* save_string(char* p) (* char* s = new char[strlen(p)+1]; strcpy(s,p); return s; *)
Π‘Π»Π΅Π΄ΡΠ΅Ρ Π·Π°ΠΌΠ΅ΡΠΈΡΡ, ΡΡΠΎ ΡΡΠΎΠ±Ρ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡΡ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ, Π²Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ new, delete Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΠΌΠ΅ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΡΠ°Π·ΠΌΠ΅Ρ Π²ΡΠ΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ°. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ:
int main(int argc, char* argv[]) (* if (argc Β« 2) exit(1); char* p = save_string(argv[1]); delete p; *)
ΠΡΠΎ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ ΡΠΎΠΌΡ, ΡΡΠΎ ΠΎΠ±ΡΠ΅ΠΊΡ, Π²ΡΠ΄Π΅Π»Π΅Π½Π½ΡΠΉ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠ΅ΠΉ new, Π±ΡΠ΄Π΅Ρ Π·Π°Π½ΠΈΠΌΠ°ΡΡ Π±ΠΎΠ»ΡΡΠ΅ ΠΌΠ΅ΡΡΠ°, ΡΠ΅ΠΌ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ (ΠΎΠ±ΡΡΠ½ΠΎ, Π±ΠΎΠ»ΡΡΠ΅ Π½Π° ΠΎΠ΄Π½ΠΎ ΡΠ»ΠΎΠ²ΠΎ).
ΠΠΎΠΆΠ½ΠΎ ΡΠ°ΠΊΠΆΠ΅ ΡΠ²Π½ΠΎ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ ΡΠ°Π·ΠΌΠ΅Ρ Π²Π΅ΠΊΡΠΎΡΠ° Π² ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΡΠ½ΠΈΡΡΠΎΠΆΠ΅Π½ΠΈΡ delete. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ:
int main(int argc, char* argv[]) (* if (argc Β« 2) exit(1); int size = strlen(argv[1])+1; char* p = save_string(argv[1]); delete[size] p; *)
ΠΠ°Π΄Π°Π½Π½ΡΠΉ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ ΡΠ°Π·ΠΌΠ΅Ρ Π²Π΅ΠΊΡΠΎΡΠ° ΠΈΠ³Π½ΠΎΡΠΈΡΡΠ΅ΡΡΡ Π·Π° ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΡΠΈΠΏΠΎΠ², ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ (#5.5.5).
ΠΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ ΡΠ΅Π°Π»ΠΈΠ·ΡΡΡΡΡ ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ (#Ρ.7.2.3):
void operator new(long); void operator delete(void*);