Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«C++Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 10

Автор ΠœΡŽΡ€Ρ€Π΅ΠΉ Π₯ΠΈΠ»Π»

extern complex sqrt(complex); extern int error_number; struct user;

Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ опрСдСлСниями. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΎΠ½ΠΈ относятся, Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π³Π΄Π΅-Ρ‚ΠΎ Π΅Ρ‰Π΅. Код (Ρ‚Π΅Π»ΠΎ) Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sqrt Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒΡΡ Π½Π΅ΠΊΠΈΠΌ Π΄Ρ€ΡƒΠ³ΠΈΠΌ описаниСм, ΠΏΠ°ΠΌΡΡ‚ΡŒ для ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ error_number Ρ‚ΠΈΠΏΠ° int Π΄ΠΎΠ»ΠΆΠ½Π° Π²Ρ‹Π΄Π΅Π»ΡΡ‚ΡŒΡΡ Π½Π΅ΠΊΠΈΠΌ Π΄Ρ€ΡƒΠ³ΠΈΠΌ описаниСм, ΠΈ ΠΊΠ°ΠΊΠΎΠ΅-Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ описаниС Ρ‚ΠΈΠΏΠ° user Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΠΈΠ· сСбя прСдставляСт. Π’ Π‘++ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ всСгда Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ, Π½ΠΎ описаний ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ, ΠΈ всС описания Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΠ³Π»Π°ΡΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒΡΡ с Ρ‚ΠΈΠΏΠΎΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΎΠ½ΠΈ относятся, поэтому Π² этом Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π΅ Π΅ΡΡ‚ΡŒ Π΄Π²Π΅ ошибки:

int count; int count; // ошибка: ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ extern int error_number; extern int error_number; // ошибка: нСсоотвСтствиС Ρ‚ΠΈΠΏΠΎΠ²

Π° Π² этом – Π½ΠΈ ΠΎΠ΄Π½ΠΎΠΉ (ΠΎΠ± использовании extern см. #4.2):

extern int error_number; extern int error_number;

НСкоторыС описания Π·Π°Π΄Π°ΡŽΡ‚ Β«Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅Β» для сущностСй, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚:

struct complex (* float re, im; *); typedef complex point; float real(complex* p) (* return p-Β»re *); const double pi = 3.1415926535897932385;

Для Ρ‚ΠΈΠΏΠΎΠ², Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ констант Β«Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅Β» Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½ΠΎ. Для нСконстантных Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ впослСдствии ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ:

int count = 1; char* name = Β«BjarneΒ»; //... count = 2; name = Β«MarianΒ»;

Из всСх ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ

char ch;

Π½Π΅ Π·Π°Π΄Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. ВсякоС описаниС, Π·Π°Π΄Π°ΡŽΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, являСтся ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ.

2.1.1 ΠžΠ±Π»Π°ΡΡ‚ΡŒ Видимости

ОписаниС Π²Π²ΠΎΠ΄ΠΈΡ‚ имя Π² области видимости. Π’ΠΎ Π΅ΡΡ‚ΡŒ, имя ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ части ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Для ΠΈΠΌΠ΅Π½ΠΈ, описанного Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (Ρ‚Π°ΠΊΠΎΠ΅ имя часто Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ), эта ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости простираСтся ΠΎΡ‚ Ρ‚ΠΎΡ‡ΠΊΠΈ описания Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° Π±Π»ΠΎΠΊΠ°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ появилось описаниС. Для ΠΈΠΌΠ΅Π½ΠΈ Π½Π΅ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ Π½Π΅ Π² классС (Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ³ΠΎ часто глобально Π²ΠΈΠ΄ΠΈΠΌΡ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ) ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости простираСтся ΠΎΡ‚ Ρ‚ΠΎΡ‡ΠΊΠΈ описания Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° Ρ„Π°ΠΉΠ»Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ появилось описаниС. ОписаниС ΠΈΠΌΠ΅Π½ΠΈ Π² Π±Π»ΠΎΠΊΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ (ΠΏΡ€ΡΡ‚Π°Ρ‚ΡŒ) описаниС Π²ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΌ Π±Π»ΠΎΠΊΠ΅ ΠΈΠ»ΠΈ глобальноС имя. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ имя Π²Π½ΡƒΡ‚Ρ€ΠΈ Π±Π»ΠΎΠΊΠ° для ссылки Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. ПослС Π²Ρ‹Ρ…ΠΎΠ΄Π° ΠΈΠ· Π±Π»ΠΎΠΊΠ° имя вновь ΠΎΠ±Ρ€Π΅Ρ‚Π°Π΅Ρ‚ своС ΠΏΡ€Π΅ΠΆΠ½Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. НапримСр:

int x; // глобальноС x

f() (* int x; // локальноС x прячСт глобальноС x x = 1; // ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΠΎΠΌΡƒ x (* int x; // прячСт ΠΏΠ΅Ρ€Π²ΠΎΠ΅ локальноС x x = 2; // ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ Π²Ρ‚ΠΎΡ€ΠΎΠΌΡƒ Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΠΎΠΌΡƒ x *) x = 3; // ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π²ΠΎΠΌΡƒ Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΠΎΠΌΡƒ x *)

int* p = amp;x; // Π²Π·ΡΡ‚ΡŒ адрСс глобального x

Π‘ΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ ΠΈΠΌΠ΅Π½ Π½Π΅ΠΈΠ·Π±Π΅ΠΆΠ½ΠΎ ΠΏΡ€ΠΈ написании Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ. Однако Ρ‡ΠΈΡ‚Π°ΡŽΡ‰ΠΈΠΉ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ Π»Π΅Π³ΠΊΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ имя скрыто, ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ошибки, Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‰ΠΈΠ΅ вслСдствиС этого,


ΠΎΡ‡Π΅Π½ΡŒ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ΡŒ, Π³Π»Π°Π²Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Ρ€Π΅Π΄ΠΊΠΈΠ΅. Π—Π½Π°Ρ‡ΠΈΡ‚ сокрытиС ΠΈΠΌΠ΅Π½ слСдуСт ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. ИспользованиС для Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈΠΌΠ΅Π½ Π²Ρ€ΠΎΠ΄Π΅ i ΠΈΠ»ΠΈ x Π½Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅ΠΌΡΡ Π½Π° нСприятности.

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ примСнСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ области видимости :: ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ скрытоС глобальноС имя. НапримСр:

int x;

f() (* int x = 1; // скрываСт глобальноС x ::x = 2; // присваиваСт Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΠΎΠΌΡƒ x *)

Но возмоТности ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ скрытоС локальноС имя Π½Π΅Ρ‚.

ΠžΠ±Π»Π°ΡΡ‚ΡŒ видимости ΠΈΠΌΠ΅Π½ΠΈ начинаСтся Π² Ρ‚ΠΎΡ‡ΠΊΠ΅ описания. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ имя ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°ΠΆΠ΅ для задания Π΅Π³ΠΎ собствСнного значСния. НапримСр:

int x;

f() (* int x = x; // ΠΈΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ *)

Π­Ρ‚ΠΎ Π½Π΅ являСтся нСдопустимым, хотя ΠΈ бСссмыслСнно, ΠΈ компилятор ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅Π΄ΠΈΡ‚, Ρ‡Ρ‚ΠΎ x Β«used before setΒ» («использовано Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π·Π°Π΄Π°Π½ΠΎΒ»), Ссли Π²Ρ‹ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅Ρ‚Π΅ Ρ‚Π°ΠΊ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ. МоТно, Π½Π°ΠΏΡ€ΠΎΡ‚ΠΈΠ², Π½Π΅ примСняя ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ ::, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎ имя для ссылки Π½Π° Π΄Π²Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π² Π±Π»ΠΎΠΊΠ΅. НапримСр:

int x;

f() // ΠΈΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ (* int y = x; // глобальноС x int x = 22; y = x; // локальноС x *)

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ y инициализируСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ глобального x, 11, Π° Π·Π°Ρ‚Π΅ΠΌ Π΅ΠΌΡƒ присваиваСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ локальной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ x, 22.

ИмСна ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ описанными Π² самом внСшнСм Π±Π»ΠΎΠΊΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, поэтому

f(int x) (* int x; // ошибка *)

содСрТит ΠΎΡˆΠΈΠ±ΠΊΡƒ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ x ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ Π΄Π²Π°ΠΆΠ΄Ρ‹ Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΈ Ρ‚ΠΎΠΉ ΠΆΠ΅ области видимости.

2.1.2 ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈ АдрСса (Lvalue)

МоТно Π½Π°Π·Π½Π°Ρ‡Π°Ρ‚ΡŒ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ ΠΈΠΌΠ΅Π½, ΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒ присваиваниС выраТСниям странного Π²ΠΈΠ΄Π° (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, *p[a+10]=7). Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π΅ΡΡ‚ΡŒ ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎΡΡ‚ΡŒ Π² ΠΈΠΌΠ΅Π½ΠΈ Β«Π½Π΅Ρ‡Ρ‚ΠΎ Π² памяти». Π’ΠΎΡ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ Ρ†ΠΈΡ‚Π°Ρ‚Π° ΠΈΠ· справочного руководства ΠΏΠΎ Π‘++: "ΠžΠ±ΡŠΠ΅ΠΊΡ‚ Π΅ΡΡ‚ΡŒ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ памяти.


lvalue Π΅ΡΡ‚ΡŒ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΡΡΡ‹Π»Π°ΡŽΡ‰Π΅Π΅ΡΡ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚" (#с.5). Π‘Π»ΠΎΠ²ΠΎ Β«lvalueΒ» ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Π½ΠΎ для значСния Β«Π½Π΅Ρ‡Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‚ΠΎΡΡ‚ΡŒ Π² Π»Π΅Π²ΠΎΠΉ части присваивания». Однако Π½Π΅ всякоС lvalue ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² Π»Π΅Π²ΠΎΠΉ части присваивания; Π±Ρ‹Π²Π°ΡŽΡ‚ lvalue, ΡΡΡ‹Π»Π°ΡŽΡ‰ΠΈΠ΅ΡΡ Π½Π° константу (см. #2.4).

2.1.3 ВрСмя Π–ΠΈΠ·Π½ΠΈ

Если программист Π½Π΅ ΡƒΠΊΠ°Π·Π°Π» ΠΈΠ½ΠΎΠ³ΠΎ, Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ создаСтся, ΠΊΠΎΠ³Π΄Π° встрСчаСтся Π΅Π³ΠΎ описаниС, ΠΈ уничтоТаСтся, ΠΊΠΎΠ³Π΄Π° Π΅Π³ΠΎ имя Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΈΠ· области видимости, ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ с Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· (Ρ‚ΠΎΠ»ΡŒΠΊΠΎ) ΠΈ Β«ΠΆΠΈΠ²ΡƒΡ‚Β» Π΄ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ описаниСм с ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌ словом static, Π²Π΅Π΄ΡƒΡ‚ сСбя Ρ‚Π°ΠΊ ΠΆΠ΅. НапримСр*:

– * Команда #include Β«stream.hΒ» Π±Ρ‹Π»Π° Π²Ρ‹Π±Ρ€ΠΎΡˆΠ΅Π½Π° ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² Π² этой Π³Π»Π°Π²Π΅ для экономии мСста. Она Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…, производящих Π²Ρ‹Π²ΠΎΠ΄, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ ΠΏΠΎΠ»Π½Ρ‹ΠΌΠΈ. (ΠΏΡ€ΠΈΠΌ. Π°Π²Ρ‚ΠΎΡ€Π°)

int a = 1;

void f() (* int b = 1; // инициализируСтся ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ // Π²Ρ‹Π·ΠΎΠ²Π΅ f() static int c = 1; // инициализируСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· cout Β«β€ž " a = " «« a++ «« " b = " «« b++ «« " c = " «« c++ «« Β«\nβ€œ; *)

main() (* while (a Β« 4) f(); *)

ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ Π²Ρ‹Π²ΠΎΠ΄

a = 1 b = 1 c = 1 a = 2 b = 1 c = 2 a = 3 b = 1 c = 3

НС инициализированная явно статичСская (static) пСрСмСнная нСявно инициализируСтся Π½ΡƒΠ»Π΅ΠΌ.

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ new ΠΈ delete программист ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, врСмя ΠΆΠΈΠ·Π½ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… управляСтся нСпосрСдствСнно, см. #3.2.4.

2.2 ИмСна

Имя (ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€) состоит ΠΈΠ· ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π±ΡƒΠΊΠ² ΠΈ Ρ†ΠΈΡ„Ρ€. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ символ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π±ΡƒΠΊΠ²ΠΎΠΉ. Π‘ΠΈΠΌΠ²ΠΎΠ» ΠΏΠΎΠ΄Ρ‡Π΅Ρ€ΠΊΠ° _ считаСтся Π±ΡƒΠΊΠ²ΠΎΠΉ. Π‘++ Π½Π΅ Π½Π°Π»Π°Π³Π°Π΅Ρ‚ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ Π½Π° число символов Π² ΠΈΠΌΠ΅Π½ΠΈ, Π½ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ части Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ находятся Π²Π½Π΅ вСдСния Π°Π²Ρ‚ΠΎΡ€Π° компилятора (Π² частности, Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊ), ΠΈ ΠΎΠ½ΠΈ, ΠΊ соТалСнию, Ρ‚Π°ΠΊΠΈΠ΅ ограничСния Π½Π°Π»Π°Π³Π°ΡŽΡ‚. НСкоторыС срСды выполнСния Ρ‚Π°ΠΊΠΆΠ΅ Π΄Π΅Π»Π°ΡŽΡ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΌ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ Π½Π°Π±ΠΎΡ€ символов, допустимых Π² ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π΅. Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΈ Π΄ΠΎΠΏΡƒΡ‰Π΅Π½ΠΈΠΈ Π² ΠΈΠΌΠ΅Π½Π°Ρ… символа $) ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°ΡŽΡ‚ нСпСрСносимыС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π’ качСствС ΠΈΠΌΠ΅Π½ΠΈ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π‘++ (см. #с.2.3). ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΈΠΌΠ΅Π½:

hello this_is_a_most_unusially_long_name DEFINED foO bAr u_name HorseSense var0 var1 CLASS _class ___

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ символов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹:

012 a fool $sys class 3var pay.due foo~bar .name if

Π‘ΡƒΠΊΠ²Ρ‹ Π² Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ ΠΈ Π½ΠΈΠΆΠ½Π΅ΠΌ рСгистрах ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ, поэтому Count ΠΈ count – Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΈΠΌΠ΅Π½Π°, Π½ΠΎ Π²Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΈΠΌΠ΅Π½Π°, лишь Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‰ΠΈΠ΅ΡΡ Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π°, Π½Π΅ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ. ИмСна, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΠ΅ΡΡ с ΠΏΠΎΠ΄Ρ‡Π΅Ρ€ΠΊΠ°, ΠΏΠΎ Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… срСдств срСды выполнСния, поэтому ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ ΠΈΠΌΠ΅Π½Π° Π² ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… Π½Π΅ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ.

Π’ΠΎ врСмя чтСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ компилятор всСгда ΠΈΡ‰Π΅Ρ‚ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π΄Π»ΠΈΠ½Π½ΡƒΡŽ строку, ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΡƒΡŽ имя, поэтому var10 – это ΠΎΠ½ΠΎ имя, Π° Π½Π΅ имя var, Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ слСдуСт число 10, ΠΈ elseif – ΠΎΠ΄Π½ΠΎ имя, Π° Π½Π΅ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово else, послС ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ стоит ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово if.

2.3 Π’ΠΈΠΏΡ‹

КаТдоС имя (ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€) Π² Π‘++ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ ассоциированный с Π½ΠΈΠΌ Ρ‚ΠΈΠΏ. Π­Ρ‚ΠΎΡ‚ Ρ‚ΠΈΠΏ опрСдСляСт, ΠΊΠ°ΠΊΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΌΠΎΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΊ ΠΈΠΌΠ΅Π½ΠΈ (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ½ΠΎ ссылаСтся), ΠΈ ΠΊΠ°ΠΊ эти ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ΡΡ. НапримСр:

int error number; float real(complex* p);

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ error_number описано ΠΊΠ°ΠΊ int, Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Ρ‚ΡŒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² арифмСтичСских выраТСниях ΠΈ Ρ‚.Π΄. Π’ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ функция real ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ с адрСсом complex Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°. МоТно Π²Π·ΡΡ‚ΡŒ адрСс любого ΠΈΠ· Π½ΠΈΡ…. НСкоторыС ΠΈΠΌΠ΅Π½Π°, Π²Ρ€ΠΎΠ΄Π΅ int ΠΈ complex, ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ Ρ‚ΠΈΠΏΠΎΠ². ΠžΠ±Ρ‹Ρ‡Π½ΠΎ имя Ρ‚ΠΈΠΏΠ° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² описании для спСцификации Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ. ЕдинствСнныС ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΎΡ‚ этого дСйствия Π½Π°Π΄ ΠΈΠΌΠ΅Π½Π΅ΠΌ Ρ‚ΠΈΠΏΠ° – это sizeof (для опрСдСлСния количСства памяти, которая трСбуСтся для хранСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Ρ‚ΠΈΠΏΠ°) ΠΈ new (для размСщСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Ρ‚ΠΈΠΏΠ° Π² свободной памяти). НапримСр:

main() (* int* p = new int; cout Β«β€ž "sizeof(int) = " «« sizeof(int) Β«\nβ€œ; *)

Имя Ρ‚ΠΈΠΏΠ° ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для задания явного прСобразования ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

float f; char* p; //... long ll = long(p); // ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ p Π² long int i = int(f); // ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ f Π² int

2.3.1 ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ Π’ΠΈΠΏΡ‹

Π’ Π‘++ Π΅ΡΡ‚ΡŒ Π½Π°Π±ΠΎΡ€ основных Ρ‚ΠΈΠΏΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΎΠ±Ρ‰ΠΈΠΌ основным Π΅Π΄ΠΈΠ½ΠΈΡ†Π°ΠΌ памяти ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π° ΠΈ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΎΠ±Ρ‰ΠΈΠΌ основным способам ΠΈΡ… использования:

char short int int long int

для прСдставлСния Ρ†Π΅Π»Ρ‹Ρ… Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ²,

float double

для прСдставлСния чисСл с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ,

unsigned char unsigned short int unsigned int unsigned long int

для прСдставлСния Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²Ρ‹Ρ… Ρ†Π΅Π»Ρ‹Ρ…, логичСских Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, Π±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… массивов ΠΈ Ρ‚.ΠΏ. Для большСй компактности записи ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ int Π² комбинациях ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… слов, Ρ‡Ρ‚ΠΎ Π½Π΅ мСняСт смысла. Π’Π°ΠΊ, long ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ long int, ΠΈ unsigned Ρ‚ΠΈΠΏ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Ρ‚ΠΈΠΏ unsigned int. Π’ ΠΎΠ±Ρ‰Π΅ΠΌ, ΠΊΠΎΠ³Π΄Π° Π² описании ΠΎΠΏΡƒΡ‰Π΅Π½ Ρ‚ΠΈΠΏ, ΠΎΠ½ прСдполагаСтся int. НапримСр:

const a = 1; static x;

всС ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° int.

Π¦Π΅Π»Ρ‹ΠΉ Ρ‚ΠΈΠΏ char Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΡƒΠ΄ΠΎΠ±Π΅Π½ для хранСния ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ символов Π½Π° Π΄Π°Π½Π½ΠΎΠΌ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ это 8-Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΉ Π±Π°ΠΉΡ‚. Π Π°Π·ΠΌΠ΅Ρ€Ρ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π‘++ Π²Ρ‹Ρ€Π°ΠΆΠ°ΡŽΡ‚ΡΡ Π² Π΅Π΄ΠΈΠ½ΠΈΡ†Π°Ρ… Ρ€Π°Π·ΠΌΠ΅Ρ€Π° char, ΠΏΠΎΡ‚ΠΎΠΌΡƒ ΠΏΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡŽ sizeof(char)==1. Π’ зависимости ΠΎΡ‚ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ обСспСчСния char являСтся Π·Π½Π°ΠΊΠΎΠ²Ρ‹ΠΌ ΠΈΠ»ΠΈ Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²Ρ‹ΠΌ Ρ†Π΅Π»Ρ‹ΠΌ. Π’ΠΈΠΏ unsigned char, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, всСгда Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²Ρ‹ΠΉ, ΠΈ ΠΏΡ€ΠΈ Π΅Π³ΠΎ использовании ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ΡΡ Π±ΠΎΠ»Π΅Π΅ пСрСносимыС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π½ΠΎ ΠΈΠ·-Π·Π° примСнСния Π΅Π³ΠΎ вмСсто просто char ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Ρ‚ΡŒ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠΎΡ‚Π΅Ρ€ΠΈ Π² эффСктивности.